Develop with pleasure!

福岡でCloudとかBlockchainとか。

サイドチェーンにBitcoinをペグしてみる。

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直下にelementsdelements-clielements-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の部分がペグインの証明で、上から順に以下の項目で構成されている。

アウトプットについて
  • ペグした1 BTCがP2PKH宛に0.99993920コイン送られ、手数料が差し引かれているのが分かる。またこのP2PKHのアドレスはキープールから新しい鍵を取得して割り当てているみたい。
  • 手数料の方は、feeとあるだけでscriptPubKeyスクリプトは空。
  • assetはコインの識別子。メインチェーンのコインとペグするコインの他に任意のアセットが発行できる(Confidentail Assets)ためその識別に使うものと思われる。

あとはまたブロック署名者の鍵を使って新しいブロックを作れば、↑のトランザクションもブロックに入る。listunspentすれば↑のUTXOも利用可能になっており、このコインを使ってサイドチェーンでコインの送付ができるようになる。

ひとまずCT作るための下準備ができたので次は実際にCTを作ってみよう。

*1:もともとのサイドチェーンのホワイトペーパーにあるようなSPV Proofの仕組みがあればこのRPCアクセスはおそらく不要になるが、そのためにはBitcoinに機能追加しないといけないので現状こういう形をとっていると思われる。