Taproot Assets Protocol を理解する(実践編 #2)

Hiroki Gondo
Nayuta エンジニアブログ
38 min readMay 29, 2023

以前の記事で Taproot Assets Protocol Daemon(tapd)をインストールしてアセットを生成し、転送した。しかし、単一の tapd で自分から自分にアセットを転送したので、重要な手順が省略されている。

ここでは 2 台の tapd (とそれぞれと連携する LND)を実行し、片方で生成したアセットをもう一方へ転送する。簡単に複数ノードを実行するために Polar を使用して環境を構築する。simnet(regtest)環境で実行するため、どこからか Bitcoin を融通する必要もなくなる :)

注意!完全に tapd の実装を確認したわけではないのでこの記事の一部に推測を含みます。内容に誤りがある可能性があります :)

環境の構築

Polar のインストールは簡単なので特にここで説明はしないが、tapd に対応した最新のリリースをインストールする必要がある。

Polar を実行したら、Create Network 画面で以下の構成でネットワークを構築する。

  • LND 2 台
  • Bitcoin Core 1 台

Bitcoin Core は simnet 環境のマイナーで以降直接触ることはない。

ネットワークが構築されたら Network Designer からそれぞれの LND に対して Taproot Assets Daemon を追加する。以下のような構成になる。

  • alice (LND) + alice-tap (tapd)
  • bob (LND) + bob-tap (tapd)
  • bakend1 (マイナー)

[Start] ボタンを押して、すべてのノードを起動する。

アセットの生成、転送には Bitcoin トランザクションの発行が伴うので、LND に幾ばくかの Bitcoin が必要になる。

それぞれの LND (alice, bob) を選択し、 [Actions] -> [Deposit] を押して Bitcoin を Deposit する。

環境の構築はこれで終わり。

以降の手順は、Polar の GUI 上で容易に実行することができるが、今回は何が行われているか理解するために、あえて Terminal からコマンドを発行して行う。

アセットの生成

alice-tap の [Actions] -> [Terminal] -> [Launch] を押して Terminal を開く。以下のコマンドでアセットを生成する。

tap@alice-tap:/$ tapcli --tapddir=~/.tapd/ assets mint --type normal --name fantasycoin --supply 100 --meta_bytes "fantastic money"
{
"batch_key": "0340d50914ac4177066e0729f8c7580eece1abcc5f99e8dc2f72ff3191dd3adb36"
}
tap@alice-tap:/$ tapcli --tapddir=~/.tapd/ assets mint finalize
{
"batch_key": "0340d50914ac4177066e0729f8c7580eece1abcc5f99e8dc2f72ff3191dd3adb36"
}
tap@alice-tap:/$ tapcli --tapddir=~/.tapd/ assets list
{
"assets": [
{
"version": 0,
"asset_genesis": {
"genesis_point": "b0aa68809a3c0e1cef0e818296f5cea549b3e82fb8abeaa5b9a045f2993adcac:1",
"name": "fantasycoin",
"meta_hash": "04e552053fd4c8e2c01bc14cb9a0ce00f07d4ffdffff68fe455c70b934b22a43",
"asset_id": "4c4bb0d1f8110f62d7845ab56fe7ac18e793ca9a2eb7d0e2fbd3e3f642ebcf5c",
"output_index": 0,
"version": 0
},
"asset_type": "NORMAL",
"amount": "100",
"lock_time": 0,
"relative_lock_time": 0,
"script_version": 0,
"script_key": "0257f1c79e28e5d9e31ec2e90eeacb48abc1db4d94db668c2bfd1e6c52d738b826",
"script_key_is_local": true,
"asset_group": null,
"chain_anchor": {
"anchor_tx": "02000000000101acdc3a99f245a0b9a5eaabb82fe8b349a5cef59682810eef1c0e3c9a8068aab00100000000ffffffff02e803000000000000225120abd6ed0b2442e8099ea5208eb28cd5375f96ddc050c36cdae085c9aeb4e565431e1e0f00000000002251206b20afddf11d1e359d7bc205cbc3c52ff5c1bc283c2df69767017edbb030d13c02483045022100806cdf440cf0e0426e8458e663009a5fc0ec89903624ab89af6aee1dbecfa8f10220460befadd971a55e6c51b4755b14abae2d3bb977d85b6a99d0ddd11dd42c2b7e01210286e6439ae6b3d424dbbe2f4c3a5fc15a19aa6d1a54c9a8c4eb8d42f9c2e7a46e00000000",
"anchor_txid": "cc845fdf19988f8b89d44c9482af82aef10b15135c2e7bd91fa5d4cff3a15142",
"anchor_block_hash": "0000000000000000000000000000000000000000000000000000000000000000",
"anchor_outpoint": "cc845fdf19988f8b89d44c9482af82aef10b15135c2e7bd91fa5d4cff3a15142:0",
"internal_key": "0340d50914ac4177066e0729f8c7580eece1abcc5f99e8dc2f72ff3191dd3adb36",
"merkle_root": "be3431d1aaf341ac5d20f86ceeea2364178e19e57de956c1bf03380f28fd1e2f",
"tapscript_sibling": null
},
"prev_witnesses": [
],
"is_spent": false
}
]
}

