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

Develop with pleasure!

福岡でCloudとかBlockchainとか。

複数のアセットを1トランザクションで送付できるようになったopenassets-ruby v0.2.9をリリース

Bitcoin Open Asset Protocol Ruby

Open Assets Protocolのカラーリングは、order-based coloringという方式を採用しており、トランザクションの入力に色(Asset ID)の異なるアセットが含まれていても、出力で指定されたアドレスにそれぞれ指定した量ずつアセットを送付することができる。

複数のアセットを1つのトランザクションで送付するメリットは↓

ただ現状、Open Assets Protocolの仕様に沿って複数アセットを送付するトランザクションを作成できるWebウォレットはおそらく無く、自前でそういったトランザクションを作成し、ブロードキャストする必要がある。

openassets-rubyはライブラリであってWebウォレットではないが、複数のアセットを1つのトランザクションで送付するApi#send_assetsのサポートを追加した。

使い方は↓

from = address_to_oa_address('mrxpeizRrF8ymNx5FrvcGGZVecZjtUFVP3')
to = address_to_oa_address('n4MEsSUN8GktDFZzU3V55mP3jWGMN7e4wE')
params = []
params << OpenAssets::SendAssetParam.new('oGu4VXx2TU97d9LmPP8PMCkHckkcPqC5RY', 50, to)
params << OpenAssets::SendAssetParam.new('oUygwarZqNGrjDvcZUpZdvEc7es6dcs1vs', 4, to)
tx = api.send_assets(from, params)

実際にtestnetで実行した結果が↓

前提条件
  • アセットを保持するBitcoinアドレス
    mrxpeizRrF8ymNx5FrvcGGZVecZjtUFVP3
  • 送付するアセット
    • oGu4VXx2TU97d9LmPP8PMCkHckkcPqC5RY
      このアセットを24,24,24,27個持つ4つのUTXOがある。
    • oUygwarZqNGrjDvcZUpZdvEc7es6dcs1vs
      このアセットを3,3,4個持つ3つのUTXOがある。
  • アセットの送付先Bitcoinアドレス
    n4MEsSUN8GktDFZzU3V55mP3jWGMN7e4wE にoGu4VXx2TU97d9LmPP8PMCkHckkcPqC5RY を50個、oUygwarZqNGrjDvcZUpZdvEc7es6dcs1vs を4個、1トランザクションで送付する。
実行結果

上記前提条件の2つのアセットを一緒に送付したトランザクションが↓

