Простое блокчейн-приложение для проверки данных: как кодировать жизнеспособное приложение для Ethereum в несколько строк

  • HLCS 

Источник · Перевод автора

«Все великие вещи просты, и многие могут быть выражены одним словом: свобода, справедливость, честь, долг, милосердие, надежда». — Уинстон Черчилль

Вступление

В этой статье я собираюсь описать простейшее из известных мне блокчейнов с примерами кода. Это полезно для тех, кто начинает в блокчейне, а также для проектирования более опытных архитекторов.

Представьте себе следующий вариант использования. Вы получили документ, который прошел через несколько раздач, и вы хотите убедиться в его подлинности. Документом может быть книга обслуживания автомобиля, который вы покупаете, или документ, подтверждающий, что дом, который вы покупаете, действительно принадлежит продавцу. Это может быть что угодно.

Цифровая подпись документов, чтобы убедиться, что они не были подделаны, не является чем-то новым. Вы можете взять содержимое документа и сделать с ним криптографическую подпись, которая отправляется вместе с самим документом.

В этой статье я собираюсь описать простейшее из известных мне блокчейнов с примерами кода.

Получатель документа может снова произвести подпись и убедиться, что она соответствует предоставленной. Совпадение означает, что документ не изменился.

Это то, что вы получаете с контрольными суммами MD5, и им очень удобно пользоваться. Его слабость в том, что вам необходимо получить подпись для проверки подлинности документа. Если кто-то окажется посередине и изменит и документ, и подпись, вы не будете мудрее.

Поскольку получение данных от отдельных лиц не является чем-то, чему можно легко доверять, иногда сторонние организации предоставляют услуги по ведению учета для получения прибыли. Именно этот мотив прибыли делает честного хранителя рекордов.
Работоспособное, но не идеальное решение. Хранитель записей, естественно, будет работать на руководящей должности и извлекать высокую арендную плату без конкуренции. Еще хуже, если экономические стимулы изменятся, владелец отчета может стать коррумпированным. Кто смотрит на сторожей?

Что Блокчейн может сделать для вас

Хранилище данных блокчейна децентрализовано, надежно и неизменно.

  • Децентрализованное означает, что хранилище данных работает совместно на оборудовании нескольких разных людей.
  • Надежность означает, что хранилище данных продолжит работу, даже если некоторые участники покинут или прекратят сотрудничество.
  • Неизменяемость означает, что после сохранения данных в блокчейне их нельзя изменить.
  • Блокчейн решает проблему реестра документов элегантным способом. После того как мы введем подпись в блокчейн-реестр, нам не нужно опасаться, что подпись будет изменена в соответствии с подделанным документом. Для этого большинству участников сети придётся согласиться с изменением, что вряд ли делает его секретным.

В то же время нет никого, кто мог бы взимать плату за обслуживание. Участники сети сами предоставляют услугу.

В этом контексте документ может быть любым набором данных. Этот же шаблон будет работать для подтверждения подлинности любой бизнес-транзакции, набора данных IoT или идентификации пользователя, а также многих других.

Блокчейн решает проблему реестра документов элегантным способом. Как только мы записываем подпись, она не может быть подделана.

Если бы я писал это в 2016 году, я мог бы реализовать около ста строк кода, а затем документ с двумя дюжинами страниц и собрать несколько миллионов в ICO. Приложения для этого шаблона бесконечны, и многие люди воспользовались этой возможностью.

В настоящее время полезно знать, как использовать этот строительный блок для разработки более сложных решений. Все блокчейн-решения основаны на хранении пользовательских данных, которым можно доверять, не завися от кого-либо.

Реализация

На этот раз я не кодировал контракт с нуля. Я пытаюсь прекратить заново изобретать колесо, и реестры блокчейнов были реализованы дюжиной. Быстрый поиск в Google привел меня к репозиторию GitHub, который я буду использовать, чтобы показать, как работает шаблон. Даже если он использует старую версию твердости, он работает просто отлично, и вы можете проверить это (спасибо Светлин!).

Контракт очень прост, только с одной релевантной переменной контракта и двумя функциями.

  • Сопоставление документов связывает хэш, рассчитанный для документа, с блоком, в который он был добавлен.
  • Метод add берет хеш и сохраняет его в отображении.
  • Метод verifyiy возвращает метку времени для хэша.
pragma solidity ^0.4.18;
contract DocumentRegistry {
mapping (string => uint256) documents;
address contractOwner = msg.sender;
  function add(string hash) 
public
returns (uint256 dateAdded)
{
require (msg.sender == contractOwner);
var timeAdded = block.timestamp;
documents[hash] = timeAdded;
return timeAdded;
}
  function verify(string hash) 
constant
public
returns (uint256 dateAdded)
{
return documents[hash];
}
}

Интерфейс позволяет загружать документ с помощью contract.add и вычисляет подпись как sha256 содержимого документа.

async function uploadDocument() {

let fileReader = new FileReader();
fileReader.onload = function() {
let documentHash = sha256(fileReader.result);

contract.add(documentHash, function(err, result) {…});

}
<}

Интерфейс также позволяет загружать документ с помощью contract.verify, и, если он был загружен ранее, он сообщит вам приблизительно когда.

function verifyDocument() {

let fileReader = new FileReader();
fileReader.onload = function() {
let documentHash = sha256(fileReader.result);

contract.verify(documentHash, function(err, result) {

let contractPublishDate = result.toNumber();
if (contractPublishDate > 0) {
let displayDate = new Date(
contractPublishDate * 1000
).toLocaleString();
showInfo(
`Document ${documentHash} is <b>valid<b>,
date published: ${displayDate}`
);
}
else
return showError(
`Document ${documentHash} is <b>invalid</b>:
not found in the registry.`
);
});
}

}
 

Это все, что вам нужно для реализации децентрализованного реестра документов, который допускает две вещи:

Подписать документ

  1. Чтобы проверить, изменился ли документ с момента его последней записи подписи.
  2. Это работает, потому что вероятность того, что два разных документа имеют одну и ту же подпись, очень близка к нулю. Если вы вернете временную метку, вы можете быть уверены, что предоставленный вами документ был внесен в реестр в то время.

Код контракта, безусловно, можно обновлять и улучшать, но основное поведение в этих 17 строках все еще корректно.

Заключение

Реестр документов — это простейшая реализация приложения блокчейна, имеющая ценность для бизнеса. В 2016 году нескольких строк кода в этой статье было бы достаточно, чтобы собрать несколько миллионов долларов в ICO. Сегодня они по-прежнему актуальны как один из строительных блоков, который вы можете использовать снова и снова в более сложных решениях.

Реестр документов эффективно использует свойства децентрализации и неизменности блокчейна, чтобы устранить необходимость доверять кому-либо подлинность предоставленных данных. Идея простая, но революционная.