読者です 読者をやめる 読者になる 読者になる

Develop with pleasure!

福岡でCloudとかBlockchainとか。

トランザクションからasset IDを抽出する

Bitcoin Open Asset Protocol

2015.07.23 追記
実際にトランザクションを辿ってみた↓の記事の方がわかりやすいかも。techmedia-think.hatenablog.com


Open Assets Protocolでは、通常のBitcoinのブロックチェーンにasset IDとasset quantityが含まれることになる。トランザクション内にMarker Outputという専用の出力があるかどうかでそのトランザクションがOpen Assetsを含むトランザクションかどうかがわかる。そして、そのトランザクションでいくつのasset quantityが取引されているかはMarker Outputの内容から分かるが、実際に取引されているasset IDが何なのかはMarker Outputには記載されていない。今回はトランザクションのデータに含まれるasset IDを抽出する方法を調べてみる。

colorcoreのlistunspentでやってるプロセスは↓の通り。

1.まず、bitcoindのlistunspentでウォレット内の未使用の出力を収集する。
↓は予めOpen Assetsを送付しておいた未使用の出力。

$ bitcoin-cli listunspent
..
{
        "txid" : "8382f29f591222a8e2c8a4f617516353f5e88774133f220950ed1fe0edfeef25",
        "vout" : 2,
        "address" : "1MFW7BTwiNbAkmVz4SzAMQXboKYKGSzkq2",
        "account" : "admin@haw.co.jp",
        "scriptPubKey" : "76a914de20a2d5a57ee40ce9a4ce14cf06a6c2c6ffe29788ac",
        "amount" : 0.00000600,
        "confirmations" : 3209,
        "spendable" : true
    },
    {
        "txid" : "8382f29f591222a8e2c8a4f617516353f5e88774133f220950ed1fe0edfeef25",
        "vout" : 3,
        "address" : "1MFW7BTwiNbAkmVz4SzAMQXboKYKGSzkq2",
        "account" : "admin@haw.co.jp",
        "scriptPubKey" : "76a914de20a2d5a57ee40ce9a4ce14cf06a6c2c6ffe29788ac",
        "amount" : 0.00457600,
        "confirmations" : 3209,
        "spendable" : true
    },
...


2.収集した未使用の出力のtxidを元にトランザクション情報を取得する。

$ bitcoin-cli gettransaction 8382f29f591222a8e2c8a4f617516353f5e88774133f220950ed1fe0edfeef25
...
    "hex" : "0100000002601c8e18d88537c1bae0691c0d8b768c952b4402b114d5964f692c140d719a8e020000006a47304402204499758dab8e117c40f640de25f2a487989be277a84c54a2fe027914ec4d2a59022079641263d4463d821802af282ff3c3a30ebf0e68c77f6027c8b1d00eebe1ca6a012102174620b7c583dc471e04b604fc85f7ae19d161a070af7227ca03edfcb6c4dc4fffffffff601c8e18d88537c1bae0691c0d8b768c952b4402b114d5964f692c140d719a8e030000006b483045022100bedf89e7302f8e2cc4ce5c4f8fd31ee0093e362a348df197c30725ece485bca702206605a643f16da53ce72a13c22b98166e4eeb7fcb8e744c415c2b514b35b54a77012102174620b7c583dc471e04b604fc85f7ae19d161a070af7227ca03edfcb6c4dc4fffffffff0400000000000000000a6a084f4101000201440058020000000000001976a914b7218fe503cd18555255e5b13d4f07f3fd00d0c988ac58020000000000001976a914de20a2d5a57ee40ce9a4ce14cf06a6c2c6ffe29788ac80fb0600000000001976a914de20a2d5a57ee40ce9a4ce14cf06a6c2c6ffe29788ac00000000"

3.取得したトランザクションの全出力を取得する。

