+ + + +
+ + + + + +
+ +
+

Tapyrus Signerノードセットアップ方法 +

+ + + +
+ + +
+ +

この記事ではTapyrus Signerノードをセットアップする方法を解説します。 +公式ドキュメントはこちらです。

+ +

前提

+

本記事で使用するTapyus Signerの参照実装はrustで実装されているため、事前にrustの実行環境を準備してください。

+ +

Signer Networkの構成

+

本記事では3名のSignerノードによるSigner Networkの構築方法を解説します。 +各ノードは以下のように名付けます。

+
    +
  • Alice
  • +
  • Bob
  • +
  • Carol
  • +
+ +

Signerノードの数は、3名以上であれば上限はありません。 +また、本記事では閾値を2に設定します。 +ターミナルで3つのタブを開き、それぞれのタブで各Signerノードのコマンドを実行します。

+ +

全体の流れ

+ + +

Step1. インストール

+ +

(インストール方法1) ビルド済みのバイナリの利用

+

バイナリを用いたインストール方法を解説します。

+ +

tapyrus-signerリポジトリのReleaseでバイナリを配布しています。
+使用環境に応じたバイナリファイルをクリックし、ダウンロードします。 +Tapyrus Signer Binary   +本記事執筆時点(2022年8月)で公開されている最新バーションがv0.4.0なため、以下のコマンドはx86_64のv0.4.0の圧縮ファイルを解凍する例です。

+
$ tar xzf tapyrus-signer-v0.4.0-x86_64-px-linux-gnu.tar.gz
+
+

解凍したあとのbin以下にパスを通してください。

+ +

以上でインストールは完了です。
+次に、Step2. キーペアの作成を実施してください。

+ +

(インストール方法2) ソースコードからのビルド

+ +

Githubに公開されているtapyrus-signerのソースコードを用いたインストール方法を解説します。

+ +

ソースコードをcloneし、ディレクトリを移動してビルドを実行します。その後、bin以下にパスを通します。

+
$ git clone https://github.com/chaintope/tapyrus-signer.git
+$ cd tapyrus-signer
+$ cargo build --release\
+$ sudo cp target/release/tapyrus-setup /usr/bin/
+
+ +

次に、Step2. キーペアの作成を実施してください。

+ +

tapyrus-setupについて

+

Signerのセットアップには、tapyrus-setupコマンドを実行します。 +tapyrus-setupでは、以下のような構成でコマンドを実行します。

+
$ tapyrus-setup [subcommands] <options>
+
+

tapyrus-setupの各コマンドの詳細はtapyrus-setup -hで確認できます。

+ +

Step2. キーペアの作成

+

まずはsecp256k1楕円曲線に基づく秘密鍵、公開鍵のキーペアを作成します。 +キーペアの生成にはcreatekeyコマンドを使用します。 +WIF形式の秘密鍵と公開鍵のHex値が出力されます。以下をAlice, Bob, Carolのそれぞれで実行してください。

+
$ tapyrus-setup createkey
+<秘密鍵> <公開鍵>
+
+ +
入出力例
+ +
$ tapyrus-setup createkey
+> L3CUPgEmeHP1uMGC6q4cpuwpZvRCVWR3NegG3cE4ZBy9EY4osWCX 0244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b44342
+
+ +

Step3. ノードVSSの生成

+

ノードVSSを生成します。

+ +

入力

+

ノードVSSの生成にはcreatenodevssコマンドを使用します。

+
    +
  • --public-keyオプションにStep2で生成したそれぞれのSignerの公開鍵を指定します。
  • +
  • --private-keyオプションにはコマンドを実行するSignerノードの秘密鍵を指定します。
  • +
  • --thresholdにはブロックの署名生成に必要な署名数の閾値を指定します。本記事では閾値に2を指定します。 +
    $ tapyrus-setup createnodevss \
    +--public-key=<Aliceの公開鍵> --public-key=<Bobの公開鍵> --public-key=<Carolの公開鍵> \
    +--private-key=<コマンド実行者の秘密鍵> \
    +--threshold=<閾値>
    +
    +
  • +
+ +

このコマンドをAlice, Bob, Carolのそれぞれで実行します。

+ +

出力

+

コマンドを実行すると、各公開鍵に対応したノードVSSが出力されます。

