北京大学「ブロックチェーン技術と応用」公開授業ノート-BTCのシャオ・ジェン教師

このノートは学習期間中の主な知識とロジックを記録したもので、コース内容に応じてBTCとETHの2つの部分に分かれており、この部分はBTC部分となります

北京大学「ブロックチェーン技術と応用」公開授業ノート - ETH

01-コース紹介


  • 参照 (コードの対象)
    • ビットコインと暗号通貨テクノロジーの包括的な紹介 (2016 年発行、古い)
    • イーサリアムのホワイトペーパー、イエローペーパー、ソースコード
    • Solidityドキュメント

コース概要:ビットコイン

  • ビットコイン
    • 暗号化の基礎
    • ビットコインのデータ構造
    • コンセンサスプロトコルとシステムの実装
    • マイニングアルゴリズムと難易度調整
    • ビットコインスクリプト
    • ソフトフォークとハードフォーク 匿名性とプライバシーの保護

コース概要:イーサリアム

  • イーサリアム
    • 概要: アカウントベースの分散元帳
    • データ構造: 状態ツリー、トランザクション ツリー、レシート ツリー
    • GHOSTプロトコル
    • マイニング: 覚えるのが大変なマイニング パズル
    • 採掘難易度の調整
    • 賭け金の証拠
      • キャスパー・ザ・フレンドリー・ファイナリティ・ガジェット(FFG)
    • スマートコントラクト
  • 概要と展望

02-BTC-暗号化の原理


ビットコインは暗号化で主に 2 つの機能を使用します: 1. ハッシュ 2. 署名

  • 暗号化で使用されるハッシュ関数は、暗号化ハッシュ関数と呼ばれます。これには、いくつかの重要な特性があります。
  1. 衝突 (ここではハッシュ衝突を指します) 耐性: ハッシュ値を元の入力のハッシュ値と一致させるための他の入力が見つかりません。
  2. 隠蔽ハッシュ関数の計算プロセスは一方向であり、不可逆的です
  3. パズルフレンドリーとは、ハッシュ値の値の範囲が事前に予測できないことを意味します。つまり、マイニングでは、ハッシュ値がターゲットよりも小さくなるように乱数を見つけて、試行を続けることしかできません。

  • ビットコイン システムでアカウントを開きます。
  1. 公開鍵と秘密鍵のペア (公開鍵、秘密鍵) をローカルに作成します。これがアカウントです。公開鍵と秘密鍵のペアは、非対称暗号化アルゴリズムから取得されます。

  2. 公開キーで暗号化し、受信後に独自の秘密キーで復号化します

  3. 署名用の秘密鍵、復号用の公開鍵

  4. したがって、公開鍵と秘密鍵のペアを生成するには、適切なランダム性のソースが必要です。

03-BTC-データ構造


  • ハッシュポインタ

    通常のポインタは、構造体のアドレスをメモリに格納します。ビットコインのハッシュポインタは構造体のハッシュ値H()のみを保存します。ハッシュ値から位置を特定し、改ざんの有無を判定


  • ビットコインの最も基本的な構造はブロックチェーンです

    • ブロックチェーンと通常のリンクリストの違いは何ですか:

      1. 通常のポインタの代わりにハッシュポインタを使用します(Bブロックチェーンはハッシュポインタを使用した連結リストです)

      2. 通常のリンク リストは任意の要素を変更できますが、リンク リスト内の他の要素には影響しません。ブロックチェーンは本体全体に影響を与えるため、ブロックチェーンが変更されたかどうか、および変更された場所を判断するには、最後のハッシュ値のみを保存する必要があります。

    • ブロックはブロックヘッダーとブロックボディに分かれています

      • ブロックヘッダーにはマークルツリーのルートハッシュが含まれています

  • マークルツリー(ビットコインのブロックのデータ構造)

    • 最下位層はデータ ブロックで、内部ノードの上位 3 層はすべてハッシュ ポインターであり、最初の層はルート ノードであり、ルート ノードのブロックはルート ハッシュ (ルート ハッシュ) と呼ばれるハッシュを取ることもできます。各データ ブロックはトランザクションです

    • 機能: マークル証明の提供: データ ブロック内のトランザクションがブロックに含まれていることを証明する

      • 黄色の TX がブロック内にあることを証明します。

        フルノードから返された赤いハッシュ値に従って、ルートハッシュ値がブロックヘッダーのルートハッシュ値であるかどうかを計算します

        ライトノードにはブロックヘッダーのみがあります

      • 特定のトランザクションがマークル ツリーに含まれていないことを証明するにはどうすればよいですか?

        トランザクションのハッシュ値によるソートなど、リーフ ノードの順序にいくつかの要件がある場合。それぞれのリーフノードがトランザクションであり、トランザクションの内容が一度ハッシュ化され、そのハッシュ値が昇順に並べられます。チェックされるトランザクションは、まずハッシュ値を計算して、それが内部にあるかどうかを確認します。たとえば、3 番目と 4 番目の間では、この時点で提供される証明は、3 番目と 4 番目のリーフ ノードがルート ノードに到達する必要があるということです。ハッシュ値がすべて正しく、ルート ノードによって計算されたハッシュ値が変更されていない場合、3 番目と 4 番目のノードが実際に元のマークル ツリーで隣接する点であることを意味します。探しているトランザクションが存在する場合、それはこれら 2 つのノードの間にあるはずです。しかし、それは現れないので、存在しません。その複雑さはログ形式でもありますが、ソートが必要になります。ソートされたものをソートマークルツリーと呼びます。この種のソートされたマークル ツリーは、ビットコインでは存在しないことを証明する必要がないため、ビットコインでは使用されません。

