Документация
Поиск

Как это работает

Рассмотрим работу системы на реальном примере. Пусть есть издатель Emercoin, который сам себе валидатор (простейший случай). Издатель выпустил бинарный файл-инсталлятор кошелька Emercoin для Windows, имя файла: emercoin-0.7.10-win64-setup.exe.

Издатель

Издатель Emercoin желает воспользоваться предлагаемой системой FV для того, чтобы пользователи могли проверить полученный бинарный файл и убедиться, что они получили именно то, что распространяет издатель.

Для этого он хеширует файл алгоритмом sha256 (система предполагает смену алгоритма при необходимости), и получает хеш файла:

169dc5dd293cd82f84737055403ae87a62008072d785376f56f6d309288a092a

Издатель на основе хеш-суммы создаёт поисковое имя, которое будет выступать ключом в Emercoin NVS:

fv:sha256=169dc5dd293cd82f84737055403ae87a62008072d785376f56f6d309288a092a

Здесь:

  • fv: Префикс сервиса, File Validator
  • sha256: алгоритм хеширования (дефолтный sha256, но возможна в будущем замена на другие алгоритмы)
  • hex-строка: хеш-сумма файла.

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

Валидатор

Валидатор имеет в Emercoin NVS уникальное имя, с которым связан Emercoin address. Имя имеет префикс сервиса “val:”, и может содержать только латинские символы нижнего регистра, а также точку и минус. То есть разрешённое множество символов: [a-z.-]. Пробелы, табуляции, спецсимволы или символы национальных кодировок также запрещены. Это ограничение призвано заблокировать манипуляции, позволяющие создавать внешне похожие имена валидаторов и от их имени подписывать всякое. Типичный пример такой манипуляции – внешне похожие, но отличающиеся имена: paypal - paypaI – paypa1.

Например, имя валидатора olegarch – корректное, а имя o1egarch – некорректное, так как содержит цифру 1.

В нашем примере, валидатором выступает Emercoin, владеющий NVS-именем val:emercoin

связанным с адресом: EcXrMDf8YyLMFk6RCnkAnPm9fmDBfu5eQX

На основании полученного файла, валидатор создаёт поисковое имя аналогично тому, как это сделал издатель. После этого издатель создаёт строку для подписи:

emercoin|100|fv:sha256=169dc5dd293cd82f84737055403ae87a62008072d785376f56f6d309288a092a

Здесь:

  • emercoin: NVS-имя валидатора.
  • 100: Уровень доверия (зарезервировано для дальнейшего использования).
  • fv..f6: поисковое имя, аналогичное таковому у издателя.

Эту строку валидатор подписывает командой signmessage в своём кошельке адресом EcXrMDf8YyLMFk6RCnkAnPm9fmDBfu5eQX, связанным с именем валидатора val:emercoin:

signmessage  EcXrMDf8YyLMFk6RCnkAnPm9fmDBfu5eQX em..f6

Полученную цифровую подпись IH0yysgQpP1xIjRcJPrWaDVrl9B35BfrNcgOdwNm1gjFeE2zpKZZooSd55LydWlPnnlfnLiI+2Q1VUzzsD/8irE=

валидатор передаёт издателю.

Издатель, получив подпись от валидатора, создаёт и публикует в блокчейне NVS-запись, где в качестве имени выступает поисковый ключ, а value содержит строку с подписью:

SIG=emercoin|100|IH0yysgQpP1xIjRcJPrWaDVrl9B35BfrNcgOdwNm1gjFeE2zpKZZooSd55LydWlPnnlfnLiI+2Q1VUzzsD/8irE=

Здесь:

  • SIG=: Префикс, специфицирующий цифровую подпись.
  • emercoin: NVS-имя валидатора.
  • 100: Уровень доверия (зарезервировано для дальнейшего использования).
  • IH..E=: цифровая подпись валидатора.

Value может содержать несколько строк-подписей и другие строки, содержащие произвольную информацию о подписываемом файле. Например, реальная NVS-запись о нашем файле имеет структуру:

Name:

fv:sha256=169dc5dd293cd82f84737055403ae87a62008072d785376f56f6d309288a092a

Value:

Emercoin core wallet, full node
File: emercoin-0.7.10-win64-setup.exe
Download: https://emercoin.com/en/for-coinholders#download
SIG=emercoin|100|IH0yysgQpP1xIjRcJPrWaDVrl9B35BfrNcgOdwNm1gjFeE2zpKZZooSd55LydWlPnnlfnLiI+2Q1VUzzsD/8irE=
SIG=olegarch|100|H32Bp3cLoqBFvlyUIIXLrKX3TD+IG2aX2dmegy4oIxGEWeKBw9YTITKWaFWM4UdejEgpH5em4Gi/ZfoZFU69Owk=

Здесь мы видим, что информация о файле содержит подписи от двух валидаторов – emercoin и olegarch.

Пользователь

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

Хеширует файл, и получает его хеш sha256, например командой:

$ sha256sum emercoin-0.7.10-win64-setup.exe
169dc5dd293cd82f84737055403ae87a62008072d785376f56f6d309288a092a  emercoin-0.7.10-win64-setup.exe

На основании полученной хеш-суммы пользователь формирует поисковое имя аналогично тому, как это делал издатель (см выше):

fv:sha256=169dc5dd293cd82f84737055403ae87a62008072d785376f56f6d309288a092a

Извлекает из Emercoin NVS информацию о полученном файле, посредством команды name_show:

name_show fv:sha256=169dc5dd293cd82f84737055403ae87a62008072d785376f56f6d309288a092a

