前章で勉強したマルチシグの作り方の復習
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);




0 件のコメント:
コメントを投稿