banner
leaf

leaf

It is better to manage the army than to manage the people. And the enemy.
follow
substack
tg_channel

スマートコントラクトの初探:概念と進化

前言 ¶#

自 2009 年ビットコインがブロックチェーン時代を開いた以来、近 10 年間で、技術とエコシステムの発展に伴い、ブロックチェーンに基づく分散型アプリケーション(dapp)が急増しており、dapp を支える基盤技術は「ブロックチェーン + スマートコントラクト」です。 スマートコントラクトとブロックチェーンの結合は、ブロックチェーンの世界における画期的なアップグレードと広く見なされています。ブロックチェーンとスマートコントラクト技術を組み合わせた最初のプラットフォームであるイーサリアムの誕生は、「ブロックチェーン 2.0」時代の幕開けと見なされています。

スマートコントラクトとは ¶#

1996 年、Nick Szabo は論文「Smart Contracts: Building Blocks For Digital Markets」でスマートコントラクトの概念を提唱しました。 「契約」とは、条文や契約書のようなもので、発生条件とそれに対応する実行条項が記録され、権利確定などの操作をサポートします。「スマート」とは、自動化やプログラム可能であることを意味します。 したがって、スマートコントラクトはプログラム可能な契約であり、自動実行される条文契約の一部と理解することもできます。コンピュータ内では、自動実行されるプログラムの一部です。契約の保存が容易であり、確定したアルゴリズムによって実行され、与えられた入力に対して対応する出力が得られ、契約の実行力が大いに保証されます。 自動販売機を例に挙げると、スマートコントラクトの核心的な特徴をよりよく理解するのに役立ちます。 使用者が購入する商品を選択し、支払いを完了すると、出荷ロジックがトリガーされ、ユーザーは望む商品を受け取ることができ、このプロセスには人間の介入が必要なく、商品販売の人件費を節約します。この契約を破壊するには、自動販売機を物理的に破壊する必要があります。POS 端末や EDI(電子データ交換)なども同様の類比として考えられます。

スマートコントラクトとブロックチェーン ¶#

スマートコントラクトは 20 世紀に提唱されましたが、ブロックチェーンは 2009 年に誕生したため、定義上、スマートコントラクトとブロックチェーンの関係はあまりありません。 では、なぜこの 10 年間でスマートコントラクトとブロックチェーンがこれほど密接に関連しているのでしょうか?それは、ブロックチェーンがスマートコントラクトの改ざん不可能性を保証できるからです。契約内容だけでなく、呼び出し記録も改ざん不可能です。 スマートコントラクトが価値を生み出すための最も基本的な前提は、物理的に破壊されない強力な基盤メディアが存在することです。 しかし、スマートコントラクトの本体はコードであり、非常に改ざんされやすいため、強力なストレージメディアを提供する方法が問題となります。これはまさにブロックチェーンが得意とする解決策です —— ビットコインの実践を通じて、ブロックチェーンが分散環境で電子記録を改ざん不可能にできることが証明されました。 同時に、スマートコントラクトもブロックチェーンにフィードバックを行い、ブロックチェーンのビジネスシーンを大いに拡張しました。 スマートコントラクトと結びついた後、ブロックチェーンは単一の通貨支払いにサービスを提供するだけでなく、生活のあらゆる側面に広がることができます。豊富なアプリケーションシーンは、ブロックチェーンの能力に新たな挑戦をもたらしました。

ブロックチェーン 2.0:イーサリアムの誕生 ¶#

2009 年に誕生したビットコインは、ブロックチェーンなどの技術を利用してエコシステムを保証し、ブロックチェーン 1.0 時代を開創しました。 ユーザーはスクリプトコードを使用していくつかの内容をカスタマイズできます。たとえば、資金をどのようにアンロックするかです。これらのスクリプトコードは取引とともに保存され、改ざん不可能な特性を享受し、決定的です。 したがって、ある意味で、これらのスクリプトはスマートコントラクトとも見なすことができます。しかし、使い勝手はあまり良くありません。 まず、これらのスクリプトコードはチューリング完全ではなく、実現できる機能が制限されています。次に、開発のハードルが高く、複雑なロジックを書く体験は非常に悪く、JVM バイトコードを使用してプログラムを書くようなものです。 2013 年、若き V 神がイーサリアムを提案しました。その核心は、世界の状態を通じてブロックチェーンデータを更新および検証することです。イーサリアムとビットコインの最大の違いは、スマートコントラクトを通じて複雑なロジック操作を実行できることです。 イーサリアムでは、スマートコントラクトの言語は Solidity であり、これはチューリング完全であり、比較的高水準の言語であり、スマートコントラクトの能力範囲を大いに拡張し、スマートコントラクトの作成の難易度を下げました。 このため、イーサリアムの誕生は、ブロックチェーン 2.0 時代の幕開けをも意味します。その後、スマートコントラクト技術は徐々にトレーサビリティ、証明、サプライチェーンなどの複数のビジネスシーンに浸透しました。

スマートコントラクトの現状と展望 ¶#

プログラミングの観点から見ると、スマートコントラクトは一段のコードです。従来のコードと比較して、スマートコントラクトには多くの違いと制限があります。たとえば:

  • 単一スレッド実行
  • コードの実行はリソースを消費し、リソース制限を超えることはできません
  • 現在、チェーン外データを取得することは困難です。たとえば、天気情報や試合結果など
  • その他の制限、たとえば TPS
    これらの特徴により、現在のスマートコントラクトエコシステムは、オンチェーンリソースのガバナンスを中心にしています。イーサリアム上のさまざまな ERC 標準やガバナンスプランのように。EOS には、CPU、RAM、経済モデル、Rex、Bancor プロトコルなど、さまざまなリソースモデルがあります。 明らかに、現在のエコシステムにおいて、スマートコントラクトは現実世界に対する影響力が限られています。しかし、物事は常に発展しています。現在、これらの制限を突破することに取り組んでいる多くの研究があります。典型的なものは Oracle(オラクルですが、一般には予言機と呼ばれます)で、これはスマートコントラクトとチェーン外との相互作用を可能にし、スマートコントラクトの使用シーンを大幅に向上させます。まるでコンピュータがネットに接続されたかのようです。また、チェーン自体の性能ボトルネックを突破する試みもあります。たとえば、支払いチャネル、クロスチェーン、プラズマ、ロールアップなど、これらはすべて異なる角度から安全性と性能の束縛を打破しています。 疑いなく、スマートコントラクトはますます重要な役割を果たすでしょう。将来的には、イーサリアム 2.0 の実現に伴い、新たなブロックチェーン時代が開かれるかもしれません。

