スマート コントラクトとイーサリアム仮想マシン: スマート コントラクト、Solidity 言語

第四章



1. スマートコントラクト

スマート コントラクトの動作はコントラクト コードによって制御され、スマート コントラクトのアカウント ストレージにはコントラクトの状態が保存されます。
スマート コントラクトのコードは、イーサリアム プロトコルの中核であるイーサリアム仮想マシンで実行されます。
ストレージの観点から見ると、スマート コントラクトには製品情報とすべての取引記録が含まれ、機能の観点から見ると、契約には補充機能、取引機能、引き出し機能が含まれます。

1. 保管方法

Ethereum 仮想マシンのストレージ方式は、スタック、アカウント ストレージ、メモリの 3 つのカテゴリに分類されます。スタック、ストレージ、メモリ。
スタックは一般的な線形データ構造であり、スタック内の各要素の長さは 256 ビットです。
アカウントのストレージはアカウントの属性としてブロックチェーン上に保存されるため、Yuyinpan も永続的なストレージであり、契約の実行が終了しても解放されません。アカウントに保存されるキーの値はすべて 256 ビットです。0 から 0 以外の値を割り当てると、20,000 ユニットのガスが消費されます。ゼロ以外の値を変更すると、5000 単位のガスが消費されます。ゼロ以外から 0 までの値を割り当てると、15,000 ユニットのガスを回収できます。
メモリは、コードの実行時にイーサリアム仮想マシンによって一時的に割り当てられる線形領域であり、コントラクト コールが終了すると自動的に解放されます。バイトはメモリの基本的な記憶単位です。消費するたびに32バイト単位の領域を拡張する必要があり、32バイトごとに3単位のGasを消費します。
Gas を節約するために、通常は契約実行の中間プロセスでメモリが使用され、最終結果はアカウント ストレージに保存されます。

2. 命令セットとメッセージコール

メッセージ呼び出しはトランザクションに含まれており、ブロックチェーンに新しいトランザクション レコードは生成されません。
デリゲート呼び出し: ターゲット コントラクトからコードを取得して実行するだけで、msg.sender と msg.value、現在のアカウント、ストレージ、メモリなどを含む現在のコンテキストは変更しません。これにより、スマート コントラクトは実行時に他のアドレスからコードを動的に読み込むことができます。

3. ログ

開発者は、コントラクト コードの実行中にさまざまなイベントによって生成されたログを記録でき、これらのログは、開発者がコードを呼び出したり、ブロックチェーン上で発生するトランザクションの証拠として使用したりするのに役立ちます。
ブロックチェーンは完全なログを保存するのではなく、ログのハッシュ値検証をトランザクション レシートに保存します。
ブルーム フィルターを使用すると、要素がセットに含まれる可能性が高いかどうかをすばやく取得できます。検索効率を向上させることができます。

2. 堅牢性言語

変数の型は、パラメーターの受け渡し方法の違いに応じて、値型と参照型の 2 つのカテゴリに分類できます。

  • 値のタイプ: コピーが作成されるか、パラメータとして渡されるたびにコピーが作成されます。含まれるもの: bool、int、uint 接尾辞は 8 ~ 256 の範囲の 8 の倍数である必要があります。列挙型はデフォルトでは 0 から始まり、アドレスの長さは 20 バイトです。address.transfer が失敗すると例外がスローされて終了しますが、address.send は false を返して実行を継続します。
  • 参照タイプ: 2 つのストレージ場所: アカウント ストレージとメモリ。状態変数と一部のタイプのローカル変数はデフォルトでアカウント ストレージに保存されますが、関数パラメータや他の単純なタイプのローカル変数はメモリに保存されます。必要に応じて、メモリまたはストレージ修飾子を使用して変数を宣言して、変数の格納場所を強制することもできます。含まれるもの: 配列、プッシュは要素、構造体、配列の最後にマッピング (Mapping) を追加できます。これはキーと値のマッピング関係の記憶構造であり、マッピング (KeyType=>ValueType)、マッピングには長さの概念がありません。キーの Keccak-256 ハッシュ値のみを保存します。

1.型変換

暗黙的な変換: uint8 は uint16 または uint32 に変換できますが、int8 は uint6 に変換できません。uint16 に変換できる変数はすべてアドレス型に変換できます。

2. オペレーター

Solidity には、算術演算子、比較演算子、およびビット単位の演算子が含まれます。
delete はデフォルト値を表します。ただし、マッピングには無効です。

3. ブロックとトランザクションの属性:

block.blockhash: 特定のブロックのハッシュ値を取得します
block.coinbase: 現在のブロック「マイナー」のアカウントアドレス
block.difficulty:
block.gaslimit
block.number: 現在のブロック番号。
block.timestamp: uint、現在のブロックの生成時刻
msg.gas: uint、残りの Gas を示す
msg.sender: address、現在のメッセージの送信者アドレス
msg.sig: bytes4、呼び出しデータの最初の 4 バイト、機能識別記号。
msg.value: uint、このメッセージで転送された Ether の量 Unit: wei
tx.gasprice: uint、現在のトランザクションの Gas 価格
tx.origin: address、完全な呼び出しチェーンの開始者。
selfdestruct: 現在のコントラクトを破棄します。
自殺: selfdistruct の別名。

4. 制御構造ステートメント

Switch および goto はサポートされていません。

5.機能

関数には複数のパラメータと複数の戻り値を含めることができます。
関数呼び出しには次の 2 種類があります。

  • 内部呼び出し: 同じコントラクト内の関数の呼び出し
  • 外部呼び出し: 別のコントラクト内のインスタンスを呼び出すと、メッセージが作成され、呼び出されたコントラクト (this.a() や foo.bar() など) に送信されます。

external: 外部関数
public: 外部および内部 external
: 現在のコントラクトまたは現在のコントラクトを継承する他のコントラクトでのみアクセス可能
private: 内部

6. 定数関数とフォールバック関数

constant または view は読み取り専用を意味します。

7. 関数修飾子

修飾子

8. 例外処理

  • アサート: 変数と内部エラーをチェックするために使用され、スローはエラーを識別し、現在のメッセージ呼び出しによって引き起こされた状態の変更をロールバックします。ただし、無効な操作が実行される場合は例外です。
  • require: プログラムの実行に必要な条件が満たされていることを確認します。例外が発生すると、ロールバック操作が実行されます。

上記の両方の Ethereum 仮想マシンは、すべての状態変更を元に戻します。
ただし、send、call、delegatecall には例外があり、これらの関数は実行中に例外がスローされると、自動的に例外をスローするのではなく、false を返します。

9. イベントとログ

イベント{}
またはログ経由

10. スマートコントラクトの継承

is
コントラクト内の関数はすべて仮想関数であり、クラス名を指定しない限り、最後に派生した関数が呼び出されます。継承する場合は左から右へ継承されます。
抽象コントラクト: コントラクトには関数の存続期間のみがあり、関数の特定の実装はありません。この関数はコンパイルできませんが、継承できます。

要約する

提示:这里对文章进行总结:

今日はそれについて話します。
イーサリアム プラットフォームでは、スマート コントラクトはブロックチェーンに保存されているロジック コードの一部であり、イーサリアム仮想マシンで実行されます。

おすすめ

転載: blog.csdn.net/qq_53982314/article/details/124326167