BTC
ETH
HTX
SOL
BNB
View Market
简中
繁中
English
日本語
한국어
ภาษาไทย
Tiếng Việt

【仮想マシンコラム】スマートコントラクト実行エンジンの今と昔

趣链科技 QTech
特邀专栏作者
この記事は約3279文字で、全文を読むには約5分かかります
最初に提案されたスマート コントラクト言語として、Solidity はブロックチェーン アプリケーション シナリオに新しい扉を開きました。
AI要約
展開
最初に提案されたスマート コントラクト言語として、Solidity はブロックチェーン アプリケーション シナリオに新しい扉を開きました。

最初に提案されたスマート コントラクト言語として、Solidity はブロックチェーン アプリケーション シナリオに新しい扉を開きました。

最初に提案されたスマート コントラクト言語として、Solidity はブロックチェーン アプリケーション シナリオに新しい扉を開きました。

- 起源 -

スマート コントラクトという用語は、学際的な法学者である Nick Szabo によって 1994 年に初めて提案されました。彼のスマートコントラクトの定義は次のとおりです。

「スマートコントラクトとは、デジタル的に定義された一連の約束であり、契約の当事者がそれらの約束を強制できる合意も含まれます。」

つまり、一言で言えば、Nick Szabo はスマート コントラクトを一連の約束であると考えています。いわゆるコミットメントとは、参加者によって合意された相互の権利と義務を指します。したがって、スマートコントラクトの本質と目的は約束そのものです。たとえば、単純な売買イベントでは、売り手は供給することを約束し、買い手は支払うことを約束し、これら 2 つの約束によってスマート コントラクトを形成できます。 Nick Szabo 氏のスマート コントラクトの定義で言及されているキーワード、デジタル形式と契約に注目してください。これら 2 つのキーワードは、スマート コントラクトが従来の意味でのコミットメントとは異なり、形式と機能において決定的な特徴を持っていることを決定します。

「スマートコントラクト」はイーサリアムによって初めてブロックチェーンに導入されました。イーサリアムのホワイトペーパーによると、スマートコントラクトの導入は主に次の問題を解決するために行われます。

スクリプト言語の場合、スクリプトはチューリング完全ではなく(後で紹介します)、楕円曲線署名アルゴリズムなどの複雑な機能を実装するのが困難です。

スクリプトでは、引き出し可能な金額を細かく制御できません。

スクリプトには状態保存機能がないため、より複雑なステートフル コントラクトを実装できません

乱数、タイムスタンプ、以前のブロックのハッシュの取得など、実行中に取得できるデータが十分ではありません。

つまり、スクリプト言語ではよりリッチなアプリケーション操作を満足させることができないため、イーサリアムは独自のスマートコントラクト言語Solidityを設計し、同時にスマートコントラクトを実行するためのスマートコントラクト実行エンジンEVMも誕生しました。

それ以来、ブロックチェーン テクノロジーの応用シナリオは、単一の UTXO ベースのデジタル通貨トランザクションから、チューリングの完全な一般的なコンピューティング分野まで拡張されました。ユーザーは、ビットコイン スクリプトでサポートされる単純なロジックに限定されなくなり、任意に複雑なコントラクト ロジックを自分で設計できます。

- 概要 -

Ethereum 設計スマート コントラクトには、次の設計機能があります。

▲執行の確実性

決定性とは、プログラムがいつどこで実行されたとしても、何回実行されたとしても、特定の入力に対して同じ出力が得られることを意味します。ブロックチェーンは同じ台帳を維持するため、スマート コントラクト実行の確実性は、同じコントラクトを実行する異なるノードが同じ結果を持たなければならないと理解できます。

イーサリアムのスマートコントラクト言語はシンプルに設計されており、実行の確実性を確保するために、乱数や不確実な(システム)コールなどの機能は実装されていません。これにより、結果の確実性が最下層で保証されます。

▲チューリング完成度

