В процессе знакомства с замечательной, поистине революционной технологией “всемирного компьютера” Ethereum и языка описания смарт-контрактов Solidity, у меня возникла следующая скромная идея.

А что если (в отличии от не менее интересных электронных нотариальных сервисов) трактовать само понятие “нотариуса” (уполномоченной свидетельствовать верность документов сущности) более общо?

Обычный нотариус

Например, традиционный нотариус, заверяющий ксерокопию паспорта или свидетельство о браке, по сути есть не что иное, как функция:

notarify :: Document -> Proof -> Fee -> (Document, Signature)

То есть пафосная тётя из нотариальной конторы фактически принимает от клиента:

  1. документы (например, ксерокопию паспорта)
  2. доказательства (например, оригинал паспорта)
  3. оплату нотариальных услуг

Затем, собственно, проделывает некоторую работу (не обязательно тривиальную!) по установлению верности предоставленных данных:

check :: (Document, Proof) -> Bool

И, в случае корректности и достаточности предоставленных с документам доказательств, выдаёт клиенту нотариальное заверение:

sign :: Document -> (Document, Signature)

Фактическая работа нотариуса, как всем известно, таким образом сводится к процессу установления истинности информации, и не более.

Обобщённый нотариус

А вот что если, учитывая революцию, данную нам смарт-контрактами на блокчейне, поразмыслить над процессом и попробовать его обобщить? Представим, что клиенты теперь могут заверять не статичные документы, а вообще любой информационный контекст в принципе: информацию в движении.

notarify :: (Information, Context) -> Proof -> Fee -> (SmartContract, Signature)

То есть на выходе работы Обобщённого нотариуса получается подписанный (его цифровой подписью) смарт-контракт, который уже поставлен в блокчейн и доказан майнерами на глубине нескольких блоков (то есть он уже гарантированно никуда не денется).

Смарт-контракт – это специальная программа, вечно живущая в блокчейне Ethereum. Такую программу невозможно подделать (майнеры позаботятся об этом) или удалить; она не хранится в сейфе, а растиражированна на миллионах компьютерах по всему Миру, её невозможно отменить, запретить, заблокировать и так далее. У этой программы есть открытый интерфейс (API), с помощью которого с ней могут взаимодействовать люди или другие смарт-контракты^[В Ethereum вызвать контракт (дёрнуть API) может только человек: т.е. инициатива от программы-клиента сети Ethereum. После активации какого-либо метода в контракте, контракт может дёргать другие контракты, выполнять транзакции на адреса контрактов или людей и так далее (за транзакции, как и за изменения внутреннего стэйта контракта, вроде обновления переменной и т.п., должен кто-то платить, поскольку эти действия обновляют блокчейн)].

Исходный код смарт-контракта, порождаемого Обобщённым нотариусом, открыт для клиента и всего Мира, чтобы все знали о том, какие “рычаги управления” и какая логика, запускаемая ими, гарантированно присутствует и гарантированно отсутствует в данном контракте.

Обобщённый нотариус кажется мне в таком случае уже не просто сверяющим копии и оригиналы документов лицом, но скорее гарантом, поручителем, некоторой репутацией, если угодно.

Внутри такого смарт-контракта мне представляются следующие компоненты:

  1. Цифровая подпись уполномоченного на данное конкретное “санкционирование” человека или иной сущности
  2. Ethereum-адрес клиента нотариуса (только с него контракт принимает управляющие собой команды)
  3. Хэш предоставленных клиентом доказательств (тип Proof выше)
  4. Хэш информации, предъявляемой нотариусу (тип Information выше)

Последние два пункта могут быть опциональными в конкретных реализациях Обобщённого нотариуса.

Ясно, что всё вышеописанное – довольно абстрактная идея. Приведу некоторые конкретные примеры, которые приходят в голову.

Пример: благотворительные фонды помощи

Не для кого не секрет, что действующие в России фонды помощи (например, сбор средств на операцию ребёнку) не только иногда берут плату за размещение объявления (расходы на верификацию медицинских справок, трудноизлечимость диагноза и т.п.), но и берут проценты с собранных денег, иногда не совсем прозрачно. Ещё одна проблема в том, что фондов много, а значит концентрация внимания и репутация в рамках конкретной кампании по помощи – меньше.

Оставить без работы многие благотворительные фонды и усилить КПД от сбора средств (удалив горизонтальные связи: доноры и меценаты платят не фонду, а осуществляют транзакции напрямую смарт-контракту, которым владеет, скажем, мама ребёнка) мог бы Обобщённый нотариус, приспособленной к данной проблеме.

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

Входные данные от клиента (мамы ребёнка)

  1. Цель данной кампании: например, собрать определённую сумму денег на операцию.
  2. Медицинские и прочие документы для верификации актуальности и целей данной кампании (сотрудники Обобщённого нотариуса выносят решение, опираясь на эти доказательства).
  3. Ethereum-адрес клиента (мама ребёнка хранит приватный ключ у себя).
  4. Небольшая плата сотрудникам Обобщённого нотариуса за проверку документов.
  5. Плата (крохотная) за первичное размещение контракта в блокчейне.

Выходные данные – смарт-контракт