+
<Aliceの公開鍵>:<AliceのノードVSS>
+<Bobの公開鍵>:<BobのノードVSS>
+<Carolの公開鍵>:<CarolのノードVSS>
+
+ +
入出力例
+ +
$ tapyrus-setup createnodevss \
+  --public-key=0244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b44342 \
+  --public-key=0344e060779264b530897dadd8f8190b0b4ae09d640ecfeaf60105145c7f7f9868 \
+  --public-key=02a274ba5e6da6a5bea692754f32c9cf184392daaba66d3bbec421fbceef25ed48 \
+  --private-key=L3CUPgEmeHP1uMGC6q4cpuwpZvRCVWR3NegG3cE4ZBy9EY4osWCX \
+  --threshold=2
+> 0244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b44342:0244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b443420244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b44342000244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b44342ae46a2f969561b55c6c1f9d0b5cd5a22f3cf10b7e58c367a0ed7fd4639d036c2f31e34dad1e7976521a5f34ca3801c4f6f12ed28d91fb0f8b89e70a1bd1449e560b5883b8e1c16b9451973cf9ee0ea5ab5f658071c7a51e3b817ca432aa30f44aa5056922ebd35e57ee6d22c9d8354b3d2258b1d4128d31db7a652720782faa444b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b44342ae46a2f969561b55c6c1f9d0b5cd5a22f3cf10b7e58c367a0ed7fd4639d036c2f31e34dad1e7976521a5f34ca3801c4f6f12ed28d91fb0f8b89e70a1bd1449e560b5883b8e1c16b9451973cf9ee0ea5ab5f658071c7a51e3b817ca432aa30f44aa5056922ebd35e57ee6d22c9d8354b3d2258b1d4128d31db7a652720782faa4
+> 02a274ba5e6da6a5bea692754f32c9cf184392daaba66d3bbec421fbceef25ed48:0244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b4434202a274ba5e6da6a5bea692754f32c9cf184392daaba66d3bbec421fbceef25ed48000244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b44342ae46a2f969561b55c6c1f9d0b5cd5a22f3cf10b7e58c367a0ed7fd4639d036c2f31e34dad1e7976521a5f34ca3801c4f6f12ed28d91fb0f8b89e70a1bd1449e560b5883b8e1c16b9451973cf9ee0ea5ab5f658071c7a51e3b817ca432aa30f44a23d730e5f3d48bc68739bfc6c4cf86df273d5b821eb3abc9859f558ddf5e02e44b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b44342ae46a2f969561b55c6c1f9d0b5cd5a22f3cf10b7e58c367a0ed7fd4639d036c2f31e34dad1e7976521a5f34ca3801c4f6f12ed28d91fb0f8b89e70a1bd1449e560b5883b8e1c16b9451973cf9ee0ea5ab5f658071c7a51e3b817ca432aa30f44a23d730e5f3d48bc68739bfc6c4cf86df273d5b821eb3abc9859f558ddf5e02e
+> 0344e060779264b530897dadd8f8190b0b4ae09d640ecfeaf60105145c7f7f9868:0244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b443420344e060779264b530897dadd8f8190b0b4ae09d640ecfeaf60105145c7f7f9868000244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b44342ae46a2f969561b55c6c1f9d0b5cd5a22f3cf10b7e58c367a0ed7fd4639d036c2f31e34dad1e7976521a5f34ca3801c4f6f12ed28d91fb0f8b89e70a1bd1449e560b5883b8e1c16b9451973cf9ee0ea5ab5f658071c7a51e3b817ca432aa30f449a2a8f8a8fbd5b93520065cc3b169c2812c2205302ada25b790d983fb468c5b844b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b44342ae46a2f969561b55c6c1f9d0b5cd5a22f3cf10b7e58c367a0ed7fd4639d036c2f31e34dad1e7976521a5f34ca3801c4f6f12ed28d91fb0f8b89e70a1bd1449e560b5883b8e1c16b9451973cf9ee0ea5ab5f658071c7a51e3b817ca432aa30f449a2a8f8a8fbd5b93520065cc3b169c2812c2205302ada25b790d983fb468c5b8
+
+ +

Step4. 集約公開回鍵の生成

+

Step3で生成したノードVSSを元に集約公開鍵とノードの秘密シェアを生成します。

+ +

入力

+

引数に--vss--private-keyを指定してaggregateコマンドを実行します。

+
    +
  • --private-keyにはコマンドを実行するSignerノードの秘密鍵を指定します。
  • +
  • --vssオプションにStep3のノードVSSの生成で生成した、各SignerノードのノードVSSをそれぞれ指定します。 +
    $ tapyrus-setup aggregate \
    +--vss=<Aliceが生成したコマンド実行者のノードVSS> --vss=<Bobが生成したコマンド実行者のノードVSS> --vss=<Carolが生成したコマンド実行者のノードVSS> \
    +--private-key=<コマンド実行者の秘密鍵>
    +
    +
  • +
+ +

このコマンドをAlice, Bob, Carolのそれぞれで実行します。

+ +

出力

+

コマンドを実行すると集約公開鍵とノードの秘密シェアが出力されます。

+ +
 <集約公開鍵> <ノードの秘密シェア>
