kharukaのブログ~お金と技術とキャリア~

Edu Fin~金融×教育~若いうちからお金について学ぶってだいじ!学んだテクノロジーはみんなの財産。過去、現在、将来の人生についてのブログ

【サイドチェーン】Elements code tutorialを読む Part4

エンジニアスクールFLOC

Pythonで動かして学ぶ!あたらしいブロックチェーンの教科書 (AI & TECHNOLOGY)

Pythonで動かして学ぶ!あたらしいブロックチェーンの教科書 (AI & TECHNOLOGY)

▼前回の記事はこちらです。

【サイドチェーン】Elements code tutorialを読む Part3 - kharukaのブログ~お金と技術とキャリア~

Block creation in a Strong Federation - Block Signing

今まで、ブロック生成するためにいずれかのノードから the “generate” command を呼び出していました。デフォルトでは block signing が OP_TRUE であるため、これまではうまくいきました。

$ ADDRGEN1="AzptV6SVTqas3s5pZ5ATc1yvrQ4ojCNXCsJAS95UbwmcZERoN9ob33BCKD3NQQfMdP475EwHm7Gd6Vte"
$ echo $ADDRGEN1
AzptV6SVTqas3s5pZ5ATc1yvrQ4ojCNXCsJAS95UbwmcZERoN9ob33BCKD3NQQfMdP475EwHm7Gd6Vte
$ e1-cli generatetoaddress 1 $ADDRGEN1
[
  "3b8ace02f60f87addf7c3a9397ab4b762c691b2572d7b1d2e7313873e2baa330"
]

Elementsは、 valid block を生成するために必要な signatures の数を指定する a federated signing モデルをサポートしています。ノードに、有効な 2-of-2 multi-signature block 生成条件を要求するように命令してましょう。これは the signblockscript parameter を使用して行われます。このパラメーターは the config file に追加するかノード起動時にオプションとして渡すことが出来ます。 ​ まず、 block sign script を作成出来るように両方のクライアント(ウォレット)のキーを取得する必要があります。 ​

address 生成

$ ADDR1=$(e1-cli getnewaddress)
$ echo $ADDR1
AzpjDKjkz7qpyq3CX8CXYTTnw8H5mhyWYZTG9zCBkhWrDtNTiajesceprrHFdiSxHJHCJGtYE8s8ysxQ
$ ADDR2=$(e2-cli getnewaddress)
$ echo $ADDR2
AzpmayLZiaqLzmtBu3TXpHkaAgcgZrrhrqjdYU3YRTE8cf632LeJVhCGW3uVkRxMyLNyQyoDL8uFQvCp

jq インストール(必要に応じて)

jq is a lightweight and flexible command-line JSON processor. ​

$ sudo apt -y update
$ sudo apt -y install jq

public keys 取得

$ VALID1=$(e1-cli getaddressinfo $ADDR1)
$ PUBKEY1=$(echo $VALID1 | jq '.pubkey' | tr -d '"')
$ echo $PUBKEY1
031fbb81ba5152df01f99c81f0f40e9a7dbe602b6c0789464a571671963b787f21
$ VALID2=$(e2-cli getaddressinfo $ADDR2)
$ PUBKEY2=$(echo $VALID2 | jq '.pubkey' | tr -d '"')
$ echo $PUBKEY2
02146b6e1bf588e8e4a67b161917bce137176976d21bfe3803be519820b0e89d55

private keys 取得

$ KEY1=$(e1-cli dumpprivkey $ADDR1)
$ echo $KEY1
cP7SZAXASdw4TJKw74Mst3CbBWZBEeCbSPm5jUbDD3x8qvqS1JX6
$ KEY2=$(e2-cli dumpprivkey $ADDR2)
$ echo $KEY2
cQ1L59g8MR112JZPBy5JpaqKrn6NiDSiKAnUQBbS8zXxySk1dvzF

マルチシグアドレス生成と redeemscript 取得