スマートコントラクト技術 ¶#

イーサリアムは Solidity をスマートコントラクト言語として採用しています。Solidity はスマートコントラクトを実現するために作成された高級プログラミング言語で、イーサリアムプログラムのノード上で実行できます。この言語は C++ や JavaScript のいくつかの特徴を取り入れています。たとえば、静的型言語であり、継承やライブラリをサポートしています。 Solidity の他にも、各プラットフォームのスマートコントラクト技術は異なります。次に、パブリックチェーンとコンソーシアムチェーンを切り口に、他のプラットフォームで採用されている技術を紹介します。
パブリックチェーン ¶
まず、三大パブリックチェーンのスマートコントラクト技術を理解しましょう。

画像

ビットコインシステム#

ビットコインは 2009 年に中本聡によって発明されたデジタル通貨で、主に中央集権的な銀行システムに対抗するために作られました。その精巧なシステム設計と安全性により、価値も急速に高まっています。また、実世界のアイデンティティと結びついていないため、強力な匿名性を持ち、違法取引、マネーロンダリング、恐喝などの悪意のある行為にも使用されており、いくつかの論争を引き起こしています。 去中心化されたブロックチェーンシステムとして、誰でもアクセスでき、ローカルでノードを維持してビットコインネットワークに参加できます。以下では、Bitcoin Core クライアントを使用してローカルでノードを維持します。

画像
ノードはフルノードとライトノードの 2 種類に分かれます。初期のすべてのノードはフルノードでしたが、データ量が増えるにつれて、スマートフォンやタブレットなどのデバイスで動作するビットコインクライアントは、ブロックチェーン全体の情報を保存する必要がなく、Simplified Payment Verification(SPV)ノードとも呼ばれるライトノードです。 Bitcoin Core クライアントはフルノードであり、以下で具体的に説明します。フルノードは常にオンラインで、完全なブロックチェーン情報を維持します。メモリには完全な UTXO セットが維持されているため、ブロックチェーン全体のブロックと取引情報(創世ブロックから最新のブロックまで)を検証して取引の合法性を確認します。また、どの取引がブロックにパッケージ化されるかを決定します。取引の検証はマイニングであり、どのチェーンに沿ってマイニングを続けるかを決定できます。等長の分岐が発生した場合、どの分岐を選択するかも決定します。同時に、他のマイナーが掘り出したブロックを監視し、合法性を検証します。 ライトノードは常にオンラインである必要はなく、ブロックチェーン全体を保持する必要もありません(データ量が膨大です)。各ブロックのブロックヘッダーのみを保持する必要があります。また、自分に関連するブロックのみを保存し、チェーン上のすべての取引を保存する必要はありません。すべての情報を保存していないため、大多数の取引の合法性やオンラインで発表された新しいブロックの正確性を検証することはできず、自分に関連するブロックのみを検証できます。 Merkle Proof を通じて取引の存在を確認できますが、取引の不存在を確認することはできません。マイニングの難易度を検証することはできます。なぜなら、それはブロックヘッダーに保存されているからです。 以下の例を通じて、フルノードとライトノードの取引検証方法を説明します。 たとえば、block 300,000 にある取引 T を検証する場合、フルノードはすべての 300,000 ブロック(創世ブロックまで)を確認し、完全な UTXO データベースを構築してこの取引が消費されていないことを確認します。一方、ライトノードは Merkle Path を通じて取引 T に関連するすべてのブロックをリンクし、300,001 から 300,006 のブロックを待って確認し、取引の合法性を検証します。

ブロックチェーン構造#

ブロックチェーンは、順次リンクされたブロックで構成されるデータ構造であり、単一のファイルまたはデータベースに保存できます。Bitcoin Client は Google の LevelDB データベースを使用してデータを保存します。 各ブロックは前のブロックを指し、いずれかのブロックが変更されると、その後のすべてのブロックに影響を与えます。したがって、ブロックを改ざんするには、後続のすべてのブロックを同時に改ざんする必要があり、これには膨大な計算能力が必要で、コストが利益を上回ることが多いため、安全性が大いに保証されます。 ブロックチェーン構造には、ブロックサイズ(4 バイト)、ブロックヘッダー、トランザクションカウンター(1-9 バイト)、トランザクションなどのいくつかのコア構成要素が含まれています。 ブロックチェーンのブロックヘッダーサイズは 80 バイトで、Version(4 バイト)、Previous Block Hash(32 バイト)、Merkle Tree Root(32 バイト)、Timestamp(4 バイト)、Difficulty Target(4 バイト)、Nonce(4 バイト)を保存しています。 各ブロックのハッシュ値は、ブロックヘッダーに対して 2 回ハッシュ計算を行うことによって得られます。すなわち SHA256 (SHA256 (Block Header)) であり、ブロックチェーン構造には存在せず、各ノードがブロックを受信した後に計算して得られます。これはユニークです。さらに、Block Height もブロックの識別子として使用できます。

メルクルツリー#

メルクルツリーはブロックチェーンにおいて非常に重要なデータ構造であり、主にハッシュアルゴリズムを使用して大規模データセットを検証します(これは二重ハッシュ方式 SHA256 (SHA256 (Block Header)) を通じて行われます)。構造は以下の図のようになります:

画像
メルクルツリーの方式を使用すると、特定の取引が特定のブロックに存在するかどうかを迅速に検証できます(アルゴリズムの複雑さは LogN です)。たとえば、取引 K がブロックに存在するかどうかを検証するには、非常に少ないノードにアクセスするだけで済みます。

画像
ビットコインネットワークには大量の取引が存在するため、この方法は効率を大幅に向上させることができます。以下の図のように:

