Develop with pleasure!

福岡でCloudとかBlockchainとか。

Open Assets Protocolのアセットをburn(焼却)する

Open Assets Protocolを利用することで、Blockchain上で任意のアセットの発行・送付が可能になるが、ユースケースとしてアセットの流通の他にアセットの消滅というユースケースも考えられる。

Open Assets Protocolをアセットを消滅させるには以下のような方法が考えられる。

  • Counterpartyのように誰もその秘密鍵をもっていないアドレスにアセットを送付する
  • 保持しているアセットのUTXOをBitcoinとして消費する
    Open Assets Protocolはトランザクションの出力に必ずMarker Outputと呼ばれるOP_RETURNを使った特別な出力が含まれる。このMarker Outputを含まない普通のBitcoinの送付をするトランザクショントランザクションの入力にアセットを保持したUTXOをセットしBitcoinを送付する出力のみのトランザクションを作成することで、アセットを消滅させることができる。

後者の方法でアセットをburnするAPIをopenassets-rubyに追加してみた。testnetでの実行結果が↓

oa_address = 'bX2vhttomKj2fdd7SJV2nv8U4zDjusE5Y4B'
asset_id = 'oGu4VXx2TU97d9LmPP8PMCkHckkcPqC5RY'
tx = api.burn_asset(oa_address, asset_id)

実際にアセットを焼却したトランザクションが↓

{
    "hex" : "0100000003106948b5ad069587da671acd3a1c71059e196516214645bd4728adb716dd8768040000006b483045022100db3a4e8a65a048d6944dec4423544f2333561501378c7ccbeba0ba3a022836fe022020d3dcec71ec8099925dc949aad412c3ce8cf8b871b2e2a13869e3b551f35cf6012102f61508529d9676dac201761069ba10eaf546586874e136b02e5d31e9880b5a2affffffffacea5d7636cf13eda12b2eb58df5a429d2a10272e22f8abf14ea24281c6dd87e020000006b483045022100862fb40115a793b6b4e0ce7f6f59b0c7802741a03bca9242dae074e39a26785d022075a082b2c381860725f5de7dd290ac295b472af49f63ece7df798dadaef46147012102f61508529d9676dac201761069ba10eaf546586874e136b02e5d31e9880b5a2affffffffacea5d7636cf13eda12b2eb58df5a429d2a10272e22f8abf14ea24281c6dd87e050000006a47304402206a3b2b71546935a68e8a250b1ccbb95477272783b79767c588b227862bf9b505022025adb485fdeee9c7452f0de7922b2e66300ae9f410b186f456c7fd2a7bfd41f5012102f61508529d9676dac201761069ba10eaf546586874e136b02e5d31e9880b5a2affffffff01883f0100000000001976a9147d8dd16cc3413a64a9964c91cb0ee9358ab1dff688ac00000000",
    "txid" : "41fbb44dd78a11f8a1188983dfd63e70e47be94f7e644d20e2e673e811535bde",
    "version" : 1,
    "locktime" : 0,
    "vin" : [
        {
            "txid" : "6887dd16b7ad2847bd4546211665199e05711c3acd1a67da879506adb5486910",
            "vout" : 4,
            "scriptSig" : {
                "asm" : "3045022100db3a4e8a65a048d6944dec4423544f2333561501378c7ccbeba0ba3a022836fe022020d3dcec71ec8099925dc949aad412c3ce8cf8b871b2e2a13869e3b551f35cf601 02f61508529d9676dac201761069ba10eaf546586874e136b02e5d31e9880b5a2a",
                "hex" : "483045022100db3a4e8a65a048d6944dec4423544f2333561501378c7ccbeba0ba3a022836fe022020d3dcec71ec8099925dc949aad412c3ce8cf8b871b2e2a13869e3b551f35cf6012102f61508529d9676dac201761069ba10eaf546586874e136b02e5d31e9880b5a2a"
            },
            "sequence" : 4294967295
        },
        {
            "txid" : "7ed86d1c2824ea14bf8a2fe27202a1d229a4f58db52e2ba1ed13cf36765deaac",
            "vout" : 2,
            "scriptSig" : {
                "asm" : "3045022100862fb40115a793b6b4e0ce7f6f59b0c7802741a03bca9242dae074e39a26785d022075a082b2c381860725f5de7dd290ac295b472af49f63ece7df798dadaef4614701 02f61508529d9676dac201761069ba10eaf546586874e136b02e5d31e9880b5a2a",
                "hex" : "483045022100862fb40115a793b6b4e0ce7f6f59b0c7802741a03bca9242dae074e39a26785d022075a082b2c381860725f5de7dd290ac295b472af49f63ece7df798dadaef46147012102f61508529d9676dac201761069ba10eaf546586874e136b02e5d31e9880b5a2a"
            },
            "sequence" : 4294967295
        },
        {
            "txid" : "7ed86d1c2824ea14bf8a2fe27202a1d229a4f58db52e2ba1ed13cf36765deaac",
            "vout" : 5,
            "scriptSig" : {
                "asm" : "304402206a3b2b71546935a68e8a250b1ccbb95477272783b79767c588b227862bf9b505022025adb485fdeee9c7452f0de7922b2e66300ae9f410b186f456c7fd2a7bfd41f501 02f61508529d9676dac201761069ba10eaf546586874e136b02e5d31e9880b5a2a",
                "hex" : "47304402206a3b2b71546935a68e8a250b1ccbb95477272783b79767c588b227862bf9b505022025adb485fdeee9c7452f0de7922b2e66300ae9f410b186f456c7fd2a7bfd41f5012102f61508529d9676dac201761069ba10eaf546586874e136b02e5d31e9880b5a2a"
            },
            "sequence" : 4294967295
        }
    ],
    "vout" : [
        {
            "value" : 0.00081800,
            "n" : 0,
            "scriptPubKey" : {
                "asm" : "OP_DUP OP_HASH160 7d8dd16cc3413a64a9964c91cb0ee9358ab1dff6 OP_EQUALVERIFY OP_CHECKSIG",
                "hex" : "76a9147d8dd16cc3413a64a9964c91cb0ee9358ab1dff688ac",
                "reqSigs" : 1,
                "type" : "pubkeyhash",
                "addresses" : [
                    "mrxpeizRrF8ymNx5FrvcGGZVecZjtUFVP3"
                ]
            }
        }
    ]
}

入力の1番目と2番目がAsset ID”oGu4VXx2TU97d9LmPP8PMCkHckkcPqC5RY”のアセットのUTXO。これらのUTXOが持つBitcoinの量は600×2=1200satoshiで、10000satoshiの手数料(デフォルト値で変更は可能)を考慮するとBitcoinの量が不足しているので、3番め目のBitcoinを持つ入力をUTXOを追加している。そして出力はMarker Outputを含まない単純なBitcoinの送付スクリプトが1つだけなので、”oGu4VXx2TU97d9LmPP8PMCkHckkcPqC5RY”の2つのUTXO分のアセットはここで消滅する。

このAPIでは指定されたアドレスが持つ、指定したアセットIDのアセットを全て焼却する。機能的には焼却するアセットの量を指定できた方がいいと思うが、指定したアセット量ピッタリのアセットを保持するUTXOが集まるような状態でないかぎり(焼却しないアセット分のおつりが発生する=出力にMarker Outputが必要になり)1トランザクションで焼却を実現できない。

開発時に発行した様々なアセットもこれで、きれいさっぱり非Open AssetsなBitcoinにすることができる。