署名付きメッセージと暗号化メッセージ
すべての署名にトランザクションが必要なわけではありません。署名付きメッセージは、お金を動かさず、手数料も支払わずに、鍵を持っていることを証明します。暗号化メッセージは、受取人だけがそれを読めるようにします。このページではその両方と、ノード API が受け付ける 2 つの関連する署名を扱います。
アドレスを管理していることの証明
あなたが ZooBC のアドレスを管理していることを知りたいウェブサイトは、ランダムなチャレンジを送ってきます。あなたはそれに zbc-cli sign-message、または公開の コマンドラインツール のどの移植版でも同じ関数で署名し、サイトはその署名をあなたのアドレスと照合します。ネイティブの ZBC_ アドレスでは、アドレスが公開鍵そのものなので、他には何も要りません。支払いを送ることでも管理を証明できますが、それはトランザクションであり、手数料がかかります。代わりに秘密鍵を誰かに渡すことは決してしないでください。
この方式は ZBC-MSG-v2 と呼ばれます。Ed25519 で次のものに署名します。
SHA3-256("ZBC-MSG-v2" ‖ genesis hash ‖ message)
このダイジェストの 2 つの部分が重要です。
- タグ。 トランザクションは別のタグ "ZBC-TX" で署名されます。したがって、メッセージの署名がトランザクションとして有効になることも、トランザクションの署名がメッセージとして有効になることも決してありません。
- ジェネシスハッシュ。 これが署名を 1 つのネットワークに結び付けます。devnet 用に署名されたメッセージが testnet や mainnet で検証に通ることは決してありません(チェーン束縛署名)。
移行期間のあいだ、ツールの verify-message は、チェーンを含まない古い形式 ZBC-MSG-v1("ZBC-MSG" とメッセージの SHA3-256)も受け付けます。この期間はツールに定められた期限の時刻に終わり、その後は ZBC-MSG-v2 だけが検証を通ります。
メッセージの署名は、公開ツールとそれを採用するサービスの約束事であって、チェーンの機能ではありません。チェーン上には何も保存されず、ノードにはそのためのエンドポイントもありません。
暗号化メッセージ
すべてのトランザクションはメッセージを運ぶことができます(トランザクションのエンベロープ)。平文のメッセージは最大 256 バイトです。暗号化されたメッセージは "ZBE1" という印で始まり、その後に受取人の鍵宛ての libsodium の sealed box が続き、それを開けられるのは受取人の秘密鍵だけです。暗号化されたメッセージは最大 320 バイトで、テキストには最大 268 バイトが残ります。
暗号化されるのはメッセージだけです。送信者、受取人、金額など、トランザクションのそれ以外の部分は、他のどのトランザクションとも同じように公開されたままです。
署名付きの API リクエスト
ノード API のほとんどは開かれた読み取りで、トランザクションは自分の署名を運ぶため API キーを必要としません。リクエスト自体に署名が必要な場合、その署名はテキスト METHOD:PATH:TIMESTAMP:BODY に対する Ed25519 署名で、300 秒間有効です。5 分以内に署名付きの認証に 20 回失敗したクライアントは、300 秒間締め出されます。
保留中のトランザクションの取り消し
ノードのプールで待っているトランザクションは、DELETE /api/v1/transactions/pending/ にそのハッシュを続けたリクエストで、そのノードから取り下げることができます。リクエストは次のものに対する署名を運びます。
SHA3-256("ZBC-CANCEL" ‖ genesis hash ‖ transaction hash)
これが取り除くのは、そのノードのプールにあるコピーだけです。すでにそのトランザクションを持っている他のノードがそれをブロックに取り込むこともあるため、取り消しは保証ではなく要求です。