Кожен платіж Blocknet може містити коротку зашифровану нотатку. Її можна використати для номера рахунку, посилання на замовлення чи повідомлення людині, якій ви платите, і прочитати її зможете лише ви двоє. У цьому посібнику показано, як додати мемо під час надсилання BNT, хто може його прочитати, чому мемо ніколи не виділяються в блокчейні і де знайти мемо, які ви отримали.
Що таке мемо в Blocknet?
Мемо в Blocknet — це 128-байтове зашифроване поле, прикріплене до кожного виходу транзакції. Воно вміщує до 124 байтів вашого тексту чи даних, наприклад номер рахунку або коротку нотатку. Воно шифрується секретом, спільним лише для відправника й отримувача, і доповнюється так, що порожнє мемо виглядає як заповнене.
Мемо є частиною самого формату транзакцій. Його має кожен вихід у блокчейні, зокрема виходи решти, що повертають монети у ваш власний гаманець. Це дає три корисні властивості:
- Приватність за замовчуванням. Вміст зашифровано для отримувача цього виходу. Ніхто інший не бачить, що ви написали.
- Фіксований розмір. Поле в блокчейні завжди має 128 байтів, хоч би що ви в нього записали.
- Завжди присутнє. Оскільки кожен вихід містить мемо, платіж із нотаткою виглядає точно так само, як платіж без неї.
Що можна записати в мемо?
Усе, що вміщається в 124 байти. Звичайний текст зберігається в UTF-8, тож латиницею це 124 літери, цифри й пробіли. Символи поза латинським алфавітом займають більше байтів: китайський ієрогліф займає три, тож мемо вміщує близько 41 ієрогліфа.
Поширені варіанти використання:
- Рахунки. Вкажіть у мемо номер рахунку, і отримувач платежу зможе зіставити його з потрібним рахунком, нічого не перепитуючи.
- Номери замовлень. Магазин чи сервіс може попросити клієнтів вказувати номер замовлення, а потім прочитати його прямо з вхідного платежу.
- Нотатки. «Оренда за листопад», «Дякую за допомогу» чи «Моя частка за вечерю» подорожують разом із монетами.
- Двійкові дані. Гаманець також приймає необроблені байти у вигляді hex для кодів, які генерує й читає програмне забезпечення.
Як додати мемо під час надсилання 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:. Гаманець декодує 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:, відображається як hex.
Якщо платіж колись доведеться підтвердити, відправник може це довести. Команда гаманця prove <txid> виводить ключ транзакції для надісланого вами платежу. Будь-хто, маючи цей ключ, ідентифікатор транзакції та адресу отримувача, може перевірити платіж через ендпоінт POST /api/verify-proof, для якого гаманець не потрібен. Він підтверджує транзакцію й показує виходи, які отримала ця адреса, їхні суми та мемо.
Заробіть BNT, які будете надсилати
Простий спосіб отримати перші BNT — намайнити їх. seine працює на вашому власному комп’ютері, налаштовується під час майнінгу й виплачує через bntpool.com прямо на вашу адресу або ваш @name. Посібник з майнінгу допоможе запустити його за кілька хвилин.
Поширені запитання
Якої довжини може бути мемо в Blocknet?
Мемо вміщує до 124 байтів. Звичайний текст зберігається в UTF-8, тож це 124 латинські літери, цифри чи розділові знаки або близько 41 китайського ієрогліфа по три байти кожен. Довше мемо гаманець зупиняє ще до створення транзакції й повідомляє про максимум у 124 байти.
Чи може оглядач блоків прочитати мемо Blocknet?
Ні. Оглядач показує поле мемо як 128 байтів шифротексту з позначкою «зашифровано». Ключ виводиться із секрету, спільного для відправника й отримувача цього виходу, тож відкрити мемо можуть лише їхні гаманці. Оскільки кожне мемо доповнюється до повного розміру, оглядач навіть не може визначити, які виходи містять нотатку.
Чи збільшує мемо розмір транзакції Blocknet?
Ні. Кожен вихід уже містить 128-байтове зашифроване поле мемо, незалежно від того, чи ви пишете нотатку, чи залишаєте його порожнім. Мемо лише заповнює місце, яке є в будь-якому разі, тож платіж із номером рахунку має точно такий самий розмір, як і той самий платіж без нього, і в блокчейні вони виглядають однаково.
Чи можна додати мемо під час оплати на ім'я Blocknet ID?
Так. Вкажіть ім'я замість адреси, а мемо після суми, наприклад send @rock 100 "invoice 1042". Гаманець знаходить адресу за іменем, показує перевірену адресу, комісію та мемо й просить підтвердження. Мемо шифрується для гаманця, на який вказує ім'я.