画像
ライトノード(たとえば、スマートフォンのビットコインウォレット)はブロックチェーン全体のデータを保存しないため、メルクルツリー構造を使用して取引を簡単に検索できます。ライトノードは、Bloom フィルターを構築して、自身に関連する取引を取得します:

  1. まず、Bloom フィルターを空の値で初期化し、ウォレット内のすべてのアドレスを取得し、取引出力に関連するアドレスと一致する検索パターンを作成し、検索パターンを Bloom フィルターに追加します;
  2. 次に、Bloom フィルターが各ノードに送信されます(filterload メッセージを通じて);
  3. ノードが受信すると、条件に合致するブロックヘッダーと取引のメルクルパスを含む merkleblock メッセージと、フィルタリング結果を含む tx メッセージが送信されます。
    このプロセスでは、ライトノードはメルクルパスを使用して取引とブロックをリンクし、ブロックヘッダーを通じてブロックチェーンを構成し、取引がブロックチェーンに存在することを検証できるようになります。 Bloom フィルターを使用すると、フィルタリング条件に合致する結果が返されますが、いくつかの誤報も存在するため、多くの無関係な結果が返され、ライトノードが他のノードに関連アドレスを要求する際にプライバシーが保護されます。
    ビットコインネットワーク #
    ビットコインシステムは P2P ピアツーピアネットワーク上で動作しており、ノード間は平等で、アイデンティティや権限の違いはありません。中央集権的なサーバーはなく、ネットワークにも階層的な区分はありません。 各ノードは、ブロックチェーンに上がるのを待っている取引の集合を維持する必要があります。各ブロックのサイズは 1M であるため、ほとんどのノードに到達するまでに数秒かかります。あるノードが A->B の取引を監視していると仮定すると、それを集合に書き込みます。同時に、A->C の二重支払い攻撃を発見した場合は、もう書き込まれません。ただし、同じ A->B の取引や同じコインソースの A->C の取引を監視すると、集合内の A->B の取引が削除されます。
    ビットコインコンセンサスプロトコル #
    ビットコインは誰でも参加できる開発システムとして、悪意のあるノードの脅威を解決する必要があります。その解決策は、作業証明メカニズム、つまり計算力投票メカニズムです。新しい取引が生成されると、新しいデータ記録がブロードキャストされ、全ネットワークがコンセンサスアルゴリズムを実行します。つまり、マイナーがマイニングを行って記録を検証し、ランダム数を解決し、最初に問題を解決したマイナーが記帳権を得て新しいブロックを生成し、他のノードが検証を通過した後に主チェーンに追加されます。
    ウォレット #
    デジタル通貨システムとして、ビットコインには独自のウォレットシステムがあり、主に秘密鍵、公鍵、ウォレットアドレスの 3 つの部分で構成されています。 ウォレットアドレスを生成するプロセスは以下の通りです:
  4. ECDSA(Elliptic Curve Digital Signature Algorithm)を使用して、秘密鍵から対応する公開鍵を生成します。
  5. 公開鍵は非常に長く、入力や記憶が難しいため、SHA256 と RIPEMD160 アルゴリズムを使用して公開鍵ハッシュ値を取得します。
  6. 最後に Base58Check で処理し、可読性の高いウォレットアドレスを取得します。
    取引プロセス #
    ウォレット(および資産)を持っていると、取引を開始できます。典型的なビットコイン取引を通じてこのプロセスを理解してみましょう: A と B はそれぞれビットコインウォレットアドレスを持っています(Bitcoin Client を使用して生成できます。原理は上記の通りです)。 A が B に 5BTC を送金したいと仮定すると、A は B のウォレットアドレスを取得し、自分の秘密鍵で A->B の 5BTC の送金取引に署名する必要があります(A の秘密鍵は自分だけが知っているため、秘密鍵を持つことはウォレット資産の所有権を持つことを意味します)。その後、この取引を発表し、ビットコインシステムで取引を開始するには、少額のマイナー手数料を支払う必要があります。マイナーはこの取引の合法性を検証し、6 回の確認を得た後、取引はビットコイン台帳に受け入れられます。全体の検証プロセスは約 10 分です。
    マイナーはなぜ取引を検証するために大量の計算力を消費するのでしょうか? マイナーは検証プロセスでブロック報酬とマイナー手数料を得ることができ、ブロック報酬は 4 年ごとに減少します。したがって、後期の主なインセンティブはマイナー手数料です。
    なぜ検証に 10 分かかるのでしょうか? ビットコインは実際には絶対的に安全ではなく、新しい取引は悪意のある攻撃を受けやすいため、マイニングの難易度を制御して検証プロセスを約 10 分に保つことで、悪意のある攻撃を大幅に防ぐことができます。これは確率的な保証に過ぎません。
    ビットコインシステムでは、二重支払いをどのように防ぐのでしょうか? ビットコインは UTXO(未使用取引出力)という概念を採用しています。ユーザーが BTC 取引を受け取ると、それは UTXO にカウントされます。 この例では、A が B に 5BTC を送金したいと考えており、A のこの 5BTC は 2 つの UTXO(2BTC + 3BTC)から来ている可能性があります。したがって、A が B に送金する際、マイナーが検証する必要があるのは、これらの 2 つの UTXO がこの取引の前に消費されていないかどうかです。消費されている場合、その取引は不正です。 下の図は、複数の取引の流れと UTXO に関連する概念をよく説明しています。

画像
さらに、UTXO には非常に重要な特性があり、分割できません。たとえば、A が 20BTC を持っていて、B に 5BTC を送金したい場合、取引は最初に 20BTC を入力として使用し、2 つの出力を生成します。1 つは B に 5BTC を送金し、もう 1 つは A に残りの 15BTC を返します。したがって、A は 15BTC の UTXO を再び持つことになります。単一の UTXO が支払いに不十分な場合は、複数を組み合わせて入力を形成できますが、合計は必ず取引額を超える必要があります。
マイナーはどのように取引の発起者が十分な残高を持っているかを検証するのでしょうか? この問題は一見簡単に見えます。最初の反応は、Alipay のように残高が十分かどうかを確認するだけで済むということです。しかし、ビットコインは取引ベースの帳簿モデルであり、アカウントの概念がないため、残高を直接確認することはできません。アカウントの残りの資産を知るには、過去のすべての取引を振り返り、すべての UTXO を見つけて合計する必要があります。
取引モデル #
上記では、取引がどのように発生するかについて説明しましたが、ビットコイン取引はどのような部分で構成されているのでしょうか?

