ブロック:何ブロックですか?


導入


前の記事では、コード付きブロックの概念を説明しました.今回は単一ブロックの構造を説明します.私はブロックを説明するためにBitcoinブロックチェーンを使用しますが、その概念が多かれ少なかれ同じままであることを心に留めておいてください.最初にいくつかのことを理解するために読むのは役に立つかもしれません.

ブロックの構造


ブロックはコンテナデータ構造です.Bitcoinの世界では、ブロックの平均500以上のトランザクションが含まれます.ブロックの平均サイズは1 MB(source)である.Bitcoinキャッシュ(Bitcoinブロックからのハードフォーク)では、ブロックのサイズは8 MBまで行くことができます.これは、より多くのトランザクションを1秒あたりの処理を可能にします.
とにかく、ブロックはヘッダーとトランザクションの長いリストから成ります.ヘッダから始めましょう.

ブロックヘッダー


ヘッダはブロックに関するメタデータを含んでいます.メタデータの三つの異なるセットがあります.
  • 以前のブロックハッシュ.ブロックのすべてのブロックは以前のブロックから継承されることを覚えておいてください.ブロックのハッシュを作成する前のブロックのハッシュを使用しています.すべてのブロックnに対して、ブロックn - 1のハッシュを送ります.
  • 鉱業競争.ブロックがブロックの一部であるためには、有効なハッシュを与えなければなりません.これはタイムスタンプ、nonceと難しさを含んでいます.マイニングはブロックチェーン技術のもう一つの重要な部分ですが、この記事の範囲外です.
  • 第三部は、merkle木根です.これは、ブロック内のトランザクションを要約するデータ構造です.そして、我々はそれのために現在それを残します.後でこれ以上.
  • ブロック識別子


    ブロックを識別するには、暗号ハッシュ、デジタル署名をする必要があります.これはブロックヘッダをSHA 256アルゴリズムで2回ハッシュすることによって作成されます.例えば、this is a block .この記事の例としてこのブロックを参照します.
    この特定のブロックのブロックヘッダーハッシュは(右カラム)です.
    また、前のブロックのハッシュ(右カラム)を見ることができます.
    最初に作成する2番目のハッシュを使ったことを覚えておいてください.すべてのブロックは前のブロックのハッシュを使ってハッシュを構築します.ブロックハッシュはユニークな識別子です.あなたは、同じハッシュで2つのブロックを見つけません.
    特定のブロックを特定する他の方法はブロック高さです.ブロックはブロックの位置です.私たちの例のブロックは、500312の位置にあります.これは前に500311ブロックがあることを意味します.2009年にBitcoinブロックの作成以来、500312ブロックが作成されている(明らかに書く時点で).
    ブロックの高さは一意ではありません.いくつかのブロックは、例えば、Bitcoin Cashのようなフォークの場合、同じ位置を競うことができます.

    メルクルツリー


    ブロック内のトランザクションは、Merkleツリーまたはバイナリハッシュツリーと呼ばれる構造体に含まれます.
    私は、そのような話題が実際の例でわかりやすいと感じます.それで、我々はこれをコーディングしに行きます.Merkleツリーは再帰的にノード(この場合、トランザクション)のペアをハッシュ化することによって構築されます.我々がビットコイン世界にとどまるならば、使用される暗号ハッシュアルゴリズムはSHA 256です.これは、毎回2回適用されます.
    例:我々は4つのトランザクションをブロックしている.簡単にするために、各トランザクションは文字列です.
    const tA = 'Hello'
    const tB = 'How are you?'
    const tC = 'This is Thursday'
    const tD = 'Happy new Year'
    
    我々のMerkle木を建設するために、我々は底から始めます.我々は、各トランザクションを取るとダブルハッシュします.ここでJS - SHA 256パッケージを使用します.
    const sha256 = require('js-sha256').sha256
    
    // Double-hashing here
    const hA = sha256(sha256(tA))
    const hB = sha256(sha256(tB))
    const hC = sha256(sha256(tC))
    const hD = sha256(sha256(tD))
    
    //Results
    52c87cd40ccfbd7873af4180fced6d38803d4c3684ed60f6513e8d16077e5b8e //hA
    426436adcaca92d2f41d221e0dd48d1518b524c56e4e93fd324d10cb4ff8bfb9 //hB
    6eeb307fb7fbc0b0fdb8bcfdcd2d455e4f6f347ff8007ed47475481a462e1aeb //hC
    fd0df328a806a6517e2eafeaacea72964f689d29560185294b4e99ca16c63f8f //hD
    
    よろしい.今、私はMerkleツリーのノードのハッシュハッシュの構築を書いた覚えている.それで、我々は我々の取引を対にして、彼らのハッシュを連結します.その後、我々はあまりにもハッシュを2倍になります.ハッシュHAとHBを使用してハッシュを作成し、HCとHDを別のものとします.それから、我々は1つのハッシュ左ともう一つの対だけが働くまで、そのプロセスを繰り返します.最後のハッシュは、我々のmerkleルートです.
    つのトランザクションだけで、これはかなり速いでしょう
    //Pairing hA and hB
    
    const hAB = sha256(sha256(hA + hB))
    //5dc23d1a2151665e2ac258340aa9a11ed227a4cc235e142a3e1738333575590b
    
    //Pairing hC and hD
    
    const hCD = sha256(sha256(hC + hD))
    //ff220daefda29821435691a9aa07dd2c47ca1d2574b8b77344aa783142bae330
    
    // We do it again. We pair hAB and hCD
    // This is our root!
    const hABCD = sha256(sha256(hAB + hCD))
    //301faf21178234b04e1746ee43e126e7b2ecd2188e3fe6986356cc1dd7aa1377
    
    
    merkleツリーの上部のノードをルートと呼びます.これはブロックの各ブロックのブロックヘッダに格納されている情報です.これは、各ブロックにトランザクションがどのように要約されるかです.以前に与えられたブロック例では、右側のカラムにメルクルルートがあります.
    大阪府大阪市
    どのように多くのトランザクションがブロックに含まれているかは重要ではありません.
    注意: merkle treeはバイナリツリーです.トランザクションの数が奇数であれば、最後のものを複製してツリーを構築できます.
    私たちの木の葉は他の葉に依存しているので、他の葉を変えないで葉を変えることは不可能です.あなたが1つの葉(1つの取引)だけを変えるならば、ハッシュは変化します、したがって、もう一つの葉でそれをペアリングすることによって造られるハッシュは変化します、したがって、Merkleルートは異なります.
    任意のトランザクションは、認証のパスまたはmerkleパスを作成することによってブロックに含まれていることを証明することができます.ログベース2 ( n ) 32バイトハッシュを知る必要があるだけです.例えば、
    4トランザクション用のmerkle treeについては
    私が4つの取引の木のために2ハッシュの経路を持っているならば、私はトランザクションがこのmerkle木に属しているかどうかについて証明することができます.
    16トランザクションのマークルツリー:
    16のトランザクションの木のために4ハッシュの経路があるならば、私はトランザクションがこのMerkle木に属しているかどうかを証明することができます.
    私が1500の取引の木のために11ハッシュの経路を持っているならば、私はトランザクションがこのmerkle木に属しているかどうかについて証明することができます.
    おそらく少しの図が役立つでしょう.

    この木には16本の葉がある.我々は、各葉をペアリングすることによって、私たちの木を下から構築します.今、誰もが私は緑の緑のパスを持つことによって、このブロックの一部である葉を証明することができます.我々には4つのハッシュがあります、しかし、それが葉がここに属するかどうか知るのに十分です.それは、それらの情報によって、我々が必要とするすべての単一の葉を構築することができるからです.IJ、IJKL、IJKLMNOPとルートを作成し、それらのハッシュが一致するかどうかを確認できます.これは、ブロックチェーンをカンニングに非常に複雑な理由です.変更するには、すべてを変更する必要があります.
    よく、それはブロックがBitcoinブロックチェーンに含まれているものです.ホープヘルプ!