После положительного решения организации об актуальности данной кампании в блокчейне Ethereum размещается смарт-контракт следующего вида (если кампания отклонена, плата майнерам возвращается клиенту):

  1. Владельцем контракта является Ethereum-адрес клиента (мамы ребёнка).
  2. В контракте имеется константа с суммой, которую необходимо собрать в рамках данной кампании.
  3. Контракт ведёт историю всех транзакций от меценатов: например, метод donate(100) не только инициирует транзакцию с передачей 100 Ether с баланса вызвавшего его мецената, но и записывает эту сумму, а также адрес (сообщение?) мецената
  4. API контракта открыт всему Миру: любой может не только посмотреть баланс контракта (что само собой разумеется в блокчейне), но и методом donations() узнать адреса/сообщения доноров и историюдотаций.
  5. Однако, только с адреса мамы ребёнка контракт откликнется на метод thankyou(), в котором он произведёт обычную Ethereum-транзакцию с баланса контракта на баланс адреса своего владельца (клиента Обобщённого нотариуса, то есть, опять-же, мамы ребёнка).
  6. В методе thankyou() имеется также логика, которая смотрит, не превышает ли общая сумма пожертвований (по истории дотаций) сумму, которую требуется собрать. Если за всю историю была собрана требуемая сумма, то метод thankyou() после перевода остатка средств маме вызывает самоуничтожение данного смарт-контракта в сети Ethereum.
  7. В контракте имеются имена файлов, их размеры и md5-суммы (хэш) всех предоставленных Обобщённому нотариусу медицинских и прочих документов. Эта информация также доступна любому желающему (например, хэши документов могут пригодиться для проверки в клинике).
  8. Цифровая подпись данного Обобщённого нотариуса, пользующегося общественным доверием, также вшита в тело контракта и доступна с помощью метода signature() любому желающему.

Сумма денег везде представляется, разумеется, в Ether – криптовалюте сети. Однако, в Ethereum существуют т.н. Оракулы – контракты, регулярно обновляемые специальными людьми или организациями, которые привносят внешнюю информацию из окружающего мира в мир сети EVM (Ethereum Virtual Machine). Метод thankyou() выше может использовать Оракул с котировками, чтобы узнать текущую рыночную стоимость валюты Ether по отношению к рублу или доллару и понять, достигнута ли необходимая для операции сумма.

Пример: передача актива в будущем, тайм-капсулы и т.п.

Исходя из последнего замайненного в блокчейне блока можно примерно установить текущую дату. Смарт-контракт может использовать этот факт (или просто опросить внешний Оракул точного времени, за небольшую плату) для создания определённого типа обязательств санкционированных Обобщённым нотариусом.

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

Входные данные от клиента

  1. Ethereum-адрес внука (внук должен его сохранить; дедуля мог бы выгравировать его на металле и подарить сейчас)
  2. Собственно актив: непосредственно сумма подарка в Ether или иная ценная информация (номер банковской ячейки, пароль, приватный ключ от Bitcoin-адреса, ценный совет и т.п.)
  3. Дата в будещем, которая приходится на 20-летие внука.
  4. Оплата услуг Обобщённого нотариуса (практически даром, поскольку объёмы его работы минимальны).
  5. Плата майнерам за первичное размещение контракта.

Выходные данные – смарт-контракт

  1. Владелец контракта – Ethereum-адрес дедули. С этого адреса контракт принимает команду на аннуляцию – пересылку всех денежных средства контракта на адрес дедули и самоуничтожение (например, дедуля впоследствии понял, что внук растёт говнюком).
  2. Бенефициант – Ethereum-адрес внука: активировать контракт после указанной даты можно только с этого адреса.
  3. Метод unlocks() возвращает дату или номер замайненного блока, после которого контрактом можно воспользоваться.
  4. Метод activate() активирует подарок: его можно вызвать только с адреса внука (если он не потерял приватный ключ от него!) и только после указанной даты или блока. Логика пересылает подарочную сумму на адрес внука или делает доступным (опять-таки, с адреса внука) метод secret(), который сообщает какую-либо ценную информацию вроде номера банковской ячейки.
  5. Цифровая подпись Обобщённого нотариуса, пользующего общественным доверием. Сам факт этой подписи делает данный контракт ценным активом: например, внук может продать приватный ключ от своего Ethereum-адреса в 18 лет (не дожидаясь двадцати), расплачиваясь за дом.

Пример: завещание

Завещание представляется мне смарт-контрактом, похожим на контракт выше. Факт кончины дедули-миллионера можно определять разными способами (по выбору клиента):

  1. Семейным советом (Ethereum-адреса всех членов семьи навсегда зашиваются в смарт-контракт, и когда более половины из них со своих адресов вызывают vote(), контракт разблокируется)
  2. Добавлением в контракт адреса Обобщённого нотариуса или списка адресов нескольких доверенных организаций, с которых контракт может быть разблокирован (но не опустошён в пользу этой организации, поскольку активировать контракт методом activate() после разблокировки может только бенефициант).
  3. Истёкшим таймаутом с момента последней отметки дедули: если дедуля со своего адреса каждый год вызывает метод stillalive() и контракт сохраняет таймштамп, то можно считать завещание разблокированным по истечении 13 месяцев с момента последнего таймштампа.

Наверное, можно придумать и другие интересные споосбы.

Пример: традиционное нотариальное заверение документов

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

Самое важное – то, что всему миру с помощью методов смарт-контрактов с открытым интерфейсом станет доступен результат работы некоторой доверительной организации, и никто не сумеет потерять или исказить эту информацию.

Реализацию Обобщённого нотариуса я представляю себе в виде Web-приложения на Yesod, для которого, впоследствии, каждая из доверенных организаций (или частных лиц) создаёт под свои задачи собственные шаблоны смарт-контрактов на Solidity, выкладывает их в открытый доступ и стандартизирует.