ベーシック・ブロックチェーンについて
ハッシュ関数の特徴。 1. 同じデータに対するハッシュ値は、常に同じになる。2. ハッシュ値から元のデータを知ることが難しい。3. データを少し変更しただけでも、ハッシュ値が大きく変化する。4. 同じハッシュ値になるような、異なるデータを見つけることが難しい。
proof of workは、改ざん目的でブロックを作り直すことを防ぐため、あえてブロックの生成を遅くする仕組み。さらに、ブロックの生成を10分に調整するという目的もある。difficulty targetを満たすナンス値(ゴールデンナンス)を探索するため、ハッシュ値を計算する。このナンス探索をマイニングという。正確には、繰り返しナンス値を変えながらブロックヘッダーのハッシュ値を計算する。
UTXOを使い支払いをする際、そのUTXOの所有者であることを証明する仕組みとして電子署名がある。タイミングははっきりとは分からないが、トランザクション全体をハッシュ関数にかけて、さらにそのハッシュ値にUTXOを使用する者の秘密鍵で暗号化する。これを署名という。トランザクションをハッシュ関数にかけた値と、署名された値をUTXOを使用する者の公開鍵で復号した値が同一ならば、所有者であると証明されたことになる。以上が電子署名の仕組みだが、これではUTXOを使用する者の秘密鍵で暗号化する時点で、偽者の秘密鍵で暗号化してしまえば、当然復号化することも出来るから、欠陥があるように思える。仕組みをより詳細に理解しなければこの点は分からないのだろう。
ウォレットとトランザクションの関係。まず、ウォレットを作成する際に、恐らく秘密鍵と公開鍵も作成する。何らかの形でビットコインをもらうと、ビットコインはその公開鍵をSHA-256したアドレスを送金先として、トランザクションのOUTPUTにUTXOとして記録される。そして、そのUTXOを使用したいならば、アドレス(公開鍵)に対応する秘密鍵を提示し、施錠しなければ使用できない。これを署名と呼ぶ。もしアリスのアドレスをボブの秘密鍵で署名を試みても不可となる。ユーザーがビットコインを使用する際に、過去のUTXOを参照してトランザクションが作成される。そのトランザクションは、ネットワークへブロードキャストされ、マイナーによりmempoolという未検証トランザクションを収集した空間へ保管される。
トランザクションの検証。OUTPUTにUTXOを使用するための「解除条件」として、locking-scriptがあり、INPUTにはunlocking-scriptがある。locking-script(scriptPubKey)は、アドレスを含む。unlocking-script(scriptSig)も、署名を含む。P2PKH,P2PKなどはトランザクションの検証の方法の違い。Script言語を使う。具体的な検証は、Mastering Bitcoinのp137を参照。
トランザクションの検証、候補ブロックへのトランザクションの収集、ナンス値探索、ブロックの検証(ナンス値探索が成功しているかなど)、コインベーストランザクションのセットをマイナーに自発的に行わせる仕組みをコンセンサスアルゴリズムと呼ぶ。マイナーにとって、不正なトランザクションやブロックを追加することは、他のマイナーによってブロックへの追加を拒否されることが予想できるので、無意味。ブロックチェーンを維持するインセンティブを考えたことがサトシの発明。ただ、マイナーにとって、マイニング報酬があるというインセンティブだけではないことに注意。PoWは、マイナーに新規ビットコインの獲得というインセンティブを与えることで、トランザクションの検証、ブロックの検証を担わせることにより、ブロックチェーンの正しさを保証するための総合的な仕組みだと考えると良い。
PoWでのマイナーの動き。ナンス値の探索に成功したマイナーは、完成したブロックをビットコイン・ネットワークへブロードキャストし、他のマイナーは正当なブロックかどうか検証を行い、正しいならばブロックを今までのチェーンに「追加」する。マイナーは、ナンス探索とともに、ブロックを「作成」し、ブロック生成の約10分間にノードからビットコイン・ネットワークへブロードキャストされたトランザクションを自分のブロックへ取り込んでおく。そして、約10分が経ち新規ブロックがチェーンに追加されたら、トランザクションの取り込みを終え、今度はこのブロックのナンス値を探索する。これを繰り返す。マイナーは同時に二つの作業を行なっていると、現段階では考えることで辻褄が合う。
仮に全てのマイニングの計算能力の51%を保有していれば、マイニング競争で負けることがなく、二重支払い問題などを引き起こすリスクがあるとされる。だが、ブロックを改ざんし、二重支払いを行なった場合、そのネットワークは信頼が失われ、ユーザーが離れるので、自分のマシンパワーを生かす場もなくなる。つまり、「改ざん出来る」からといって「改ざんする」とは限らないし、半数以上のマシンパワーを単独で保持していたとしても、このインセンティブがあることで、改ざんには動かないのではないかと思っている。実際に、改ざんすることが難しいことは別として。
ビットコインの支払いについて。チェーンに追加されたブロック(or トランザクション)は、承認数という値を持つ。これは、チェーンの分岐が収まり、あるチェーンが確定されたと考えるブロックの長さを、チェーンの末尾から6以上とすることを指す。つまり、この末尾からのブロックの長さを承認数と定義し、それが6以上になれば、「もうその取引は確実に行われたと考えて良い」ということだ。通常、ブロックの生成には10分かかるので、単純計算で1時間しなければ本当にそのトランザクションが確定したのか分からない。実は、手数料が低く、どのマイナーにも新規ブロックに取り込まれていないトランザクションであった可能性もある。小売店で1時間、レジに客を待たせるわけにはいかないので、解決策としてライトニングネットワークが考えられた。ライトニングネットワークとは、ブロックチェーンの外で、取引を行うようだ。詳しいところはこれから勉強する。とにかくそのライトニングネットワークがあることで、決済の時間が大幅に短縮する。
ブロックヘッダーについて。マークルツリーとは、ブロックに格納された約2000のトランザクションを、トーナメントのように2個ずつ一組としてハッシュ関数にかけ、最終的に一つのハッシュ値になるまで続ける作業のこと。最後の一つのハッシュ値はマークルルート(merkle root) と呼ばれ、ブロックヘッダー(block header)に組み込まれる。マークルルートは全データの要約を意味する。ブロックヘッダーには、他に主なものとして直前のブロックをハッシュ関数にかけた値(previous block hash)、ナンス値探索の難易度(defficulty target)、ナンス値(nonce)が入っている。SPVノードは、トランザクション部分を取得せず、このブロックヘッダーのみをデータとして取得する。
鍵の導出について。秘密鍵をkとして、定点をGとすると、公開鍵KはK=k*Gとして計算できる。さらに公開鍵KからアドレスAを計算する式は、A= RIPEMD160(SHA256(K))。つまり、二回ハッシュ関数をかける。さらに、そのアドレスに対して、Base58Checkエンコードをする。これは、長い数字を少ない記号でコンパクトに表すために用いられる(打ち間違いを防ぐ)。公開鍵の時点で、圧縮するか、しないかという区別がある。圧縮する目的は、トランザクションサイズの削減。圧縮できるのは、公開鍵がprefix + x座標 + y座標という構成されるからで、x座標がわかればy座標は計算式で解くことができるので、y座標分を削除できる。しかし、y座標の正負は情報として与える必要があるので、それをprefixとして与える。圧縮されていない公開鍵なら04、圧縮公開鍵でyが正(正確には偶数)なら02、圧縮公開鍵でyが負(正確には奇数)なら03となる。
ウォレットには、ビットコイン自体が保管されているわけではなく、デジタル鍵が保管されている。つまり、ビットコインへのアクセスが保証される。ウォレットでどのように鍵を保管するか、鍵を導出するかの点で種類があり、主流はHDウォレット。HDウォレットは鍵がツリー構造になっており、親公開鍵から子秘密鍵を導出し、子秘密鍵から子公開鍵を導出するというようにルールに基づいて連鎖して鍵を作ることができる。したがって、ルートシードと呼ばれる最初の値を覚えておけば、計算によってすぐに必要な鍵を見つけることができる。生成の仕方は以下のようになる。ルートシードをHMAC-SHA512というハッシュ関数にかけて、ハッシュ値を出す。そのハッシュ値は512ビット(64文字)の左半分をマスター秘密鍵(m)とし、右半分をマスターchain codeとする。マスター秘密鍵からマスター公開鍵を計算する。そして、マスター公開鍵、マスターchain code、インデックスを合わせてHMAC-SHA512にかけ、親秘密鍵、親chain codeを作成。これを繰り返すことができる。ルートシードは暗号生成器で作られるので、覚えておくことが難しいという点を解決するために、ニーモニック(mnemonic)というアイデアが使われている。ニーモニックの具体的な挙動はまだ勉強していないが、ニーモニックを使うと12〜24の英単語に変換してくれるので、これを覚えておけば良い。
参考文献
松浦健一郎・司ゆき「仮想通貨の作り方」秀和システム. 2018
アンドレアス・M・アントノプロス 「Mastering Bitcoin」 NTT出版.2016
この記事が気に入ったらサポートをしてみませんか?