Tapyrus core v0.5.0を触ってみる

昨年末にTapyrus Coreのv0.5.0が正式リリースされていたので触ってみる記事。

超絶多忙年末年始が無事終わりやっと触れた嬉しい3連休最高

Tapyrusとは

Tapyrusとはchaintope社が開発するハイブリッド型ブロックチェーンです。同日に技術仕様書も出てたので詳しくはそちらをご覧ください。

v0.5.0の内容

雑に抜粋してるので詳しくはリリースノートを確認してください。

  • トークン・Colored Coinのサポート
  • Reissuable Token, Non-Reissuable Token, NFTの発行・移転・焼却
  • OP_COLORの追加
  • Core WalletでのColored Coinサポート
  • その他RPCの更新

また、v0.4.x, v0.3.x など以前のバージョンとの互換性はなく、testnetも同日にv0.5.0でリセットされているそうです。

ノードを立てる

まずは準備編です。Dockerを使ってdevモードのノードを構築していきます。詳しい手順はこちらの記事をご覧ください。

今回はさらっと触るだけなのでGitHubのドキュメントで紹介されているパラメータ値を用いて進めていきます。

Dockerイメージは tapyrus/tapyrusd:v0.5.0 を指定します。

$ docker run -d --name 'tapyrus_node_dev_050' -e GENESIS_BLOCK_WITH_SIG='0100000000000000000000000000000000000000000000000000000000000000000000002b5331139c6bc8646bb4e5737c51378133f70b9712b75548cb3c05f9188670e7440d295e7300c5640730c4634402a3e66fb5d921f76b48d8972a484cc0361e66ef74f45e012103af80b90d25145da28c583359beb47b21796b2fe1a23c1511e443e7a64dfdb27d40e05f064662d6b9acf65ae416379d82e11a9b78cdeb3a316d1057cd2780e3727f70a61f901d10acbe349cd11e04aa6b4351e782c44670aefbe138e99a5ce75ace01010000000100000000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100f2052a010000001976a91445d405b9ed450fec89044f9b7a99a4ef6fe2cd3f88ac00000000' tapyrus/tapyrusd:v0.5.0

コンテナが作成できたら構築を確認します。

# Blockchain info を確認 $ docker exec tapyrus_node_dev_050 tapyrus-cli -conf=/etc/tapyrus/tapyrus.conf getblockchaininfo { "chain": "1905960821", "mode": "dev", "blocks": 0, "headers": 0, "bestblockhash": "aa71d030ac96eafa5cd4cb6dcbd8e8845c03b1a60641bf816c85e97bcf6bb8ea", "mediantime": 1593079023, "verificationprogress": 1, "initialblockdownload": true, "size_on_disk": 298, "pruned": false, "aggregatePubkeys": [ { "03af80b90d25145da28c583359beb47b21796b2fe1a23c1511e443e7a64dfdb27d": 0 } ], "warnings": ""} # ↑devモードで新品のチェーンが立っています # Network info も確認 $ docker exec tapyrus_node_dev_050 tapyrus-cli -conf=/etc/tapyrus/tapyrus.conf getnetworkinfo { "version": 50000, "subversion": "/Tapyrus Core:0.5.0/", "protocolversion": 10000, ~~} # ↑verisonが50000、subversionがTapyrus Core:0.5.0になっていることが分かります

注釈:v0.4.1ではversionが 40100、subversionが Tapyrus Core:0.4.1 となります。

アドレスとTPCの準備

実験用にアドレスとTPCを準備します。

# アドレスを新規作成 $ docker exec tapyrus_node_dev_050 tapyrus-cli -conf=/etc/tapyrus/tapyrus.conf getnewaddress mpbAVZRMDWCv57d8xrzug6FLm28RLxkEgc # 作成したアドレス名義でブロック作成 $ docker exec tapyrus_node_dev_050 tapyrus-cli -conf=/etc/tapyrus/tapyrus.conf generatetoaddress 1 mpbAVZRMDWCv57d8xrzug6FLm28RLxkEgc cUJN5RVzYWFoeY8rUztd47jzXCu1p57Ay8V7pqCzsBD3PEXN7Dd4 [ "2ac8144e3e70d3eea3e883ceb617ed76cbacda22e78f9b432a1a237992684861"] # 残高確認 $ docker exec tapyrus_node_dev_050 tapyrus-cli -conf=/etc/tapyrus/tapyrus.conf getbalance 50.00000000

