К основному содержимому

Введите слово из вопроса или названия статьи.

2 · Практика

Хеш-обязательство: как зафиксировать условия сделки, не раскрывая их

Как криптографический хеш (keccak256) позволяет записать в блокчейн отпечаток договора, не публикуя сам текст, и почему подменить документ становится невозможно.

4 мин чтенияОбновлено:
В этой статье

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

Что такое хеш

Хеш-функция превращает любые данные - слово, абзац, файл на 100 мегабайт - в строку фиксированной длины. В Ethereum используется keccak256: на выходе всегда 32 байта, записанные как 66 символов вида 0x7f3a9c2e…4b8d1a.

Три свойства делают хеш пригодным для фиксации условий:

  1. Детерминированность. Одни и те же данные всегда дают один и тот же хеш.
  2. Лавинный эффект. Изменение одного символа меняет хеш до неузнаваемости. «Оплата 1000» и «Оплата 1001» дают совершенно разные отпечатки.
  3. Односторонность. По хешу невозможно восстановить исходный текст и, что важно, нельзя подобрать другой документ с таким же хешем.

Как это работает в сделке

  1. Стороны договариваются об условиях - где угодно: в мессенджере, по почте, голосом.
  2. Составляют документ с условиями.
  3. Сервис вычисляет его хеш в вашем браузере - сам документ никуда не отправляется.
  4. Хеш записывается в блокчейн вместе со сделкой. Документ в сеть не попадает: содержание сделки остаётся приватным.
  5. Контракт требует, чтобы вторая сторона при принятии передала тот же самый хеш. Если она видит другой документ, её хеш будет отличаться, и транзакция откатится.
  6. При споре любая сторона отдаёт документ гаранту, тот считает хеш и сверяет с тем, что записан в сделке. Совпало - документ подлинный.

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

Нормализация текста: почему «тот же» текст даёт разный хеш

Для компьютера «Привет» и «Привет␠» (с пробелом в конце) - разные данные. Поэтому скопированный из Word текст и набранный вручную могут дать разные хеши, хотя на глаз они одинаковы. Источников расхождений несколько:

  • Переводы строк. Windows использует CRLF, Linux и macOS - LF.
  • Неразрывные пробелы. Word и мессенджеры любят подставлять особые пробелы, которые выглядят как обычные.
  • Хвостовые пробелы в конце строк.
  • Формы Unicode. Буква «й» может быть записана одним символом или двумя («и» плюс знак «краткая»). Выглядят идентично.

Чтобы всё сошлось, текст перед хешированием приводится к каноническому виду:

  1. Unicode приводится к форме NFC.
  2. Все переводы строк становятся \n.
  3. Неразрывные и экзотические пробелы заменяются обычным.
  4. Пробелы в конце каждой строки убираются.
  5. Пустые строки в начале и конце отбрасываются.

Затем нормализованный текст кодируется в байты UTF-8, и от них считается keccak256. Эти правила обязаны совпадать у покупателя, продавца, гаранта и любого сервиса, проверяющего хеш, - иначе сверка не сойдётся. Поэтому они зафиксированы в контрольных тестовых векторах.

А если это файл

Для файла - PDF, изображения, архива - нормализация не применяется. Хешируются байты файла как есть. Любое «улучшение» файла (пересохранение, сжатие, добавление метаданных) меняет байты и ломает проверку. Передавайте файл неизменным.

Чего хеш не даёт

Важно понимать границы.

Он не доказывает, что условия справедливы или выполнены. Хеш подтверждает только тождественность документа: тот самый ли текст зафиксировали стороны. Кто прав в споре, решает гарант.

Он не скрывает короткие, предсказуемые тексты. Хеш нельзя «развернуть», но можно перебирать варианты. Если условия - «Куплю iPhone за 500 USDT» и больше ничего, злоумышленник может перебрать похожие тексты, сравнивая хеши, и догадаться о содержании. Для длинных уникальных договоров это нереально, но для коротких фраз стоит добавить случайную строку - «соль».

Он не хранит сам документ. Потерянный файл не восстановить из хеша. Сервис хранит только отпечаток, а документ - у вас и у второй стороны. Скачайте и сохраните его сразу. Без документа гарант не сможет вам помочь.

Время тоже зафиксировано

Хеш записывается в блокчейн с отметкой времени блока. Это означает, что к моменту создания сделки документ уже существовал - вы доказываете не только содержание, но и «не позже какого момента» он был.

Где это применяется ещё

Та же идея - основа множества технологий: проверка целостности файлов при скачивании, подписи в Git-коммитах, дерево Меркла в блокчейне, commit-reveal в голосованиях и аукционах. Если вы разработчик, как это выглядит на уровне байтов, можно посмотреть в статье про кодирование данных в ABI.

Практические советы

  • Описывайте условия конкретно: что, в каком виде, в какой срок, по каким признакам считается выполненным.
  • Не меняйте файл после вычисления хеша: даже одна запятая изменит отпечаток.
  • Скачивайте документ из сервиса и храните копию.
  • Отправьте второй стороне и документ, и отпечаток - она сверит до принятия.
  • Для коротких текстов добавьте случайную строку.

Что почитать дальше

Хеш закрепляет текст, но сам текст нужно уметь написать: как писать условия сделки. Затем посмотрите готовые примеры: фриланс-проект, физические товары, домен и цифровые товары. Для тех, кто готов заглянуть под капот, - мультиподпись и таймлок и затем аккаунты Ethereum.

Упоминается в статьях

Готовы попробовать?

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