画像
図の最初の部分は Version で、バージョンを示します。 次に、Input に関連する情報:Input Count は数量を示し、Input Info は入力の内容、つまり Unlocking Script で、主に入力の出所、入力が使用可能かどうか、その他の入力の詳細を確認するために使用されます。

  • Previous output hash すべての入力は 1 つの出力に追跡でき、これはその入力で消費される UTXO を含むものであり、その UTXO のハッシュ値はここで逆順に保存されます。
  • Previous output index1 つの取引には、インデックス番号で参照される複数の UTXO がある場合があります。最初のインデックスは 0 です。
  • Unlocking Script Size - Unlocking Script のバイトサイズ
  • Unlocking Script は UTXO Unlocking Script のハッシュを満たします。
  • Sequence Number はデフォルトで ffffffff です。
    次に、Output に関連する情報が続きます。Output Count は数量を示し、Output Info は出力の内容、つまり Locking Script で、主に出力されたビットコインの量、将来の支出条件、出力の詳細を記録するために使用されます。
  • Amount は Satoshis(最小のビットコイン単位)で表される出力ビットコインの数量で、10^8 Satoshis = 1 ビットコインです。
  • Locking Script Size は Locking Script のバイトサイズです。
  • Locking Script は Locking Script のハッシュであり、出力を使用するために満たす必要がある条件を指定します。
    最後に Locktime があり、これは取引が最初にブロックチェーンに追加されることができる時間 / ブロックを示します。500 million 未満の場合はブロックの高さを直接読み取り、500 million を超える場合はタイムスタンプを読み取ります。

ビットコインスクリプト#

取引の中で Unlocking script と Locking script が言及されている場合、ビットコインスクリプトとは何でしょうか? ビットコインスクリプトは、各取引に記録された命令リストであり、スクリプトが実行されると、取引が有効かどうか、ビットコインが使用可能かどうかを検証できます。典型的なスクリプトは次のようになります。

<sig> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG

ビットコインスクリプトは、左から右にスタックベースで実行され、データを操作するために Opcodes を使用します。上記のスクリプト言語では、<> 内にはスタックにプッシュされるデータが含まれ、<> が含まれていない OP_で始まるものはオペレーター(OP は省略可能)であり、スクリプトはデータを埋め込んで永久にチェーン上に記録することもできます(40 バイトを超えない)。記録されたデータは UTXO に影響を与えません。 取引の中で、 は Unlocking script であり、OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG の部分は Locking script です。 大多数のプログラミング言語と比較して、ビットコインスクリプトは非チューリング完全であり、ループや複雑なフロー制御がなく、実行は非常に簡単で、どこで実行されても結果は決定的であり、状態を保存することはありません。また、スクリプト同士は相互に独立しています。これらの特徴により、ビットコインスクリプトは比較的安全ですが、非常に複雑なロジックを処理することはできないため、複雑なビジネスを処理するには適していません。Ethereum が提供するスマートコントラクトは、この点で革新的な突破を実現し、多くの分散型アプリケーションが誕生しました。

マイニング#

上記の取引プロセス全体でマイニングが言及されましたので、次に詳しく説明します。 一部のノードは、ブロック報酬とマイナー手数料を得るために、取引を検証します。これをマイナーのマイニングと呼びます。ブロック報酬は coinbase によって作成され、4 年ごとに減少します。2009 年の 25 から、現在は 6.5 に減少しています。 マイニングは、特定の設定された目標値に達するためにランダム数を試行し続けるプロセスです。たとえば、特定のターゲット値未満です。この難易度は、人為的に設定されて検証時間を調整し、安全性を高めるためのものであり、数学的な問題を解決するためのものではありません。 マイナーはこの値を試行し続けますが、成功率は非常に低いですが、試行回数は多くなります。したがって、計算力の強いノードは比例的な優位性を持ち、問題を解決しやすくなります。 では、なぜマイニングの難易度を調整する必要があるのでしょうか? ビットコインシステムでは、ブロック生成時間が短すぎると分岐が発生しやすく、分岐が多すぎるとシステムの合意形成に影響を与え、システムの安全性を脅かします。ビットコインシステムは、難易度調整を通じてブロック生成速度を約 10 分に安定させ、取引が改ざんされるのを防ぎます。 マイニングの難易度はどのように調整されるのでしょうか? システムは、2016 ブロックが生成されるごとに(約 2 週間)、目標閾値を一度調整します。ブロックヘッダーに存在し、全ネットワークのすべてのノードは新しい難易度でマイニングを行う必要があります。悪意のあるノードがコード内のターゲットを調整しない場合、誠実なマイナーは認めません。 目標閾値 = 目標閾値 * (2016 ブロック生成の実際の時間 / 2016 ブロック生成の予想時間) ビットコインが誕生した当初、マイナーは非常に少なく、マイニングの難易度も低く、ほとんどが家庭用コンピュータ(CPU)で直接マイニングを行っていました。ますます多くの人々がビットコインエコシステムに参加するにつれて、マイニングの難易度も高くなり、次第に計算力の強い GPU を使用してマイニングを行うようになりました。また、特定の ASIC(Application Specific Integrated Circuit)専用マイニングチップやマイニング機器も市場の需要に応じて誕生しました。現在では、多くの大規模マイニングプールも登場し、全ネットワークの大量の計算力を集めて集中マイニングを行っています。 このような大規模マイニングプールシステムでは、プールマネージャーがフルノードの役割を果たし、大量のマイナーが協力してハッシュ値を計算し、最終的に作業証明メカニズムを通じて報酬を分配します。しかし、計算力が過度に集中すると、いくつかの中央集権的リスクが生じる可能性があります。たとえば、特定の大規模マイニングプールが全ネットワークの 51%以上の計算力に達すると、取引を巻き戻したり、特定の取引を拒否したりすることができます。
分岐 #
ビットコインシステムでは、合意に達しない状況が発生することもあります。これを分岐と呼びます。分岐は主に 2 種類に分けられます。1 つは状態分岐であり、通常は一部のノードによって故意に行われます。もう 1 つはプロトコル分岐であり、ビットコインプロトコルに対するいくつかの意見の相違を意味します。 プロトコル分岐はさらに 2 種類に分けられます。1 つはハードフォークであり、プロトコルの一部の内容に対して互換性のない変更が行われた場合です。たとえば、ビットコインのブロックサイズを 1M から 4M に調整することです。この分岐方式は永久的であり、特定のノードから始まる 2 つの平行に発展するチェーンが形成されます。たとえば、Bitcoin Classic が形成され、2 つの通貨が生まれます。 もう 1 つはソフトフォークであり、たとえばビットコインのブロックサイズを調整する場合ですが、1M から 0.5M に調整します。このように調整すると、新しいノードが小さなブロックを掘り、古いノードが大きなブロックを掘るという状況が発生します。ソフトフォークは非永久的であり、典型的な例は coinbase の内容を変更することや P2SH(Pay to Script Hash)によって生じた分岐です。