+
+ +
入出力例
+ +
$ tapyrus-setup aggregate \
+  --vss=0244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b443420244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b44342000244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b44342ae46a2f969561b55c6c1f9d0b5cd5a22f3cf10b7e58c367a0ed7fd4639d036c2f31e34dad1e7976521a5f34ca3801c4f6f12ed28d91fb0f8b89e70a1bd1449e560b5883b8e1c16b9451973cf9ee0ea5ab5f658071c7a51e3b817ca432aa30f44aa5056922ebd35e57ee6d22c9d8354b3d2258b1d4128d31db7a652720782faa444b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b44342ae46a2f969561b55c6c1f9d0b5cd5a22f3cf10b7e58c367a0ed7fd4639d036c2f31e34dad1e7976521a5f34ca3801c4f6f12ed28d91fb0f8b89e70a1bd1449e560b5883b8e1c16b9451973cf9ee0ea5ab5f658071c7a51e3b817ca432aa30f44aa5056922ebd35e57ee6d22c9d8354b3d2258b1d4128d31db7a652720782faa4 \
+  --vss=0244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b443420244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b44342000244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b44342ae46a2f969561b55c6c1f9d0b5cd5a22f3cf10b7e58c367a0ed7fd4639d036c2f31e34dad1e7976521a5f34ca3801c4f6f12ed28d91fb0f8b89e70a1bd1449e560b5883b8e1c16b9451973cf9ee0ea5ab5f658071c7a51e3b817ca432aa30f44aa5056922ebd35e57ee6d22c9d8354b3d2258b1d4128d31db7a652720782faa444b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b44342ae46a2f969561b55c6c1f9d0b5cd5a22f3cf10b7e58c367a0ed7fd4639d036c2f31e34dad1e7976521a5f34ca3801c4f6f12ed28d91fb0f8b89e70a1bd1449e560b5883b8e1c16b9451973cf9ee0ea5ab5f658071c7a51e3b817ca432aa30f44aa5056922ebd35e57ee6d22c9d8354b3d2258b1d4128d31db7a652720782faa4 \
+  --vss=0244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b443420244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b44342000244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b44342ae46a2f969561b55c6c1f9d0b5cd5a22f3cf10b7e58c367a0ed7fd4639d036c2f31e34dad1e7976521a5f34ca3801c4f6f12ed28d91fb0f8b89e70a1bd1449e560b5883b8e1c16b9451973cf9ee0ea5ab5f658071c7a51e3b817ca432aa30f44aa5056922ebd35e57ee6d22c9d8354b3d2258b1d4128d31db7a652720782faa444b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b44342ae46a2f969561b55c6c1f9d0b5cd5a22f3cf10b7e58c367a0ed7fd4639d036c2f31e34dad1e7976521a5f34ca3801c4f6f12ed28d91fb0f8b89e70a1bd1449e560b5883b8e1c16b9451973cf9ee0ea5ab5f658071c7a51e3b817ca432aa30f44aa5056922ebd35e57ee6d22c9d8354b3d2258b1d4128d31db7a652720782faa4 \
+  --private-key=L3CUPgEmeHP1uMGC6q4cpuwpZvRCVWR3NegG3cE4ZBy9EY4osWCX
+> 02b45d04c7fabe51857c3d4dfb34f2aece4cc58c9d3a43ecc8517ac38bf9598bb9 58b72dffcc114db48291d10a611e13546b4f444bccf234bc132a63b88c9b34c1
+
+ +

Step5. genesisブロックの生成

+

genesisブロックの生成を行います。
+genesisブロックの生成にはtapyrus-coretapyrus-genesisコマンドを使用します。 +以下のようなオプションが指定可能です。

+
    +
  • -signblockpubkey(文字列, 必須): Step4で生成した集約公開鍵を指定します。
  • +
  • -address(文字列, 任意): ブロック報酬を受け取るアドレスを指定することができます。
  • +
  • -time(数値, 任意): genesisブロックのUNIX時間を設定できます。指定しない場合、現在時刻が設定されます。 +今回は-signblockpubkeyのみを指定します。 +
    $ tapyrus-genesis -signblockpubkey=<集約公開鍵>
    +
    +
  • +
+ +
入出力例
+
$ tapyrus-genesis -signblockpubkey=02b45d04c7fabe51857c3d4dfb34f2aece4cc58c9d3a43ecc8517ac38bf9598bb9
+> 010000000000000000000000000000000000000000000000000000000000000000000000c30fc7bfabe904aecc6db258736b0f52150a43aa3b09bf27fdcb12677684003013c741355a4217988fca4948326a9e737c9899eb7958f3081c1f8e40b18db4c18046d762012102b45d04c7fabe51857c3d4dfb34f2aece4cc58c9d3a43ecc8517ac38bf9598bb90001010000000100000000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100f2052a010000001976a914a02d5bb5a1be6b923adf53d079b6e9ede53e4ef988ac00000000
+
+ +

Step6. ブロックVSSの生成

+

ブロックVSSを生成します。

+ +

入力

+

ブロックVSSの生成にはcreateblockvssを指定します。

+
    +
  • --public-keyオプションにそれぞれのSignerの公開鍵を指定します。
  • +
  • --private-keyオプションにはコマンドを実行者の秘密鍵を指定します。
  • +
  • --thresholdオプションで閾値を指定します。本記事では閾値には2を指定します。 +
    $ tapyrus-setup createblockvss \
    +--public-key=<Aliceの公開鍵> --public-key=<Bobの公開鍵> --public-key=<Carolの公開鍵> \
    +--private-key=<コマンド実行者の秘密鍵> \
    +--threshold=<閾値>
    +
    +
  • +
+ +

このコマンドをAlice, Bob, Carolのそれぞれで実行します。

+ +

出力

+

コマンドを実行すると、各公開鍵に対応したブロックVSSが出力されます。