50TPCあれば十分です。

Colord Coinを触る

では今回のアップデートの目玉、Colored Coinを触ります🪙

例としてNFTの発行・焼却を行います。

issue

何はともあれまずは発行してみましょう。

# UTXOを確認$ docker exec tapyrus_node_dev_050 tapyrus-cli -conf=/etc/tapyrus/tapyrus.conf listunspent [ { "txid": "b2d9e995895b6f34381146e4948339622cdac3e487624a9924435bd22dfad531", "vout": 0, "address": "mpbAVZRMDWCv57d8xrzug6FLm28RLxkEgc", "token": "TPC", "amount": 50.00000000, "label": "", "scriptPubKey": "76a9146384fa850006323e9a9479fbf1daac11aaadf73988ac", "confirmations": 1, "spendable": true, "solvable": true, "safe": true }]# issue$ docker exec tapyrus_node_dev_050 tapyrus-cli -conf=/etc/tapyrus/tapyrus.conf issuetoken 3 1 b2d9e995895b6f34381146e4948339622cdac3e487624a9924435bd22dfad531 0 { "color": "c3fe867030bbc10029a2d11a7ef4719a4b6ef11e5bdbe0d023bd5a57732c48cf99", "txid": "28618a610078b4460b8302e3cc4a1e822b600024b399ede7815de9b830a4a83a"}

issuetokenコマンドは

issuetoken <token_type> <amount> <txid> <index>

の形で使います。<token_type>はReissuable Tokenは 1, Non-Reissuable Tokenは 2, NFTは 3 です。<amount>はトークンの発行枚数ですが、NFTの場合は 1 固定です。そりゃそうですね。続く<txid>,<index> はlistunspentコマンドで確認したUTXOを元に入力します。また、Reissuable
Tokenの発行時にはtxidの代わりにscriptpubleyの入力が必要です。

返答は発行されたNFTのcolor_idとtxidです。

トランザクションの中身を覗いてみましょう。