Bitcoin Core クライアント#

Bitcoin Core はビットコインの実装であり、Bitcoin-QT または Satoshi-client とも呼ばれ、このクライアントを通じてビットコインネットワークに接続し、ブロックチェーンを検証し、ビットコインを送受信することができます。Mainnet、Testnet、Regnet の 3 つのネットワークがあり、切り替えることができます。 ビットコインブロックチェーンと直接対話するためのデバッグコンソールが提供されており、一般的な操作は以下の通りです:
Blockchain

  • getblockchaininfo: ブロックチェーン処理に関するさまざまな状態情報を返します。
  • getblockcount: ブロックチェーン内のブロック数を返します。
  • verifychain: ブロックチェーンデータベースを検証します。
    Hash
  • getblockhash: 提供されたブロックのハッシュ値を返します。
  • getnetworkhashps: 指定された最近のブロック数に基づいて、毎秒のネットワークハッシュ数を返します。
  • getbestblockhash: 最良のブロックのハッシュ値を返します。
    Blocks
  • getblock: ブロック情報の詳細を返します。
  • getblockheader: ブロックヘッダー情報に関する情報を返します。
  • generate: 指定された数のブロックを即座にウォレット内のアドレスにマイニングします。
    Wallet
  • getwalletinfo: ウォレットの状態に関するさまざまな情報を含むオブジェクトを返します。
  • listwallets: 現在ロードされているウォレットのリストを返します。
  • walletpassphrasechange: ウォレットのパスワードを変更します。
    Mempool
  • getmempoolinfo: メモリプールの活動状態に関する詳細情報を返します。
  • getrawmempool: メモリプール内のすべての取引の詳細情報を返します。
  • getmempoolentry: 指定された取引のメモリプールデータを返します。
    Transaction
  • getchaintxstats: チェーン内の取引総数と速度に関する統計データを計算します。
  • getrawtransaction: 生の取引データを返します。
  • listtransactions: 指定されたアカウントの取引リストを返します。
    Signature
  • signrawtransaction: 生の取引の入力に署名します。
  • signmessage: アドレスの秘密鍵を使用して情報に署名します。
  • dumpprivkey: 秘密鍵を取得します。
    Network
  • getnetworkinfo: P2P ネットワークの状態情報を返します。
  • getpeerinfo: 各接続ネットワークノードのデータを返します。
  • getconnectioncount: ノードの接続数を返します。
    Mining
  • getmininginfo: マイニングに関する情報を含むオブジェクトを返します。
  • getblocktemplate: ブロックを構築するために必要なデータを返します。
  • prioritisetransaction: より高いまたは低い優先度で取引をマイニングブロックに受け入れます。

まとめ#

以上がビットコインの核心技術に関する解説であり、主にその基本原理とデータモデルの側面から深く理解しました。ビットコインの学習を通じて、ブロックチェーンの設計理念と運用メカニズムをよく理解できるようになりました。次に、ブロックチェーン 2.0 と呼ばれるイーサリアムについて学び、分析していく予定です。ご期待ください!

参考資料#

  1. COMP7408 Distributed Ledger and Blockchain Technology, Professor S.M. Yiu, HKU
  2. Udacity Blockchain Developer Nanodegree, Udacity
    イーサリアムの核心技術解読 #

前言#

ビットコインは去中心化されたデジタル通貨として非常に成功していますが、ビットコインスクリプト(非チューリング完全で、単純なロジックしか処理できない)に制約され、非常に複雑なビジネスを処理することはできません。イーサリアムはスマートコントラクトを導入し、去中心化の概念をより豊富なアプリケーションシーンに適用できるようにしたため、ブロックチェーン 2.0 とも呼ばれています。本稿では、イーサリアムの核心技術について解説します。誤りや漏れがあれば、ぜひご指摘ください。

イーサリアムシステム#

2014 年 1 月、ロシアの開発者 Vitalik Buterin はイーサリアムのホワイトペーパーを発表し、チームを結成しました。これは、より汎用的なスクリプト言語を統合したブロックチェーンプラットフォームを作成することを目的としています。そのメンバーの一人である Dr. Gavin Wood は、イーサリアム仮想マシン(EVM)に関する技術を含むイエローペーパーを発表しました。これがイーサリアムの誕生です。

画像

簡単に言えば、イーサリアムはオープンソースの去中心化システムであり、ブロックチェーンを使用してシステムの状態変化を保存します。したがって、「世界コンピュータ」とも呼ばれています。開発者はブロックチェーン上に不変のプログラムをデプロイして実行することができ、これをスマートコントラクトと呼びます。したがって、広範なアプリケーションシーンをサポートできます。システムリソースの消費を測定するために、デジタル通貨 Ether を使用し、より多くの人々がイーサリアムシステムの構築に参加するように促します。

去中心化アプリ DApp#

狭義には、DApp はユーザーインターフェースを統合し、スマートコントラクトをサポートし、イーサリアムブロックチェーン上で実行されるアプリケーションです。

画像
上の図のように、イーサリアムアプリのインスタンスはブロックチェーンネットワークにデプロイされ(スマートコントラクトはブロックチェーン仮想マシン内で実行されます)、Web プログラムは Web3.js を介してブロックチェーンネットワークに RPC リモート呼び出しを行うだけで、ユーザーはブラウザ(DApp ブラウザや MetaMask などのプラグインツール)を介して去中心化サービスアプリにアクセスできます。

帳簿#

イーサリアムブロックチェーンは去中心化された帳簿(データベース)であり、ネットワーク内のすべての取引はブロックチェーンに保存され、すべてのノードはローカルにデータのコピーを保持し、各取引の信頼性を確保します。すべての取引は公開されており、改ざん不可能であり、ネットワーク内のすべてのノードが確認および検証できます。