+ +
<Aliceの公開鍵>:<AliceのブロックVSS>
+<Bobの公開鍵>:<BobのブロックVSS>
+<Carolの公開鍵>:<CarolのブロックVSS>
+
+ +
入出力例
+ +
$ tapyrus-setup createblockvss \
+  --public-key=0244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b44342 \
+  --public-key=0344e060779264b530897dadd8f8190b0b4ae09d640ecfeaf60105145c7f7f9868 \
+  --public-key=02a274ba5e6da6a5bea692754f32c9cf184392daaba66d3bbec421fbceef25ed48 \
+  --private-key=L3CUPgEmeHP1uMGC6q4cpuwpZvRCVWR3NegG3cE4ZBy9EY4osWCX \
+  --threshold=2
+> 0244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b44342:0244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b443420244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b4434200020d6902381257c8395090c0dd2df2269ecc472627fb99672dd5f838f67526c75488b74a2edda67467e32b5d84aed833ae9323065079e342808d49b8ba63f453a11c2d69a540d0da7abe7e4c736343d7b70332266d2f815a8fb66b58b9dd472b3d4a93ac4841e15dd05d9ba5cd3cdea9c9fd733d8bd6eb494a23fd4ececefecbe1c6a9440cfe2fac0a445701e4fd99ae597b8f5445d1497237f6ddcb1d7c462ff30d6902381257c8395090c0dd2df2269ecc472627fb99672dd5f838f67526c7547748b5d122598b981cd4a27b5127cc516cdcf9af861cbd7f72b647449c0ba88ec3d00453ff72bbf15d1e6cfa1b92e574b1e62ec224c3179592ed531a6f9f9d4e4ce69d212f4f05f36af093ae4ab5bd382ce3725f5e1885160256341b49cefb5a68ff2eaa02cc098ee2c01aa7ddbaa28a9ab79af6684fc33b5499e7c81ada5503
+> 02a274ba5e6da6a5bea692754f32c9cf184392daaba66d3bbec421fbceef25ed48:0244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b4434202a274ba5e6da6a5bea692754f32c9cf184392daaba66d3bbec421fbceef25ed4800020d6902381257c8395090c0dd2df2269ecc472627fb99672dd5f838f67526c75488b74a2edda67467e32b5d84aed833ae9323065079e342808d49b8ba63f453a11c2d69a540d0da7abe7e4c736343d7b70332266d2f815a8fb66b58b9dd472b3d4a93ac4841e15dd05d9ba5cd3cdea9c9fd733d8bd6eb494a23fd4ececefecbe18e8de4f2373fbb5ab72fd75755290ab8b9d1d1a7980642bd8caa56c5c5f24f9d0d6902381257c8395090c0dd2df2269ecc472627fb99672dd5f838f67526c7547748b5d122598b981cd4a27b5127cc516cdcf9af861cbd7f72b647449c0ba88ec3d00453ff72bbf15d1e6cfa1b92e574b1e62ec224c3179592ed531a6f9f9d4e4ce69d212f4f05f36af093ae4ab5bd382ce3725f5e1885160256341b49cefb5ad0c3007bcab7afd796fe61c2617f9710b80d2fea2be387ed4a72b0789818790e
+> 0344e060779264b530897dadd8f8190b0b4ae09d640ecfeaf60105145c7f7f9868:0244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b443420344e060779264b530897dadd8f8190b0b4ae09d640ecfeaf60105145c7f7f986800020d6902381257c8395090c0dd2df2269ecc472627fb99672dd5f838f67526c75488b74a2edda67467e32b5d84aed833ae9323065079e342808d49b8ba63f453a11c2d69a540d0da7abe7e4c736343d7b70332266d2f815a8fb66b58b9dd472b3d4a93ac4841e15dd05d9ba5cd3cdea9c9fd733d8bd6eb494a23fd4ececefecbe1567285d7704fcaab2a08acc9acb86717f8144f095ec313432276e26e0f9e6f470d6902381257c8395090c0dd2df2269ecc472627fb99672dd5f838f67526c7547748b5d122598b981cd4a27b5127cc516cdcf9af861cbd7f72b647449c0ba88ec3d00453ff72bbf15d1e6cfa1b92e574b1e62ec224c3179592ed531a6f9f9d4e4ce69d212f4f05f36af093ae4ab5bd382ce3725f5e1885160256341b49cefb5a3886d24d92a356204b3ca8dce5448b981ab3e7f7402eac6380791a9c45205bd8
+
+ +

Step7. genesisブロックへの署名

+

Step5で生成したgenesisブロックに対して、各Signerのローカル署名を作成します。

+ +

入力

+

ローカル署名の作成にはsignコマンドを用います。

+
    +
  • --block-vssに各ノードでコマンドを実行するSignerノードの秘密鍵と対応する公開鍵とセットで出力されたブロックVSSをそれぞれ指定します。
  • +
  • --aggregated-public-keyオプションで集約公開鍵を指定します。
  • +
  • --node-secret-shareオプションでStep4で生成したコマンド実行者のノードの秘密シェアを指定します。
  • +
  • --private-keyオプションでコマンド実行者の秘密鍵を指定します。
  • +
  • --blockオプションでStep5で生成したgenesisブロックを指定します。
  • +
  • --thresholdオプションで閾値を指定します。本記事では閾値には2を指定します。
  • +
