2017年4月16日日曜日

"Programming The Blockchain in C# 日本語"のP2SHでコードを動かしてみた

前回と同様にこちらでの勉強内容を記す。

前章で勉強したマルチシグの作り方の復習

Key bob = new Key();
Key alice = new Key();
Key satoshi = new Key();

var scriptPubKey = PayToMultiSigTemplate.Instance
.GenerateScriptPubKey(2, new[]{bob.PubKey,alice.PubKey,satoshi.PubKey});
Console.WriteLine(scriptPubKey);



ここで得られるマルチシグはビットコインアドレスのように人が区別しやすい形式になっていないとのこと。確かにそうだ。

先ほどの懸案を解消するP2SH

var paymentScript = PayToMultiSigTemplate
            .Instance.GenerateScriptPubKey
            (2, new[]{bob.PubKey,alice.PubKey,satoshi.PubKey}).PaymentScript;
Console.WriteLine(paymentScript);
Console.WriteLine(paymentScript.GetScriptAddress(Network.Main));



  • paymentScriptはマルチシグのハッシュを表しているため、Base58エンコードでBitcoinScriptAddressに変換できるので独自にpaymentScriptAddressを生成して見た。
  • 一番目が"3"担っている。わかりやすい表記にすることができた。


上記と同様にredeemScript.Hash.ScriptPubkeyでも表現できる

Script redeemScript = PayToMultiSigTemplate
.Instance.GenerateScriptPubKey
(2, new[]{bob.PubKey,alice.PubKey,satoshi.PubKey});
Console.WriteLine("redeemScript" + redeemScript);
Console.WriteLine("redeemScriptAddress:" + redeemScript
.Hash.GetAddress(Network.Main));



  • ここで得られるのはBitcoinScriptAddress、つまりマルチシグ用のアドレスと理解しておけば良いだろう
    • このメリットは支払う人がredeemScriptHashについて知っていればいいの
      • つまりredeemScriptのような複雑な情報に触れる必要がなくなる
      • またその中身が誰と誰のマルチシグなのかを知る必要もなくなるということ



  • 疑問が湧いたので記しておく
    • そもそもredeemScriptの必要性はなんなのか?
    • paymentScriptがマルチシグのハッシュであるならばGetScriptAddressでマルチシグ用のアドレスを生成できるのではないか?


receivedというトランザクションにマルチシグが受け取ったコインがあると想定すると

Transaction received = new Transaction();
received.Outputs.Add(new TxOut(Money.Coins(1.0m), redeemScript.Hash));
Console.WriteLine("received.Outputs:" + received.Outputs.Transaction);


受け取ったコインを使いたい時

ScriptCoin coin = received.Outputs.AsCoins().First().ToScriptCoin(redeemScript);
Console.WriteLine(coin.Amount);
Console.WriteLine(coin.CanGetScriptCode);
Console.WriteLine(coin.IsP2SH);
Console.WriteLine(coin.Outpoint);
Console.WriteLine(coin.Redeem);
Console.WriteLine(coin.RedeemType);
Console.WriteLine(coin.ScriptPubKey);
Console.WriteLine(coin.TxOut);


まとめ

redeemScriptとpaymentScriptどちらからも同様のscriptAddressが得られると思っていたがそうではなかった。その理由は解決したらここに追記したい。

0 件のコメント:

コメントを投稿