2017年4月2日日曜日

"Programming The Blockchain in C# 日本語"のP2PK[H] (Pay to Public Key [Hash])でコードを動かしてみた

前回に引き続きこちらのサイトで練習。
P2PK(Pay to Public Key)とP2PKH(Pay to Public Key Hash)の違いについて学ぶ。

前準備

こちらでScriptPubKeyに関する説明がされている。
ひょっとすると知らないかもしれないが、実は、ビットコインのブロックチェーンの内部には、ビットコインアドレスなどというものはない。内部的に、ビットコインのプロトコルでは、ビットコインを受け取る相手をScriptPubKeyで認識することになっている。
つまりビットコインの所有権を誰が持っているのかをScriptPubKeyで認識するということ。一般的にはビットコインアドレスがその一旦を担ってい流ように思われがちだがそうではないということ。

本編


公開鍵とビットコインアドレスの関係性を復習

            var publicKeyHash = new Key().PubKey.Hash;
                //公開鍵ハッシュ値を生成
            var bitcoinAddress = publicKeyHash.GetAddress(Network.Main);
                //公開鍵ハッシュ値からメインネット用のビットコインアドレスを生成
            Console.WriteLine(publicKeyHash);
            Console.WriteLine(bitcoinAddress);

  • ビットコインアドレスは公開鍵ハッシュから生成される


ビットコインアドレスとScriptPubKeyの関係性を把握

            var scriptPubKey = bitcoinAddress.ScriptPubKey;
                //ビットコインアドレスからLockingScript(ScriptPubKey)を生成
            Console.WriteLine(scriptPubKey);

            var sameBitcoinAddress = scriptPubKey.GetDestinationAddress(Network.Main);
                //LockingScriptからビットコインアドレスを生成
            Console.WriteLine(sameBitcoinAddress);

  • ScriptPubKeyはビットコインアドレスから生成される
  • その逆もまた然り


しかし必ずしもScriptPubKeyはビットコインアドレスを含んでいる訳ではない。というのがここで主張されていることだ。

GenesisBlockから見るScriptPubKeyの性質

            Block genesisBlock = Network.Main.GetGenesis();
                //GenesisBlockを取得
            Transaction firstTransactionEver = genesisBlock.Transactions.First();
                //GenesisBlockのトランザクション情報
            var firstOutputEver = firstTransactionEver.Outputs.First();
                //GenesisBlockのトランザクションのアウトプットを取得
            var firstScriptPubKey = firstOutputEver.ScriptPubKey;
                //GenesisBlockのトランザクションのアウトプットのScriptPubKeyを取得
            var firstBitcoinAddressEver = 
                firstScriptPubKey.GetDestinationAddress(Network.Main);
                //GenesisBlockのトランザクションのアウトプットの
                      //ScriptPubKeyからビットコインアドレスを生成
            
            Console.WriteLine(firstTransactionEver);
                //scriptPubKeyの形式が「公開鍵ハッシュ値+スクリプト」ではなく
                     //「公開鍵+スクリプト」となっている
                //初期の頃は公開鍵が直接scriptPubKeyに使われているということがわかる
      
            var key = new Key();
            Console.WriteLine("pay to public key : " + key.PubKey.ScriptPubKey);
            Console.WriteLine();
            Console.WriteLine("pay to public key hash : " + key.PubKey.Hash.ScriptPubKey);


  • ScriptPubKeyの形式が「公開鍵ハッシュ値+スクリプト」ではなく「公開鍵+スクリプト」となっている
  • 初期の頃は公開鍵が直接ScriptPubKeyに使われていたということがわかる。


まとめ

P2PKtpP2PKHの違いはScriptPubKeyが公開鍵か公開鍵ハッシュを含んでいるかが大きな違いであることがわかった。

しかし以下の文章については疑問が残る。P2PKHの採用が量子コンピュータへの対策に繋がるとのことだがなぜそう言えるのだろうか?現在調査中なのでわかり次第追記したい。

  • 楕円曲線暗号(公開鍵秘密鍵 に使われれている暗号)が、楕円曲線上の離散対数問題を解くために改良されたショアのアルゴリズムによって解かれてしまうから。簡単に言うとそれが意味するのは、理論上、量子コンピューターがそう遠くない未来に 公開鍵から秘密鍵を導出できてしまう ということだ。ビットコインを使うときだけ公開鍵を公開することによって、そういった攻撃を無力化することができる(一度使われたビットコインアドレスを二度と使わない前提だが)。





0 件のコメント:

コメントを投稿