+ +
$ tapyrus-setup sign \
+  --block-vss=<Aliceが生成したコマンド実行者のVSS> \
+  --block-vss=<Bobが生成したコマンド実行者のブロックVSS> \
+  --block-vss=<Carolが生成したコマンド実行者のブロックVSS> \
+  --aggregated-public-key=<集約公開鍵> \ 
+  --node-secret-share=<コマンド実行者の秘密シェア> \
+  --private-key=<コマンド実行者の秘密鍵> \
+  --block=<genesisブロック> \
+  --threshold=<閾値>
+
+ +

このコマンドをAlice, Bob, Carolのそれぞれで実行します。

+ +

出力

+

コマンドを実行すると、コマンド実行者が生成したローカル署名が生成されます。

+ +
<コマンド実行者のローカル署名>
+
+ +
入出力例
+ +
$ tapyrus-setup sign \
+  --block-vss=0244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b443420244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b4434200020d6902381257c8395090c0dd2df2269ecc472627fb99672dd5f838f67526c75488b74a2edda67467e32b5d84aed833ae9323065079e342808d49b8ba63f453a11c2d69a540d0da7abe7e4c736343d7b70332266d2f815a8fb66b58b9dd472b3d4a93ac4841e15dd05d9ba5cd3cdea9c9fd733d8bd6eb494a23fd4ececefecbe1c6a9440cfe2fac0a445701e4fd99ae597b8f5445d1497237f6ddcb1d7c462ff30d6902381257c8395090c0dd2df2269ecc472627fb99672dd5f838f67526c7547748b5d122598b981cd4a27b5127cc516cdcf9af861cbd7f72b647449c0ba88ec3d00453ff72bbf15d1e6cfa1b92e574b1e62ec224c3179592ed531a6f9f9d4e4ce69d212f4f05f36af093ae4ab5bd382ce3725f5e1885160256341b49cefb5a68ff2eaa02cc098ee2c01aa7ddbaa28a9ab79af6684fc33b5499e7c81ada5503 \
+  --block-vss=0344e060779264b530897dadd8f8190b0b4ae09d640ecfeaf60105145c7f7f98680244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b443420002a9c569b4e8e08bbcebf36cd741c7131a9d7a7d1290cd8e1bf1ac0704931f8362490f66310dbe0ceb43b73a973d0d26be975b729d79733cd152fef4ae7ef247a995e8ebe4766775fc651e7b540dda5350447c490b6126574ec5f4b81ddb99801b06c01ffb9f3d3a164ebf718c197e2713d35195ef20b01d24f83634e3ef498d098e8acb1e2377f3301252ed45e22735ad6be12bae18c00f7ed693007f9c71627aa9c569b4e8e08bbcebf36cd741c7131a9d7a7d1290cd8e1bf1ac0704931f8362b6f099cef241f314bc48c568c2f2d94168a48d62868cc32ead010b50810db486bb282a91c688b5d03ff748ba8f399e008713b7d2c000ea8529e36f09a38054855150646a9b561cbcd81ec1aab1a1e753d7d031dfac7511143371da93cbe0999d5f13091e1490e08f757bd7ad5ecaf05fcd0bc72b69d5f92348ee71b4c15110e2 \
+  --block-vss=02a274ba5e6da6a5bea692754f32c9cf184392daaba66d3bbec421fbceef25ed480244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b443420002118d674f5a238a9481b3d755db4d81b608e5cca2705c802053c509f19eb48ee25f40122e1427f3e102b9a2e425939452100c69847efe20120b9a1914c7a4a2573571818ff838721f66308ca9d9b91949dd33cdd663de3ebbf0580bee641b50184a5fb9a73f081a8da9568542186b8b6201715edbac23fedab1500f0ea1be8eab006668c13e041fe2dfcd2f7e231d76b7e93a8314a8272df28ce7507f4f45177c118d674f5a238a9481b3d755db4d81b608e5cca2705c802053c509f19eb48ee2a0bfedd1ebd80c1efd465d1bda6c6badeff3967b8101dfedf465e6ea385b59d80b078bc1ada92e254eb23834320f0af5259392567443184ad9725084d04cb480d97e0cdfaae77f847af6b347249aee51e1bbe2dffb3d281d1062508404d4ab1eb4149dceeb2e11c4b43caa6e4e693272c99e3ab17e8b58f3f306d77f13fbc33b \
+  --aggregated-public-key=02b45d04c7fabe51857c3d4dfb34f2aece4cc58c9d3a43ecc8517ac38bf9598bb9 \
+  --node-secret-share=58b72dffcc114db48291d10a611e13546b4f444bccf234bc132a63b88c9b34c1 \
+  --private-key=L3CUPgEmeHP1uMGC6q4cpuwpZvRCVWR3NegG3cE4ZBy9EY4osWCX \
+  --block=010000000000000000000000000000000000000000000000000000000000000000000000c30fc7bfabe904aecc6db258736b0f52150a43aa3b09bf27fdcb12677684003013c741355a4217988fca4948326a9e737c9899eb7958f3081c1f8e40b18db4c18046d762012102b45d04c7fabe51857c3d4dfb34f2aece4cc58c9d3a43ecc8517ac38bf9598bb90001010000000100000000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100f2052a010000001976a914a02d5bb5a1be6b923adf53d079b6e9ede53e4ef988ac00000000 \
+  --threshold=2
+> 45e89b81b0268c7c82be4b84fdeaee224de5122cc5ecb7aaffadd8953de3fabca3a2a3dba83b87bba16320e51701df85787a82555912017aeff71eb3a651d4330244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b44342
+
+ +