{
    "hex" : "0100000006106948b5ad069587da671acd3a1c71059e196516214645bd4728adb716dd8768010000006b483045022100b9e0cb64360c13299be81f2a8c07334e2913f2273f75ccfb919d48b83488ecb00220791aa7e596559be4acc9ce92141775b54d2c4017ddc7a6c2fd37b427c1d07d8c012102f61508529d9676dac201761069ba10eaf546586874e136b02e5d31e9880b5a2affffffff106948b5ad069587da671acd3a1c71059e196516214645bd4728adb716dd8768020000006a473044022030bf90882f9d22dfb13c782ecbe27ada99f8339a2ad780f0780691625c95f426022005246378a8d26ff56ceb6da210fa9e773b0639e12795f51c3cf96986be74c681012102f61508529d9676dac201761069ba10eaf546586874e136b02e5d31e9880b5a2affffffff106948b5ad069587da671acd3a1c71059e196516214645bd4728adb716dd8768030000006b483045022100fba1072d96a3972838dc1503de4509dd4b8c2ba365bea68a8d5c267b2104ede50220688f2e3d4f529b3921884d3b22f6ec26486ce432a8caaf20e45b0d24501d8ffc012102f61508529d9676dac201761069ba10eaf546586874e136b02e5d31e9880b5a2affffffff6f2db9cb1eac348ae672c39b92d5ef290c3cee89b3f06776e40558a9dd6cce9e010000006b483045022100c47feb60db13996e8c2bb46f7053733389385499b17c8ff10f5a23b21cc96be602200a4d4f66115a1b009c64b33e89b867afe3bcc516dda67e5cfe10c510f3465483012102f61508529d9676dac201761069ba10eaf546586874e136b02e5d31e9880b5a2affffffff6f2db9cb1eac348ae672c39b92d5ef290c3cee89b3f06776e40558a9dd6cce9e020000006b48304502210086eb2186d4728b641b392aecaef752a5938e791e4a5b8aa4b6c31a05f88c25c802202cfdc7ce96624f2f667854c12abc969cbd9a31197b7f557cf4d94ee3a1e4e9a0012102f61508529d9676dac201761069ba10eaf546586874e136b02e5d31e9880b5a2affffffff5caa4a08ae0ef0e765e95d8fca4d53bd6e3d5496f941cb8a42f1be453ba78e30010000006a47304402201285dcba61a3524ff6146157a14b354d0b8ed4480793186ccb9fb4196b68d49302205587cad2dc7f1d7cd1044cf5705748810388313182893a82140e8657cbe1a48a012102f61508529d9676dac201761069ba10eaf546586874e136b02e5d31e9880b5a2affffffff0600000000000000000c6a0a4f41010004321604020058020000000000001976a914fa7491ee214ab15241a613fb5906f6df996bb08b88ac58020000000000001976a9147d8dd16cc3413a64a9964c91cb0ee9358ab1dff688ac58020000000000001976a914fa7491ee214ab15241a613fb5906f6df996bb08b88ac58020000000000001976a9147d8dd16cc3413a64a9964c91cb0ee9358ab1dff688ace8610100000000001976a9147d8dd16cc3413a64a9964c91cb0ee9358ab1dff688ac00000000",
    "txid" : "7ed86d1c2824ea14bf8a2fe27202a1d229a4f58db52e2ba1ed13cf36765deaac",
    "version" : 1,
    "locktime" : 0,
    "vin" : [
        {
            "txid" : "6887dd16b7ad2847bd4546211665199e05711c3acd1a67da879506adb5486910",
            "vout" : 1,
            "scriptSig" : {
                "asm" : "3045022100b9e0cb64360c13299be81f2a8c07334e2913f2273f75ccfb919d48b83488ecb00220791aa7e596559be4acc9ce92141775b54d2c4017ddc7a6c2fd37b427c1d07d8c01 02f61508529d9676dac201761069ba10eaf546586874e136b02e5d31e9880b5a2a",
                "hex" : "483045022100b9e0cb64360c13299be81f2a8c07334e2913f2273f75ccfb919d48b83488ecb00220791aa7e596559be4acc9ce92141775b54d2c4017ddc7a6c2fd37b427c1d07d8c012102f61508529d9676dac201761069ba10eaf546586874e136b02e5d31e9880b5a2a"
            },
            "sequence" : 4294967295
        },
        {
            "txid" : "6887dd16b7ad2847bd4546211665199e05711c3acd1a67da879506adb5486910",
            "vout" : 2,
            "scriptSig" : {
                "asm" : "3044022030bf90882f9d22dfb13c782ecbe27ada99f8339a2ad780f0780691625c95f426022005246378a8d26ff56ceb6da210fa9e773b0639e12795f51c3cf96986be74c68101 02f61508529d9676dac201761069ba10eaf546586874e136b02e5d31e9880b5a2a",
                "hex" : "473044022030bf90882f9d22dfb13c782ecbe27ada99f8339a2ad780f0780691625c95f426022005246378a8d26ff56ceb6da210fa9e773b0639e12795f51c3cf96986be74c681012102f61508529d9676dac201761069ba10eaf546586874e136b02e5d31e9880b5a2a"
            },
            "sequence" : 4294967295
        },
        {
            "txid" : "6887dd16b7ad2847bd4546211665199e05711c3acd1a67da879506adb5486910",
            "vout" : 3,
            "scriptSig" : {
                "asm" : "3045022100fba1072d96a3972838dc1503de4509dd4b8c2ba365bea68a8d5c267b2104ede50220688f2e3d4f529b3921884d3b22f6ec26486ce432a8caaf20e45b0d24501d8ffc01 02f61508529d9676dac201761069ba10eaf546586874e136b02e5d31e9880b5a2a",
                "hex" : "483045022100fba1072d96a3972838dc1503de4509dd4b8c2ba365bea68a8d5c267b2104ede50220688f2e3d4f529b3921884d3b22f6ec26486ce432a8caaf20e45b0d24501d8ffc012102f61508529d9676dac201761069ba10eaf546586874e136b02e5d31e9880b5a2a"
            },
            "sequence" : 4294967295
        },
        {
            "txid" : "9ece6cdda95805e47667f0b389ee3c0c29efd5929bc372e68a34ac1ecbb92d6f",
            "vout" : 1,
            "scriptSig" : {
                "asm" : "3045022100c47feb60db13996e8c2bb46f7053733389385499b17c8ff10f5a23b21cc96be602200a4d4f66115a1b009c64b33e89b867afe3bcc516dda67e5cfe10c510f346548301 02f61508529d9676dac201761069ba10eaf546586874e136b02e5d31e9880b5a2a",
                "hex" : "483045022100c47feb60db13996e8c2bb46f7053733389385499b17c8ff10f5a23b21cc96be602200a4d4f66115a1b009c64b33e89b867afe3bcc516dda67e5cfe10c510f3465483012102f61508529d9676dac201761069ba10eaf546586874e136b02e5d31e9880b5a2a"
            },
            "sequence" : 4294967295
        },
        {
            "txid" : "9ece6cdda95805e47667f0b389ee3c0c29efd5929bc372e68a34ac1ecbb92d6f",
            "vout" : 2,
            "scriptSig" : {
                "asm" : "304502210086eb2186d4728b641b392aecaef752a5938e791e4a5b8aa4b6c31a05f88c25c802202cfdc7ce96624f2f667854c12abc969cbd9a31197b7f557cf4d94ee3a1e4e9a001 02f61508529d9676dac201761069ba10eaf546586874e136b02e5d31e9880b5a2a",
                "hex" : "48304502210086eb2186d4728b641b392aecaef752a5938e791e4a5b8aa4b6c31a05f88c25c802202cfdc7ce96624f2f667854c12abc969cbd9a31197b7f557cf4d94ee3a1e4e9a0012102f61508529d9676dac201761069ba10eaf546586874e136b02e5d31e9880b5a2a"
            },
            "sequence" : 4294967295
        },
        {
            "txid" : "308ea73b45bef1428acb41f996543d6ebd534dca8f5de965e7f00eae084aaa5c",
            "vout" : 1,
            "scriptSig" : {
                "asm" : "304402201285dcba61a3524ff6146157a14b354d0b8ed4480793186ccb9fb4196b68d49302205587cad2dc7f1d7cd1044cf5705748810388313182893a82140e8657cbe1a48a01 02f61508529d9676dac201761069ba10eaf546586874e136b02e5d31e9880b5a2a",
                "hex" : "47304402201285dcba61a3524ff6146157a14b354d0b8ed4480793186ccb9fb4196b68d49302205587cad2dc7f1d7cd1044cf5705748810388313182893a82140e8657cbe1a48a012102f61508529d9676dac201761069ba10eaf546586874e136b02e5d31e9880b5a2a"
            },
            "sequence" : 4294967295
        }
    ],
    "vout" : [
        {
            "value" : 0.00000000,
            "n" : 0,
            "scriptPubKey" : {
                "asm" : "OP_RETURN 4f410100043216040200",
                "hex" : "6a0a4f410100043216040200",
                "type" : "nulldata"
            }
        },
        {
            "value" : 0.00000600,
            "n" : 1,
            "scriptPubKey" : {
                "asm" : "OP_DUP OP_HASH160 fa7491ee214ab15241a613fb5906f6df996bb08b OP_EQUALVERIFY OP_CHECKSIG",
                "hex" : "76a914fa7491ee214ab15241a613fb5906f6df996bb08b88ac",
                "reqSigs" : 1,
                "type" : "pubkeyhash",
                "addresses" : [
                    "n4MEsSUN8GktDFZzU3V55mP3jWGMN7e4wE"
                ]
            }
        },
        {
            "value" : 0.00000600,
            "n" : 2,
            "scriptPubKey" : {
                "asm" : "OP_DUP OP_HASH160 7d8dd16cc3413a64a9964c91cb0ee9358ab1dff6 OP_EQUALVERIFY OP_CHECKSIG",
                "hex" : "76a9147d8dd16cc3413a64a9964c91cb0ee9358ab1dff688ac",
                "reqSigs" : 1,
                "type" : "pubkeyhash",
                "addresses" : [
                    "mrxpeizRrF8ymNx5FrvcGGZVecZjtUFVP3"
                ]
            }
        },
        {
            "value" : 0.00000600,
            "n" : 3,
            "scriptPubKey" : {
                "asm" : "OP_DUP OP_HASH160 fa7491ee214ab15241a613fb5906f6df996bb08b OP_EQUALVERIFY OP_CHECKSIG",
                "hex" : "76a914fa7491ee214ab15241a613fb5906f6df996bb08b88ac",
                "reqSigs" : 1,
                "type" : "pubkeyhash",
                "addresses" : [
                    "n4MEsSUN8GktDFZzU3V55mP3jWGMN7e4wE"
                ]
            }
        },
        {
            "value" : 0.00000600,
            "n" : 4,
            "scriptPubKey" : {
                "asm" : "OP_DUP OP_HASH160 7d8dd16cc3413a64a9964c91cb0ee9358ab1dff6 OP_EQUALVERIFY OP_CHECKSIG",
                "hex" : "76a9147d8dd16cc3413a64a9964c91cb0ee9358ab1dff688ac",
                "reqSigs" : 1,
                "type" : "pubkeyhash",
                "addresses" : [
                    "mrxpeizRrF8ymNx5FrvcGGZVecZjtUFVP3"
                ]
            }
        },
        {
            "value" : 0.00090600,
            "n" : 5,
            "scriptPubKey" : {
                "asm" : "OP_DUP OP_HASH160 7d8dd16cc3413a64a9964c91cb0ee9358ab1dff6 OP_EQUALVERIFY OP_CHECKSIG",
                "hex" : "76a9147d8dd16cc3413a64a9964c91cb0ee9358ab1dff688ac",
                "reqSigs" : 1,
                "type" : "pubkeyhash",
                "addresses" : [
                    "mrxpeizRrF8ymNx5FrvcGGZVecZjtUFVP3"
                ]
            }
        }
    ],
    "blockhash" : "0000000000002a073b205c601148a92146d48c11e44f48a4906dbff0a85b9b9d",
    "confirmations" : 1468,
    "time" : 1453356734,
    "blocktime" : 1453356734
}

出力の0番目のMarkerOutputをパースしてasset quantity listを確認すると[50, 22, 4, 2]となり、

  • oGu4VXx2TU97d9LmPP8PMCkHckkcPqC5RY のアセットについて
    24,24,24の同アセットを持つUXTOをインプットとして、50個のアセットの送付と22個のおつり
  • oUygwarZqNGrjDvcZUpZdvEc7es6dcs1vs のアセットについて
    3,3の同アセットを持つUTXOをインプットとして、4個のアセットの送付と2個のおつり

を表現していることが分かる。また各出力のUTXOもそれぞれ送付したAsset IDになっていることがCoinprism等、Open Assets Protocolに対応したエクスプローラでも確認できる