チューリングの完全な言語、より公式な説明では、無限ループを含む「アルゴリズムで計算できるすべての問題を計算できる」言語です。イーサリアムにスマート コントラクトを導入する目的は、チューリングの完全性を達成して、より豊富なアプリケーション フォームをサポートすることです。

チューリング完全性の導入後に解決する必要がある問題の 1 つは、停止問題です。一般に、特定のプログラムが停止するかどうかを知る方法はありません。

Turing の完全性によって引き起こされるダウンタイムの問題を回避するために、イーサリアムは、関連する実行プロセスのコスト計算を実行するための Gas メカニズムを導入しました。さまざまな操作のコストをガス単位で計算し (各操作は特定のガス消費量に対応します。つまり、対応するガス消費量のテーブルがあります)、各実行のガス消費量の上限を設定します。 GasLimit、コントラクト実行の累積操作 GasLimit の上限を超えると、シャットダウンの効果を得るために実行が強制的に停止されます。 Gas メカニズムの導入により、ユーザーがアプリケーションを使用する際の複雑さは、プラットフォームの物理的な制限ではなく、ユーザーが支払う意思のある価格に依存するようになります。

もちろん、Gas メカニズムの導入には他の利点もありますが、ここでは紹介しません。

▲ セキュリティ

イーサリアムの設計前提として、セキュリティはスマートコントラクトが保証する必要があるものでもあります。イーサリアム スマート コントラクトのセキュリティは、主に設計の 2 つの側面に反映されています。

1) 比較的シンプルなスマートコントラクト言語

主流のチューリング完全言語と比較して、Solidity 言語はブロックチェーン シナリオに重点を置いているため、マルチスレッドやシステム コールなどの多くの言語機能を実装する必要がなく、その設計が可能な限りシンプルになっています。ただし、これは、言語の段階的な開発に伴い、その機能が常に増加および改善されているにもかかわらず、初期の段階では使いにくかった理由の 1 つでもあります。

2) スマートコントラクトの実行環境が十分に隔離されている

Ethereum スマート コントラクトは Ethereum Virtual Machine (EVM) で実行されます。EVM での実行はサンドボックス化されているだけでなく、実際には完全に分離されています。つまり、EVM で実行されているコードはネットワーク、ファイル システム、またはその他のプロセスにアクセスできません。スマート コントラクトであっても、他のスマート コントラクトへのアクセスは制限されています。制御可能なセキュリティは、操作を分離することによって大幅に保証されます。

——詳しい説明——

次に、Solidity コントラクトの実行エンジンである EVM について詳しく見ていきましょう。

文章

EVM は、1 バイトを命令として使用するスタック仮想マシンとして定義されます。スタック仮想マシンの特徴は、操作の実行時にオペランド スタック (オペランド スタック) との対話に依存することです。

Solidity コントラクトのソース コードは、低レベルのスタックベースのバイトコードを使用するようにコンパイルされているため、実際に Ethereum にデプロイして EVM で実行するものは、実際にはバイトコードの文字列になります。コードは一連のバイトで構成され、各バイトが操作を表します。バイトコードが実行されると、バイトコードの演算意味に従って最初のバイトコードからコードの最後に到達するか、エラーが発生するまで(REVERT、STOP、RETURN オペコードの発生など)、順番に実行されます。これらの操作では、データを保存するために 3 種類のスペースにアクセスできます。

スタック: 値をプッシュおよびポップできる LIFO コンテナ。

メモリ: 無限に拡張可能なバイト配列。

ストレージ: コントラクトの長期ストレージ。キーと値のペアとして保存されます。計算後にリセットされるスタックやメモリとは異なり、ストレージは長期間にわたって存在し、この部分はよく言われる「ワールドステート」の一部でもあります。

スマートコントラクトの実行プロセスは、実際にはオペコードで定義された動作に従った3種類のストレージスペースの操作プロセスであるため、以下の例で簡単に示します。

次の図は、いくつかのコントラクトのフラグメントを示しています。左側はコントラクトのバイトコード、右側はバイトコードによって表される操作の意味です。