Step8. genesisブロックの署名を計算する

+

各Signerが生成したローカル署名から、genesisブロックに対して集約署名を生成します。 +このコマンドは各ノードで行なう必要がありますが、出力結果は同じなため、今回はAliceのみで実行します。 +そのため、以下におけるコマンド実行者はAliceに当たります。

+ +

入力

+

集約署名の生成にはcomputesigコマンドを指定します。

+
    +
  • --sigオプションにStep7で各Signerが作成したローカル署名を指定します。
  • +
  • --private-keyオプションにコマンド実行者(Alice)の秘密鍵を指定します。
  • +
  • --blockオプションにStep5で生成したgenesisブロックを指定します。
  • +
  • --block-vssオプションに各ノードでコマンドを実行するSignerノードの秘密鍵と対応する公開鍵とセットで出力されたブロックVSSをそれぞれ指定します。
  • +
  • --node-vssオプションに各ノードでコマンドを実行するSignerノードの秘密鍵と対応する公開鍵とセットで出力されたノードVSSをそれぞれ指定します。
  • +
  • --aggregated-public-keyオプションに集約公開鍵を指定します。
  • +
  • --node-secret-shareオプションにStep4で生成したコマンド実行者のノード(Alice)の秘密シェアを指定します。
  • +
  • --thresholdオプションで閾値を指定します。本記事では閾値には2を指定します。
  • +
+ +
$ tapyrus-setup computesig \
+  --sig=<Aliceのローカル署名> --sig=<Bobのローカル署名> --sig=<Carolのローカル署名> \
+  --private-key=<コマンド実行者の秘密鍵> \
+  --block=<genesisブロック> \
+  --block-vss=<コマンド実行者のブロックVSS> --block-vss=<Bobが生成したコマンド実行者のブロックVSS> --block-vss=<Carolが生成したのコマンド実行者のブロックVSS> \
+  --node-vss=<コマンド実行者のノードVSS> --block-vss=<Bobが生成したコマンド実行者のノードVSS> --block-vss=<Carolが生成したのコマンド実行者のノードVSS> \
+  --aggregated-public-key=<集約公開鍵> \
+  --node-secret-share=<コマンド実行者のノードの秘密シェア> \
+  --threshold=<閾値>
+
+ +

出力

+

コマンドを実行すると集約署名が付与されたgenesisブロックが出力されます。 +この集約署名は集約公開鍵に対して有効なdouble-SHA256ハッシュ値形式のSchnorr署名の値です。