ここに画像の説明を挿入

04-BTC-コンセンサスプロトコル


  • デジタル通貨と紙幣の違いは、二重支払い攻撃と呼ばれるコピーが可能であることです。
    分散型通貨には次の 2 つの問題を解決する必要があります。

    • 質問

      1. デジタル通貨の発行

      2. 取引の正当性を検証し、二重支払い攻撃を防ぐ方法。

    • 解決:

      • ビットコインの発行量はマイニングによって決まる

        すべてのビットコインの最終的なソースは、新しくマイニングされたすべてのブロック内の貨幣トランザクションです。

      • ブロックチェーンのデータ構造に依存する

        コインのソースとソース残高を示します。ソースの最終的なソースは、新しいブロックごとの鋳造トランザクションです。


  • 転送トランザクション

    • 情報

      • 支払者は他のチャネルを通じて受取人の公開鍵を取得します

      • 受取人およびその他の人は、支払者の公開鍵 (取引時に支払者によって与えられる) を知る必要があります。

        1. 支払い者の身元を確認する
        2. 通貨のソースには、鋳造トランザクションの出力に支払者の公開鍵のハッシュが含まれており、これが合法であることを検証できます。
      • 他人が自分の公開鍵を使って署名を偽造するのを防ぐにはどうすればよいでしょうか?

        • これらは入力スクリプトと出力スクリプトによって実行され、入力スクリプトと出力スクリプトが一緒に正しく実行できれば、トランザクションは正当であることを意味します。

          本質的には、前の支払いの公開キーのハッシュがこのトランザクションの公開キーのハッシュと一致するかどうかを確認することです。


  • 分散型コンセンサス: 台帳の内容は分散型コンセンサスを達成する必要があります。

    • CAP 定理という有名な結論もあります。

      • 一貫性 [システム状態の一貫性]

      • 可用性 [他の人が使用できる]

      • パーティション許容度

        理論の内容は、「分散ハッシュ テーブルなどの分散システムは、これら 3 つのプロパティのうち最大でも 2 つしか満たせない。最初の 2 つのプロパティが必要な場合、3 番目のプロパティは得られない」というものです。

    • ビットコインのコンセンサスプロトコル:

      • コンピューティング能力による投票

        各ノードは、ローカルで候補ブロックを組み立て、その中に正当であると考えられるトランザクションを配置し、さまざまな nonce 値 (4 バイトを占有する) を試し始めて、どれが H(ブロック ヘッダー) ≤ target という不等式を満たすことができるかを確認します。ノードが要件を満たす nonce を見つけた場合、そのノードは簿記の権利を取得します。

        いわゆる簿記権とは、ビットコイン台帳に次のブロックを書き込む権利です。この nonce が見つかった場合にのみ、ブックキーピング権を取得したノードは次のブロックを公開する権利を持ちます。他のノードはブロックを受信した後、ブロックの有効性を検証する必要があります。

        • 正当性を検証します。

          • nBits フィールド (ターゲットしきい値のエンコーディング)
          • ノンス
          • 取引は合法です: 合法的に署名されており、二重支払いではありません

          nonce が同時に見つかった場合、それは誰が最も長い合法的チェーンにあるかによって決まります。

ここに画像の説明を挿入

05-BTC-実装


  • トランザクションベースの台帳モデル

    ブロックチェーンは分散型台帳であり、ビットコインはトランザクションベースの台帳モデル(トランザクション【取引】ベースの台帳【元帳】)を採用しています。システムは各アカウントにいくら入っているかを表示しません。

    • アカウントベースの台帳モデル: イーサリアム

    • UTXO:

      ビットコインのフル ノードは、UTXO セット、つまり、消費されていない出力のセットを維持する必要があります。二重支出を迅速に発見するため。

    • 取引手数料

      • 総インプット = 総アウトプット

        一部のトランザクションでは、総インプットが総アウトプットよりわずかに大きくなります。
        1ビットコインを入力すると0.99ビットコインが出力され、さらに0.01ビットコインがブロックを公開する簿記権を取得したノードへのトランザクション手数料として使用されます。

      • 主にブロック報酬

        ブロック報酬は21万ブロックごとに半分になり、21万ブロックをマイニングするには約4年かかります。ビットコイン システムによって設計された平均ブロック生成時間は 10 分です。これは、システム全体が平均 10 分で新しいブロックを生成することを意味します。


ブロックの例

