Blocknet の送金にはすべて、短い暗号化メッセージを付けられます。請求書番号、注文番号、支払い相手へのメッセージなどに使え、読めるのはあなたと相手の 2 人だけです。このガイドでは、BNT を送るときのメモの付け方、メモを読めるのは誰か、メモがチェーン上で決して目立たない理由、受け取ったメモの確認場所を説明します。
Blocknet のメモとは何ですか?
Blocknet のメモは、すべてのトランザクションアウトプットに付いている 128 バイトの暗号化フィールドです。請求書番号や短いメッセージなど、自分のテキストやデータを最大 124 バイトまで入れられます。送信者と受信者だけが共有する秘密で暗号化され、空のメモも満杯のメモと同じに見えるようパディングされます。
メモはトランザクション形式そのものの一部です。チェーン上のすべてのアウトプットにメモがあり、コインを自分のウォレットへ戻すおつりのアウトプットも例外ではありません。そのため、次の 3 つの便利な特性があります。
- デフォルトでプライベート。 内容はそのアウトプットの受信者向けに暗号化されます。書いた内容はほかの誰にも見えません。
- 固定サイズ。 何を入れても、チェーン上のフィールドは常に 128 バイトです。
- 常に存在する。 すべてのアウトプットがメモを持つため、メッセージ付きの送金はメッセージなしの送金とまったく同じに見えます。
メモには何を入れられますか?
124 バイトに収まるものなら何でも入れられます。プレーンテキストは UTF-8 で保存されるので、英語なら文字、数字、スペースで 124 文字です。ラテン文字以外の文字はより多くのバイトを使います。日本語の漢字やかなは 1 文字 3 バイトなので、メモには約 41 文字入ります。
よくある使い方:
- 請求書。 請求書番号をメモに入れておけば、受け取った人は問い合わせなくても正しい請求と照合できます。
- 注文番号。 ショップやサービスはお客様に注文番号を入れてもらい、届いた送金から直接読み取れます。
- メッセージ。 「11 月分の家賃」「手伝ってくれてありがとう」「夕食の割り勘」といったメッセージがコインと一緒に届きます。
- バイナリデータ。 ウォレットは 16 進数で書いた生のバイト列も受け付けるので、ソフトウェアが生成して読み取る参照コードにも使えます。
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: を付けます。ウォレットが 16 進数をデコードし、そのバイト列を暗号化します。
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 のメモを読めるのは誰ですか?
送信者と受信者です。各メモは、そのアウトプットについて 2 つのウォレットが共有する秘密で暗号化されます。これは受信者の使い捨てステルスアドレスを作るのと同じ秘密です。ノード運営者やブロックエクスプローラーを含むほかの人には、ランダムに見える 128 バイトのデータしか見えず、メッセージが入っているかどうかもわかりません。
ウォレットは送金を作るとき、新しいランダムなトランザクション鍵と受信者の公開ビューキーを組み合わせて共有秘密を得ます。この秘密が受信者の使い捨てステルスアドレスを作り、ウォレットはそれをメモの暗号化にも使います。秘密を、トランザクション内でのアウトプットの位置とネットワークの識別子と一緒に SHA3-256 でハッシュして 128 バイトのマスクを作り、そのマスクをメモと組み合わせます。アウトプットごとに専用のマスクが作られるので、同じトランザクション内の 2 つのメモは別々に暗号化されます。
受信者のウォレットは、各ブロックをスキャンする際に秘密ビューキーを使って反対側から同じ秘密を求めます。そしてメモを復号し、送金と一緒に保存します。送信側では、ウォレットが書いたメモを送金履歴に保存します。
知っておくとよい点が 2 つあります。
- 閲覧専用ウォレットでもメモが見えます。 受け取った送金を読むのは秘密ビューキーなので、それから作った閲覧専用ウォレットでは各送金の金額とメモが見えます。この鍵は、受け取った送金を見せてもよい相手にだけ共有してください。
- マイニング報酬のメモは空です。 コンセンサスにより、すべてのブロック報酬のメモは空でなければならないので、チェーンのコインベースアウトプットが公開メッセージの手段として使われることはありません。
チェーン上ですべてのメモが同じに見える理由
メモの長さがわかれば、それ自体が情報になります。30 バイトのメッセージは 100 バイトのものとは違って見え、空のメモはそのどちらとも違って目立ってしまいます。Blocknet のウォレットは、固定レイアウトとランダムなパディングでこの差をなくしています。
ウォレットは暗号化の前に、メモを 128 バイトのエンベロープに詰めます。
| バイト数 | 内容 |
|---|---|
| 1 | エンベロープのバージョン |
| 1 | メモの長さ |
| 2 | メモのチェックサム |
| 0〜124 | あなたのメモ |
| 残り | ランダムなパディング |
パディングはシステムの暗号論的乱数生成器から作られるので、未使用の領域は予測できません。暗号化後は、短いメッセージも、満杯のメッセージも、空のメモも、すべてランダムに見える 128 バイトのデータになります。おつりのアウトプットにも空のパディング済みメモが付くので、自分宛てに戻すコインも同じように紛れ込みます。
チェックサムにより、受信者のウォレットはメモを表示する前に正しく復号できたことを確認できます。また、ノードはメモ欄がすべてゼロのアウトプットを含むブロックを拒否するので、チェーン上のすべてのアウトプットには正しく埋められたメモが付いています。
受け取ったメモの確認場所
コマンドライン版ウォレットは、送金を一覧表示するところならどこでもメモを表示します。
historyは受け取った送金と送った送金を一覧表示し、メモ付きの送金には下にmemo:の行を表示します。outputs tx <txid>は、そのトランザクション内でウォレットが所有するすべてのアウトプットをメモ付きで表示します。outputs <n>は、一覧の中の 1 つのアウトプットについて同じことを行います。- ウォレット API は、
GET /api/wallet/historyで受け取った各アウトプットのメモをmemo_hexとして返すので、注文システムで請求書と照合できます。
テキストのメモは引用符付きで表示されます。hex: で送った生のバイト列など、表示可能なテキストでないメモは 16 進数で表示されます。
送金について確認が必要になった場合は、送信者が証明できます。ウォレットの prove <txid> コマンドは、送った送金のトランザクション鍵を表示します。その鍵、トランザクション ID、受信者のアドレスがあれば、誰でもウォレット不要の POST /api/verify-proof エンドポイントで送金を確認できます。このエンドポイントはトランザクションを確認し、そのアドレスが受け取ったアウトプットと、その金額とメモを表示します。
送る BNT をマイニングで手に入れる
最初の BNT を手に入れる簡単な方法は、マイニングすることです。seine は自分のコンピューターで動き、マイニングしながら自動で調整します。報酬は bntpool.com からアドレスまたは @name へ直接支払われます。マイニングガイドを読めば数分で始められます。
よくある質問
Blocknet のメモはどれくらいの長さまで書けますか?
メモには最大 124 バイトまで入ります。プレーンテキストは UTF-8 で保存されるので、英語なら文字、数字、記号で 124 文字、日本語の漢字やかなは 1 文字 3 バイトなので約 41 文字です。それより長いメモは、ウォレットがトランザクションを作る前に止め、上限が 124 バイトであることを表示します。
ブロックエクスプローラーで Blocknet のメモを読めますか?
いいえ。エクスプローラーではメモ欄は暗号化済みとされた 128 バイトの暗号文として表示されます。鍵はそのアウトプットについて送信者と受信者が共有する秘密から作られるので、開けるのは 2 人のウォレットだけです。すべてのメモが最大サイズまでパディングされるため、エクスプローラーにはどのアウトプットにメッセージが入っているかさえわかりません。
メモを付けると Blocknet のトランザクションは大きくなりますか?
いいえ。すべてのアウトプットには、メッセージを書いても空のままでも、もともと 128 バイトの暗号化メモ欄があります。メモを付けてもすでにある領域を埋めるだけなので、請求書番号付きの送金と番号なしの同じ送金はまったく同じサイズで、チェーン上では見分けがつきません。
Blocknet ID の名前宛てに送金するときもメモを付けられますか?
はい。アドレスの位置に名前を、金額の後にメモを書きます。たとえば send @rock 100 "invoice 1042" です。ウォレットが名前を解決し、検証済みのアドレス、手数料、メモを表示して確認を求めます。メモはその名前が指すウォレット向けに暗号化されます。