アカウント#

私たちがウェブサイトやシステム(たとえば、メール)にログインする必要があるとき、通常はアカウントとパスワードが必要であり、パスワードは暗号化アルゴリズムを通じて中央集権的なデータベースに暗号文の形式で保存されます。しかし、イーサリアムは去中心化されたシステムであるため、アカウントはどのように生成されるのでしょうか?

ビットコインシステムの原理と似ています。

まず、自分だけが知っている秘密鍵を生成します。これを sk と仮定し、ECDSA(Elliptic Curve Digital Signature Algorithm)を使用して対応する公開鍵 pk を生成します。
次に、keccak256 アルゴリズムを使用して公開鍵 pk のハッシュ値を求めます。
最後に、160 ビットを切り取ってイーサリアムのアドレスとします。
ユーザーの秘密鍵とアドレスは一緒にイーサリアムのアカウントを構成し、残高を保存したり、取引を開始したりできます(ビットコインの残高はすべての UTXO を計算することによって得られますが、イーサリアムのようにアカウントに保存されるわけではありません)。

実際、イーサリアムアカウントには 2 種類あります。上記の方法で生成されたものは Externally Owned Accounts(EOA)と呼ばれ、外部アカウント、つまり通常のユーザーが持つアカウントで、Ether トークンを送受信したり、スマートコントラクトに取引を送信したりするために使用されます(つまり、スマートコントラクトを呼び出します)。

もう 1 つは Contract Accounts であり、契約アカウントは外部アカウントとは異なり、対応する秘密鍵がなく、契約をデプロイする際に生成され、スマートコントラクトコードを保存します。注意すべきは、契約アカウントは外部アカウントまたは他の契約によって呼び出される必要があり、自分から取引を実行することはできません。

ウォレット#

イーサリアムアカウントを保存および管理するソフトウェア / プラグインはウォレットと呼ばれ、取引署名、残高管理などの機能を提供します。ウォレット生成には主に 2 つの方法があり、非決定的にランダム生成するか、ランダムシードに基づいて生成します。

ガス#

イーサリアムネットワーク上の操作にも「手数料」が必要で、これをガスと呼びます。ブロックチェーン上にスマートコントラクトをデプロイしたり、送金したりするには、一定のガス単位を消費する必要があります。これは、マイナーがイーサリアムネットワークの構築に参加するためのインセンティブメカニズムでもあり、全体のネットワークをより安全で信頼性の高いものにします。

