每一筆 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 透過
GET /api/wallet/history以memo_hex回傳每個收到的輸出的備註,可直接供訂單系統與帳單對帳。
文字備註會顯示在引號中。不是可列印文字的備註,例如以 hex: 發送的原始位元組,會以十六進位顯示。
如果某筆付款需要核實,發送方可以證明它。錢包的 prove <txid> 指令會顯示你送出的某筆付款的交易金鑰。任何人只要有這把金鑰、交易 ID 與接收方地址,就可以透過 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"。錢包會解析名稱,顯示已驗證的地址、手續費與備註,然後請你確認。備註會針對該名稱所指向的錢包進行加密。