+ +
<署名付きgenesisブロック>
+
+ +
入出力例
+ +
$ tapyrus-setup computesig \
+  --sig=45e89b81b0268c7c82be4b84fdeaee224de5122cc5ecb7aaffadd8953de3fabca3a2a3dba83b87bba16320e51701df85787a82555912017aeff71eb3a651d4330244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b44342 \
+  --sig=3dd264f0ccd98e1cc57a47da38e187e4b82a16944a7395717e9a276f577715eea3a2a3dba83b87bba16320e51701df85787a82555912017aeff71eb3a651d43302a274ba5e6da6a5bea692754f32c9cf184392daaba66d3bbec421fbceef25ed48 \
+  --sig=35bc2e5fe98c8fbd0836442f73d821a7226f1afbcefa7337fd867649710a3120a3a2a3dba83b87bba16320e51701df85787a82555912017aeff71eb3a651d4330344e060779264b530897dadd8f8190b0b4ae09d640ecfeaf60105145c7f7f9868 \
+  --private-key=L3CUPgEmeHP1uMGC6q4cpuwpZvRCVWR3NegG3cE4ZBy9EY4osWCX \
+  --block=010000000000000000000000000000000000000000000000000000000000000000000000c30fc7bfabe904aecc6db258736b0f52150a43aa3b09bf27fdcb12677684003013c741355a4217988fca4948326a9e737c9899eb7958f3081c1f8e40b18db4c18046d762012102b45d04c7fabe51857c3d4dfb34f2aece4cc58c9d3a43ecc8517ac38bf9598bb90001010000000100000000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100f2052a010000001976a914a02d5bb5a1be6b923adf53d079b6e9ede53e4ef988ac00000000 \
+  --block-vss=0244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b443420244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b4434200020d6902381257c8395090c0dd2df2269ecc472627fb99672dd5f838f67526c75488b74a2edda67467e32b5d84aed833ae9323065079e342808d49b8ba63f453a11c2d69a540d0da7abe7e4c736343d7b70332266d2f815a8fb66b58b9dd472b3d4a93ac4841e15dd05d9ba5cd3cdea9c9fd733d8bd6eb494a23fd4ececefecbe1c6a9440cfe2fac0a445701e4fd99ae597b8f5445d1497237f6ddcb1d7c462ff30d6902381257c8395090c0dd2df2269ecc472627fb99672dd5f838f67526c7547748b5d122598b981cd4a27b5127cc516cdcf9af861cbd7f72b647449c0ba88ec3d00453ff72bbf15d1e6cfa1b92e574b1e62ec224c3179592ed531a6f9f9d4e4ce69d212f4f05f36af093ae4ab5bd382ce3725f5e1885160256341b49cefb5a68ff2eaa02cc098ee2c01aa7ddbaa28a9ab79af6684fc33b5499e7c81ada5503 \
+  --block-vss=0344e060779264b530897dadd8f8190b0b4ae09d640ecfeaf60105145c7f7f98680244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b443420002a9c569b4e8e08bbcebf36cd741c7131a9d7a7d1290cd8e1bf1ac0704931f8362490f66310dbe0ceb43b73a973d0d26be975b729d79733cd152fef4ae7ef247a995e8ebe4766775fc651e7b540dda5350447c490b6126574ec5f4b81ddb99801b06c01ffb9f3d3a164ebf718c197e2713d35195ef20b01d24f83634e3ef498d098e8acb1e2377f3301252ed45e22735ad6be12bae18c00f7ed693007f9c71627aa9c569b4e8e08bbcebf36cd741c7131a9d7a7d1290cd8e1bf1ac0704931f8362b6f099cef241f314bc48c568c2f2d94168a48d62868cc32ead010b50810db486bb282a91c688b5d03ff748ba8f399e008713b7d2c000ea8529e36f09a38054855150646a9b561cbcd81ec1aab1a1e753d7d031dfac7511143371da93cbe0999d5f13091e1490e08f757bd7ad5ecaf05fcd0bc72b69d5f92348ee71b4c15110e2 \
+  --block-vss=02a274ba5e6da6a5bea692754f32c9cf184392daaba66d3bbec421fbceef25ed480244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b443420002118d674f5a238a9481b3d755db4d81b608e5cca2705c802053c509f19eb48ee25f40122e1427f3e102b9a2e425939452100c69847efe20120b9a1914c7a4a2573571818ff838721f66308ca9d9b91949dd33cdd663de3ebbf0580bee641b50184a5fb9a73f081a8da9568542186b8b6201715edbac23fedab1500f0ea1be8eab006668c13e041fe2dfcd2f7e231d76b7e93a8314a8272df28ce7507f4f45177c118d674f5a238a9481b3d755db4d81b608e5cca2705c802053c509f19eb48ee2a0bfedd1ebd80c1efd465d1bda6c6badeff3967b8101dfedf465e6ea385b59d80b078bc1ada92e254eb23834320f0af5259392567443184ad9725084d04cb480d97e0cdfaae77f847af6b347249aee51e1bbe2dffb3d281d1062508404d4ab1eb4149dceeb2e11c4b43caa6e4e693272c99e3ab17e8b58f3f306d77f13fbc33b \
+  --node-vss=0244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b443420244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b44342000244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b44342ae46a2f969561b55c6c1f9d0b5cd5a22f3cf10b7e58c367a0ed7fd4639d036c2f31e34dad1e7976521a5f34ca3801c4f6f12ed28d91fb0f8b89e70a1bd1449e560b5883b8e1c16b9451973cf9ee0ea5ab5f658071c7a51e3b817ca432aa30f44aa5056922ebd35e57ee6d22c9d8354b3d2258b1d4128d31db7a652720782faa444b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b44342ae46a2f969561b55c6c1f9d0b5cd5a22f3cf10b7e58c367a0ed7fd4639d036c2f31e34dad1e7976521a5f34ca3801c4f6f12ed28d91fb0f8b89e70a1bd1449e560b5883b8e1c16b9451973cf9ee0ea5ab5f658071c7a51e3b817ca432aa30f44aa5056922ebd35e57ee6d22c9d8354b3d2258b1d4128d31db7a652720782faa4 \
+  --node-vss=0344e060779264b530897dadd8f8190b0b4ae09d640ecfeaf60105145c7f7f98680244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b44342000244e060779264b530897dadd8f8190b0b4ae09d640ecfeaf60105145c7f7f986899837470106ef438ac15958551e05837fa58edb0e692b2268158a0ff2185298d4983fb2a9d6071b542364dad99ea3a20eb30b1d3b463455575e2d47201129fad24f6acfd5f54a3afa7325619b7c23b3e175b28c970e6ed47a3c6cfd21adf9ef3033c01a45d5c5e2026029ac6b657f780a8a46c7dea500f18880da04be5e6773544e060779264b530897dadd8f8190b0b4ae09d640ecfeaf60105145c7f7f986899837470106ef438ac15958551e05837fa58edb0e692b2268158a0ff2185298d4983fb2a9d6071b542364dad99ea3a20eb30b1d3b463455575e2d47201129fad24f6acfd5f54a3afa7325619b7c23b3e175b28c970e6ed47a3c6cfd21adf9ef3033c01a45d5c5e2026029ac6b657f780a8a46c7dea500f18880da04be5e67735 \
+  --node-vss=02a274ba5e6da6a5bea692754f32c9cf184392daaba66d3bbec421fbceef25ed480244b1830ed3be7faa697b57accdadc41f0367b46f3e6b8c323777cba737b443420002a274ba5e6da6a5bea692754f32c9cf184392daaba66d3bbec421fbceef25ed4808733c8356963207a0dc3ba176d7e20ed69487908f119a3e4fcb662356a0373ea3655037dce5642b4c34ebb281e877151b5bc81abab140f8eab5f22e6db227752e820837f845852a46c37488a32c41e182be703d237001e501212466962efc8eab2ad5c93ff7b9aedda864170d42c71eab34299750c1f2c19348cf876f680429a274ba5e6da6a5bea692754f32c9cf184392daaba66d3bbec421fbceef25ed4808733c8356963207a0dc3ba176d7e20ed69487908f119a3e4fcb662356a0373ea3655037dce5642b4c34ebb281e877151b5bc81abab140f8eab5f22e6db227752e820837f845852a46c37488a32c41e182be703d237001e501212466962efc8eab2ad5c93ff7b9aedda864170d42c71eab34299750c1f2c19348cf876f680429 \
+  --aggregated-public-key=02b45d04c7fabe51857c3d4dfb34f2aece4cc58c9d3a43ecc8517ac38bf9598bb9 \
+  --node-secret-share=58b72dffcc114db48291d10a611e13546b4f444bccf234bc132a63b88c9b34c1 \
+  --threshold=2
+> 010000000000000000000000000000000000000000000000000000000000000000000000c30fc7bfabe904aecc6db258736b0f52150a43aa3b09bf27fdcb12677684003013c741355a4217988fca4948326a9e737c9899eb7958f3081c1f8e40b18db4c18046d762012102b45d04c7fabe51857c3d4dfb34f2aece4cc58c9d3a43ecc8517ac38bf9598bb9405737a9e12ccff7b4810195837295481b93a5ef6bd7dd50d36843ae3c0e77f6cb4dfed21293738adc40024f2fc2f4545fe3a00dc54165d9e480c189bb2450df8a01010000000100000000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100f2052a010000001976a914a02d5bb5a1be6b923adf53d079b6e9ede53e4ef988ac00000000
+
+ +