各取引には、適切なガス量とガスの価格を設定できます。ガス料金を高く設定すると、マイナーが取引をより早く処理することが多いですが、取引が何度も実行されて大量のガス料金を消費するのを防ぐために、ガスリミットを設定して制限することができます。ガスに関連する情報は [https://etherscan.io/gastracker](Ethereum Gas Tracker) で確認できます。

画像

スマートコントラクト#

上記で述べたように、イーサリアムブロックチェーンは取引情報だけでなく、スマートコントラクトコードの実行も保存します。 スマートコントラクトはアプリケーションと取引ロジックを制御し、イーサリアムシステム内のスマートコントラクトは専用の Solidity 言語を採用しており、構文は JavaScript に似ています。これに加えて、Vyper、Bamboo などのプログラミング言語もあります。 スマートコントラクトコードはバイトコードにコンパイルされ、ブロックチェーンにデプロイされ、一度上に載せられると編集できません。EVM はスマートコントラクト実行環境として、実行結果の決定性を保証します。
スマートコントラクトの例:クラウドファンディング #
より複雑なシーンを想像してみましょう。たとえば、新製品を開発するために 10000 元をクラウドファンディングしたいとします。既存のクラウドファンディングプラットフォームを通じて高額な手数料を支払う必要があり、信頼の問題を解決するのは非常に難しいです。そこで、クラウドファンディングの DApp を通じてこの問題を解決できます。 まず、クラウドファンディングのいくつかのルールを設定します。

  1. クラウドファンディングに参加したい人は、10-10000 元の金額を寄付できます。
  2. 目標金額が達成された場合、金額はスマートコントラクトを通じて私(つまりクラウドファンディングの発起人)に送信されます。
  3. 目標が一定の期間内(たとえば 1 か月)に達成されなかった場合、クラウドファンディングの資金は元のルートでクラウドファンディングユーザーに返還されます。
  4. また、いくつかのルールを設定できます。たとえば、1 週間後に目標金額が達成されなかった場合、ユーザーは返金を申請できます。
    これらのクラウドファンディング条項はスマートコントラクトを通じて実現され、公開ブロックチェーンにデプロイされているため、発起者でさえ条項を改ざんすることはできず、誰でも確認できます。信頼の問題を解決しました。 完全なコードはここをクリックして確認できます:https://www.toshblocks.com/solidity/complete-example-crowd-funding-smart-contract/

取引#

イーサリアムでは、典型的な取引はどのようなものですか?

  1. 開発者がスマートコントラクトをブロックチェーンにデプロイします。
  2. DApp が契約をインスタンス化し、契約を実行するために適切な値を渡します。
  3. DApp が取引にデジタル署名を行います。
  4. ローカルで取引を検証します。
  5. 取引をネットワークにブロードキャストします。
  6. マイナーのノードが取引を受信し、検証します。
  7. マイナーのノードが信頼できるブロックを確認した後、ネットワークにブロードキャストします。
  8. ローカルノードがネットワークと同期し、新しいブロックを受信します。

アーキテクチャ#

ツールを使用してクエリします。

画像

スマートコントラクト#

上記で述べたように、イーサリアムブロックチェーンは取引情報だけでなく、スマートコントラクトコードの実行も保存します。 スマートコントラクトはアプリケーションと取引ロジックを制御し、イーサリアムシステム内のスマートコントラクトは専用の Solidity 言語を採用しており、構文は JavaScript に似ています。これに加えて、Vyper、Bamboo などのプログラミング言語もあります。 スマートコントラクトコードはバイトコードにコンパイルされ、ブロックチェーンにデプロイされ、一度上に載せられると編集できません。EVM はスマートコントラクト実行環境として、実行結果の決定性を保証します。

スマートコントラクトの例:クラウドファンディング#

より複雑なシーンを想像してみましょう。たとえば、新製品を開発するために 10000 元をクラウドファンディングしたいとします。既存のクラウドファンディングプラットフォームを通じて高額な手数料を支払う必要があり、信頼の問題を解決するのは非常に難しいです。そこで、クラウドファンディングの DApp を通じてこの問題を解決できます。 まず、クラウドファンディングのいくつかのルールを設定します。

  1. クラウドファンディングに参加したい人は、10-10000 元の金額を寄付できます。
  2. 目標金額が達成された場合、金額はスマートコントラクトを通じて私(つまりクラウドファンディングの発起人)に送信されます。
  3. 目標が一定の期間内(たとえば 1 か月)に達成されなかった場合、クラウドファンディングの資金は元のルートでクラウドファンディングユーザーに返還されます。
  4. また、いくつかのルールを設定できます。たとえば、1 週間後に目標金額が達成されなかった場合、ユーザーは返金を申請できます。
    これらのクラウドファンディング条項はスマートコントラクトを通じて実現され、公開ブロックチェーンにデプロイされているため、発起者でさえ条項を改ざんすることはできず、誰でも確認できます。信頼の問題を解決しました。 完全なコードはここをクリックして確認できます:Demo

取引#

イーサリアムでは、典型的な取引はどのようなものですか?

  1. 開発者がスマートコントラクトをブロックチェーンにデプロイします。
  2. DApp が契約をインスタンス化し、契約を実行するために適切な値を渡します。
  3. DApp が取引にデジタル署名を行います。
  4. ローカルで取引を検証します。
  5. 取引をネットワークにブロードキャストします。
  6. マイナーのノードが取引を受信し、検証します。
  7. マイナーのノードが信頼できるブロックを確認した後、ネットワークにブロードキャストします。
  8. ローカルノードがネットワークと同期し、新しいブロックを受信します。

アーキテクチャ#

画像

イーサリアムは Order - Execute - Validate - Update State のシステムアーキテクチャを採用しています。このアーキテクチャでは、新しい取引が発生すると、マイナーは PoW 作業証明メカニズムの計算を行います。検証が完了すると、ブロックが gossip プロトコルを通じてネットワークにブロードキャストされます。ネットワーク内の他のノードが新しいブロックを受信すると、それも検証されます。最終的に、ブロックチェーンに提出され、状態が更新されます。具体的に見ると、イーサリアムシステムにはコンセンサス層、データ層、アプリケーション層などのコアコンポーネントがあり、その相互作用ロジックは以下のようになります。

画像

上の図のように、イーサリアムデータは Transaction Root と State Root で構成されています。Transaction Root はすべての取引で構成される木で、From、To、Data、Value、Gas Limit、Gas Price を含みます。一方、State Root はすべてのアカウントで構成される木で、Address、Code、Storage、Balance、Nonce を含みます。

まとめ#

以上がイーサリアムの核心技術に関する解説であり、スマートコントラクトの導入はブロックチェーンのアプリケーションに多くの可能性をもたらしましたが、依然として多くの安全性、プライバシー、効率の問題を考慮する必要があります。複雑な企業向けアプリケーションシーンに対しては、コンソーシアムチェーンがより良い選択肢です。今後、Hyperledger Fabric について詳細に分析する予定ですので、ご期待ください!

参考資料#

  1. COMP7408 Distributed Ledger and Blockchain Technology, Professor S.M. Yiu, HKU
  2. Udacity Blockchain Developer Nanodegree, Udacity

EOS#

Pomelo Coin EOS の紹介 Pomelo Coin EOS は、ブロックチェーンの魔法使い BM(Daniel Larimer)が開発した、オペレーティングシステムに似たブロックチェーンアーキテクチャプラットフォームで、分散型アプリケーションのパフォーマンス拡張を実現することを目的としています。EOS は数百の CPU またはクラスター上でアカウント、認証、データベース、非同期通信、プログラムスケジューリングを提供します。この技術の最終的な形は、毎秒数百万の取引をサポートできるブロックチェーンアーキテクチャであり、一般ユーザーは使用料を支払う必要がありません。

EOS.IO のhttps://github.com/EOSIO/Documentation/blob/master/zh-CN/TechnicalWhitePaper.md](ホワイトペーパー):#

EOS.IO ソフトウェアは、新しいブロックチェーンアーキテクチャ設計を導入し、去中心化アプリケーションが横方向および縦方向にスケールできるようにします。これは、オペレーティングシステムのような構築を通じて実現され、その上にアプリケーションを構築できます。このソフトウェアは、アカウント、認証、データベース、非同期通信、および数百の CPU コアまたはクラスターを横断するアプリケーションスケジューリングを提供します。これにより、毎秒数百万の取引を処理できるブロックチェーンアーキテクチャが生まれ、ユーザーの手数料を排除し、去中心化アプリケーションの迅速かつ簡単なデプロイを可能にします。
EOS.IO のホワイトペーパーでは、EOS.IO の設計当初のいくつかの主要目標についても言及されています:

  • 数百から数千のユーザーをサポート
  • 無料で使用
  • 簡単なアップグレードとバグ修正
  • 低遅延
  • 時系列性能
  • 同時性能
    これらの中で、最も魅力的なのは、毎秒数百万の取引を処理する能力です。このレベルの処理能力があれば、ブロックチェーンには真の大規模アプリケーションの可能性が生まれます。これに対して、Ethereum の初期テストネットの処理能力は 25 トランザクション / 秒であり、徐々に最適化されることで 50-100 トランザクション / 秒に達する可能性があります。しかし、この 50-100 トランザクション / 秒の処理能力では、大規模アプリケーションには明らかに不十分です。2017 年に登場した Cryptokitties(イーサ猫)は、この問題を明らかにしました。 毎秒数百万の取引をサポートすることも、EOS.IO が Ethereum に対して持つ最も核心的で本質的な革命です。 もちろん、喜ぶのは早すぎます。実現できるかどうかは、後で探求していきます。
    識別アルゴリズム
    EOS.IO は委任証明(delegated proof of stake)アルゴリズムを採用しています。略して DPOS です。 DPOS は、デジタル通貨のアプリケーションにおいて最初に登場したのは BitShare(ビット株)であり、ByteMaster の最初のブロックチェーン製品です。最初は、ブロックチェーンに基づく去中心化取引所と去中心化銀行を作成するために登場しました。興味がある方は、こちらのアドレスで BitShare の内部取引を確認できます。 DPOS について言及する理由は、BitShare が ByteMaster のアイデアをよく表現しているアプリケーションであり、その中に存在する担保モデルが、最近 EOS.IO に対して大きな疑問を引き起こしているからです。これについては後で詳しく説明します。 まず、DPOS を簡単に紹介し、後でさまざまなコンセンサスアルゴリズムについての単独の記事を考慮します。 DPOS は、コンセンサスメカニズムを対応する人に委任することを意味します。BitShare を例にとると、DPOS は BitShare を持つすべての人に投票を行わせ、101 人の代表を選出します。この 101 人の代表は、各自が同じ権利を持ち、最終的にどのチェーンが有効で真実のチェーンであるかを決定するのは、この 101 人の代表の状況によって決まります。 これは、国会や議会制度のように聞こえませんか?多数の人が少数の人を選出し、その少数の人が最終的な決定を投票で決定します。この投票の最終的な目標は、誰もが歴史を改ざんできないようにすることです。 具体的にこのモデルがどのようにそれを実現できるかについては、Steemit の dantheman が 2017 年 6 月に発表した「DPOS Consensus Algorithm - The Missing White Paper」を参照してください。 中国語翻訳版を見たい場合は、奚海峰が万云 BaaS で発表した翻訳稿を参照できます。そこで当時の具体的な内容を確認できます。

EOS.IO に戻ってコンセンサスアルゴリズムを見てみると、DPOS に基づく EOS.IO は、3 秒ごとに新しいブロックを生成します。このブロックは、投票によって選出された 21 人のプロデューサーによって交代で生成される必要があります。このように、1 回のサイクルが完了すると、再び 21 人のプロデューサーが選出されます。選択の過程では、得票数の多い上位 20 名が自動的に選出され、残りの 1 人のプロデューサーは得票比率に応じて選出されます。 ただし、これを単純に説明すると理解が難しいかもしれませんので、具体的なコードに基づいてさらに分析を行うことができます。
その他の特性

  • 取引確認:15/21(つまり、1 つのノードが 21 人のプロデューサーのうち 15 人から確認を受けることで、既存の取引の合法性を確認します)
  • EOS.IO は、2 から 32 文字の長さのカスタム名をインデックスとしてサポートします。アカウントはネームスペースをサポートします(簡単に言えば、@をサポートします)。また、アカウントは権限管理をサポートし、権限マッピングと権限評価を許可します。特に、盗まれたキーを復元することをサポートしています。原理は、現在使用している WeChat のパスワード回復に必要な複数のアクティブな友人からのメッセージ検証と非常に似ています。
  • EOS.IO は、ブロックプロデューサーが並行アルゴリズムを使用して取引をスケジュールすることをサポートします。

EOS EVM の概要#

EVM はイーサリアム仮想マシンを指します。イーサリアムエコシステム内では、これは一連のスマートコントラクトであり、開発者が Solidity で書かれた去中心化アプリケーション(dApp)をデプロイおよび実行できるようにします。 EOS EVM はイーサリアム EVM のシミュレーションであり、EOS スマートコントラクト内にあります。 EOS EVM は、他の EVM と同等の機能を提供しますが、比類のない速度、性能、互換性の利点を持っています。 これらの利点は、EOS EVM のアーキテクチャ設計と EOS ネイティブシステムの強力な特性に起因しています。
EOS ネイティブが大規模採用において果たす役割
現在の焦点は EOS EVM ですが、EOS ネイティブレイヤーは依然としてエコシステムのフラッグシップ製品です。 Leap v4.0.0 のリリースが近づくにつれて、EOS ネイティブは EOS EVM と共に革新を続けます。 EOS ネイティブは C++ で書かれており、これは伝統的な開発者の間で非常に人気のある言語であり、速度と強力なライブラリの利点を持っています。これは、オペレーティングシステムやゲームなど、性能が厳しく要求される技術プロジェクトに頻繁に使用されます。 この基盤アーキテクチャにより、EOS ネイティブに基づいて構築されたスマートコントラクトはより効率的で強力であり、Web2 や他の伝統的なコンピュータサイエンス分野から Web3 分野に移行する開発者に好まれることがよくあります。 GameFi の台頭に伴い、EOS ネイティブは大規模採用を実現する強力なプラットフォームとしての役割を果たし、Web2 環境で構築されたゲーム開発者がニーズに応じて Web3 要素をシームレスに統合できるようにします。 EOS ネイティブインフラストラクチャの最適化作業が継続的に進行し、現在イーサリアムエコシステムからのツールが EOS EVM に導入されることで、EOS エコシステムには他のエコシステムでは実現不可能な革新の機会が現れると予想されます。 これに基づいて、EOS は積極的な正の開発環境として自らを位置づけています。

EOS EVM の技術的詳細#

EOS EVM の背後で行われている開発作業には多くのことがあり、性能と使いやすさを最大限に高めるようにしています。以下では、過去 1 年間に実施された革新的な設計選択のいくつかを紹介します。

画像

Silkworm のアーキテクチャ#

画像
最初、Silkworm の開発は、分離された各段階を作成してテストすることに焦点を当てていました。Erigon はこれらの段階のためにデータベース状態を準備するために使用されました。その後、対等体との相互作用に依存する 2 つの段階を実装する作業が開始され(Erigon が提供する Sentry コンポーネントを介して)、Silkworm StageLoop の組み立てと異なるバイナリファイル(各段階ごとに 1 つ)を可用製品に変換する作業が行われました。すべての段階が 1 つのバイナリファイルに統合されています。

図のように、現在はブロック体をダウンロードし、状態根ハッシュを維持する段階で作業が行われています。
Erigon の実行時間 vs Silkworm の実行時間

画像

参考資料#

詳細を学びたい場合は、Erigon ブログをチェックしてください。
https://erigon.substack.com/p/current-status-of-silkworm-and-silkrpc
https://erigon.substack.com/p/staged-sync-and-short-history-of?s=w

コンソーシアムチェーン#

パブリックチェーンの他に、コンソーシアムチェーンも重要なブロックチェーンのタイプです。公的チェーンと比較して、コンソーシアムチェーンのコンセンサ

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。