2017年6月16日金曜日

RFIDとブロックチェーン その3.1

前回は Open Assets で新しくコインを発行したところまででしたが、発行時の手数料を最小値の 0.0001 BTCにしていたものだからいつまでたってもブロックに入れてもらえずこの先どうなるんだろーと思ってましたが先ほどようやくブロックに入れてもらえたようです(結局48時間くらいかかった)。

こちらが該当の取引になります。
https://blockchain.info/ja/tx/944a081a91c66c8bef34bdce1b1a84abb34c23c2a99c7f866bad8e4ef5b876bf

で、blockchain.infoでは Open Assets を認識していただけないので奇妙な取引ということになっています。そこで Open Assets を認識できる coinprism というサイトで取引を参照してみます。
https://www.coinprism.info/tx/944a081a91c66c8bef34bdce1b1a84abb34c23c2a99c7f866bad8e4ef5b876bf

おー、コイン100枚発行できているようです。「Unnamed colored coins」ってなってるのでコインに名前とかも付けれるのかなー。

これを利用して例えば ICカード内にビットコインアドレスとプライベートキーを保存しておけば独自コインを使ったポイントシステムとかは出来そうですね。QRでもできるじゃんというのはまぁそうなんですけど。

2017年6月14日水曜日

RFIDとブロックチェーン その3

前回はタグIDをビットコインネットワークに保存するというのを恐る恐るやったわけですが、今回はきちんと?運用されている Open Assets というのを使ってみたいと思います。(※文中にコードがありますがスマホでは表示されません すいません)

Open Assetsはビットコインネットワークを利用して、ビットコイン以外の資産(独自のコインとか)を管理できるようにしたものです。あくまでもビットコインの仕様の上で動いていますのであまり大袈裟なことはできないわけですが、前回出てきた OP_RETURN を活用した仕組みになっています。

Open Assetsでは、Asset ID と数量(整数)を管理することができます。Asset IDはビットコインアドレスに1対1で対応しているアドレスで、例えば私のビットコインアドレスでアセットを発行すると私のビットコインアドレスに対応した Asset ID の資産が数量分発行(これは自由に決められます)することができます。で、発行した資産はビットコインの送金と同じように他の人に送ることができるわけです。

とりあえずやってみます。
調べてみると C# 用のBitcoinライブラリもあって Open Assetsに対応していました。しかもNuGetでゲットできるというお手軽さ。(詳しくはこちらでお勉強できます。Programming The Blockchain in C#)コア的なライブラリの NBitcoin とトランザクションを簡単に扱える QBitNinja.Client の2つをインストールします。

アセットの発行には 600 Satoshi必要のようです。前回のアドレスに0.0015BTC残っているのでこれを使います。https://blockchain.info

// 送り先のアドレス
BitcoinSecret send_to = new BitcoinSecret("??????????", Network.Main);
Console.WriteLine(send_to.PubKeyHash.GetAddress(Network.Main));
// 送り元のアドレス
BitcoinSecret send_from = new BitcoinSecret("??????????", Network.Main);
Console.WriteLine(send_from.PubKeyHash.GetAddress(Network.Main));

// 前回やったトランザクションの OUTPUT の2個目を使ってコインを作る
Coin coin = new Coin(
    fromTxHash: new uint256("d5d3029172421fedd5a91b587049869c7f492580d07fa453de5549764fbd1cca"),
    fromOutputIndex: 1,
    amount: Money.Satoshis(150000),
    scriptPubKey: send_from.ScriptPubKey);

IssuanceCoin issuance = new IssuanceCoin(coin);
で、トランザクションを作成してブロードキャストします。コインは100枚発行しましょう。

TransactionBuilder builder = new TransactionBuilder();

Transaction tx = builder
    .AddKeys(send_from)
    .AddCoins(issuance)
    .IssueAsset(send_to.PubKeyHash.GetAddress(Network.Main), new AssetMoney(issuance.AssetId, quantity: 100))
    .SendFees(Money.Coins(0.0001m))
    .SetChange(send_from.GetAddress())
    .BuildTransaction(true);

Console.WriteLine(tx);

QBitNinjaClient client = new QBitNinjaClient(Network.Main);
BroadcastResponse broadcastResponse = client.Broadcast(tx).Result;
if (!broadcastResponse.Success)
{
    Console.WriteLine("ErrorCode: " + broadcastResponse.Error.ErrorCode);
    Console.WriteLine("Error message: " + broadcastResponse.Error.Reason);
}
else
{
    Console.WriteLine("Success!");
}
こんな簡単なコードでできちゃうのがすげー。作成されたトランザクションのデータを見ると、あれ?

{
  ...
  "out": [
    {
      "value": "0.00002730",
      "scriptPubKey": "OP_DUP OP_HASH160 a91f670b0ccdf12f5c48fd3182981b3e9ec800d
9 OP_EQUALVERIFY OP_CHECKSIG"
    },
    {
      "value": "0.00137270",
      "scriptPubKey": "OP_DUP OP_HASH160 cda95ef101b16b546d83fa0a304d4df05477f72
1 OP_EQUALVERIFY OP_CHECKSIG"
    },
    {
      "value": "0.00000000",
      "scriptPubKey": "OP_RETURN 4f410100016400"
    }
  ]
}
600 Satoshi のはずだが 2730 Satoshiかかってるぞ?仕様変わったの?いつ?
まぁいいやということでトランザクションを見てみましょう。https://blockchain.info/

ここでも奇妙な取引と出ました。これはOpen Assetsに対応していないからということのようです。Open Assetsに対応したサイトで見てみます。と思ったらまだデータが届いてないようなので後で確認します。