$ bitcoin-cli decoderawtransaction 0100000002601c8e18d88537c1bae0691c0d8b768c952b4402b114d5964f692c140d719a8e020000006a47304402204499758dab8e117c40f640de25f2a487989be277a84c54a2fe027914ec4d2a59022079641263d4463d821802af282ff3c3a30ebf0e68c77f6027c8b1d00eebe1ca6a012102174620b7c583dc471e04b604fc85f7ae19d161a070af7227ca03edfcb6c4dc4fffffffff601c8e18d88537c1bae0691c0d8b768c952b4402b114d5964f692c140d719a8e030000006b483045022100bedf89e7302f8e2cc4ce5c4f8fd31ee0093e362a348df197c30725ece485bca702206605a643f16da53ce72a13c22b98166e4eeb7fcb8e744c415c2b514b35b54a77012102174620b7c583dc471e04b604fc85f7ae19d161a070af7227ca03edfcb6c4dc4fffffffff0400000000000000000a6a084f4101000201440058020000000000001976a914b7218fe503cd18555255e5b13d4f07f3fd00d0c988ac58020000000000001976a914de20a2d5a57ee40ce9a4ce14cf06a6c2c6ffe29788ac80fb0600000000001976a914de20a2d5a57ee40ce9a4ce14cf06a6c2c6ffe29788ac00000000
{
    "txid" : "8382f29f591222a8e2c8a4f617516353f5e88774133f220950ed1fe0edfeef25",
    "version" : 1,
    "locktime" : 0,
    "vin" : [
        {
            "txid" : "8e9a710d142c694f96d514b102442b958c768b0d1c69e0bac13785d8188e1c60",
            "vout" : 2,
            "scriptSig" : {
                "asm" : "304402204499758dab8e117c40f640de25f2a487989be277a84c54a2fe027914ec4d2a59022079641263d4463d821802af282ff3c3a30ebf0e68c77f6027c8b1d00eebe1ca6a01 02174620b7c583dc471e04b604fc85f7ae19d161a070af7227ca03edfcb6c4dc4f",
                "hex" : "47304402204499758dab8e117c40f640de25f2a487989be277a84c54a2fe027914ec4d2a59022079641263d4463d821802af282ff3c3a30ebf0e68c77f6027c8b1d00eebe1ca6a012102174620b7c583dc471e04b604fc85f7ae19d161a070af7227ca03edfcb6c4dc4f"
            },
            "sequence" : 4294967295
        },
        {
            "txid" : "8e9a710d142c694f96d514b102442b958c768b0d1c69e0bac13785d8188e1c60",
            "vout" : 3,
            "scriptSig" : {
                "asm" : "3045022100bedf89e7302f8e2cc4ce5c4f8fd31ee0093e362a348df197c30725ece485bca702206605a643f16da53ce72a13c22b98166e4eeb7fcb8e744c415c2b514b35b54a7701 02174620b7c583dc471e04b604fc85f7ae19d161a070af7227ca03edfcb6c4dc4f",
                "hex" : "483045022100bedf89e7302f8e2cc4ce5c4f8fd31ee0093e362a348df197c30725ece485bca702206605a643f16da53ce72a13c22b98166e4eeb7fcb8e744c415c2b514b35b54a77012102174620b7c583dc471e04b604fc85f7ae19d161a070af7227ca03edfcb6c4dc4f"
            },
            "sequence" : 4294967295
        }
    ],
    "vout" : [
        {
            "value" : 0.00000000,
            "n" : 0,
            "scriptPubKey" : {
                "asm" : "OP_RETURN 4f41010002014400",
                "hex" : "6a084f41010002014400",
                "type" : "nulldata"
            }
        },
        {
            "value" : 0.00000600,
            "n" : 1,
            "scriptPubKey" : {
                "asm" : "OP_DUP OP_HASH160 b7218fe503cd18555255e5b13d4f07f3fd00d0c9 OP_EQUALVERIFY OP_CHECKSIG",
                "hex" : "76a914b7218fe503cd18555255e5b13d4f07f3fd00d0c988ac",
                "reqSigs" : 1,
                "type" : "pubkeyhash",
                "addresses" : [
                    "1HhJs3JgbiyxC8ktfi6nU4wTqVmrMtCVkG"
                ]
            }
        },
        {
            "value" : 0.00000600,
            "n" : 2,
            "scriptPubKey" : {
                "asm" : "OP_DUP OP_HASH160 de20a2d5a57ee40ce9a4ce14cf06a6c2c6ffe297 OP_EQUALVERIFY OP_CHECKSIG",
                "hex" : "76a914de20a2d5a57ee40ce9a4ce14cf06a6c2c6ffe29788ac",
                "reqSigs" : 1,
                "type" : "pubkeyhash",
                "addresses" : [
                    "1MFW7BTwiNbAkmVz4SzAMQXboKYKGSzkq2"
                ]
            }
        },
        {
            "value" : 0.00457600,
            "n" : 3,
            "scriptPubKey" : {
                "asm" : "OP_DUP OP_HASH160 de20a2d5a57ee40ce9a4ce14cf06a6c2c6ffe297 OP_EQUALVERIFY OP_CHECKSIG",
                "hex" : "76a914de20a2d5a57ee40ce9a4ce14cf06a6c2c6ffe29788ac",
                "reqSigs" : 1,
                "type" : "pubkeyhash",
                "addresses" : [
                    "1MFW7BTwiNbAkmVz4SzAMQXboKYKGSzkq2"
                ]
            }
        }
    ]
}

