Blocknet 付款中的加密備註

· 6 分鐘閱讀

每一筆 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 位元組的密文,並標示為已加密。金鑰來自發送方與接收方針對該輸出共享的秘密,因此只有他們兩人的錢包能打開。由於每則備註都會填充到完整長度,瀏覽器甚至看不出哪些輸出帶有備註。

備註會讓 Blocknet 交易變大嗎?

不會。無論你是否寫了備註,每個輸出本來就帶有一個 128 位元組的加密備註欄位。加上備註只是填入原本就存在的空間,所以附帶帳單號碼的付款與不附帶的同一筆付款大小完全相同,在鏈上看起來也一模一樣。

向 Blocknet ID 名稱付款時可以加備註嗎?

可以。把名稱填在地址的位置,把備註寫在金額後面,例如 send @rock 100 "invoice 1042"。錢包會解析名稱,顯示已驗證的地址、手續費與備註,然後請你確認。備註會針對該名稱所指向的錢包進行加密。