# 生データを取得 $ docker exec tapyrus_node_dev_050 tapyrus-cli -conf=/etc/tapyrus/tapyrus.conf getrawtransaction 28618a610078b4460b8302e3cc4a1e822b600024b399ede7815de9b830a4a83a 010000000131d5fa2dd25b4324994a6287e4c3da2c62398394e4461138346f5b8995e9d9b2000000006a473044022013423d91b01571f16354d969d35ff9f663719a39f788f03cf8c1335a3b160ce7022046b0ec37de17485e0c82806da0fa84f23c6004a2b692eaea27653b87d2931132012103a62bbea8755fe703679363174264bdab8ebd60f7344d02128099cdc8c223ce41feffffff0201000000000000003a21c3fe867030bbc10029a2d11a7ef4719a4b6ef11e5bdbe0d023bd5a57732c48cf99bca9149edc2446c70515ad5f64c6965bb8ea0b022e432f87d8dd052a010000001976a9140fd54aa93eee2487001991bb6138d2157774c64788ac01000000 # デコード $ docker exec tapyrus_node_dev_050 tapyrus-cli -conf=/etc/tapyrus/tapyrus.conf decoderawtransaction 010000000131d5fa2dd25b4324994a6287e4c3da2c62398394e4461138346f5b8995e9d9b2000000006a473044022013423d91b01571f16354d969d35ff9f663719a39f788f03cf8c1335a3b160ce7022046b0ec37de17485e0c82806da0fa84f23c6004a2b692eaea27653b87d2931132012103a62bbea8755fe703679363174264bdab8ebd60f7344d02128099cdc8c223ce41feffffff0201000000000000003a21c3fe867030bbc10029a2d11a7ef4719a4b6ef11e5bdbe0d023bd5a57732c48cf99bca9149edc2446c70515ad5f64c6965bb8ea0b022e432f87d8dd052a010000001976a9140fd54aa93eee2487001991bb6138d2157774c64788ac01000000 { "txid": "28618a610078b4460b8302e3cc4a1e822b600024b399ede7815de9b830a4a83a", "hash": "676d6b89e7c2c1ba98e1e8dbcb8ebaf04b40c24a10c200be0d4bfe66a1db9dbf", "features": 1, "size": 258, "locktime": 1, "vin": [ { "txid": "b2d9e995895b6f34381146e4948339622cdac3e487624a9924435bd22dfad531", "vout": 0, "scriptSig": { "asm": "3044022013423d91b01571f16354d969d35ff9f663719a39f788f03cf8c1335a3b160ce7022046b0ec37de17485e0c82806da0fa84f23c6004a2b692eaea27653b87d2931132[ALL] 03a62bbea8755fe703679363174264bdab8ebd60f7344d02128099cdc8c223ce41", "hex": "473044022013423d91b01571f16354d969d35ff9f663719a39f788f03cf8c1335a3b160ce7022046b0ec37de17485e0c82806da0fa84f23c6004a2b692eaea27653b87d2931132012103a62bbea8755fe703679363174264bdab8ebd60f7344d02128099cdc8c223ce41" }, "sequence": 4294967294 } ], "vout": [ { "token": "c3fe867030bbc10029a2d11a7ef4719a4b6ef11e5bdbe0d023bd5a57732c48cf99", "value": 1, "n": 0, "scriptPubKey": { "asm": "c3fe867030bbc10029a2d11a7ef4719a4b6ef11e5bdbe0d023bd5a57732c48cf99 OP_COLOR OP_HASH160 9edc2446c70515ad5f64c6965bb8ea0b022e432f OP_EQUAL", "hex": "21c3fe867030bbc10029a2d11a7ef4719a4b6ef11e5bdbe0d023bd5a57732c48cf99bca9149edc2446c70515ad5f64c6965bb8ea0b022e432f87", "reqSigs": 1, "type": "coloredscripthash", "addresses": [ "2oLeGt7qyy2BTKW9EpcTfmZ55HJmxof5Lj5Em46648jrsEsP75hyiwiGZverrMxRAyUBMHbiY8J7oYMp" ] } }, { "token": "TPC", "value": 49.99994840, "n": 1, "scriptPubKey": { "asm": "OP_DUP OP_HASH160 0fd54aa93eee2487001991bb6138d2157774c647 OP_EQUALVERIFY OP_CHECKSIG", "hex": "76a9140fd54aa93eee2487001991bb6138d2157774c64788ac", "reqSigs": 1, "type": "pubkeyhash", "addresses": [ "mgxfwhFVMcSwbyvAZSQUySWULyAKEgpyHb" ] } } ]}

inputには指定したUTXOが、outputでは発行したNFTと手数料を差し引いたお釣りのUTXOが格納されていることが分かります。またNFTはtokenの欄にcolor_idが記載されていることも確認できます。

トランザクションを確定し、listunspentで確認してみましょう。

# トランザクションの確定 $ docker exec tapyrus_node_dev_050 tapyrus-cli -conf=/etc/tapyrus/tapyrus.conf generatetoaddress 1 mpbAVZRMDWCv57d8xrzug6FLm28RLxkEgc cUJN5RVzYWFoeY8rUztd47jzXCu1p57Ay8V7pqCzsBD3PEXN7Dd4 [ "bde71a0e26c8bdfe119a5ab337d95e1d688732c4f9166b9a4fdf1dd2c96ce31a"] # UTXOを確認 $ docker exec tapyrus_node_dev_050 tapyrus-cli -conf=/etc/tapyrus/tapyrus.conf listunspent [ ~~ { "txid": "28618a610078b4460b8302e3cc4a1e822b600024b399ede7815de9b830a4a83a", "vout": 0, "address": "2oLeGt7qyy2BTKW9EpcTfmZ55HJmxof5Lj5Em46648jrsEsP75hyiwiGZverrMxRAyUBMHbiY8J7oYMp", "token": "c3fe867030bbc10029a2d11a7ef4719a4b6ef11e5bdbe0d023bd5a57732c48cf99", "amount": 1, "scriptPubKey": "21c3fe867030bbc10029a2d11a7ef4719a4b6ef11e5bdbe0d023bd5a57732c48cf99bca9149edc2446c70515ad5f64c6965bb8ea0b022e432f87", "confirmations": 1, "spendable": true, "solvable": true, "safe": true }, ~~]

