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 つの部分で構成されています。 ウォレットアドレスを生成するプロセスは以下の通りです:

  1. ECDSA(Elliptic Curve Digital Signature Algorithm)を使用して、秘密鍵から対応する公開鍵を生成します。
  2. 公開鍵は長く、入力や記憶が難しいため、SHA256 と RIPEMD160 アルゴリズムを使用して公開鍵ハッシュ値を取得します。
  3. 最後に Base58Check で処理し、可読性の高いウォレットアドレスを取得します。

取引プロセス #
ウォレット(および資産)を持つと、取引を開始できます。典型的なビットコイン取引を通じてこのプロセスを理解してみましょう: A と B はそれぞれビットコインウォレットアドレスを持っています(Bitcoin Client を使用して生成できます)。 A が B に 5BTC を送金したいと仮定すると、A は B のウォレットアドレスを取得し、自分の秘密鍵で A->B の 5BTC の送金取引に署名する必要があります(A の秘密鍵は自分だけが知っているため、秘密鍵を持つことはウォレット資産の所有権を持つことを意味します)。その後、この取引を発表し、ビットコインシステム内で取引を開始するには、少額のマイナー手数料を支払う必要があります。マイナーはこの取引の合法性を検証し、6 回の確認を得た後、取引はビットコイン台帳に受け入れられます。全体の検証プロセスは約 10 分です。

なぜマイナーは取引を検証するために大量の計算力を消費するのでしょうか? マイナーは検証プロセス中にブロック報酬とマイナー手数料を得ることができ、ブロック報酬は 4 年ごとに減少します。そのため、後期の主要なインセンティブはマイナー手数料です。

なぜ検証に 10 分かかるのでしょうか? ビットコインは実際には絶対的に安全ではなく、新しい取引は悪意のある攻撃を受けやすいため、マイニングの難易度を制御して検証プロセスを約 10 分に保つことで、悪意のある攻撃を大幅に防ぐことができます。これは確率的な保証に過ぎません。

ビットコインシステムでは、どのように二重支払いを防ぐのでしょうか? ビットコインは UTXO(Unspent Transaction Outputs)という概念を採用しています。ユーザーが 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 週間)、目標閾値を 1 回調整します。ブロックヘッダーに存在し、全ネットワークのすべてのノードは新しい難易度でマイニングを行う必要があります。悪意のあるノードがコード内のターゲットを調整しない場合、誠実なマイナーは認識しません。 目標閾値 = 目標閾値 * (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 つのネットワークがあり、切り替えることができます。 デバッグコンソールを提供し、ビットコインブロックチェーンと直接対話できます。一般的な操作は以下の通りです:
ブロックチェーン

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

まとめ#

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

参考資料#

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

Ethereum 核心技術解読 #

前言#

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

Ethereum システム#

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

画像

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

去中心化アプリ DApp#

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

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

台帳#

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

アカウント#

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

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

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

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

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

ウォレット#

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

ガス#

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

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

画像

スマートコントラクト#

上記で述べたように、Ethereum ブロックチェーンは取引情報だけでなく、スマートコントラクトコードを実行することも保存します。 スマートコントラクトはアプリケーションと取引ロジックを制御し、Ethereum システム内のスマートコントラクトは専用の 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/

取引#

Ethereum における典型的な取引はどのようなものでしょうか?

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

アーキテクチャ#

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

画像

スマートコントラクト#

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

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

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

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

取引#

Ethereum における典型的な取引はどのようなものでしょうか?

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

アーキテクチャ#

画像

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

画像

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

まとめ#

以上が Ethereum の核心技術に関するいくつかの解釈であり、スマートコントラクトの導入はブロックチェーンのアプリケーションに多くの可能性をもたらしましたが、依然として多くの安全性、プライバシー、効率の問題を考慮する必要があります。複雑な企業向けアプリケーションシーンに対しては、コンソーシアムチェーンがより良い選択肢です。今後、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 のホワイトペーパーでは、設計当初のいくつかの主要な目標についても言及されています:

  • 数百から千のユーザーをサポート
  • 無料での使用
  • 簡単なアップグレードとバグ修正
  • 低遅延
  • 時間性能
  • 同時性能

これらの中で、最も魅力的なのは毎秒数百万回の取引を処理できるということです。このようなレベルの処理能力があれば、ブロックチェーンは本当に大規模なアプリケーションの可能性を持つことができます。それに対して、Ethereum は初期のテストネットの処理能力が 25 トランザクション / 秒であり、徐々に最適化されることで 50-100 トランザクション / 秒に達する可能性があります。しかし、この 50-100 トランザクション / 秒の処理能力は、大規模なアプリケーションには明らかに不十分です。2017 年に登場した Cryptokitties(イーサ猫)は、この問題を明確に露呈しました。 毎秒数百万回の取引をサポートすることも、EOS.IO が Ethereum に対して最も核心的で本質的な革命です。

もちろん、早く喜ぶ必要はありません。果たして実現できるかどうか、後で探求してみましょう。

コンセンサスアルゴリズム#

EOS.IO は委任証明(DPoS)アルゴリズムを採用しています。 DPOS は、デジタル通貨のアプリケーションにおいて最初に登場したのは BitShare(ビットシェア)であり、ByteMaster の最初のブロックチェーン製品です。最初は、ブロックチェーンに基づく去中心化取引所と去中心化ブロックチェーン銀行を出すために、ビットシェア内のプラットフォームが登場しました。興味がある方は、こちらのアドレスでビットシェア内盤についてご覧ください。

ここでビットシェア内盤を言及する理由は、ビットシェアが ByteMaster のアイデアを体現する良い例であり、その中に存在する質権モデルが、最近 EOS.IO に対して大きな疑問を引き起こしています。これについては後で詳しく説明します。

DPOS を簡単に紹介しますが、後でさまざまなコンセンサスアルゴリズムを紹介するために別の記事を考えています。 DPOS は、コンセンサスメカニズムを対応する人に委任することを意味します。ビットシェアを例にとると、DPOS はビットシェアを持つすべての人に投票を行わせ、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 は Ethereum 仮想マシンを指します。Ethereum エコシステム内では、これは一連のスマートコントラクトであり、開発者が Solidity で書かれた去中心化アプリケーション(dApp)をデプロイして実行できるようにします。 EOS EVM は Ethereum 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 ネイティブのインフラストラクチャの最適化作業が進行中であり、現在 Ethereum エコシステムからのツールが EOS EVM に導入されているため、EOS エコシステムには他のエコシステムでは実現できない革新的な機会が現れると予想されます。これに基づいて、EOS は積極的なウィンウィン開発環境として自らを位置づけています。

EOS EVM の技術的詳細#

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

画像

Silkworm のアーキテクチャ#

画像
最初、Silkworm の開発は、各段階を分離して作成およびテストすることに焦点を当てていました。Erigon はこれらの段階のためにデータベース状態を準備するために使用されました。その後、対等体との相互作用に依存する 2 つの段階を実装する作業が開始され、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

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

パブリックチェーンの他に、コンソーシアムチェーンも重要なブロックチェーンのタイプです。公チェーンと比較して、コンソーシアムチェーンのコンセンサスの複雑さは大幅に削減されるため、実行効率が高くなります。 コンソーシアムチェーンは企業レベルの機関に好まれ、一般的に関連機関間で連盟が形成され、コンソーシアムチェーンを通じてデータを共有します。コンソ

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