ここに画像の説明を挿入

  • ノート:

    ブロックの例
    1 行目: ブロックには 686 個のトランザクションが含まれています
    2 行目: XXX ビットコインの合計出力 4 行目
    : 合計トランザクション手数料 (686 個のトランザクションのトランザクション手数料の合計) 最後の行:ブロック
    報酬 (マイナーがマイニングする主な原動力) 5 行目: ブロックのシリアル番号 6 行目: ブロックのタイムスタンプ番号



    右: 1行目: そのブロックのブロックヘッダーのハッシュ値
    2行目: 前のブロックのブロックヘッダーのハッシュ値
    (注: ハッシュ値の計算ではブロックヘッダーのみがカウントされます)
    2つのハッシュ値の共通点: 先頭に0の文字列があります。これは、設定対象のプリセット値が 16 進数で先頭に 0 が続く長い文字列で表現されているためです。したがって、難易度の要件を満たすブロックでは、ブロック ヘッダーのハッシュ値には 0 の長い文字列が含まれている必要があります。
    4 行目: merkle root は、このブロックに含まれるトランザクションで構成されるマークル ツリーのルート ハッシュ値です。


  • 検索スペースを改善する

    マイニング時に乱数を変更するだけでは不十分で、ナンスは2から32番目の値しか取りえず、ルートハッシュ値も変更できます。

    ミント トランザクションで Coinbase フィールドを変更すると、ブロック ヘッダーの hashMerkleRoot が変更され、検索スペースが 2 の 92 乗に増加します。

    トランザクションの鋳造には入力情報がなく、ビットコインの破棄には出力情報がないため、追加情報を入力できることがわかります。そのため、人々はビットコインを燃やすことで、ブロックチェーンに必要なものを追加することがよくあります。

  • ベルヌーイ試行 (ベルヌーイ実験)

    マイニング プロセスにおける nonce の各試行は、ベルヌーイ試行 (ベルヌーイ実験) と見なすことができます。すべてのランダムなベルヌーイ実験はベルヌーイ過程を構成します。その特性の 1 つは、メモリがないことです。

    ベルヌーイ過程の代わりにポアソン過程を使用することもできます。私たちが本当に気にするのは、指数分布に従うシステムのブロック時間です。

    • 無料で進行

      指数分布にも記憶はありません。確率分布曲線の特性は、ある場所から任意に切り捨てられ、曲線の残りの部分は元の曲線と同じになるためです。例: 10 分間待っていますが、正当なブロックを誰も見つけられませんでした。どのくらい待つ必要がありますか? 確率密度関数分布を参照すると、平均待機時間は依然として 10 分です。将来掘るのにどれくらい時間がかかるかは、過去に掘られた期間とは関係がありません。

      • マイニングの公平性を保証する

        強力な計算能力を持つマイナーは、過去により多くの作業を行っており、過去に何度も失敗した nonce を試した後、成功する nonce の確率は増加します。このように、プログレスフリーはマイニングの公平性を保証します。

/** Nodes collect new transactions into a block, hash them into a hash tree,
 * and scan through nonce values to make the block's hash satisfy proof-of-work
 * requirements.  When they solve the proof-of-work, they broadcast the block
 * to everyone and the block is added to the block chain.  The first transaction
 * in the block is a special one that creates a new coin owned by the creator
 * of the block.
 */
class CBlockHeader
{
public:
    // header
    int32_t nVersion;
    uint256 hashPrevBlock;
    uint256 hashMerkleRoot;
    uint32_t nTime;
    uint32_t nBits;
    uint32_t nNonce;	

    CBlockHeader()
    {
        SetNull();
    }

    SERIALIZE_METHODS(CBlockHeader, obj) { READWRITE(obj.nVersion, obj.hashPrevBlock, obj.hashMerkleRoot, obj.nTime, obj.nBits, obj.nNonce); }

    void SetNull()
    {
        nVersion = 0;
        hashPrevBlock.SetNull();
        hashMerkleRoot.SetNull();
        nTime = 0;
        nBits = 0;
        nNonce = 0;
    }

    bool IsNull() const
    {
        return (nBits == 0);
    }

    uint256 GetHash() const;

    int64_t GetBlockTime() const
    {
        return (int64_t)nTime;
    }
};


06-BTC-ネットワーク


  • ネットワーク構造

    • アプリケーション層: BitCoin ブロックチェーン
    • ネットワーク層: P2P オーバーレイ ネットワーク
  • 広める

    • シードノード

      P2P ネットワークに参加するには、まず少なくとも 1 つのシード ノードがあることを知っておく必要があります。その後、シード ノードに連絡する必要があります。そうすると、ネットワーク内の他のノードが認識されます。ノード間の通信は TCP 経由で行われるため、ファイアウォールを通過するのに役立ちます。終了したい場合は、何もする必要はなく、他のノードに通知する必要もなく、アプリケーションを終了するだけです。他のノードはあなたのメッセージを聞いていないため、しばらくするとあなたを削除します。

    • 隣接ノード

      ビットコイン ネットワークの設計原則は、効率ではなく、シンプルさと堅牢性です。各ノードは隣接ノードのセットを維持し、メッセージの伝播はネットワーク内でのフラッディングの形で行われます。ノードが初めてメッセージを受信すると、そのメッセージをすべての 0 度ノードに拡散し、同時にこのメッセージを受信したことを記録します。次回このメッセージを受信するときは、それを 0 度ノードに転送する必要はありません。

      隣接ノードの選択は、基礎となるトポロジを考慮せずにランダムに行われます。たとえば、カリフォルニアのノードはアルゼンチンの 0 度ノードを選択する場合があります。この設計の利点は堅牢性を高めることです。基礎となるトポロジは考慮されていませんが、効率が犠牲になっています。周囲の人々に送金する速度は、米国内の人々に送金する速度と似ています。

    • チェーンを待っています

      ビットコイン システムでは、各ノードがチェーンにアップロードされるのを待っているトランザクションのコレクションを維持します。トランザクションのコレクションがブロックチェーンへの書き込みを待機している場合、特定のトランザクションを初めて聞いたときに、このトランザクションをコレクションに追加し、このトランザクションをノードに転送します。その後、ネットワーク上でのトランザクションの無線送信を回避するために、後でトランザクションを受信するときにこのトランザクションを転送する必要はありません。転送の前提は、取引が合法であることです。

    • 帯域幅

      ビットコイン プロトコルのブロック サイズには 1M バイトの制限があります。ビットコイン システムで採用されている送信方法は帯域幅を非常に多く消費するため、帯域幅がボトルネックになっています。ブロック サイズの制限 1M に基づいて計算すると、新しくリリースされたブロックがほとんどのネットワークに送信されるまでに数十秒かかる可能性があり、これはすでに長い時間であるため、この制限値は小さくありません。