確かにNFTを所持していることが分かります。

burn

発行したNFTを焼却してみましょう。

# burn $ docker exec tapyrus_node_dev_050 tapyrus-cli -conf=/etc/tapyrus/tapyrus.conf burntoken c3fe867030bbc10029a2d11a7ef4719a4b6ef11e5bdbe0d023bd5a57732c48cf99 1 5a5847c4a3d10d3f3b37c5eb14b74318bf5ec1e8ee78534048e8e8ddaf850481

burntokenコマンドは

burntoken <color_id> <amount>

の形で使います。簡単ですね。今回はNFTなのでamountは当然1です。

返答はtxidです。

トランザクションの中身を覗いてみましょう。

# 生データを取得 $ docker exec tapyrus_node_dev_050 tapyrus-cli -conf=/etc/tapyrus/tapyrus.conf getrawtransaction 5a5847c4a3d10d3f3b37c5eb14b74318bf5ec1e8ee78534048e8e8ddaf850481 01000000023aa8a430b8e95d81e7ed99b32400602b821e4acce302830b46b47800618a6128000000001a1976a914e86f06e39ca1739b94fd5d0b9f51a6b307f5e92288acfeffffff3aa8a430b8e95d81e7ed99b32400602b821e4acce302830b46b47800618a6128010000006a4730440220048ea8b604b57e5c5f255cdcbce976b393ad04a23dac7d9846125b960b6878f802206ad46f561a42a371d1dc72f26233baf9b5d015922bbc2478b550a4b1d85c1e48012102f06e77fb7d4b03c28e8d97844c4475c494faeec2c1ff34bab90d655a485e2291feffffff01b0c9052a010000001976a914374efe88a99fe3ec68ff1bd0cabe443872832ce688ac02000000 # デコード $ docker exec tapyrus_node_dev_050 tapyrus-cli -conf=/etc/tapyrus/tapyrus.conf decoderawtransaction 01000000023aa8a430b8e95d81e7ed99b32400602b821e4acce302830b46b47800618a6128000000001a1976a914e86f06e39ca1739b94fd5d0b9f51a6b307f5e92288acfeffffff3aa8a430b8e95d81e7ed99b32400602b821e4acce302830b46b47800618a6128010000006a4730440220048ea8b604b57e5c5f255cdcbce976b393ad04a23dac7d9846125b960b6878f802206ad46f561a42a371d1dc72f26233baf9b5d015922bbc2478b550a4b1d85c1e48012102f06e77fb7d4b03c28e8d97844c4475c494faeec2c1ff34bab90d655a485e2291feffffff01b0c9052a010000001976a914374efe88a99fe3ec68ff1bd0cabe443872832ce688ac02000000 { "txid": "5a5847c4a3d10d3f3b37c5eb14b74318bf5ec1e8ee78534048e8e8ddaf850481", "hash": "67ecac920f69ea43358b125d27b087d725b6705ed26015a6d5f2c78f51d118ed", "features": 1, "size": 258, "locktime": 2, "vin": [ { "txid": "28618a610078b4460b8302e3cc4a1e822b600024b399ede7815de9b830a4a83a", "vout": 0, "scriptSig": { "asm": "76a914e86f06e39ca1739b94fd5d0b9f51a6b307f5e92288ac", "hex": "1976a914e86f06e39ca1739b94fd5d0b9f51a6b307f5e92288ac" }, "sequence": 4294967294 }, { "txid": "28618a610078b4460b8302e3cc4a1e822b600024b399ede7815de9b830a4a83a", "vout": 1, "scriptSig": { "asm": "30440220048ea8b604b57e5c5f255cdcbce976b393ad04a23dac7d9846125b960b6878f802206ad46f561a42a371d1dc72f26233baf9b5d015922bbc2478b550a4b1d85c1e48[ALL] 02f06e77fb7d4b03c28e8d97844c4475c494faeec2c1ff34bab90d655a485e2291", "hex": "4730440220048ea8b604b57e5c5f255cdcbce976b393ad04a23dac7d9846125b960b6878f802206ad46f561a42a371d1dc72f26233baf9b5d015922bbc2478b550a4b1d85c1e48012102f06e77fb7d4b03c28e8d97844c4475c494faeec2c1ff34bab90d655a485e2291" }, "sequence": 4294967294 } ], "vout": [ { "token": "TPC", "value": 49.99989680, "n": 0, "scriptPubKey": { "asm": "OP_DUP OP_HASH160 374efe88a99fe3ec68ff1bd0cabe443872832ce6 OP_EQUALVERIFY OP_CHECKSIG", "hex": "76a914374efe88a99fe3ec68ff1bd0cabe443872832ce688ac", "reqSigs": 1, "type": "pubkeyhash", "addresses": [ "mkZQ6DtPoRPoUqNR4a8WW1Un2jTTUtvdi6" ] } } ]}