$ MULTISIG=$(e1-cli createmultisig 2 '''["'''$PUBKEY1'''", "'''$PUBKEY2'''"]''')
$ echo $MULTISIG
{ "address": "XK3XdVPBzYz1hp3fdALNEMLymwU6jUZnFk", "redeemScript": "5221031fbb81ba5152df01f99c81f0f40e9a7dbe602b6c0789464a571671963b787f212102146b6e1bf588e8e4a67b161917bce137176976d21bfe3803be519820b0e89d5552ae" }
$ REDEEMSCRIPT=$(echo $MULTISIG | jq '.redeemScript' | tr -d '"')
$ echo $REDEEMSCRIPT
5221031fbb81ba5152df01f99c81f0f40e9a7dbe602b6c0789464a571671963b787f212102146b6e1bf588e8e4a67b161917bce137176976d21bfe3803be519820b0e89d5552ae

ノードを停止して、新しい block signing 方式を設定出来るようにする

$ e1-cli stop
$ e2-cli stop

ブロック生成の要件定義

$ SIGNBLOCKARG="-signblockscript=$(echo $REDEEMSCRIPT) -con_max_block_sig_size=150"

ウォレットのクリーンアップ

$ mv ~/elementsdir1/elementsregtest/blocks ~/tmp/elementsdir1/elementsregtest/
$ mv ~/elementsdir1/elementsregtest/chainstate ~/tmp/elementsdir1/elementsregtest/
$ mv ~/elementsdir1/elementsregtest/wallets/wallet.dat ~/tmp/elementsdir1/elementsregtest/wallets/
$ mv ~/elementsdir2/elementsregtest/blocks ~/tmp/elementsdir2/elementsregtest/
$ mv ~/elementsdir2/elementsregtest/chainstate ~/tmp/elementsdir2/elementsregtest/
$ mv ~/elementsdir2/elementsregtest/wallets/wallet.dat ~/tmp/elementsdir2/elementsregtest/wallets/

the 2 of 2 block signing 指定した “signblockscript” オプション付きでデーモンを起動します。

$ e1-dae $SIGNBLOCKARG
$ e2-dae $SIGNBLOCKARG

削除したウォレットの the signing keys をインポートします。

$ e1-cli importprivkey $KEY1
$ e2-cli importprivkey $KEY2

signing に必要な the keys がウォレットにインポートされたにもかかわらず、 The “generate” command は機能しなくなりました。the signblockscript argument 付きでデーモン起動したためです。エラーの原因が signblockscript の導入であり、生成した受信アドレスを含むウォレットを削除したためではないことを確認し、新しいものを作成します。 the signblockscript を導入したため、 the signblockscript commands はエラーになります。

$ ADDRGEN1=$(e1-cli getnewaddress)
$ echo $ADDRGEN1
AzppTCbKDPMQo39VpajzGFXX9kfjpUVWMp97vuSJN4A79kooUYf7wbeYcAs3wAMUt52WbW1rscJZa24j
$ ADDRGEN2=$(e2-cli getnewaddress)
$ echo $ADDRGEN2
Azpxn7FbVYU9H1PdJVZ83eFXyAY2w7W8dAWdibN3L9jshSDQCxACpvvKHyS4Qwd8ncpqf3dw4bpEmdoo
$ e1-cli generatetoaddress 1 $ADDRGEN1
error code: -32603
error message:
ProcessNewBlock, block not accepted
$ e2-cli generatetoaddress 1 $ADDRGEN2
error code: -32603
error message:
ProcessNewBlock, block not accepted

the “signblockscript” argument 付きでデーモン起動したので、ブロックの生成、署名、リリースは新しいプロセスに従わなければなりません。

The process will be:

  • Someone (it doesn”t matter who) calls “getnewblockhex” command to propose a new block.

  • The required number of block signers sign the proposed block in turn.

  • The signed block is combined by someone using the “combineblocksigs” command.

  • The result from “combineblocksigs” is submitted using the “submitblock” command. Again, it doesn’t matter who does this as long as the block is signed and valid.