07-BTC-マイニング難易度


  • ビットコインアルゴリズム: SHA-256

2 256 2^{256}22 5 6

H (ブロックヘッダー) ≤ ターゲット H(ブロック \, ヘッダー) \leq ターゲットH (ブロック_ _ _ _ヘッダー) _ _ _ _ _ターゲット_ _ _ _ _

難易度 = 難易度 1 ターゲットターゲット 難易度 = {difficulty1target \over target}困難_ _ _ _ _ _ _ _ _=ターゲット_ _ _ _ _難しい1目標_ _ _ _ _ _ _ _ _ _ _ _ _ _

  • モチベーション調整:ブロックタイム短縮

    将来的に多くのフォークが発生した場合、前のブロック内の特定のトランザクションがフォーク攻撃を受ける可能性が高く、悪意のあるノードはロールバックを試みます。将来的には多くのフォークが発生するため、計算能力が分散され、悪意のあるノードが成功する可能性が高くなります。現時点では、悪意のあるノードには 51% の計算能力は必要なく、おそらく 10% の計算能力で十分であるため、ブロックの生成時間は短いほど良いと考えられます。

  • 内容を調整する

    ビットコインプロトコルでは、2016 ブロックごと、つまり約 2 週間ごとに目標事前値を調整する必要があると規定されています。つまり、平均ブロック時間は 10 分です

target = 目標 ∗ 実際の時間予想時間 target = target*{実際の \, 予想 \ を上回る時間, 時間}ターゲット_ _ _ _ _=ターゲット_ _ _ _ _期待ます_ _時間_ _ _実際_ _ _ _ _時間_ _ _


08-BTC-マイニング


  • フルノード

    • 常にオンライン
    • 完全なブロックチェーン情報をローカル ハード ドライブに維持する
    • トランザクションの正確性を迅速にチェックしながら、UTXO コレクションをメモリ内に維持します。
    • ビットコインネットワーク上の取引情報を監視し、各取引の正当性を検証します。
    • どのトランザクションをブロックに含めるかを決定します
    • 他の鉱山労働者が掘ったブロックを聞いて、その正当性を確認します
    • 採掘
      • どの鎖を掘り下げるかを決める
      • 同じ長さのフォークチェーンがある場合にどのフォークを選択するか
  • ライトノード

    • 常にオンラインではない
    • ブロックチェーン全体を保存するのではなく、各ブロックのブロックヘッダーのみを保存します。
    • すべてのトランザクションを保存するのではなく、自分に関連するトランザクションのみを保存してください
    • ほとんどのトランザクションの正当性を検証することは不可能であり、検証できるのはそれ自体に関連するトランザクションのみです
    • ネットワーク上に公開されたブロックの正当性を確認できません
    • マイニングの難易度が確認できる
    • どれが最長のチェーンであるかのみ検出できますが、どれが最長の合法的なチェーンであるかはわかりません。
  • 採掘機器の進化

    1. CPU
    2. GPU
    3. ASIC(特定用途向け集積回路)チップ
  • マイニングパズル

    一部の新しいブロックチェーンは同じアルゴリズム、マージマイニングを使用する場合があります。

  • マイニングプール

    鉱山所有者には多数のマイナーが接続されており、マイナーはハッシュ値の計算のみを担当します。不安定な収入の問題を解決します。

    • マイナーの収入を計算します。

      • マイナーの難易度を下げる

        ターゲットを増やし、share と呼ばれる nonce を掘り、マイナーが送信したシェアの数を計算します。

        Coinbaseのドメインは鉱山所有者によって設定されているため、盗まれることはありません

    • 短所:

      コンピューティング能力の集中化、悪意のある攻撃は必ずしもコンピューティング能力を習得する必要はない


09-BTC-スクリプト


ここに画像の説明を挿入

  • 導入

    図はビットコイン取引の例です。トランザクションには 1 つの入力と 2 つの出力があります。左上隅には出力と書かれていますが、これは実際にはこのトランザクションの入力です。右側の 2 つの出力では、上の未使用は支出がないことを意味し、下の支出は支出を意味します。トランザクションはすでに 23 件の確認を受信して​​いるため、ロールバックの可能性はほとんどありません。

    以下は、このトランザクションの入力および出力スクリプトです。入力スクリプトには 2 つの操作が含まれており、それぞれ 2 つの非常に長い数値をスタックにプッシュします。ビットコインで使用されるスクリプト言語は非常に単純で、アクセスできる唯一のメモリ空間はスタックです。C++ は、C 言語のような汎用プログラミング言語と異なり、グローバル変数、ローカル変数、動的に割り当てられるメモリ空間を持ち、ここではスタックであるため、スタックベース言語と呼ばれます。ここで、出力スクリプトには 2 行があり、それぞれ上記の 2 つの出力に対応します。各出力には独自の個別のスクリプトがあります。


トランザクション構造

