ZooBC ウィキ
トランザクション

トランザクションへの署名

署名は、アカウントの鍵の保有者がトランザクションをバイト単位で承認したことを証明します。ZooBC では、署名者が素のトランザクションに署名することは決してありません。チェーンの身元も対象にしたダイジェストに署名するため、その署名は 1 つのチェーンでしか有効ではありません。多くの鍵タイプのアカウントが、それぞれ元のチェーンの方式で署名できるため、Bitcoin、Ethereum、Solana の鍵で ZooBC のアカウントを直接管理できます。

署名されるもの

署名者は、署名を除くすべてのフィールドから成る未署名のエンベロープを取り、次のダイジェストに署名します。

digest = SHA3-256( "ZBC-TX" ‖ genesis block hash ‖ unsigned bytes )

"ZBC-TX" は ASCII のタグで、‖ は「〜に続けて」を意味します。受け入れられるのはこのチェーン束縛ダイジェストだけです。バージョン 3 のトランザクションでは、4 バイトの有効期限は未署名のバイト列の一部なので、他のすべてのフィールドと同じように署名されます。

署名の式:タグ ZBC-TX、ジェネシスハッシュ、未署名のバイト列の SHA3-256 が、鍵が署名するダイジェストになります。ジェネシスハッシュはチェーンごとに異なります
署名の式:タグ ZBC-TX、ジェネシスハッシュ、未署名のバイト列の SHA3-256 が、鍵が署名するダイジェストになります。ジェネシスハッシュはチェーンごとに異なります

ジェネシスブロックのハッシュはチェーンの身元です。ZooBC にはネットワーク ID のフィールドがありません。devnet、testnet、mainnet はそれぞれ独自のジェネシスハッシュを持つため、mainnet 用に作られた署名は、同じ鍵が 3 つすべてで資金を持っていても、devnet や testnet では検証に通りません。ノードは互いに接続する前にもジェネシスハッシュを比較します。これにより、誰かがあなたのトランザクションをあるチェーンから別のチェーンへコピーするチェーン間のリプレイが防がれます。チェーン束縛署名 を参照してください。

ハッシュと ID

署名されると、トランザクションはそのハッシュと ID で識別されます。

hash = SHA3-256( unsigned bytes ‖ signature )
id   = the first 8 bytes of the hash, read as a little-endian signed 64-bit integer

ノードはすでに確認済みの ID を拒否し、これによって同じチェーン上でのリプレイが防がれます。IssueToken トランザクションの ID は、それが作るトークンの ID でもあります(トークンの発行 を参照)。

署名できる鍵タイプ

アドレスはタイプ番号から始まり、そのタイプが署名の確認方法を決めます。

鍵タイプ(番号)署名方式
ZooBC(0)、Solana(11)Ed25519
Cardano(13)、Tezos(16)Ed25519。公開鍵は 98 バイトの署名フィールドで運ばれます
Bitcoin レガシー(1)、P2PKH(5)、P2SH でラップした P2WPKH(6)、P2WPKH(7)、Ripple(14)ダイジェストのダブル SHA-256 に対する secp256k1 ECDSA。公開鍵も運ばれます
Ethereum(4)、Tron(15)ダイジェストの Keccak-256 に対する secp256k1。鍵は 65 バイトの r‖s‖v 署名から復元されます
Bitcoin Taproot(9)BIP-340 Schnorr
Polkadot(12)sr25519

ECDSA の署名は low-s 形式でなければなりません。方式にかかわらず、すべての鍵が同じチェーン束縛ダイジェストに署名します。

署名できる鍵タイプとそれぞれの署名方式の表と、署名できないタイプの灰色の行
署名できる鍵タイプとそれぞれの署名方式の表と、署名できないタイプの灰色の行

決して署名できないアドレスタイプもあります。Empty(2)、Estonia eID(3、検証器がありません)、Bitcoin P2WSH スクリプト(8)、データセット(10)です。P2WSH アドレスは単一の鍵ではなくスクリプトを表し、データセットのアドレスは署名者ではなくデータを指します。システムのプール、アカウントグループ、マルチシグネチャ アカウントなどの鍵なしアカウントは鍵をまったく持たず、それぞれのルールを通じてのみ支出します。

外部のウォレットによる署名

外部のウォレットは、自分のチェーンのトランザクションに署名し、それを対応する ZooBC トランザクションの中にメッセージとして入れて運ばせることもできます。

  • Ethereum:アクセスリストが空の、レガシー、EIP-2930、または EIP-1559 のトランザクション
  • Solana:System の送金
  • Bitcoin:入力 1 つ、出力 1 つまたは 2 つ、手数料ゼロ

ノードは送信者、受取人、金額が ZooBC トランザクションと一致していることを確認し、同じ外部のペイロードは一度しか使えません。そのようなメッセージは最大 4,096 バイトまで保持できます。Ethereum 形式のアクセスについては MetaMask と Ethereum 形式のアクセス を参照してください。

その他の署名付きダイジェスト

同じチェーン束縛のパターンが、毎回独自のタグを使って、他の同意も対象にしています。

  • アドレスをグループにリンクすることと、グループの管理を引き継ぐこと("ZBC-GROUP-LINK" と "ZBC-GROUP-CONTROL")
  • ノードにプール内の保留中のトランザクションの取り消しを求めること("ZBC-CANCEL")
  • 複数当事者による エスクロー の共同署名

トランザクションではないチェーン外のメッセージは、Ed25519 鍵で SHA3-256("ZBC-MSG-v2" ‖ genesis hash ‖ message) として署名されます。署名付きメッセージと暗号化メッセージ を参照してください。

関連項目