2017年4月9日日曜日

"Programming The Blockchain in C# 日本語"のマルチシグでコードを動かしてみた

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

ビットコインを使うためn個の異なる公開鍵に対してm個の秘密鍵で署名する必要があるscriptPubKeyを作る

署名に関わる人たちの鍵を作る

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);

  • 今回はn=3、m=2を想定するようで人数分の鍵を新たに生成する
  • 生成したそれぞれの秘密鍵から公開鍵を生成する
  • 生成された公開鍵からscriptPubKey(LockingScript)を生成する
  •  "2"というのは2つの署名で解除できるということだろうか?


出力結果
  • このscriptPubKey内容を順に解釈すると以下になるか?
    •  解除には2つの署名が必要
    •  署名できるアカウントの公開鍵ハッシュ(今回のケースでは3つ)
    •  3つのアカウントに対するマルチシグチェックをする


receivedというトランザクションでビットコインを受け取ったと想定したときこのアウトプットに先ほど作成したscriptPubKeyを含める

var received = new Transaction();
received.Outputs.Add(new TxOut(Money.Coins(1.0m), scriptPubKey));

先ほど定義したトランザクションから受け取ったコインを取得する
Coin coin = received.Outputs.AsCoins().First();

まだ署名されていないトランザクションを生成する
BitcoinAddress nico = new Key().PubKey.GetAddress(Network.Main);
TransactionBuilder builder = new TransactionBuilder();
Transaction unsigned = builder.AddCoins(coin)
           .Send(nico, Money.Coins(1.0m)).BuildTransaction(sign: false);


  • トランザクションを生成するためのnicoのアドレスを生成する
  • トランザクションビルダーを生成する
  • 生成したトランザクションビルダーに必要な情報を付与する
    •  先ほど取得したコイン
    •  送り先と送るコインの量
    •  署名の有無


生成した署名されてないトランザクションにaliceがどのように署名するかを示す

Transaction aliceSigned = builder.AddCoins(coin)
.AddKeys(alice).SignTransaction(unsigned);

  • aliceがトランザクションに署名するために必要な情報を付与する
    •  先ほど取得したコイン
    •  aliceの鍵
    •  先ほど定義した署名されてないトランザクション


このaliceSignedの中身は以下となる

bobの分も同様に行う

Transaction bobSigned = builder.AddCoins(coin)
             .AddKeys(bob).SignTransaction(aliceSigned);

  • bobがトランザクションに署名するために必要な情報を付与する
    •  先ほど取得したコイン
    •  bobの鍵
    •  先ほど定義したaliceの署名がされたトランザクション



先ほどのscriptSigにaliceのものに加えてbobのものが追加されている

しかしこれでは署名が結合されていないらしいので両者の署名を一つにする

Transaction fullySigned = builder.AddCoins(coin)
                   .CombineSignatures(aliceSigned,bobSigned);

その結果の署名が以下になる

  • 何も変わってない・・・。
  • 一度サイトの方を読み返してみると色々とおかしな点に気づく
  • bobの署名に関する図解がコードと異なっている
    •  coinとsatoshiの秘密鍵と署名されてないトランザクションが必要となっている
    •   正確にはcoinとbobの秘密鍵とaliceが署名したトランザクションが必要ではないか?
    •  しかしそれだと今回の結果通り署名の結合が意味をなさない
  • bobの署名には正しくは以下が必要なのではないかと考える
    •  aliceのトランザクションではなくunsignedなトランザクション
    •  satoshiの鍵ではなくbobの鍵

まとめ

上記の疑問通りコードを書き直したがbobSignedとfullySignedに変化はなかった
この署名の結合の意味はなんなのか、わからずじまいだった。新しいことがわかり次第追記していきたい。

0 件のコメント:

コメントを投稿