Каждый платёж Blocknet может нести короткую зашифрованную заметку. Её можно использовать для номера счёта, ссылки на заказ или сообщения тому, кому вы платите, и прочитать её можете только вы двое. Это руководство показывает, как добавить мемо при отправке BNT, кто может его прочитать, почему мемо никогда не выделяются в блокчейне и где найти полученные мемо.
Что такое мемо Blocknet?
Мемо Blocknet — это 128-байтовое зашифрованное поле, прикреплённое к каждому выходу транзакции. Оно вмещает до 124 байт вашего текста или данных, например номер счёта или короткую заметку. Оно шифруется секретом, который есть только у отправителя и получателя, и дополняется так, что пустое мемо выглядит как заполненное.
Мемо — часть самого формата транзакции. Оно есть у каждого выхода в блокчейне, включая выходы сдачи, которые возвращают монеты в ваш собственный кошелёк. Это даёт три полезных свойства:
- Приватно по умолчанию. Содержимое зашифровано для получателя этого выхода. Никто другой не видит, что вы написали.
- Фиксированный размер. В блокчейне поле всегда занимает 128 байт, что бы вы в него ни положили.
- Всегда присутствует. Поскольку мемо есть у каждого выхода, платёж с заметкой выглядит точно так же, как платёж без неё.
Что можно указать в мемо?
Всё, что помещается в 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-байтовую маску, а затем объединяет маску с мемо. Каждый выход получает свою маску, поэтому два мемо в одной транзакции шифруются отдельно.
Кошелёк получателя находит тот же секрет с другой стороны с помощью своего приватного ключа просмотра, когда сканирует каждый блок. Он расшифровывает мемо и сохраняет его вместе с платежом. На вашей стороне кошелёк хранит написанные вами мемо в истории отправок.
Два момента, которые стоит знать:
- Кошелёк только для просмотра тоже показывает мемо. Входящие платежи читает именно ваш приватный ключ просмотра, поэтому кошелёк только для просмотра, созданный из него, видит сумму и мемо каждого платежа. Делитесь этим ключом только с теми, кому готовы показать свои входящие платежи.
- Награды за майнинг несут пустые мемо. Консенсус требует, чтобы мемо в каждой награде за блок было пустым, поэтому coinbase-выходы в блокчейне никогда нельзя использовать как публичный канал сообщений.
Почему каждое мемо в блокчейне выглядит одинаково
Мемо, по которому видна его длина, выдавало бы лишнее. Заметка в 30 байт выглядит иначе, чем в 100 байт, а пустое мемо выделялось бы на фоне обеих. Кошелёк Blocknet закрывает эту брешь фиксированной структурой и случайным заполнением.
Перед шифрованием кошелёк упаковывает мемо в 128-байтовый конверт:
| Байты | Содержимое |
|---|---|
| 1 | Версия конверта |
| 1 | Длина вашего мемо |
| 2 | Контрольная сумма мемо |
| от 0 до 124 | Ваше мемо |
| Остальное | Случайное заполнение |
Заполнение берётся из криптографического генератора случайных чисел системы, поэтому неиспользованное место непредсказуемо. После шифрования короткая заметка, полная заметка и пустое мемо — это одинаковые 128 байт случайных на вид данных. Выходы сдачи получают собственное пустое дополненное мемо, поэтому даже монеты, которые вы отправляете обратно себе, не выделяются.
Контрольная сумма позволяет кошельку получателя убедиться, что мемо расшифровано правильно, прежде чем его показать. Ноды также отклоняют любой блок с выходом, у которого поле мемо полностью состоит из нулей, поэтому каждый выход в блокчейне несёт правильно заполненное мемо.
Где найти полученные мемо
Консольный кошелёк показывает мемо везде, где выводит платежи:
historyпоказывает входящие и исходящие платежи со строкойmemo:под каждым платежом, в котором оно было.outputs tx <txid>показывает каждый выход вашего кошелька в этой транзакции, включая мемо.outputs <n>делает то же для одного выхода из списка.- API кошелька возвращает мемо каждого полученного выхода как
memo_hexизGET /api/wallet/history, готовое к сопоставлению со счетами в системе заказов.
Текстовые мемо отображаются в кавычках. Мемо, которое не является печатаемым текстом, например сырые байты, отправленные с 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". Кошелёк найдёт адрес по имени, покажет проверенный адрес, комиссию и мемо и попросит подтверждения. Мемо шифруется для кошелька, на который указывает имя.