Confidential TransactionをサポートしているElementsで実際にCTを作ってみようと思い、まずElementsのセットアップしてサイドチェーンにコインをペグする。
github.com
Elementsのセットアップ
今回使用したElementsはelements-0.14.1
ブランチのソース。(久しぶりに見たら0.14.1がアクティブブランチになってる。Alphaはもう使われてない?)
↓に独自サイドチェーン(elementsのregtest)のビルド手順が書いてあるので、これを参考にして環境をセットアップする。
Building A New Sidechain with Elements — The Elements Project
Elementsのビルド
$ git clone https://github.com/ElementsProject/elements.git
$ cd elements
$ ./autogen.sh
$ ./configure
$ make -j3
makeが終わったらsrc直下にelementsd
、elements-cli
、elements-tx
などが生成されてる。
起動
基本的にはbitcoind
と同じ。
$ elementsd -regtest -daemon
起動するとUbuntuの場合$HOME/.bitcoin/
以下にelementsregtest
というディレクトリができ、チェーンのデータはこのディレクトリ配下で管理される。
getinfo
すると2100万 Bitcoinがあることが分かる。
$ elements-cli getinfo
{
"version": 2140101,
"protocolversion": 70015,
"walletversion": 130000,
"balance": {
"bitcoin": 21000000.00000000
},
"blocks": 0,
"timeoffset": 0,
"connections": 0,
"proxy": "",
"difficulty": 1,
"chain": "elementsregtest",
"keypoololdest": 1512955437,
"keypoolsize": 100,
"paytxfee": 0.00000000,
"relayfee": 0.00001000,
"errors": ""
}
Elementsはサイドチェーンなので基本的に通貨発行は行わず、Bitcoinとペグする形でコインを入手する。ペグされたBitcoinと同量のコインがElements上でアンロックされる仕組み(Elements上のコインの名前もbitcoinなのは紛らわしいよね)。
サイドチェーンにコインをペグするのに、Bitcoin⇔Elements間のコインのペグの仕組みについて理解しておいた方が良い↓
techmedia-think.hatenablog.com
ちなみに初期状態でlistunspent
すると↓のようなTXIDがb661d7fa55c27dc4dcd804e7640b23f92578a4b1ad0fbffbc2095eaec251ce34
のUTXOが100個ほど出てくる。2,100万コインを100個のUTXOに分割して保持しているのが分かる。
{
"txid": "b661d7fa55c27dc4dcd804e7640b23f92578a4b1ad0fbffbc2095eaec251ce34",
"vout": 0,
"scriptPubKey": "51",
"amount": 210000.00000000,
"asset": "d381261986457b55823c475adfaaad05268dcd85734f99acf7a96a4031d03bc2",
"assetlabel": "bitcoin",
"confirmations": 2,
"spendable": true,
"solvable": true,
"blinder": "0000000000000000000000000000000000000000000000000000000000000000",
"assetblinder": "0000000000000000000000000000000000000000000000000000000000000000"
}
設定ファイル
設定ファイル名はelements.conf
で(Bitcoin Coreと同様デフォルトでは作成されないので自分で作る)、Ubuntuだと$HOME/.bitcoin
ディレクトリ以下を探しにいく。
Elementsではメインチェーン(Bitcoin)上でコインがロックされたのを確認した上で、同量のコインをサイドチェーン(Elements)上でアンロックするが、その際メインチェーンで確かにコインがロックされているか検証するため、メインチェーンのノードに対してRPCアクセスをしている*1。そのため以下のようにelements.conf
にメインチェーンのノードのRPCアクセス情報を設定する必要がある。
rpcuser=bitcoinrpc(ElementsのRPCユーザー)
rpcpassword=password(ElementsのRPCパスワード)
rpcport=8339(ElementsのRPCポート)
daemon=1
discover=0
testnet=0
regtest=1
mainchainhost=127.0.0.1(BitcoinノードのIP)
mainchainrpcport=8338(BitcoinノードのRPCポート)
mainchainrpcuser=bitcoinrpc(BitcoinノードのRPCユーザー)
mainchainrpcpassword=password(BitcoinノードのIRPCパスワード)
validatepegin=1
txindex=1
Elementsにペグインする際のFederationスクリプトに使用する鍵の生成
Elementsのブロックは、予め決められたユーザー(公開鍵)を持つ人たち(block signer)の一定数が署名する(マルチシグ)ことで生成される。regtestなど独自チェーンを作る場合、まずこのブロックの署名に使用するスクリプトを生成する。
署名に使う新しいアドレスを生成し、
$ elements-cli getnewaddress
CTEuyLmLtg5x82wGhS9cDnAF9DUZcS1EgXTsgHMqJfNDqArjaGQVGsattpCE2CMrh6B1RRnhSUfQ6RGn
アドレスの公開鍵と秘密鍵を取得する。
$ elements-cli validateaddress CTEuyLmLtg5x82wGhS9cDnAF9DUZcS1EgXTsgHMqJfNDqArjaGQVGsattpCE2CMrh6B1RRnhSUfQ6RGn
{
"isvalid": true,
"address": "CTEuyLmLtg5x82wGhS9cDnAF9DUZcS1EgXTsgHMqJfNDqArjaGQVGsattpCE2CMrh6B1RRnhSUfQ6RGn",
"scriptPubKey": "76a91440f6a609d0969b6cbef9557fa8cbedb012472c8088ac",
"confidential_key": "037be078e2456585073c8f083b822b2a8d307f34144992436ad9e75df101cb3f8f",
"unconfidential": "2dfMF7EtbPGTREZATPgePtcLXCGby6qPwPg",
"ismine": true,
"iswatchonly": false,
"isscript": false,
"pubkey": "03d4d908226f1a075022798611f02ee992271f7581c0f527757ccfb603c43fae28", ←これが公開鍵
"iscompressed": true,
"account": "",
"timestamp": 1512955437,
"hdkeypath": "m/0'/0'/2'",
"hdmasterkeyid": "da51d8c6f773da39cfc48d90e1888ff25dcc4993"
}
$ elements-cli dumpprivkey CTEuyLmLtg5x82wGhS9cDnAF9DUZcS1EgXTsgHMqJfNDqArjaGQVGsattpCE2CMrh6B1RRnhSUfQ6RGn
cUgf4MyWeysP5iJMru4RbRpXgoCuSaz3X4beBa3qfqPwvGENity1
続いてブロックに署名するマルチシグスクリプトを作成する。↑の公開鍵使って、ここでは1-of-1
のマルチシグを作成する↓
$ elements-cli createmultisig 1 \[\"03d4d908226f1a075022798611f02ee992271f7581c0f527757ccfb603c43fae28\"\]
{
"address": "XHfz21yi9JkdtYBzYf7voeYn7et3tq4Khc",
"redeemScript": "512103d4d908226f1a075022798611f02ee992271f7581c0f527757ccfb603c43fae2851ae"
}
このマルチシグスクリプトをサイドチェーンのブロック署名用に使用する。一旦Elementsを停止し、既存のチェーンデータをリセットしてマルチシグスクリプト(↑で生成したredeemScript)を指定してElementsを起動する。今回はペグしたコインをサイドチェーンに移動する際に使われる-fedpegscript
も同じスクリプトを指定しておく。
$ rm -Rf ~/.bitcoin/elementsregtest
$ elementsd -regtest -daemon -signblockscript=512103d4d908226f1a075022798611f02ee992271f7581c0f527757ccfb603c43fae2851ae -fedpegscript=512103d4d908226f1a075022798611f02ee992271f7581c0f527757ccfb603c43fae2851ae
チェーンをリセットしてるので、このマルチシグに署名できるよう、↑で作成した秘密鍵をインポートする。
$ elements-cli importprivkey cUgf4MyWeysP5iJMru4RbRpXgoCuSaz3X4beBa3qfqPwvGENity1
ブロックの生成
getnewblockhex
でまだマイニングされていない新しいブロックのデータを生成する。
$ elements-cli getnewblockhex
0000002041b97650a81cb6395a79e3109ac5df68c7dceb40a7b65de16baff69fe4c143a61afe4f13e39ed34497613ac34d48b42cfae8590ea386dea33a70f5a178b9b47e1a0a2e5a0100000025512103d4d908226f1a075022798611f02ee992271f7581c0f527757ccfb603c43fae2851ae00010200000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03510101ffffffff0201b34490609efeb1e9d19fa51275c76fd288aa7cc3f662c54c04b44aa242ef398e01000000000000000000016a01b34490609efeb1e9d19fa51275c76fd288aa7cc3f662c54c04b44aa242ef398e01000000000000000000266a24aa21a9ed94f15ed3a62165e4a0b99699cc28b48e19cb5bc1b1f47155db62d63f1e047d45000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000
signblock
でブロックデータの署名を生成する。
$ elements-cli signblock 0000002041b97650a81cb6395a79e3109ac5df68c7dceb40a7b65de16baff69fe4c143a61afe4f13e39ed34497613ac34d48b42cfae8590ea386dea33a70f5a178b9b47e1a0a2e5a0100000025512103d4d908226f1a075022798611f02ee992271f7581c0f527757ccfb603c43fae2851ae00010200000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03510101ffffffff0201b34490609efeb1e9d19fa51275c76fd288aa7cc3f662c54c04b44aa242ef398e01000000000000000000016a01b34490609efeb1e9d19fa51275c76fd288aa7cc3f662c54c04b44aa242ef398e01000000000000000000266a24aa21a9ed94f15ed3a62165e4a0b99699cc28b48e19cb5bc1b1f47155db62d63f1e047d45000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000
00473045022100b347f546a144f153913045da6a6c707d7b4cff7f12b7967bb1597aff080b9de10220790648dfad6a5c2f7e9320a236bf4a35bc2182337de77e67b9d44aa6dc8da8ff
署名ができたらcombineblocksigs
にブロックデータと署名データを引数で渡して、署名ブロックを入手する。今回は1-of-1
なのでこれで良いけど、複数の署名者がいる場合は、各署名者がsignblock
で署名を生成し、その署名をまとめてcombineblocksigs
を実行する。
$ elements-cli combineblocksigs 0000002041b97650a81cb6395a79e3109ac5df68c7dceb40a7b65de16baff69fe4c143a61afe4f13e39ed34497613ac34d48b42cfae8590ea386dea33a70f5a178b9b47e1a0a2e5a0100000025512103d4d908226f1a075022798611f02ee992271f7581c0f527757ccfb603c43fae2851ae00010200000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03510101ffffffff0201b34490609efeb1e9d19fa51275c76fd288aa7cc3f662c54c04b44aa242ef398e01000000000000000000016a01b34490609efeb1e9d19fa51275c76fd288aa7cc3f662c54c04b44aa242ef398e01000000000000000000266a24aa21a9ed94f15ed3a62165e4a0b99699cc28b48e19cb5bc1b1f47155db62d63f1e047d45000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000 \[\"00473045022100b347f546a144f153913045da6a6c707d7b4cff7f12b7967bb1597aff080b9de10220790648dfad6a5c2f7e9320a236bf4a35bc2182337de77e67b9d44aa6dc8da8ff\"\]
{
"hex": "0000002041b97650a81cb6395a79e3109ac5df68c7dceb40a7b65de16baff69fe4c143a61afe4f13e39ed34497613ac34d48b42cfae8590ea386dea33a70f5a178b9b47e1a0a2e5a0100000025512103d4d908226f1a075022798611f02ee992271f7581c0f527757ccfb603c43fae2851ae4900473045022100b347f546a144f153913045da6a6c707d7b4cff7f12b7967bb1597aff080b9de10220790648dfad6a5c2f7e9320a236bf4a35bc2182337de77e67b9d44aa6dc8da8ff010200000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03510101ffffffff0201b34490609efeb1e9d19fa51275c76fd288aa7cc3f662c54c04b44aa242ef398e01000000000000000000016a01b34490609efeb1e9d19fa51275c76fd288aa7cc3f662c54c04b44aa242ef398e01000000000000000000266a24aa21a9ed94f15ed3a62165e4a0b99699cc28b48e19cb5bc1b1f47155db62d63f1e047d45000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000",
"complete": true
}
最後に生成した署名付きブロックをネットワークにサブミットする。
$ elements-cli submitblock 0000002041b97650a81cb6395a79e3109ac5df68c7dceb40a7b65de16baff69fe4c143a61afe4f13e39ed34497613ac34d48b42cfae8590ea386dea33a70f5a178b9b47e1a0a2e5a0100000025512103d4d908226f1a075022798611f02ee992271f7581c0f527757ccfb603c43fae2851ae4900473045022100b347f546a144f153913045da6a6c707d7b4cff7f12b7967bb1597aff080b9de10220790648dfad6a5c2f7e9320a236bf4a35bc2182337de77e67b9d44aa6dc8da8ff010200000001010000000000000000000000000000000000000000000000000000000000000000ffffffff03510101ffffffff0201b34490609efeb1e9d19fa51275c76fd288aa7cc3f662c54c04b44aa242ef398e01000000000000000000016a01b34490609efeb1e9d19fa51275c76fd288aa7cc3f662c54c04b44aa242ef398e01000000000000000000266a24aa21a9ed94f15ed3a62165e4a0b99699cc28b48e19cb5bc1b1f47155db62d63f1e047d45000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000
サブミットしたらブロックが追加されてることが確認できる。
$ elements-cli getblockcount
1
生成したブロックを確認すると
elements-cli getblock 7a48bd4377102108abff8d2b58ae22d096e06242db82244e494ef5f1a09dfc54
{
"hash": "7a48bd4377102108abff8d2b58ae22d096e06242db82244e494ef5f1a09dfc54",
"confirmations": 1,
"strippedsize": 371,
"size": 412,
"weight": 1525,
"height": 1,
"version": 536870912,
"versionHex": "20000000",
"merkleroot": "7eb4b978a1f5703aa3de86a30e59e8fa2cb4484dc33a619744d39ee3134ffe1a",
"tx": [
"7eb4b978a1f5703aa3de86a30e59e8fa2cb4484dc33a619744d39ee3134ffe1a"
],
"time": 1512966682,
"mediantime": 1512966682,
"nonce": 1,
"bits": "1 03d4d908226f1a075022798611f02ee992271f7581c0f527757ccfb603c43fae28 1 OP_CHECKMULTISIG",
"difficulty": 1,
"chainwork": "0000000000000000000000000000000000000000000000000000000000000002",
"previousblockhash": "a643c1e49ff6af6be15db6a740ebdcc768dfc59a10e3795a39b61ca85076b941"
}
Bitcoinの場合だとbitsには難易度の閾値がセットされるが、Elementsのブロックヘッダでは、ブロックの署名者のマルチシグスクリプトがセットされている。
BitcoinからElementsにペグイン
Elementsのセットアップができたので、BitcoinのコインをElementsに移動してみる。
Bitcoin Coreもregtestで起動しておく(このノードのRPCのアクセス情報と↑のelements.confの内容が一致してること)。
ペグインするアドレスを生成
getpeginaddress
でペグインの際に使用するアドレスを生成する。(getnewaddress
などと同様、生成したアドレスの秘密鍵はウォレットファイルに追加される。)
$ elements-cli getpeginaddress
{
"mainchain_address": "2Muv3LwF8YxV4Jh6mpvGjN9d77AaH1CRfaw",
"claim_script": "0014e8d28b573816ddfcf98578d7b28543e273f5a72a"
}
mainchain_address
はサイドチェーンにコインをペグする際に、ペグするコインのメインチェーン上での送付先アドレス。
このアドレスにメインチェーンでペグする分のコインを送る。
$ bitcoin-cli -regtest sendtoaddress "2Muv3LwF8YxV4Jh6mpvGjN9d77AaH1CRfaw" 1
d9017e5efc86d2e6e52a39f24edf977fc33e3d7e6eaa0d7a7e8e7599424daf81
ペグされたコインの入手
メインチェーン上でペグするコインをロックしたら、サイドチェーン上でclaimpegin
を実行しサイドチェーンのコインを入手する。claimpegin
は以下の3つの引数を取る。
- bitcoinTx
mainchain_address
宛にコインをデポジットしたBitcoinトランザクションのrawデータ。
- txoutproof
bitcoinTxのトランザクションがブロックに格納されていることの証明。データ自体はmerkleblock
メッセージで使われているデータと同じで、そのトランザクションがブロックに含まれていることを示すマークルパスとマークルルートを計算するのに必要なハッシュ。これはメインチェーン上でgettxoutproof
を実行すれば取得できる。
- claim_script(オプション)
getpeginaddress
で生成した際のwitness program
を指定。ウォレットに登録されていない場合にこのオプション使って指定する。
bitcoinTxhは↓
$ bitcoin-cli -regtest getrawtransaction d9017e5efc86d2e6e52a39f24edf977fc33e3d7e6eaa0d7a7e8e7599424daf81
02000000014578ddc14da3e19445b6e7b4c61d4af711d29e2703161aa9c11e4e6b0ea08843010000006b483045022100eea27e89c3cf2867393263bece040f34c03e0cddfa93a1a18c0d2e4322a37df7022074273c0ab3836affba53737c83673ca6c0d69bffdf722b4accfd7c0a9b2ea4e60121020bfcdbda850cd250c3995dfdb426dc40a9c8a5b378be2bf39f6b0642a783daf2feffffff02281d2418010000001976a914b56872c7b363bfb3f5af84d071ff282cf2abfe3988ac00e1f5050000000017a9141d4796c6e855ae00acecb0c20f65dd8bbeffb1ec87d1000000
txoutproofは↓
$ bitcoin-cli -regtest gettxoutproof \[\"d9017e5efc86d2e6e52a39f24edf977fc33e3d7e6eaa0d7a7e8e7599424daf81\"\]
03000030ffba1d575800bf37a1ee1962dee7e153c18bcfc93cd013e7c297d5363b36cc2d63d5c4a9fdc746b9d3f4f62995d611c34ee9740ff2b5193ce458fdac6d173800ec402e5affff7f200500000002000000027ce06590120cf8c2bef7726200f0fa655940cadcf62708d7dc9f8f2a417c890b81af4d4299758e7e7a0daa6e7e3d3ec37f97df4ef2392ae5e6d286fc5e7e01d90105
↑の2つを使ってサイドチェーンでclaimpegin
を時刻する。
regtestの注意事項
regtestでclaimpegin
を使用する際は以下の点に注意する。
- elementsのノードの最新ブロックが1日以上古い場合、まだIBD中と判断されてエラーになるので、
claimpegin
実行時にブロックが一日以上古かったら↑に書いてるようにElementsのブロックを生成すること。
- ロックされたトランザクションを確認するためbitcoindに対してRPCアクセスするが、ロックしたトランザクションがブロックに格納されてから10 confirmation経っていないとエラーになるので、Bitcoinのregtest側で事前に10ブロック作っておくこと。
※ txoutproofはメインチェーン上でペグしたトランザクションがブロックに格納されていることの保証にはなるが、それ単体ではブロックが実際にチェーン上に存在しているか、またそのブロックのConfirmation数がいくつかは分からないので、そういった確認をメインチェーンのノードにRPCして確認している。
$ elements-cli claimpegin 02000000014578ddc14da3e19445b6e7b4c61d4af711d29e2703161aa9c11e4e6b0ea08843010000006b483045022100eea27e89c3cf2867393263bece040f34c03e0cddfa93a1a18c0d2e4322a37df7022074273c0ab3836affba53737c83673ca6c0d69bffdf722b4accfd7c0a9b2ea4e60121020bfcdbda850cd250c3995dfdb426dc40a9c8a5b378be2bf39f6b0642a783daf2feffffff02281d2418010000001976a914b56872c7b363bfb3f5af84d071ff282cf2abfe3988ac00e1f5050000000017a9141d4796c6e855ae00acecb0c20f65dd8bbeffb1ec87d1000000 03000030ffba1d575800bf37a1ee1962dee7e153c18bcfc93cd013e7c297d5363b36cc2d63d5c4a9fdc746b9d3f4f62995d611c34ee9740ff2b5193ce458fdac6d173800ec402e5affff7f200500000002000000027ce06590120cf8c2bef7726200f0fa655940cadcf62708d7dc9f8f2a417c890b81af4d4299758e7e7a0daa6e7e3d3ec37f97df4ef2392ae5e6d286fc5e7e01d90105
27112a69cb01228939f993e93c4f94f764703eb3f3ee05aad7af17a7d9f7329c
正常に終わるとTXIDが返されるので、そのトランザクションを確認すると
$ elements-cli getrawtransaction 27112a69cb01228939f993e93c4f94f764703eb3f3ee05aad7af17a7d9f7329c 1
{
"hex": "02000000010181af4d4299758e7e7a0daa6e7e3d3ec37f97df4ef2392ae5e6d286fc5e7e01d90100004000ffffffff0201c23bd031406aa9f7ac994f7385cd8d2605adaadf5a473c82557b4586192681d3010000000005f5c940001976a91495208a4cf9f3e6fdf06178baed1bebb8a874b6bf88ac01c23bd031406aa9f7ac994f7385cd8d2605adaadf5a473c82557b4586192681d30100000000000017c0000000000000000002473044022075282f574650e20c3a87d0d1f67d0bcd8f9319b26d244eb254c0aa5bc0284e8002205bddfd4e2f5e278de5f473804a1d061ed6f9bdbcb65fec9b20402879c5a998090121025c36c65910268ee06421053cb9bab1c849c4bdd467d6e77a89d33ff213adc3ca060800e1f5050000000020c23bd031406aa9f7ac994f7385cd8d2605adaadf5a473c82557b4586192681d32006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f160014e8d28b573816ddfcf98578d7b28543e273f5a72ae002000000014578ddc14da3e19445b6e7b4c61d4af711d29e2703161aa9c11e4e6b0ea08843010000006b483045022100eea27e89c3cf2867393263bece040f34c03e0cddfa93a1a18c0d2e4322a37df7022074273c0ab3836affba53737c83673ca6c0d69bffdf722b4accfd7c0a9b2ea4e60121020bfcdbda850cd250c3995dfdb426dc40a9c8a5b378be2bf39f6b0642a783daf2feffffff02281d2418010000001976a914b56872c7b363bfb3f5af84d071ff282cf2abfe3988ac00e1f5050000000017a9141d4796c6e855ae00acecb0c20f65dd8bbeffb1ec87d10000009703000030ffba1d575800bf37a1ee1962dee7e153c18bcfc93cd013e7c297d5363b36cc2d63d5c4a9fdc746b9d3f4f62995d611c34ee9740ff2b5193ce458fdac6d173800ec402e5affff7f200500000002000000027ce06590120cf8c2bef7726200f0fa655940cadcf62708d7dc9f8f2a417c890b81af4d4299758e7e7a0daa6e7e3d3ec37f97df4ef2392ae5e6d286fc5e7e01d9010500000000",
"txid": "27112a69cb01228939f993e93c4f94f764703eb3f3ee05aad7af17a7d9f7329c",
"hash": "440e7c28917bbb9c3145b83c1bc2307b4a4d4b9b54e6a3d0dd0dcb77630054d8",
"withash": "6767fc94b1e1df216d048d77c739158afa3505a7b3877ad1bb28d12e9164f893",
"size": 754,
"vsize": 313,
"version": 2,
"locktime": 0,
"vin": [
{
"txid": "d9017e5efc86d2e6e52a39f24edf977fc33e3d7e6eaa0d7a7e8e7599424daf81",
"vout": 1,
"scriptSig": {
"asm": "",
"hex": ""
},
"is_pegin": true,
"scriptWitness": [
"3044022075282f574650e20c3a87d0d1f67d0bcd8f9319b26d244eb254c0aa5bc0284e8002205bddfd4e2f5e278de5f473804a1d061ed6f9bdbcb65fec9b20402879c5a9980901",
"025c36c65910268ee06421053cb9bab1c849c4bdd467d6e77a89d33ff213adc3ca"
],
"pegin_witness": [
"00e1f50500000000",
"c23bd031406aa9f7ac994f7385cd8d2605adaadf5a473c82557b4586192681d3",
"06226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f",
"0014e8d28b573816ddfcf98578d7b28543e273f5a72a",
"02000000014578ddc14da3e19445b6e7b4c61d4af711d29e2703161aa9c11e4e6b0ea08843010000006b483045022100eea27e89c3cf2867393263bece040f34c03e0cddfa93a1a18c0d2e4322a37df7022074273c0ab3836affba53737c83673ca6c0d69bffdf722b4accfd7c0a9b2ea4e60121020bfcdbda850cd250c3995dfdb426dc40a9c8a5b378be2bf39f6b0642a783daf2feffffff02281d2418010000001976a914b56872c7b363bfb3f5af84d071ff282cf2abfe3988ac00e1f5050000000017a9141d4796c6e855ae00acecb0c20f65dd8bbeffb1ec87d1000000",
"03000030ffba1d575800bf37a1ee1962dee7e153c18bcfc93cd013e7c297d5363b36cc2d63d5c4a9fdc746b9d3f4f62995d611c34ee9740ff2b5193ce458fdac6d173800ec402e5affff7f200500000002000000027ce06590120cf8c2bef7726200f0fa655940cadcf62708d7dc9f8f2a417c890b81af4d4299758e7e7a0daa6e7e3d3ec37f97df4ef2392ae5e6d286fc5e7e01d90105"
],
"sequence": 4294967295
}
],
"vout": [
{
"value": 0.99993920,
"asset": "d381261986457b55823c475adfaaad05268dcd85734f99acf7a96a4031d03bc2",
"n": 0,
"scriptPubKey": {
"asm": "OP_DUP OP_HASH160 95208a4cf9f3e6fdf06178baed1bebb8a874b6bf OP_EQUALVERIFY OP_CHECKSIG",
"hex": "76a91495208a4cf9f3e6fdf06178baed1bebb8a874b6bf88ac",
"reqSigs": 1,
"type": "pubkeyhash",
"addresses": [
"2do2G436PpVMqGxpzBoFJhTQncfKJbGU3YG"
]
}
},
{
"value": 0.00006080,
"asset": "d381261986457b55823c475adfaaad05268dcd85734f99acf7a96a4031d03bc2",
"n": 1,
"scriptPubKey": {
"asm": "",
"hex": "",
"type": "fee"
}
}
]
}
インプットについて
pegin_witness
の部分がペグインの証明で、上から順に以下の項目で構成されている。
- メインチェーン側でロックされたコインの量
- ペグされたアセット(コイン)の識別子
- メインチェーンのジェネシスブロックのハッシュ
- witness program(メインチェーンでペグする際のアドレスを
getpeginaddress
で生成した際のclaim_script
)
- メインチェーン上でコインをロックしたトランザクションのrawデータ(
claimpegin
の第1引数)
- メインチェーン上でコインをロックしたトランザクションのtxoutproof(
claimpegin
の第2引数)
アウトプットについて
- ペグした1 BTCがP2PKH宛に
0.99993920
コイン送られ、手数料が差し引かれているのが分かる。またこのP2PKHのアドレスはキープールから新しい鍵を取得して割り当てているみたい。
- 手数料の方は、
fee
とあるだけでscriptPubKey
のスクリプトは空。
asset
はコインの識別子。メインチェーンのコインとペグするコインの他に任意のアセットが発行できる(Confidentail Assets)ためその識別に使うものと思われる。
あとはまたブロック署名者の鍵を使って新しいブロックを作れば、↑のトランザクションもブロックに入る。listunspent
すれば↑のUTXOも利用可能になっており、このコインを使ってサイドチェーンでコインの送付ができるようになる。
ひとまずCT作るための下準備ができたので次は実際にCTを作ってみよう。