Polar の画面で [Quick Mine] ボタンを押してブロックを生成し、このトランザクションを確定させる。

これでアセットが生成された。

アドレスの生成と Universe の同期

同様に bob-tap の Terminal を開き、当該アセットを受け取るためのアドレスを生成する。

tap@bob-tap:/$ tapcli --tapddir=~/.tapd/ addrs new --asset_id 4c4bb0d1f8110f62d7845ab56fe7ac18e793ca9a2eb7d0e2fbd3e3f642ebcf5c --amt 21
[tapcli] unable to make addr: rpc error: code = Unknown desc = unable to make new addr: unable to make address for unknown asset 4c4bb0d1f8110f62d7845ab56fe7ac18e793ca9a2eb7d0e2fbd3e3f642ebcf5c: asset group is unknown

エラーになる ;(

bob-tap は指定された assset_id のアセットがオンチェーン上で正しく生成されているか検証できないといけない。そのためにはこのアセットのメタデータや生成トランザクションの Taproot 出力(anchor_outpoint)に埋め込まれたアセットデータの pre-image や proof が必要になる。これらのデータをまとめて発行証明と呼ぼう。

発行証明は Universe を使用して取得することができる。Universe は 発行証明を保管し、外部に提供するためのサーバである。tapd はそれぞれ内部に Local Universe を持つ。bob-tap の Universe が alice-tap の Universe と同期することにより、発行証明を取得することができる。

tap@bob-tap:/$ tapcli --tapddir=~/.tapd/ universe sync --universe_host alice-tap
{
"synced_universes": [
{
"old_asset_root": {
"id": null,
"mssmt_root": null,
"asset_name": ""
},
"new_asset_root": {
"id": {
"asset_id": "4c4bb0d1f8110f62d7845ab56fe7ac18e793ca9a2eb7d0e2fbd3e3f642ebcf5c"
},
"mssmt_root": {
"root_hash": "fbb1ffde221f2b21d913ff0602fce2feb7fca8f906e6dc9fa38c885c93490b11",
"root_sum": "100"
},
"asset_name": ""
},
"new_asset_leaves": [
{
"asset": {
"version": 0,
"asset_genesis": {
"genesis_point": "b0aa68809a3c0e1cef0e818296f5cea549b3e82fb8abeaa5b9a045f2993adcac:1",
"name": "fantasycoin",
"meta_hash": "04e552053fd4c8e2c01bc14cb9a0ce00f07d4ffdffff68fe455c70b934b22a43",
"asset_id": "4c4bb0d1f8110f62d7845ab56fe7ac18e793ca9a2eb7d0e2fbd3e3f642ebcf5c",
"output_index": 0,
"version": 0
},
"asset_type": "NORMAL",
"amount": "100",
"lock_time": 0,
"relative_lock_time": 0,
"script_version": 0,
"script_key": "0257f1c79e28e5d9e31ec2e90eeacb48abc1db4d94db668c2bfd1e6c52d738b826",
"script_key_is_local": false,
"asset_group": null,
"chain_anchor": null,
"prev_witnesses": [
{
"prev_id": {
"anchor_point": "0000000000000000000000000000000000000000000000000000000000000000:0",
"asset_id": "0000000000000000000000000000000000000000000000000000000000000000",
"script_key": "000000000000000000000000000000000000000000000000000000000000000000",
"amount": "0"
},
"tx_witness": [
],
"split_commitment": null
}
],
"is_spent": false
},
"issuance_proof": "0024acdc3a99f245a0b9a5eaabb82fe8b349a5cef59682810eef1c0e3c9a8068aab00000000101500000002013b2469cee9db74d3e96ea21cb543dcc7a954a0849ae86b0107835e5351ea03d15b5d52f07cf3027e7c06db9b9360afbcbcbea3e5939c0702e04217181d1e81b65527464ffff7f200100000002f702000000000101acdc3a99f245a0b9a5eaabb82fe8b349a5cef59682810eef1c0e3c9a8068aab00100000000ffffffff02e803000000000000225120abd6ed0b2442e8099ea5208eb28cd5375f96ddc050c36cdae085c9aeb4e565431e1e0f00000000002251206b20afddf11d1e359d7bc205cbc3c52ff5c1bc283c2df69767017edbb030d13c02483045022100806cdf440cf0e0426e8458e663009a5fc0ec89903624ab89af6aee1dbecfa8f10220460befadd971a55e6c51b4755b14abae2d3bb977d85b6a99d0ddd11dd42c2b7e01210286e6439ae6b3d424dbbe2f4c3a5fc15a19aa6d1a54c9a8c4eb8d42f9c2e7a46e00000000032201fa282b2b3ca0dcbf0a9244761cbd93d09b5e75e8a99d7757b394bd9e6f1549710004f20001000155acdc3a99f245a0b9a5eaabb82fe8b349a5cef59682810eef1c0e3c9a8068aab0000000010b66616e74617379636f696e04e552053fd4c8e2c01bc14cb9a0ce00f07d4ffdffff68fe455c70b934b22a43000000000002010003016406690167006500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000802000009210257f1c79e28e5d9e31ec2e90eeacb48abc1db4d94db668c2bfd1e6c52d738b826059f00040000000001210340d50914ac4177066e0729f8c7580eece1abcc5f99e8dc2f72ff3191dd3adb360274004900010001204c4bb0d1f8110f62d7845ab56fe7ac18e793ca9a2eb7d0e2fbd3e3f642ebcf5c02220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff012700010001220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0630012e000400000001012102a008a19cdc936b84ace324dcd6afef7798454342a87f460699deb0d3f85640c403030201010814000100010f66616e746173746963206d6f6e6579"
}
]
}
]
}

これでアドレスが発行できるようになった。

tap@bob-tap:/$ tapcli --tapddir=~/.tapd/ addrs new --asset_id 4c4bb0d1f8110f62d7845ab56fe7ac18e793ca9a2eb7d0e2fbd3e3f642ebcf5c --amt 21
{
"encoded": "taprt1qqqsqq3qf39mp50czy8k94uyt26kleavrrne8j5696mapchm603lvshteawqgggzed59whmcfaz6xdtjqnygvdq9yn23ctx3fx4jvl0zg667kk6ffwxsvggzk48rpyuh22s2hx47nep68athj2ly05lljxfc8dud73uxeueu3afssqg4tslzq5",
"asset_id": "4c4bb0d1f8110f62d7845ab56fe7ac18e793ca9a2eb7d0e2fbd3e3f642ebcf5c",
"asset_type": "NORMAL",
"amount": "21",
"group_key": null,
"script_key": "02cb68575f784f45a3357204c886340524d51c2cd149ab267de246b5eb5b494b8d",
"internal_key": "02b54e30939752a0ab9abe9e43a3f57792be47d3ff919383b78df4786cf33c8f53",
"tapscript_sibling": null,
"taproot_output_key": "3d55ca36ece1cc057034df880bd8141cd0a61da15dc6e01b812a2dfed5f4cbab"
}

アセットの転送

生成されたアドレスに対して alice-tap からアセットを送る。

tap@alice-tap:/$ tapcli --tapddir=~/.tapd/ assets send --addr taprt1qqqsqq3qf39mp50czy8k94uyt26kleavrrne8j5696mapchm603lvshteawqgggzed59whmcfaz6xdtjqnygvdq9yn23ctx3fx4jvl0zg667kk6ffwxsvggzk48rpyuh22s2hx47nep68athj2ly05lljxfc8dud73uxeueu3afssqg4tslzq5
{
"transfer": {
"transfer_timestamp": "1685348891",
"anchor_tx_hash": "f8e9dabf8b7051246a2f2ef5f978ecf19405802fdc4da2b89fc5d82fa751b0cb",
"anchor_tx_height_hint": 120,
"anchor_tx_chain_fees": "13262",
"inputs": [
{
"anchor_point": "cc845fdf19988f8b89d44c9482af82aef10b15135c2e7bd91fa5d4cff3a15142:0",
"asset_id": "4c4bb0d1f8110f62d7845ab56fe7ac18e793ca9a2eb7d0e2fbd3e3f642ebcf5c",
"script_key": "0257f1c79e28e5d9e31ec2e90eeacb48abc1db4d94db668c2bfd1e6c52d738b826",
"amount": "100"
}
],
"outputs": [
{
"anchor": {
"outpoint": "cbb051a72fd8c59fb8a24ddc2f800594f1ec78f9f52e2f6a2451708bbfdae9f8:0",
"value": "1000",
"internal_key": "03bf46a593e2c7a1ef99fa07f509c8df0e592eae9e3ff5ccef1bf8ae78674de82d",
"taproot_asset_root": "335a3664200fcd5220d7f343311232ecd3e7182d24f9c183d3ad2be2af00f4c7",
"merkle_root": "335a3664200fcd5220d7f343311232ecd3e7182d24f9c183d3ad2be2af00f4c7",
"tapscript_sibling": null,
"num_passive_assets": 0
},
"script_key": "0261a4ecd533bdc4fd9cf84f62763da4a4414553149d3f6c7c41a5b57ba4e4fd30",
"script_key_is_local": true,
"amount": "79",
"new_proof_blob": "00244251a1f3cfd4a51fd97b2e5c13150bf1ae82af82944cd4898b8f9819df5f84cc000000000150000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096e88000000000000000002fd018d02000000000102e7494b164d58fc77efa95f0d27663b6aaf3f5e9433c084a8a9718291aca6afb50000000000ffffffff4251a1f3cfd4a51fd97b2e5c13150bf1ae82af82944cd4898b8f9819df5f84cc00000000000000000003e8030000000000002251209771a17c952030b3590d0e66f43323c6459e7083f3c8d248ef352ecae8d32dd8e8030000000000002251203d55ca36ece1cc057034df880bd8141cd0a61da15dc6e01b812a2dfed5f4cbab8a0a0f0000000000225120b1c9eddddc3abde2a4eef330bfdc150ecd4d462099e00927e024fca55752f0dd024830450221008e25d13e80b5406f8ae8c7f30901787d203ab322ef1603d0755c8526c60460f402204d16168ec8017810dcb2480aae655c1c1578d981caed7fecc8dad461e79dd1de0121032759e7ff68ce4cb95cb2a149b66a2fcccd5f2d5c98a9cff3c5d51d45d9e3acdc01408fbc4e62b8eae348f392616bdb19b5f72ff00281a92ca1e8d8ba039e22baf0dc2558d14d76b5d86d17118c671d6eff6653a31b7b1c7d98b2fc4e7ca544f7c4e90000000003010004fd01600001000155acdc3a99f245a0b9a5eaabb82fe8b349a5cef59682810eef1c0e3c9a8068aab0000000010b66616e74617379636f696e04e552053fd4c8e2c01bc14cb9a0ce00f07d4ffdffff68fe455c70b934b22a43000000000002010003014f06ad01ab00654251a1f3cfd4a51fd97b2e5c13150bf1ae82af82944cd4898b8f9819df5f84cc000000004c4bb0d1f8110f62d7845ab56fe7ac18e793ca9a2eb7d0e2fbd3e3f642ebcf5c0257f1c79e28e5d9e31ec2e90eeacb48abc1db4d94db668c2bfd1e6c52d738b826014201407ff1d573b6425966961d370b2ea6b6639739f1cde0400257e4231a29069e0327b2880420a0066d3cefaeeef4c7cae114ee4ce1a0bd163c262546dd50ed11ad5b072828d78daa63b031856f1b77928d8b30341068b86bc18961ecd921d00c1b78ef6000000000000000640802000009210261a4ecd533bdc4fd9cf84f62763da4a4414553149d3f6c7c41a5b57ba4e4fd30059f000400000000012103bf46a593e2c7a1ef99fa07f509c8df0e592eae9e3ff5ccef1bf8ae78674de82d0274004900010001204c4bb0d1f8110f62d7845ab56fe7ac18e793ca9a2eb7d0e2fbd3e3f642ebcf5c02220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff012700010001220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff06f802c7000400000001012102b54e30939752a0ab9abe9e43a3f57792be47d3ff919383b78df4786cf33c8f53029c007100010001204c4bb0d1f8110f62d7845ab56fe7ac18e793ca9a2eb7d0e2fbd3e3f642ebcf5c024a000161a674e11bf65860c14acc2d591ad710a045e3ab0f1c0ff277a5410d34a874bf0000000000000015ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf012700010001220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2e00040000000201210266ade74a22f176a0f511d65bfe797b8b67b8879f112b1a92619fa3cc37b84c940303020101",
"split_commit_root_hash": "28d78daa63b031856f1b77928d8b30341068b86bc18961ecd921d00c1b78ef60",
"output_type": "OUTPUT_TYPE_SPLIT_ROOT"
},
{
"anchor": {
"outpoint": "cbb051a72fd8c59fb8a24ddc2f800594f1ec78f9f52e2f6a2451708bbfdae9f8:1",
"value": "1000",
"internal_key": "02b54e30939752a0ab9abe9e43a3f57792be47d3ff919383b78df4786cf33c8f53",
"taproot_asset_root": "1699960e4e44a2a0bfca9b8f9b47a35f189abeea5e772713f1d02dace4613178",
"merkle_root": "1699960e4e44a2a0bfca9b8f9b47a35f189abeea5e772713f1d02dace4613178",
"tapscript_sibling": null,
"num_passive_assets": 0
},
"script_key": "02cb68575f784f45a3357204c886340524d51c2cd149ab267de246b5eb5b494b8d",
"script_key_is_local": false,
"amount": "21",
"new_proof_blob": "00244251a1f3cfd4a51fd97b2e5c13150bf1ae82af82944cd4898b8f9819df5f84cc000000000150000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096e88000000000000000002fd018d02000000000102e7494b164d58fc77efa95f0d27663b6aaf3f5e9433c084a8a9718291aca6afb50000000000ffffffff4251a1f3cfd4a51fd97b2e5c13150bf1ae82af82944cd4898b8f9819df5f84cc00000000000000000003e8030000000000002251209771a17c952030b3590d0e66f43323c6459e7083f3c8d248ef352ecae8d32dd8e8030000000000002251203d55ca36ece1cc057034df880bd8141cd0a61da15dc6e01b812a2dfed5f4cbab8a0a0f0000000000225120b1c9eddddc3abde2a4eef330bfdc150ecd4d462099e00927e024fca55752f0dd024830450221008e25d13e80b5406f8ae8c7f30901787d203ab322ef1603d0755c8526c60460f402204d16168ec8017810dcb2480aae655c1c1578d981caed7fecc8dad461e79dd1de0121032759e7ff68ce4cb95cb2a149b66a2fcccd5f2d5c98a9cff3c5d51d45d9e3acdc01408fbc4e62b8eae348f392616bdb19b5f72ff00281a92ca1e8d8ba039e22baf0dc2558d14d76b5d86d17118c671d6eff6653a31b7b1c7d98b2fc4e7ca544f7c4e90000000003010004fd02a80001000155acdc3a99f245a0b9a5eaabb82fe8b349a5cef59682810eef1c0e3c9a8068aab0000000010b66616e74617379636f696e04e552053fd4c8e2c01bc14cb9a0ce00f07d4ffdffff68fe455c70b934b22a43000000000002010003011506fd021d01fd02190065000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002fd01ae4a0001844dca2fae6df7e1f190133db1d586629db6ab3fba3192fdd3e5b33fd4188848000000000000004fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbffd01600001000155acdc3a99f245a0b9a5eaabb82fe8b349a5cef59682810eef1c0e3c9a8068aab0000000010b66616e74617379636f696e04e552053fd4c8e2c01bc14cb9a0ce00f07d4ffdffff68fe455c70b934b22a43000000000002010003014f06ad01ab00654251a1f3cfd4a51fd97b2e5c13150bf1ae82af82944cd4898b8f9819df5f84cc000000004c4bb0d1f8110f62d7845ab56fe7ac18e793ca9a2eb7d0e2fbd3e3f642ebcf5c0257f1c79e28e5d9e31ec2e90eeacb48abc1db4d94db668c2bfd1e6c52d738b826014201407ff1d573b6425966961d370b2ea6b6639739f1cde0400257e4231a29069e0327b2880420a0066d3cefaeeef4c7cae114ee4ce1a0bd163c262546dd50ed11ad5b072828d78daa63b031856f1b77928d8b30341068b86bc18961ecd921d00c1b78ef6000000000000000640802000009210261a4ecd533bdc4fd9cf84f62763da4a4414553149d3f6c7c41a5b57ba4e4fd3008020000092102cb68575f784f45a3357204c886340524d51c2cd149ab267de246b5eb5b494b8d059f000400000001012102b54e30939752a0ab9abe9e43a3f57792be47d3ff919383b78df4786cf33c8f530274004900010001204c4bb0d1f8110f62d7845ab56fe7ac18e793ca9a2eb7d0e2fbd3e3f642ebcf5c02220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff012700010001220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff06f802c7000400000000012103bf46a593e2c7a1ef99fa07f509c8df0e592eae9e3ff5ccef1bf8ae78674de82d029c007100010001204c4bb0d1f8110f62d7845ab56fe7ac18e793ca9a2eb7d0e2fbd3e3f642ebcf5c024a00013b3f4a2cb4f918aa30216a9af65a932080e8b4f57201bd86e99150b188666d76000000000000004fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf012700010001220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2e00040000000201210266ade74a22f176a0f511d65bfe797b8b67b8879f112b1a92619fa3cc37b84c940303020101079f000400000000012103bf46a593e2c7a1ef99fa07f509c8df0e592eae9e3ff5ccef1bf8ae78674de82d0274004900010001204c4bb0d1f8110f62d7845ab56fe7ac18e793ca9a2eb7d0e2fbd3e3f642ebcf5c02220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff012700010001220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
"split_commit_root_hash": null,
"output_type": "OUTPUT_TYPE_SIMPLE"
}
]
}
}

Polar の画面で [Quick Mine] ボタンを押してブロックを生成し、このトランザクションを確定させる。

bob-tap で受信したアセットを確認できた。

tap@bob-tap:/$ tapcli --tapddir=~/.tapd/ assets list
{
"assets": [
{
"version": 0,
"asset_genesis": {
"genesis_point": "b0aa68809a3c0e1cef0e818296f5cea549b3e82fb8abeaa5b9a045f2993adcac:1",
"name": "fantasycoin",
"meta_hash": "04e552053fd4c8e2c01bc14cb9a0ce00f07d4ffdffff68fe455c70b934b22a43",
"asset_id": "4c4bb0d1f8110f62d7845ab56fe7ac18e793ca9a2eb7d0e2fbd3e3f642ebcf5c",
"output_index": 0,
"version": 0
},
"asset_type": "NORMAL",
"amount": "21",
"lock_time": 0,
"relative_lock_time": 0,
"script_version": 0,
"script_key": "02cb68575f784f45a3357204c886340524d51c2cd149ab267de246b5eb5b494b8d",
"script_key_is_local": true,
"asset_group": null,
"chain_anchor": {
"anchor_tx": "02000000000102e7494b164d58fc77efa95f0d27663b6aaf3f5e9433c084a8a9718291aca6afb50000000000ffffffff4251a1f3cfd4a51fd97b2e5c13150bf1ae82af82944cd4898b8f9819df5f84cc00000000000000000003e8030000000000002251209771a17c952030b3590d0e66f43323c6459e7083f3c8d248ef352ecae8d32dd8e8030000000000002251203d55ca36ece1cc057034df880bd8141cd0a61da15dc6e01b812a2dfed5f4cbab8a0a0f0000000000225120b1c9eddddc3abde2a4eef330bfdc150ecd4d462099e00927e024fca55752f0dd024830450221008e25d13e80b5406f8ae8c7f30901787d203ab322ef1603d0755c8526c60460f402204d16168ec8017810dcb2480aae655c1c1578d981caed7fecc8dad461e79dd1de0121032759e7ff68ce4cb95cb2a149b66a2fcccd5f2d5c98a9cff3c5d51d45d9e3acdc01408fbc4e62b8eae348f392616bdb19b5f72ff00281a92ca1e8d8ba039e22baf0dc2558d14d76b5d86d17118c671d6eff6653a31b7b1c7d98b2fc4e7ca544f7c4e900000000",
"anchor_txid": "cbb051a72fd8c59fb8a24ddc2f800594f1ec78f9f52e2f6a2451708bbfdae9f8",
"anchor_block_hash": "2f1e0a2fb871ba9520eb3f1568335084438426cec6a3de002db26ed32565d446",
"anchor_outpoint": "cbb051a72fd8c59fb8a24ddc2f800594f1ec78f9f52e2f6a2451708bbfdae9f8:1",
"internal_key": "02b54e30939752a0ab9abe9e43a3f57792be47d3ff919383b78df4786cf33c8f53",
"merkle_root": "1699960e4e44a2a0bfca9b8f9b47a35f189abeea5e772713f1d02dace4613178",
"tapscript_sibling": null
},
"prev_witnesses": [
],
"is_spent": false
}
]
}

「転送証明」の転送

以上で全ての手順を確認したが、ひとつ疑問が残る。

アセットの転送トランザクションの Taproot 出力(anchor_outpoint)には bob が受け取ったアセットのデータが埋め込まれている。

しかし、bob が自分のアドレスに支払う転送トランザクションを発見しても、Taproot 出力にはアセットデータのハッシュ値が埋め込まれているだけである。それを確認、検証するためにはそれができるだけの pre-image、proof が必要になる。これらのデータをまとめて転送証明と呼ぼう。

転送証明はどのようにして alice から bob へ渡されるのだろうか?現在の tapd の実装では、lightning-node-connect の mailbox という機能を使用して外部のサーバ経由で渡されている。将来的には生成証明と同じく転送証明も Universe を使用して同期されるようになるかもしれない。

--

--