Зашифрованные мемо в платежах Blocknet

· 5 мин чтения

Каждый платёж Blocknet может нести короткую зашифрованную заметку. Её можно использовать для номера счёта, ссылки на заказ или сообщения тому, кому вы платите, и прочитать её можете только вы двое. Это руководство показывает, как добавить мемо при отправке BNT, кто может его прочитать, почему мемо никогда не выделяются в блокчейне и где найти полученные мемо.

Что такое мемо Blocknet?

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

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

Что можно указать в мемо?

Всё, что помещается в 124 байта. Обычный текст хранится в UTF-8, поэтому в латинице это 124 буквы, цифры и пробелы. Символы за пределами латинского алфавита занимают больше байт: китайский иероглиф занимает три, поэтому в мемо помещается около 41 иероглифа.

Типичные применения:

Как добавить мемо при отправке BNT?

Краткий ответ

В консольном кошельке введите мемо после суммы: send @rock 100 “invoice 1042”. Кошелёк покажет мемо на экране подтверждения рядом с комиссией, зашифрует его для получателя и отправит платёж, как только вы подтвердите. Сырые байты тоже работают, с префиксом hex:.

Команда кошелька send принимает мемо необязательным последним аргументом:

send <address> <amount> [memo|hex:<memo_hex>]

Мемо может содержать пробелы, а кавычки вокруг него необязательны. Кошелёк убирает парные кавычки, прежде чем зашифровать текст. Вот платёж на имя Blocknet ID с номером счёта:

> send @rock 100 "invoice 1042"
  Resolved @rock -> <address> ✓ verified

# Send
  Building transaction...

  Send 100 BNT to @rock?
  Fee:     <fee>
  Address: <address>
  Memo:    "invoice 1042"
  Confirm [y/N]: y

На шаге подтверждения видно мемо, которое прочитает получатель, так что вы можете проверить его до отправки. Если мемо длиннее 124 байт, кошелёк останавливается ещё до сборки транзакции с сообщением memo too long: max 124 bytes, и вы можете сократить его и попробовать снова.

Чтобы отправить сырые байты, добавьте к мемо префикс hex:. Кошелёк декодирует шестнадцатеричную запись и зашифрует байты:

send @rock 100 hex:494e562d31303432

Платёжные ссылки тоже могут содержать мемо. Когда вы вставляете в кошелёк ссылку blocknet:// или bntpay.com, он заполняет адрес, сумму и мемо, которые остаётся подтвердить, так что получатель платежа может заранее задать номер счёта. Подробнее об именах и ссылках — в руководстве по Blocknet ID.

Мемо из вашей собственной программы

API кошелька принимает мемо для каждого получателя отправки. В запросе к POST /api/wallet/send укажите для каждого получателя либо memo_text для обычного текста, либо memo_hex для сырых байт:

{
  "recipients": [
    { "address": "@rock", "amount": 10000000000, "memo_text": "invoice 1042" },
    { "address": "$shop", "amount": 2500000000, "memo_hex": "4f524445522d3737" }
  ]
}

Суммы здесь указаны в атомарных единицах, где 1 BNT — это 100 000 000 единиц, поэтому пример отправляет 100 BNT и 25 BNT. Каждый получатель получает своё мемо, зашифрованное только для его кошелька. Действует тот же максимум в 124 байта.

Кто может прочитать мемо Blocknet?

Краткий ответ

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

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

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

Два момента, которые стоит знать:

Почему каждое мемо в блокчейне выглядит одинаково

Мемо, по которому видна его длина, выдавало бы лишнее. Заметка в 30 байт выглядит иначе, чем в 100 байт, а пустое мемо выделялось бы на фоне обеих. Кошелёк Blocknet закрывает эту брешь фиксированной структурой и случайным заполнением.

Перед шифрованием кошелёк упаковывает мемо в 128-байтовый конверт:

Байты Содержимое
1 Версия конверта
1 Длина вашего мемо
2 Контрольная сумма мемо
от 0 до 124 Ваше мемо
Остальное Случайное заполнение

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

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

Где найти полученные мемо

Консольный кошелёк показывает мемо везде, где выводит платежи:

Текстовые мемо отображаются в кавычках. Мемо, которое не является печатаемым текстом, например сырые байты, отправленные с hex:, отображается в шестнадцатеричном виде.

Если платёж когда-нибудь потребуется подтвердить, отправитель может это доказать. Команда кошелька prove <txid> выводит ключ транзакции для отправленного вами платежа. Любой, у кого есть этот ключ, ID транзакции и адрес получателя, может проверить платёж через эндпоинт POST /api/verify-proof, для которого кошелёк не нужен. Он подтверждает транзакцию и показывает выходы, полученные этим адресом, их суммы и мемо.

Заработайте BNT, которые будете отправлять

Простой способ получить первые BNT — намайнить их. seine работает на вашем компьютере, сам настраивается во время майнинга и выплачивает через bntpool.com прямо на ваш адрес или ваш @name. Руководство по майнингу поможет запустить его за несколько минут.

Часто задаваемые вопросы

Какой длины может быть мемо Blocknet?

Мемо вмещает до 124 байт. Обычный текст хранится в UTF-8, поэтому это 124 латинские буквы, цифры или знаки препинания, или около 41 китайского иероглифа по три байта каждый. Кошелёк останавливает более длинное мемо ещё до сборки транзакции и сообщает о максимуме в 124 байта.

Может ли обозреватель блоков прочитать мемо Blocknet?

Нет. Обозреватель показывает поле мемо как 128 байт шифротекста с пометкой encrypted. Ключ получается из секрета, общего для отправителя и получателя этого выхода, поэтому открыть его могут только их кошельки. Поскольку каждое мемо дополняется до полного размера, обозреватель не может даже понять, в каких выходах есть заметка.

Увеличивает ли мемо размер транзакции Blocknet?

Нет. Каждый выход и так содержит 128-байтовое поле зашифрованного мемо, напишете вы заметку или оставите его пустым. Мемо заполняет место, которое есть в любом случае, поэтому платёж с номером счёта ровно такого же размера, как тот же платёж без него, и в блокчейне они выглядят одинаково.

Можно ли добавить мемо при оплате на имя Blocknet ID?

Да. Укажите имя на месте адреса, а мемо после суммы, например send @rock 100 "invoice 1042". Кошелёк найдёт адрес по имени, покажет проверенный адрес, комиссию и мемо и попросит подтверждения. Мемо шифруется для кошелька, на который указывает имя.