"result":{
    "txid": "921a...dd24", // transaction id
    "hash": "921a...dd24",
    "version": 1,
    "size": 226,
    "locktime": 0,		// 用来设定交易的生效时间,0:立即生效
    "vin": {...},		// 输入脚本
    "vout": {...},		// 输出脚本
    "blockhash": "0000000000000000000002c510d...4c0b",
    "confirmations": 23,
    "time": 1530846727,	// 交易时间
    "blocktime": 1530846727
}
"vin": [{
   "txid": "c0cb...c57b",	// 来源交易的哈希值
    "vout": 0,				// 这个交易里的第几个输出
    "scriptSig": {			// 输入脚本,下文写成input script
        "asm": "3045...0018",	// 输入脚本内容
        "hex": "4830...0018"
    },
}],
"vout": [{
    "value": 0.22684000,	// 单位是比特币
    "n": 0,					// 第几个输出
    "scriptPubKey":{		// 输出脚本, 下文写成 output script
        "asm": "DUP HASH160 628e...d743 EQUALVERIFY CHECKSIG",	// 输出脚本内容
        "hex": "76a9...88ac",
        "reqSigs": 1,	// 需要多少个签名才能兑现(单重多重)
        "type": "pubkeyhash",	// 公钥哈希
        "address": ["19z8LJkNXLrTv2QK5....."]	// 输出地址
    }
},{
    "value": 0.53756644,
    "n": 1,
    "scriptPubKey":{
        "asm": "DUP HASH160 628e...d743 EQUALVERIFY CHECKSIG",
        "hex": "76a9...88ac",
        "reqSigs": 1,
        "type": "pubkeyhash",
        "address": ["1LvGTpdye....."]
}],
  • ノート:

    入出力構造は配列であり、複数の入力と出力で構成できます。


入出力スクリプトの形式

  • 実装方法

    最初に現在のトランザクションの入力スクリプトを実行し、次にソース トランザクションの出力スクリプトを実行します。

P2PK(公開鍵への支払い)

//	P2PK
//	input script
	PUSHDATA(Sig)
//	output script
	PUSHDATA(PubKey)
    CHEKSIG

P2PKH(公開鍵ハッシュへの支払い)

// P2PKH(Pay to Public Key Hash) 最常用
// input script
	PUSHDATA(Sig)
    PUSHDATA(PubKey)
// output script
    DUP	// 复制栈顶元素
    HASH160
    PUSHDATA(PubKeyHash)
    EQUALVERIFY
    CHECKSIG

P2SH(スクリプトハッシュへの支払い)

  • 与えられるのは、受取人の公開鍵のハッシュではなく、引き換えスクリプトのハッシュです。

    • スクリプトフォームを引き換える
      1. P2PK
      2. P2PKH
      3. 複数署名フォーム
  • 入力スクリプトにはいくつかの署名とシリアル化された redeemScript を与える必要があり、検証は 2 つのステップに分かれています。

    • シリアル化された redeemScript が出力スクリプトのハッシュと一致することを確認します。
    • redeemScript を逆シリアル化して実行し、入力スクリプトに指定された署名が正しいことを確認します。
  • 自然:

    複雑さを出力スクリプトから入力スクリプトに移行

// P2SH实现P2PK
// input script
    PUSHDATA(Sig)
    PUSHDATA(serialized redeemScript)
//	output script
    HASH160
    PUSHDATA(redeemScriptHash)
    EQUAL
// redeemScript
    PUSHDATA(PubKey)
    CHECKSIG
// P2SH实现多重签名
// input script
	FALSE // 忽略这一行,这个是应对内部bug的
	PUSHDATA(Sig_1)
    PUSHDATA(Sig_2)
        ...
    PUSHDATA(Sig_M)
    PUSHDATA(serialized RedeemScript)
// output script
    HASH160
    PUSHDATA(RedeemScriptHash)
    EQUAL
// redeemScript
    M
    PUSHDATA(pubkey_1)
    PUSHDATA(pubkey_2)
        ...
    PUSHDATA(pubkey_N)
    N
    CHECKMULTISIG
  • ノート

    この入力スクリプトは、電子商取引会社が出力を使用するときに提供されます。ユーザーが支払ったトランザクションの場合、出力スクリプトはハッシュ値を知るだけで済みます。

    すべてのコードでは OP_ プレフィックスが省略されます


火傷の証明

// output script
	RETURN
    [zero or more ops or text]

このような産出物は決して消費できない、これはビットコインを破壊する方法を証明している

実際、出力金額は 0 であり、トランザクション手数料を支払うだけであるため、UTXO に保存する必要はありません。


10-BTC-フォーク


  • ステートフォーク

    • 意図的なフォーク:フォーク攻撃
  • プロトコルフォーク: プロトコルに関する意見の相違

    • ハードフォーク: ハードフォーク

      • ビットコインのブロックサイズ制限。1M→4M

        1M=100万。トランザクションは大まかに250バイト、100万/250=4000、ブロックは約4000トランザクションと考えられ、平均すると10分でブロックが出現、4000/(60×10)=7、1秒間に約7トランザクション、つまり7tx/秒となり、非常に遅い通信速度となります。

        新しいノードは 4M と 1M が正当であると認識し、古いノードは 4M を認識しないため、これら 2 つのチェーンは消えません。

    • ソフトフォーク: ソフトフォーク

      • ブロックサイズの制限。1M -> 0.5M と仮定します。

        新しいノードは元のブロックを認識しませんが、古いノードは認識します。したがって、ノードがソフトウェアを更新しない場合、そのノードは常に最長の法的チェーンに従い、破棄されます。したがって、永久フォークは存在しません。

      • coinbase域

        Coinbase の最初の 8 バイトはランダムなノンスとして使用されます。

        誰かがUTXOのルートハッシュ値として次のバイトを使用することを提案しました

      • スクリプトハッシュへの支払い

    • 古いノードが認識しないものはハードフォークであり、古いノードが認識するものはソフトフォークです。

      ソフト フォーク: システムの大部分のノードが更新されている限り、永久フォークは発生しません。

      ハードフォーク: システム内にプロトコルを更新しないノードがある限り、永久フォークが発生します。


11-BTC-Q&A


  1. 送金トランザクション中に受信者がオンラインでない場合はどうなりますか?

    このとき、受取人はオンラインである必要はなく、送金トランザクションはブロックチェーンに記録されるだけで、ある人のアカウントのビットコインが別の人のアカウントに送金され、その時点で相手がビットコインネットワークに接続しているかどうかは関係ありません。

  2. フルノードが転送トランザクションを受信すると仮定すると、転送トランザクションにおける受信者の受信アドレスがノードにとってこれまでに聞いたことのないものである可能性はありますか?

    これは可能です。ビットコイン アカウントの作成時に他の人に通知する必要はなく、公開鍵と秘密鍵のペアをローカルで生成するだけです。受取アドレスが生成された後、初めてお金を受け取ったときにのみ、他のノードはこの口座の存在を知ります。

  3. アカウントの秘密キーを紛失した場合はどうすればよいですか?

    秘密鍵を紛失した後は、それを行う方法がありません。口座内のお金は死金となり、二度と引き出すことができなくなります。分散型システムでは、誰もあなたの代わりにパスワードをリセットできません。

  4. 秘密鍵が漏洩した場合はどうなりますか?

    例えば、自分の口座に不審な取引があることに気づいたら、このときどうすればよいでしょうか?このとき、自分の口座にあるお金をできるだけ早く別の安全な口座に移す必要があります。これも普段の生活とは違います。銀行口座に不審な取引があれば、まず銀行に通報することを思いつきます。他人がお金を持ち出さないようにパスワードをリセットして口座を凍結できますか。これはブロックチェーンの世界では不可能です。

  5. 送金する際に住所を間違えた場合はどうすればよいですか?

    道はない。間違ったアドレスを書いて間違った人に送金した場合、すでに発行されたトランザクションをキャンセルする方法はなく、ビットコインでの送金トランザクションがブロックチェーンに公開されると、それをキャンセルする方法はありません。間違った住所に転送した場合、誰に転送されたのかがわかれば、相手に連絡することができます。誰のアドレスに転送されるかわからない場合、または存在しないアドレスの場合は、方法がありません。

  6. 次に質問してください: 書き込み証明と OP_RETURN は実際にどのように機能しますか? フルノードが転送トランザクションを受信すると、最初にトランザクションの有効性をチェックする必要があり、正当なトランザクションのみがブロックチェーンに書き込まれます。OP_RETURN ステートメントは無条件リターン エラーですが、この場合、どうすれば検証を通過してブロックチェーンに書き込まれるのでしょうか?

    このステートメントは、現在のトランザクションの正当性を検証する場合には実行されません。つまり、現在のトランザクションの出力スクリプトは、トランザクションの正当性を検証するときに実行されません。このトランザクションの出力スクリプトは、誰かがお金を使いたいときにのみ実行され、後でこのトランザクションの出力を使用する別のトランザクションが存在します。

  7. マイニング中に答えを盗むマイナーがいるでしょうか?

    しません。解放されたブロックにはコインベースのトランザクションがあり、その中には受取人のアドレス、つまり鉱山を掘ったマイナーのアドレスが含まれています。A が鉱山を掘ると、それが A の受信アドレスになります。答えを盗みたければAさんのアドレスを自分のアドレスに置き換える必要があり、アドレスが変わるとcoinbaseのトランザクション内容も変わってしまいます。これは何をもたらすのでしょうか?このトランザクションとブロックに含まれる他のトランザクションが結合されてマークル ツリーが形成されるため、マークル ツリーのルート ハッシュ値が変更されます。どれかが変更されると、ルート ハッシュ値が変更されます。nonce はブロック ヘッダーにあり、ルート ハッシュ値もブロック ヘッダーにあり、ブロック ヘッダーの内容が変更されると、元の見つかった nonce は無効になります。したがって、各マイナーが掘ったナンスは自分の支払いアドレスにバインドされているため、答えを盗むことは不可能です。

  8. どのマイナーが取引手数料を支払うべきかをどのように判断するのでしょうか? つまり、どの鉱山労働者が鉱山を掘ることになるのかを事前にどうやって知ることができるのでしょうか?

    どのマイナーがこの取引手数料を受け取るのかを事前に知る必要はありません。取引手数料はどのように計算されますか? 総投入量 > 総生産量、その差が取引手数料となります。公開されたトランザクションでは、トランザクションに多くの入力と多くの出力を含めることができ、入力の合計から出力の合計を引いたものがトランザクション手数料となります。どのマイナーが鉱山を掘ったのかを事前に知る必要がなく、このブロックに含まれる取引の差額を自分の取引手数料として徴収できます。


12-BTC-匿名性


  • どのような状況下では、ビットコイン システムの匿名性が破壊される可能性がありますか?

    たとえば、オンライン ショッピングやビットコイン トランザクションでは、複数の入力と複数の出力が可能です。また、複数の入力は同一人物である可能性があります。これは、この人物がこれら 2 つのアカウントの秘密キーを同時に管理している可能性があるためです。

  • ビットコイン システムはアプリケーション層で動作し、最下層はネットワーク層です。したがって、匿名性を向上するには、2 つの側面から始めることができます。

    • ネットワーク層の匿名性を改善するにはどうすればよいですか?
      ネットワーク層の匿名性は比較的簡単に解決できます。ブロックチェーンは新しいものですが、ネットワーク層の匿名性に関する学術コミュニティは、マルチパス転送という優れたソリューションをすでに持っています。これはオニオン ルーティング (TOR) と同じ原理です。つまり、メッセージは送信者から受信者に直接送信されるのではなく、途中で何度も転送する必要があります。中間の各ノードは、その前のノードが誰であるかを知っているだけで、誰が最初にメッセージを送信したかは知りません。もちろん、中間の一部のノードは不良である可能性がありますが、パス上の 1 つのノードが誠実である限り、元のイニシエーターの ID を隠すことができます。これはオニオン ルーティングの基本原則でもあります。

    • アプリケーション層はどのようにして匿名性を向上させるのでしょうか?

      異なる人のコインを混合すること(コイン混合)、つまり、自分のアイデンティティと他の人のアイデンティティを混ぜて、他人が誰が誰であるかを区別できないようにします。ブロックチェーンに限らず、匿名性が必要なさまざまな分野で利用可能です。コイン混合を専門とするウェブサイトがいくつかあり、特定のサービスを提供し、特定のサービス料金を請求します。コインミキシングをしたい人全員がウェブサイトにコインを送り、ウェブサイトの内部再編が行われた後、コインが戻ってきますが、このとき取り出したコインはウェブサイト上で公開されているコインではなく、ランダムに抽選されたコインです。

  • プライバシーを保護することがこれほど難しいのはなぜですか?

    本質的な理由は、ブロックチェーンがパブリックであり、改ざんできないことです。不変性はプライバシー保護にとって悲惨です。


ゼロ知識証明

  • コンセプト:

    ゼロ知識証明とは、一方の当事者 (証明者) が、ステートメントが真実であるということ以外の情報を一切明らかにせずに、ステートメントが真実であることを別の当事者 (検証者) に証明することです。

  • 例:

    アカウントが私のものであることを証明するには、秘密キーを渡すだけで済みます。ただし、秘密鍵を直接公開することはできないため、秘密鍵から生成した署名を付与し、相手がアカウントの公開鍵を知っていると仮定して、署名の正当性を検証することができます。これがゼロ知識証明であるかどうかは、実際には議論の余地があります。なぜなら、私は秘密鍵以外の情報も与えており、それがカウントされるかどうかはアプリケーションによって異なるからです。

準同型隠蔽

ゼロ知識証明の数学的基礎は準同型隠蔽です

ここに画像の説明を挿入

  • 1 つ目の性質は、暗号化関数の値 E はハッシュ関数とは異なり衝突しないことを示しており、ハッシュ関数は衝突する可能性があります。このプロパティは、E(x) と E(y) が等しい場合、x と y も等しいことを示します。(このステートメントは上記のステートメントの逆です)

  • 2 番目のプロパティは、暗号化関数が不可逆であることを示しており、暗号化後の値がわかっていても、暗号化前の値を推測する方法はありません。

  • 3 番目のプロパティは最も重要で、準同型演算と呼ばれます。これは、暗号化された関数値に対して代数演算を実行することを意味します。これは、これらの入力に対して代数演算を直接実行して暗号化することと同じです。

    準同型加算: 暗号化された値の合計は、合計の暗号化に等しい。
    準同型乗算: 暗号化された値の積は、積の暗号化に等しい。

  • 例:


    示されているように、アリスは、ボブが x と yの特定の値を知らないようにしながら、x+y=7 となる一連の数値 x と y を知っていることをボブに証明したいと考えています。

    • 答え

      アリスは E(x) と E(y) の値をボブに送信します

      ボブは E(x) と E(y) を受け取って E(x+y) の値を計算します

      ボブは同時に E(7) の値を計算します。E(x+y)=E(7) の場合は検証に合格し、それ以外の場合は検証に失敗します。


ブラインドサイン方式

  1. ユーザー A が SerialNum を提供すると、銀行は SerialNum を知らずに署名トークンを返し、A の預金を減らします。
  2. ユーザー A が SerialNum と Token を B に渡してトランザクションを完了します
  3. ユーザー B は SerialNum とトークンを銀行に持っていき、銀行が検証に合格したことを確認し、B の預金を増額します。
  4. 銀行は A を B にリンクできません

Zcash および Zcash (匿名性を目的に設計された暗号通貨)

ゼロコインとゼロ紙幣はプロトコル層での匿名化と統合されており、その匿名性属性は暗号化保証によってもたらされます。

  • ゼロコインシステムにはベースコインとゼロコインがあり、ベースコインとゼロコインを往復変換することで旧アドレスと新アドレスの相関関係がなくなり、コインミキシングサービスと同様の原理です。

    ゼロコインにはベースコイン(ビットコインなど)とゼロコインがあります。使用するときは、ベースコインが存在することを証明する必要があり、ベースコインが使用できなくなった後、ゼロコインに交換する必要があります。ゼロコインを使用するときは、使用したコインがシステム内に存在する合法的なコインであることをゼロの知識を使用して証明するだけでよく、システム内でどのコインを使用しているかを開示する必要はありません。

  • zerocash システムは zk-SNARKs プロトコルを使用しており、基本通貨に依存せず、ブロックチェーンにはトランザクションの存在と、システムの正常な動作を検証するためにマイナーが必要とする主要な属性の証明のみが記録されます。ブロックチェーン上には取引アドレスも取引金額も表示されず、すべての取引はゼロ知識検証によって実行されます。

    ZCash には基本通貨がなく、完全な ZCash です。Zcash と Zcash は 100% 匿名かつ安全ではありませんが、匿名セキュリティに影響を与える要因の中で、エンティティとの対話時という解決できない要因がまだ 1 つあります。たとえば、誰かがこれらのコインを使って悪いことをしたり、大金をこの暗号通貨に変換したり、これらの暗号通貨を現金に変換したりしたい場合でも、自分の身元を明らかにする必要があります。これらの暗号通貨が数学的にどれほどうまく設計されているとしても、ブロックチェーン内に既に存在する送金に対して匿名性があると言うだけであり、外部世界とのやり取りの匿名性は依然として弱点です。したがって、依然として 100% の匿名性を提供することはできません。


13-BTC-思考


  • ハッシュポインタ

    ハッシュ値自体はポインタです

    • では、前のブロックの内容を見つけるにはどうすればよいでしょうか?

      フルノードは通常、これらのブロックを (キー、値) データベースに保存します。キーはブロックのハッシュであり、値はブロックのコンテンツです。一般的に使用されるキー値データベースはレベル DB です。いわゆるブロックチェーンの連結リスト構造は、実際にはレベルDBのハッシュ値を用いて計算されます。最後のブロックのハッシュ値があれば、レベルDBとハッシュキーに対応する値を検索することで、最後のブロックの内容を取得できます。次に、このブロックのヘッダーには、前のブロックを指すハッシュ値があります。次に、キーと値を探し、前のブロックの内容を見つけるなど、段階的に調べていき、最終的にブロックチェーン全体を見つけることができます。

  • 愛をブロックする

    つまり、秘密鍵をいくつかの部分に分割し、何人かの人が別々に保管し、全員が自分の部分の秘密鍵を取り出して初めて完全な秘密鍵を合成することができます。

    しかし、それが切断された場合、カップルの一方が別れた後にお金を引き出したいと考えており、彼はすでに秘密鍵の半分を知っており、残りの 128 ビット秘密鍵を推測するだけで済みます。秘密鍵の長さが半分になるということは、解読の難易度が半分になるわけではなく、解読の難易度は 2 の 256 乗から 2 の 128 乗に低下し、前者の方が後者よりもはるかに大きく、解読の難易度は大幅に低下します。これが 4 人のパートナーの例で、そのうちの 3 人が他の人に告げずにお金を引き出したい場合、2 の 64 乗を試行するだけで済みます。

    したがって、複数人で共有するアカウントの場合は、秘密鍵を切り詰める方法を使用せず、マルチ署名を使用することをお勧めします。マルチ署名で使用される各秘密鍵は独立して生成されます。また、マルチ署名は他の柔軟性も提供します。たとえば、N 人のいずれかに M 個の署名を自由に依頼できます。

  • 分散型コンセンサス

    厳密に言えば、ビットコインは真のコンセンサスに達していません。達成されたコンセンサスはいつでも、フォーク攻撃などによって覆される可能性があるからです。コンセンサスが得られたと考えている場合、フォーク攻撃の後、システムは前の状態にロールバックします。理論的には、Genesis ブロックにロールバックすることも可能です。

  • ビットコインの希少性

    マイナーがマイニングを行う理由は収入を得ることであり、利益を上げるためにはマイニングの収入がコストよりも大きくなければなりません。他の人をマイニングに誘致するには、マイニング収益を増やすか、マイニングコストを削減する必要があります。新しく発行される仮想通貨には、開始できるかどうかという問題があります。初期段階で採掘者を採掘に誘致するために、採掘者により多くの収入を与えることができます。ビットコインのアプローチは、 ①初期の難易度設定が比較的低い。②初期ブロック報酬が比較的高い。

    実際、ビットコインの総量は一定なので通貨としての使用には適していません。後述するイーサリアムではブロック報酬を定期的に半減するという慣行はなく、新通貨の中には独自のインフレ機能を持っているものもあり、毎年一定割合で通貨の流通量を増やす必要があります。希少なものは通貨に適さないため、インフレが起こるとお金の価値は下がりますが、良い通貨にはインフレの機能がなければなりません。

  • 量子コンピューティング

    量子コンピューティングの発展と量子コンピューターの計算能力がますます強力になるにつれて、暗号通貨は安全でなくなりますか?

    この心配は無用です。

    ①量子コンピューティング技術は実用化にはまだまだ程遠く、ビットコインの存続​​期間中に必ずしも実質的なつながりを持たない可能性がある。将来、量子コンピューティングが暗号化システムを破壊するほど強力になると、まず従来の金融業界に影響が及ぶでしょう。たとえば、オンライン バンキング、オンライン送金、オンライン支払いなど、私たちがオンラインで行う多くの金融活動はすべて安全でなくなります。したがって、量子コンピューティングがビットコインに与える影響を心配するよりも、量子コンピューティングが従来の金融業界に与える影響を心配したほうがよいでしょう。なぜなら、資金の大部分は依然として伝統的な金融業界にあり、仮想通貨の市場価値は現代の金融システムのほんの一部に過ぎないからです。

    ②ビットコインでは、アカウントの公開鍵が直接公開されるのではなく、公開鍵でハッシュ化してアドレスを取得します。ビットコインで使用される非対称暗号化システムでは、公開鍵は秘密鍵から導出できます。したがって、秘密キーを安全に保管している限り、公開キーを紛失しても問題ありません。当然のことながら、公開鍵から秘密鍵を導き出すことはできません。そうしないと面倒なことになります。

    将来、量子コンピューティング技術が開発され、公開鍵から秘密鍵が推定できるようになった場合、私たちはどうすればよいでしょうか。ビットコインは設計時に別の保護層を追加し、公開鍵自体を使用する代わりに、公開鍵のハッシュを使用します。したがって、誰かがあなたのアカウントからお金を盗もうとした場合、最初に行うことは、アドレスを使用して公開鍵を推定することです。これは公開鍵のハッシュ値を逆にすることと同じですが、これは量子コンピューターでも実行できません。

北京大学「ブロックチェーン技術と応用」公開授業ノート - ETH

おすすめ

転載: blog.csdn.net/qq_20493631/article/details/117912984