発行時のトランザクション(txid:28618a610078b4460b8302e3cc4a1e822b600024b399ede7815de9b830a4a83a)のvout
0,1 がinputに指定されています。vout 1はNFT本体、vout 2は発行時のお釣りUTXOです。ここから手数料を徴収し、このトランザクションのvoutでお釣りとして返却している形です。(たぶん)(おそらく)(きっと)

トランザクションを確定し、listunspentで確認してみましょう。

# トランザクションの確定 $ docker exec tapyrus_node_dev_050 tapyrus-cli -conf=/etc/tapyrus/tapyrus.conf generatetoaddress 1 mpbAVZRMDWCv57d8xrzug6FLm28RLxkEgc cUJN5RVzYWFoeY8rUztd47jzXCu1p57Ay8V7pqCzsBD3PEXN7Dd4 [ "d0a98540dfff58d3c1c4ebefb651724eb25f2119d380f8561cbbc656855a41d4"] # UTXOを確認 $ docker exec tapyrus_node_dev_050 tapyrus-cli -conf=/etc/tapyrus/tapyrus.conf listunspent [ { "txid": "7831b26e3d25773de5b4cb5d21529da8e4d4c48effbf62edf89da2048977e202", "vout": 0, "address": "mpbAVZRMDWCv57d8xrzug6FLm28RLxkEgc", "token": "TPC", "amount": 50.00005160, "label": "", "scriptPubKey": "76a9146384fa850006323e9a9479fbf1daac11aaadf73988ac", "confirmations": 2, "spendable": true, "solvable": true, "safe": true }, { "txid": "5a5847c4a3d10d3f3b37c5eb14b74318bf5ec1e8ee78534048e8e8ddaf850481", "vout": 0, "address": "mkZQ6DtPoRPoUqNR4a8WW1Un2jTTUtvdi6", "token": "TPC", "amount": 49.99989680, "scriptPubKey": "76a914374efe88a99fe3ec68ff1bd0cabe443872832ce688ac", "confirmations": 1, "spendable": true, "solvable": true, "safe": true }, { "txid": "f89c71b0c89f8004cddcdc80bf937b1368727a720ac67fa5ce5fd609093d5dc9", "vout": 0, "address": "mpbAVZRMDWCv57d8xrzug6FLm28RLxkEgc", "token": "TPC", "amount": 50.00005160, "label": "", "scriptPubKey": "76a9146384fa850006323e9a9479fbf1daac11aaadf73988ac", "confirmations": 1, "spendable": true, "solvable": true, "safe": true }]

NFTが消滅していることが分かります。

(ちなみにお金がだんだん増えているのはトランザクション確定の都度ブロック生成報酬をもらっているためです)

長くなったので今回はここまで!

終わりに

Reissuable TokenやNon-Reissuable
Tokenも触ってみたいですね。Non-Reissuable
Tokenって要するにFTなのかなって思ってるけどどうなんだろう。

閲覧ありがとうございました。