4. 取得した出力のリストの中から、Marker Outputの出力を抽出する。
↑のデータだとMarker Outputは”OP_RETURN 4f41010002014400”してる出力なので0番目の出力になる。Marker Outputのペイロード部(4f41010002014400)をデシリアライズすると、このトランザクションに含まれるasset quantityは[1, 68]というのが分かる。
アセットを送付している出力はMarker Outputより後の出力になるので、1番目以降の出力がアセット転送用の出力になる。

5.続いてトランザクションの入力に紐付いている前の出力を取得する。
↑のvinのtxid"8e9a710d142c694f96d514b102442b958c768b0d1c69e0bac13785d8188e1c60"が対象なので、

$ bitcoin-cli gettransaction 8e9a710d142c694f96d514b102442b958c768b0d1c69e0bac13785d8188e1c60
{
...
    "hex" : "0100000002daf4aac18a09390ba73aa0a905e13c55d721e6b133d4a3fd352506803e99020c020000006a47304402204fc5339a84a2cb85d8dbc5692401ddcddc0f7ceda094d58019c1b1e0725d616502207c416e182a0d40216898db84d76e07e8ef37086dabf16a86d0522357de4dbe06012102174620b7c583dc471e04b604fc85f7ae19d161a070af7227ca03edfcb6c4dc4fffffffffdaf4aac18a09390ba73aa0a905e13c55d721e6b133d4a3fd352506803e99020c030000006a4730440220652824656888d25ca13d5badcea616b83fa260391a83467ba0b2c9e827eef07e0220435851f746b6a6948d8b3692015ce83c2eeb41ba898fcfafefa530b0e4af2ad4012102174620b7c583dc471e04b604fc85f7ae19d161a070af7227ca03edfcb6c4dc4fffffffff0400000000000000000a6a084f4101000201450058020000000000001976a914b7218fe503cd18555255e5b13d4f07f3fd00d0c988ac58020000000000001976a914de20a2d5a57ee40ce9a4ce14cf06a6c2c6ffe29788ace8240700000000001976a914de20a2d5a57ee40ce9a4ce14cf06a6c2c6ffe29788ac00000000"
}