{
  "name": "fv:sha256=169dc5dd293cd82f84737055403ae87a62008072d785376f56f6d309288a092a",
  "value": "Emercoin core wallet, full node\nFile: emercoin-0.7.10-win64-setup.exe\nDownload: https://emercoin.com/en/for-coinholders#download\nSIG=emercoin|100|IH0yysgQpP1xIjRcJPrWaDVrl9B35BfrNcgOdwNm1gjFeE2zpKZZooSd55LydWlPnnlfnLiI+2Q1VUzzsD/8irE=\nSIG=olegarch|100|H32Bp3cLoqBFvlyUIIXLrKX3TD+IG2aX2dmegy4oIxGEWeKBw9YTITKWaFWM4UdejEgpH5em4Gi/ZfoZFU69Owk=",
  "txid": "a22fa9b5ac1725d30e6e6dc9bb2038b0a0afbe362031eb8b9d9a4392e0cc46ff",
  "address": "EfsrojhfLGf6LPYRFytiaGRVwYmQ9KsWN5",
  "expires_in": 957918,
  "expires_at": 1391644,
  "time": 1598137455
}

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

SIG=emercoin|100|IH0yysgQpP1xIjRcJPrWaDVrl9B35BfrNcgOdwNm1gjFeE2zpKZZooSd55LydWlPnnlfnLiI+2Q1VUzzsD/8irE=
SIG=olegarch|100|H32Bp3cLoqBFvlyUIIXLrKX3TD+IG2aX2dmegy4oIxGEWeKBw9YTITKWaFWM4UdejEgpH5em4Gi/ZfoZFU69Owk=

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

  • Из строки извлекает имя валидатора, в нашем примере emercoin.
  • Посредством запроса name_show на val:emercoin, получает EMC-адрес, связанный с этим именем: EcXrMDf8YyLMFk6RCnkAnPm9fmDBfu5eQX.
  • Извлекает из строки подпись валидатора IH..e=
  • Формирует строку для подписи аналогично тому, как это делал валидатор:
emercoin|100|fv:sha256=169dc5dd293cd82f84737055403ae87a62008072d785376f56f6d309288a092a
  • Запросом verifymessage пользователь проверяет достоверность подписи:

verifymessage адрес подпись строка_для_подписи

В нашем примере – это

verifymessage  EcXrMDf8YyLMFk6RCnkAnPm9fmDBfu5eQX IH0yysgQpP1xIjRcJPrWaDVrl9B35BfrNcgOdwNm1gjFeE2zpKZZooSd55LydWlPnnlfnLiI+2Q1VUzzsD/8irE= emercoin|100|fv:sha256=169dc5dd293cd82f84737055403ae87a62008072d785376f56f6d309288a092a
  • Получив результат проверки, пользователь принимает решение, что делать с проверяемым файлом.

Как этим пользоваться

Выше, в разделе “как это работает”, был предоставлен пошаговый алгоритм как генерации и публикации подписей, так и проверки файлов. Понятно, что вручную все эти операции делать сложно, особенно для конечного пользователя. Поэтому для практического применения мы написали программу fv.php, которую можно скачать из репозитория Emercoin:

Эта программа также является “референтной имплементацией” рассмотренных выше алгоритмов, и может быть использована в качестве практического примера для написания аналогичной программы или для интеграции системы FV в менеджеры пакетов или другие программы и сервисы.

Программа изначально написана для Linux/FreeBSD, но может быть запущена и из командной строки Windows, например в соответствии с инструкцией:

https://stackoverflow.com/questions/12870880/run-php-file-in-windows-command-prompt-cmd

После скачивания, в программе необходимо отредактировать URL для подключения к локальному кошельку, установив там актуальные параметры username/password/port:

$emcCONNECT = "http://user:secret_pass@localhost:6662";

Также, возможно, для Windows надо удалить первую строку файла, специфицирующую интерпретатор:

#!/usr/bin/php

Использование программы

Тестирование

Вначале, надо убедиться, что программа запускается без ошибок и корректно подсоединяется к кошельку Emercoin:

$ ./fv.php -getinfo

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

Проверка файла

Для этого надо запустить программу с единственным параметром - именем файла, и она проведёт весь процесс валидации.

$ ./fv.php ./emercoin-0.7.10-win64-setup.exe

File info from NVS:
    Emercoin core wallet, full node
    File: emercoin-0.7.10-win64-setup.exe
    Download: https://emercoin.com/en/for-coinholders#download

Validation results:
    emercoin/EMERCOIN [Emercoin File Validator] created 2020-08-20 05:08; Signature PASSED
    olegarch/OLEGARCH [Oleg Khovayko FV] created 2020-08-20 02:08; Signature PASSED

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

Генерация подписи валидатора

Для генерации подписи, Ваш кошелёк должен содержать NVS-запись валидатора, и быть полностью разблокированным.

Для генерации подписи, необходимо указать программе имя файла, и строку, содержащую имя валидатора и уровень доверия (насколько валидатор доверяет издателю файла). Второй параметр надо взять в кавычки, иначе интерпретатор командной строки будет интерпретировать символ “|” как shell pipe.

Пример запуска и результат:

$ ./fv.php ./emercoin-0.7.10-win64-setup.exe 'olegarch|100'

FV signature for upload to NVS FV-record:

NVS Key:
fv:sha256=169dc5dd293cd82f84737055403ae87a62008072d785376f56f6d309288a092a

Signature line:
SIG=olegarch|100|H32Bp3cLoqBFvlyUIIXLrKX3TD+IG2aX2dmegy4oIxGEWeKBw9YTITKWaFWM4UdejEgpH5em4Gi/ZfoZFU69Owk=

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