それではさっそく新しいプロセスでブロック生成をしてみましょう。

getnewblockhex

HEX=$(e1-cli getnewblockhex)
$ echo $HEX
0000002071a6f9f1ad320a250ce1630e3d92f1e8cac49347c0150838a2ff5d81227619c9c109d405eb2d2d42a48f52e1072756b02d09935420878df51aa940bbf5c864bb82e5955d01000000475221031fbb81ba5152df01f99c81f0f40e9a7dbe602b6c0789464a571671963b787f212102146b6e1bf588e8e4a67b161917bce137176976d21bfe3803be519820b0e89d5552ae00010200000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03510101ffffffff02016d0bdd59a69dfd5ccbe4ddc07c6a5275baa235022d3bafad31d5d0479915adf101000000000000000000016a016d0bdd59a69dfd5ccbe4ddc07c6a5275baa235022d3bafad31d5d0479915adf101000000000000000000266a24aa21a9ed94f15ed3a62165e4a0b99699cc28b48e19cb5bc1b1f47155db62d63f1e047d45000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000

getblockcount

$e1-cli getblockcount
0

0が返ってきます。 submitblock コマンドでブロックを submit してみましょう。

$ e1-cli submitblock $HEX
block-proof-invalid

エラーが返ってきます。 ​ block-proof-invalid ​ the block count はまだ0です。

$ e1-cli getblockcount
0

the 2 of 2 requirement を満たすように、各デーモンを使ってブロックに署名しましょう。​

signblock

$ SIGN1=$(e1-cli signblock $HEX)
$ echo $SIGN1
[ { "pubkey": "031fbb81ba5152df01f99c81f0f40e9a7dbe602b6c0789464a571671963b787f21", "sig": "3044022011e2a231c49fa14208ec868b0605c58669baffc734ea14cd3aa406f21a435f0702205c2334bd4400855be5f8681c22c7070b37a51e904a4718856eb3eee0073c20ad" } ]
$ SIGN2=$(e2-cli signblock $HEX)
$ echo $SIGN2
[ { "pubkey": "02146b6e1bf588e8e4a67b161917bce137176976d21bfe3803be519820b0e89d55", "sig": "304402201f0617f9f38f4a7c562a7c589e3df3f52ba5c1104b94c4d01a662d457af2bca502201dc59cd2ad1bd56f88e2d3ed453e54eff6d00d736e0e208d306b1a83a734e920" } ]

combineblocksigs

$ SIGN1DATA=$(echo $SIGN1 | jq '.[0]')
$ echo $SIGN1DATA
{ "pubkey": "031fbb81ba5152df01f99c81f0f40e9a7dbe602b6c0789464a571671963b787f21", "sig": "3044022011e2a231c49fa14208ec868b0605c58669baffc734ea14cd3aa406f21a435f0702205c2334bd4400855be5f8681c22c7070b37a51e904a4718856eb3eee0073c20ad" }
$ SIGN2DATA=$(echo $SIGN2 | jq '.[0]')
$ echo $SIGN2DATA
{ "pubkey": "02146b6e1bf588e8e4a67b161917bce137176976d21bfe3803be519820b0e89d55", "sig": "304402201f0617f9f38f4a7c562a7c589e3df3f52ba5c1104b94c4d01a662d457af2bca502201dc59cd2ad1bd56f88e2d3ed453e54eff6d00d736e0e208d306b1a83a734e920" }
$ COMBINED=$(e1-cli combineblocksigs $HEX "[$SIGN1DATA,$SIGN2DATA]")
$ echo $COMBINED
{ "hex": "0000002071a6f9f1ad320a250ce1630e3d92f1e8cac49347c0150838a2ff5d81227619c9c109d405eb2d2d42a48f52e1072756b02d09935420878df51aa940bbf5c864bb82e5955d01000000475221031fbb81ba5152df01f99c81f0f40e9a7dbe602b6c0789464a571671963b787f212102146b6e1bf588e8e4a67b161917bce137176976d21bfe3803be519820b0e89d5552ae8f00463044022011e2a231c49fa14208ec868b0605c58669baffc734ea14cd3aa406f21a435f0702205c2334bd4400855be5f8681c22c7070b37a51e904a4718856eb3eee0073c20ad46304402201f0617f9f38f4a7c562a7c589e3df3f52ba5c1104b94c4d01a662d457af2bca502201dc59cd2ad1bd56f88e2d3ed453e54eff6d00d736e0e208d306b1a83a734e920010200000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03510101ffffffff02016d0bdd59a69dfd5ccbe4ddc07c6a5275baa235022d3bafad31d5d0479915adf101000000000000000000016a016d0bdd59a69dfd5ccbe4ddc07c6a5275baa235022d3bafad31d5d0479915adf101000000000000000000266a24aa21a9ed94f15ed3a62165e4a0b99699cc28b48e19cb5bc1b1f47155db62d63f1e047d45000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000", "complete": true }