$ bitcoin-cli decoderawtransaction 0100000002daf4aac18a09390ba73aa0a905e13c55d721e6b133d4a3fd352506803e99020c020000006a47304402204fc5339a84a2cb85d8dbc5692401ddcddc0f7ceda094d58019c1b1e0725d616502207c416e182a0d40216898db84d76e07e8ef37086dabf16a86d0522357de4dbe06012102174620b7c583dc471e04b604fc85f7ae19d161a070af7227ca03edfcb6c4dc4fffffffffdaf4aac18a09390ba73aa0a905e13c55d721e6b133d4a3fd352506803e99020c030000006a4730440220652824656888d25ca13d5badcea616b83fa260391a83467ba0b2c9e827eef07e0220435851f746b6a6948d8b3692015ce83c2eeb41ba898fcfafefa530b0e4af2ad4012102174620b7c583dc471e04b604fc85f7ae19d161a070af7227ca03edfcb6c4dc4fffffffff0400000000000000000a6a084f4101000201450058020000000000001976a914b7218fe503cd18555255e5b13d4f07f3fd00d0c988ac58020000000000001976a914de20a2d5a57ee40ce9a4ce14cf06a6c2c6ffe29788ace8240700000000001976a914de20a2d5a57ee40ce9a4ce14cf06a6c2c6ffe29788ac00000000
{
    "txid" : "8e9a710d142c694f96d514b102442b958c768b0d1c69e0bac13785d8188e1c60",
    "version" : 1,
    "locktime" : 0,
    "vin" : [
        {
            "txid" : "0c02993e80062535fda3d433b1e621d7553ce105a9a03aa70b39098ac1aaf4da",
            "vout" : 2,
            "scriptSig" : {
                "asm" : "304402204fc5339a84a2cb85d8dbc5692401ddcddc0f7ceda094d58019c1b1e0725d616502207c416e182a0d40216898db84d76e07e8ef37086dabf16a86d0522357de4dbe0601 02174620b7c583dc471e04b604fc85f7ae19d161a070af7227ca03edfcb6c4dc4f",
                "hex" : "47304402204fc5339a84a2cb85d8dbc5692401ddcddc0f7ceda094d58019c1b1e0725d616502207c416e182a0d40216898db84d76e07e8ef37086dabf16a86d0522357de4dbe06012102174620b7c583dc471e04b604fc85f7ae19d161a070af7227ca03edfcb6c4dc4f"
            },
            "sequence" : 4294967295
        },
        {
            "txid" : "0c02993e80062535fda3d433b1e621d7553ce105a9a03aa70b39098ac1aaf4da",
            "vout" : 3,
            "scriptSig" : {
                "asm" : "30440220652824656888d25ca13d5badcea616b83fa260391a83467ba0b2c9e827eef07e0220435851f746b6a6948d8b3692015ce83c2eeb41ba898fcfafefa530b0e4af2ad401 02174620b7c583dc471e04b604fc85f7ae19d161a070af7227ca03edfcb6c4dc4f",
                "hex" : "4730440220652824656888d25ca13d5badcea616b83fa260391a83467ba0b2c9e827eef07e0220435851f746b6a6948d8b3692015ce83c2eeb41ba898fcfafefa530b0e4af2ad4012102174620b7c583dc471e04b604fc85f7ae19d161a070af7227ca03edfcb6c4dc4f"
            },
            "sequence" : 4294967295
        }
    ],
    "vout" : [
        {
            "value" : 0.00000000,
            "n" : 0,
            "scriptPubKey" : {
                "asm" : "OP_RETURN 4f41010002014500",
                "hex" : "6a084f41010002014500",
                "type" : "nulldata"
            }
        },
        {
            "value" : 0.00000600,
            "n" : 1,
            "scriptPubKey" : {
                "asm" : "OP_DUP OP_HASH160 b7218fe503cd18555255e5b13d4f07f3fd00d0c9 OP_EQUALVERIFY OP_CHECKSIG",
                "hex" : "76a914b7218fe503cd18555255e5b13d4f07f3fd00d0c988ac",
                "reqSigs" : 1,
                "type" : "pubkeyhash",
                "addresses" : [
                    "1HhJs3JgbiyxC8ktfi6nU4wTqVmrMtCVkG"
                ]
            }
        },
        {
            "value" : 0.00000600,
            "n" : 2,
            "scriptPubKey" : {
                "asm" : "OP_DUP OP_HASH160 de20a2d5a57ee40ce9a4ce14cf06a6c2c6ffe297 OP_EQUALVERIFY OP_CHECKSIG",
                "hex" : "76a914de20a2d5a57ee40ce9a4ce14cf06a6c2c6ffe29788ac",
                "reqSigs" : 1,
                "type" : "pubkeyhash",
                "addresses" : [
                    "1MFW7BTwiNbAkmVz4SzAMQXboKYKGSzkq2"
                ]
            }
        },
        {
            "value" : 0.00468200,
            "n" : 3,
            "scriptPubKey" : {
                "asm" : "OP_DUP OP_HASH160 de20a2d5a57ee40ce9a4ce14cf06a6c2c6ffe297 OP_EQUALVERIFY OP_CHECKSIG",
                "hex" : "76a914de20a2d5a57ee40ce9a4ce14cf06a6c2c6ffe29788ac",
                "reqSigs" : 1,
                "type" : "pubkeyhash",
                "addresses" : [
                    "1MFW7BTwiNbAkmVz4SzAMQXboKYKGSzkq2"
                ]
            }
        }
    ]
}

このウチ、voutのnが2,3が前の出力となる。この出力のscriptPubKeyのasmがPublicKey Scriptなので、”de20a2d5a57ee40ce9a4ce14cf06a6c2c6ffe297”からasset IDを計算すると、このトランザクションで使われているasset IDは"AWo3R89p5REmoSyMWB8AeUmud8456bRxZL"であることが分かる。

※ asset IDの計算方法は以前書いたを参照。

techmedia-think.hatenablog.com

2015.07.08追記
asset IDが含まれるのは、正しくは直前ではなくそのアセットを発行した最初のトランザクションで、asset IDを求めるにはそのトランザクションまで辿って計算する必要がある。

asset IDは、そのアセットが最初に発行されたトランザクションの最初の入力で参照されるスクリプトハッシュ(正確にはSHA-256を適用したものにさらにRIPMD-160を適用したハッシュ)である。

Open Assets Protocolの仕様(訳) - Develop with pleasure!