各オペコードの簡単な意味は次のとおりです。

PUSH1: バイトコードの 16 進数は 60 です。この操作の意味は、次のバイトをスタックにプッシュすることです。

ADD: バイトコードの 16 進数は 01 です。操作の意味は、スタック上の 2 つの要素をポップして追加し、結果をスタックに戻すことです。

MSTORE: バイト コードの 16 進数は 52、操作の意味は、スタックからポップされた 2 番目の値をメモリに保存することであり、保存されたインデックス値はスタックからポップされた最初の要素です。

RET: バイトコード 16 進数は f3、操作の意味は実行の終了、結果を返す、結果はメモリ内にあり、開始インデックスはスタックからポップされた最初の値、長さはスタックからポップされた 2 番目の値です。スタック


このバイトコードを EVM に入れて実行します。その実行プロセスは次のとおりです。

このうち、PC は現在実行中のオペレーションコードの位置を表し、コントラクトフラグメント(RET オペレーションコード)の実行終了時に、メモリの 60 バイトの先頭から 5 バイトのデータが取り出されます。コントラクトフラグメントの実行が完了し、最終結果が呼び出し元に返されます。

注意深い学生であれば、図中の関連命令にはストレージに関連する操作がないことがわかりますが、実際には、サンプル コードでは簡単にするために SStore などの関連命令が選択されていないためであり、その実行原理は上記の式と同様です。 。

「では、EVM はなぜこのように設計されているのでしょうか? これらのスタックの出入り、メモリのコピー、および保管庫?」

これにはプログラミング言語の設計が含まれます。理論的には、コンピューティングの理論システムでは、命令セット アーキテクチャはコンピュータの抽象モデルであり、命令セットに含まれる命令の種類の豊富さがプログラム表現の豊富さに直接影響します。例えば、命令セットには、加算、減算、乗算、除算などの算術および論理演算命令、ジャンプなどの制御命令、メモリの読み取りなどのデータ処理命令が含まれ得る。仮想マシンとして、必要に応じて命令を選択または追加して、目的の機能を表現する命令セットを構築できます。たとえば、EVM は浮動小数点数に関連する演算のためのストレージ関連の命令を追加しないため、これは命令レベルからすると、Solidity 言語が浮動小数点数演算をサポートしていないことを説明します。命令が決定したら、最新のプログラミング ツールを使用して、特定の言語を設計できます。したがって、必要に応じて、ある程度、独自の言語と対応する実行エンジンを実装することもできます。

- 開発する -

EVM の本質は、ブロックチェーン台帳と呼ばれるプログラマブル言語を通じて「世界状態」を操作することであるため、いかにより良く、より速く操作するかが、スマート コントラクト仮想マシンの主要な追求点となります。

継続的な開発により、業界には多くのスマート コントラクト実行エンジンがあり、新たな探索が不足することはありません。

EVM:イーサリアムEVMと互換性があり、パフォーマンスに最適化され、機能が豊富です

HVM: FunChain は、Java 言語でのスマート コントラクトの作成をサポートする、効率的で使いやすい完全なスマート コントラクト実行エンジンを開発しました。

FVM: Rust およびその他の言語でのスマート コントラクトの作成をサポートする、安全で多様かつ効率的なスマート コントラクト実行エンジン

この記事は、スマートコントラクトとイーサリアムスマートコントラクトの起源を紹介する[仮想マシン]コラムの始まりであり、次回の連載では他の実行エンジンについても詳しく紹介していきますので、ご期待ください。

著者について

著者について

文章

参考文献

参考文献

[1] スマートコントラクト百度百科事典

[2] イーサリアムイエローペーパー


スマートコントラクト
Odaily公式コミュニティへの参加を歓迎します
購読グループ
https://t.me/Odaily_News
チャットグループ
https://t.me/Odaily_GoldenApe
公式アカウント
https://twitter.com/OdailyChina
チャットグループ
https://t.me/Odaily_CryptoPunk