署名付きgenesisブロックのブロックヘッダーは以下のような構造になっています。

+
    +
  • features: ブロックのバージョン。
  • +
  • hasPrevBlock: 前のブロックヘッダの256ビットハッシュ。
  • +
  • hashMerkleRoot: ブロック内の全トランザクションのハッシュを基にした256ビットのMerkleRoot。
  • +
  • hashImMerkleRoot: トランザクションハッシュの改ざんを防止を目的とした、transaction idに基づく256ビットMerkleRoot。(トランザクションのハッシュの計算にトランザクションインプットのscriptSigは含まれていません。)
  • +
  • time: 1970-01-01T00:00 UTCからの秒数。
  • +
  • xfield: メタデータを管理する項目。
  • +
  • xfieldType: xfield項目のメタデータの種類を明示する項目。1が集約公開鍵を意味する。
  • +
  • proof: Signerが承認したこのブロックのSchnorr署名。
    +詳しくはこちらを参考にしてください。
  • +
+ +

以下が実際に生成したgenesisブロックヘッダーのJSON形式のオブジェクトです。xfieldTypeに集約公開鍵を意味する1が指定され、xfieldに集約公開鍵が指定されています。後に続くブロックはこの集約公開鍵により署名の検証が行われます。

+
{
+  "hash": "c34a5e67690b7822cceba4732f7066eb36991487aa090da64bfe33af206c71f4",
+  "confirmations": 515,
+  "height": 0,
+  "features": 1,
+  "featuresHex": "00000001",
+  "merkleroot": "300084766712cbfd27bf093baa430a15520f6b7358b26dccae04e9abbfc70fc3",
+  "immutablemerkleroot": "c1b48db1408e1f1c08f35879eb99987c739e6a324849ca8f9817425a3541c713",
+  "time": 1658275456,
+  "mediantime": 1658275456,
+  "nTx": 1,
+  "xfieldType": 1,
+  "xfield": "02b45d04c7fabe51857c3d4dfb34f2aece4cc58c9d3a43ecc8517ac38bf9598bb9",
+  "proof": "5737a9e12ccff7b4810195837295481b93a5ef6bd7dd50d36843ae3c0e77f6cb4dfed21293738adc40024f2fc2f4545fe3a00dc54165d9e480c189bb2450df8a",
+  "nextblockhash": "db655d2d63aa5ccdcafd96f937e39946b499b4abbe4e8a1c9191640c616d29b8"
+}
+
+ +

Step9. genesisブロックファイルの作成

+

genesisブロックファイルの作成を行います。 +新しく作成するTapyrus NetworkのネットワークIDを決めます。
+networkidはすでに使用されているネットワークID以外の数値であれば自由に設定可能です。 +genesis.<ネットワークID>という名前のファイルを作成し、Step8で生成した集約署名が付与されたgenesisブロックを保存します。

+ +

以上でSignerノードのセットアップは完了です。 +次に Tapyrus Custom Network構築方法を元にカスタムネットワークの構築を行います。

+ + +
+ +
+ + + + + + + +
+ + + + +
+ + +
+ + + +