the 2 of 2 の要件を満たすのに十分な keys の signatures をもつので the “complete” property の結果が “True” であることがわかる。従って、この文脈で “complete” は有効な ‘n of m’ multi-sig の signatures を十分に持っていることを意味します。 ​ 次に、 the combineblocksig command の結果から the signed block hex を抽出し、 submit します。 a signed and valid block hex を持つ限り、誰がこれを実行するかは問題ではありません。 ​ submitblock

$ SIGNEDBLOCK=$(echo $COMBINED | jq '.hex' | tr -d '"')
$ echo $SIGNEDBLOCK
0000002071a6f9f1ad320a250ce1630e3d92f1e8cac49347c0150838a2ff5d81227619c9c109d405eb2d2d42a48f52e1072756b02d09935420878df51aa940bbf5c864bb82e5955d01000000475221031fbb81ba5152df01f99c81f0f40e9a7dbe602b6c0789464a571671963b787f212102146b6e1bf588e8e4a67b161917bce137176976d21bfe3803be519820b0e89d5552ae8f00463044022011e2a231c49fa14208ec868b0605c58669baffc734ea14cd3aa406f21a435f0702205c2334bd4400855be5f8681c22c7070b37a51e904a4718856eb3eee0073c20ad46304402201f0617f9f38f4a7c562a7c589e3df3f52ba5c1104b94c4d01a662d457af2bca502201dc59cd2ad1bd56f88e2d3ed453e54eff6d00d736e0e208d306b1a83a734e920010200000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03510101ffffffff02016d0bdd59a69dfd5ccbe4ddc07c6a5275baa235022d3bafad31d5d0479915adf101000000000000000000016a016d0bdd59a69dfd5ccbe4ddc07c6a5275baa235022d3bafad31d5d0479915adf101000000000000000000266a24aa21a9ed94f15ed3a62165e4a0b99699cc28b48e19cb5bc1b1f47155db62d63f1e047d45000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000
$ e2-cli submitblock $SIGNEDBLOCK

getblockcount

$ e1-cli getblockcount
1
$ e2-cli getblockcount
1

​ one block 生成に成功しました。 ​ 次に、次のセクション(ブロックチェーンをサイドチェーンとして実行している別のブロックチェーンに “peg” する方法を説明します)に備えて、 daemons をシャットダウンします。 ​

e1-cli stop
e2-cli stop

ブロックチェーンをサイドチェーンとして動作させる必要がない場合は、次のセクションをスキップできます。そして、 the bitcoin daemon も同様にシャットダウンするため the “b-cli stop” コマンドを実行すべきです。

仮想通貨取引所

Liquid by Quoine

ウォレット

▼記事の続きは以下へ。

執筆中です。

参考

ビットコインとブロックチェーン

ビットコインとブロックチェーン