オントロジー ネットワーク上で WebAssembly スマート コントラクトを作成するにはどうすればよいですか? パート 1: 錆び

オントロジー ネットワーク上で WebAssembly スマート コントラクトを作成するにはどうすればよいですか? パート 1: 錆び

オントロジー Wasm テクノロジーは、複雑なビジネス ロジックを含む dApp スマート コントラクトをブロックチェーンに移行するコストを削減し、それによって dApp エコシステムを大幅に強化します。

オントロジー Wasm Rust と C++ の両方の開発を同時にサポートします。 Rust 言語は Wasm をより適切にサポートしており、生成されるバイトコードはよりシンプルであるため、コントラクト呼び出しのコストをさらに削減できます。 それで、 Rust を使用してオントロジー ネットワーク上でコントラクトを開発するにはどうすればよいですか?

Rust を使用した WASM コントラクトの開発

契約書を作成する

貨物 は、Rust 開発に適したプロジェクト作成およびパッケージ管理ツールであり、開発者がコードとサードパーティ ライブラリの相互作用をより適切に整理するのに役立ちます。 新しいオントロジー Wasm コントラクトを作成するには、次のコマンドを実行するだけです。

オントロジー ネットワーク上で WebAssembly スマート コントラクトを作成するにはどうすればよいですか? パート 1: 錆び

生成されるプロジェクト構造は次のとおりです。

オントロジー ネットワーク上で WebAssembly スマート コントラクトを作成するにはどうすればよいですか? パート 1: 錆び

Cargo.toml ファイルは、基本的なプロジェクト情報と依存ライブラリ情報を設定するために使用されます。 ファイルの [lib] セクションは、crate-type = ["cdylib"] に設定する必要があります。 lib.rs ファイルは、コントラクト ロジック コードを記述するために使用されます。 さらに、Cargo.toml 構成ファイルの [dependency] セクションに依存関係パラメーターを追加する必要があります。

オントロジー ネットワーク上で WebAssembly スマート コントラクトを作成するにはどうすればよいですか? パート 1: 錆び

この依存関係により、開発者はオントロジー ブロックチェーンと対話するインターフェイスやシリアル化パラメーターなどのツールを呼び出すことができます。

契約エントリー機能

すべてのプログラムには、通常目にする main 関数のような入力関数がありますが、コントラクトには main 関数がありません。 Wasm コントラクトが Rust を使用して開発される場合、コントラクトを使用するための入力関数としてデフォルトの呼び出し関数が使用されます。 Rust のソース コードを仮想マシンで実行できるバイトコードにコンパイルする場合、Rust の関数の名前は不明瞭になります。 コンパイラーが冗長なコードを生成するのを防ぎ、コントラクトのサイズを減らすために、invoke 関数は #[no_mangle] アノテーションを追加します。

invoke関数はトランザクションを実行するためのパラメータをどのように取得しますか?

ontio_std ライブラリは、トランザクションを実行するためのパラメータを取得する runtime::input() 関数を提供します。 開発者は、ZeroCopySource を使用して、結果のバイト配列を逆シリアル化できます。 最初に読み取られるバイト配列は呼び出しメソッドの名前で、その後にメソッドのパラメータが続きます。

契約の実行結果はどのように返されますか?

ontio_std ライブラリによって提供される runtime::ret 関数は、メソッドの実行の結果を返します。

完成した呼び出し関数は次のようになります。

オントロジー ネットワーク上で WebAssembly スマート コントラクトを作成するにはどうすればよいですか? パート 1: 錆び

コントラクトデータのシリアル化と逆シリアル化

コントラクトの開発プロセスでは、開発者は常にシリアル化と逆シリアル化の問題、特に構造体データ型をデータベースに保存する方法と、データベースから読み取ったバイト配列を逆シリアル化して構造体データ型を取得する方法の問題に遭遇します。

ontio_std ライブラリは、データのシリアル化と逆シリアル化のためのデコーダー インターフェイスとエンコーダー インターフェイスを提供します。 構造体のフィールドは、構造体をシリアル化および逆シリアル化できるように、デコーダー インターフェイスとエンコーダー インターフェイスも実装します。 さまざまなデータ型をシリアル化する場合は、Sink クラスのインスタンスが必要です。 Sink クラスのインスタンスにはバイト型データを格納する set 型フィールド buf があり、シリアル化されたデータはすべて buf に格納されます。

固定長データ (例: バイト、u16、u32、u64 など) の場合、データはバイト配列に直接変換されてから buf に格納されます。 非固定長のデータの場合は、長さを最初にシリアル化し、次に Ddata をシリアル化する必要があります (たとえば、u16、u32、または u64 などのサイズが不明な符号なし整数)。

逆シリアル化はその逆です。 すべてのシリアル化メソッドに、対応する逆シリアル化メソッドがあります。 逆シリアル化には、Source クラスのインスタンスを使用する必要があります。 このクラス インスタンスには buf と pos の XNUMX つのフィールドがあります。 Buf はデシリアライズされるデータを格納するために使用され、pos は現在の読み取り位置を格納するために使用されます。 特定の種類のデータを読み取るときに、その長さがわかっていれば、長さが不明なデータについては直接読み取ることができます。最初に長さを読み取り、次に内容を読み取ります。

チェーン内のデータにアクセスして更新する

オントロジー-wasm-cdt-rust - チェーン内のデータを操作するための操作メソッドをカプセル化しました。これは、開発者が次のようにチェーン内のデータの追加、削除、変更、クエリなどの操作を実装するのに便利です。

  • データベース::get(キー) - チェーンからのデータを要求するために使用され、key は AsRef インターフェイスの実装を要求します。
  • データベース::put(キー, 値) - ネットワーク上にデータを保存するために使用されます。 キーは AsRef インターフェイスの実装を要求し、値は Encoder インターフェイスの実装を要求します。
  • データベース::削除(キー) - チェーンからデータを削除するために使用され、キーは AsRef インターフェイスの実装を要求します。

受託試験

コントラクトのメソッドが実装される場合、チェーン上のデータにアクセスする必要があり、コントラクトのバイトコードを実行するための適切な仮想マシンが必要となるため、通常はテストのためにチェーン上にコントラクトをデプロイする必要があります。 しかし、このテスト方法には問題があります。 開発者がコントラクトをテストしやすくするために、ontio_std ライブラリはテスト用のモック モジュールを提供します。 このモジュールは回路内のデータのシミュレーションを提供し、開発者がコントラクト内のメソッドの単体テストを容易にします。 具体的な例が見つかります ここで.

コントラクトのデバッグ

console::debug(msg) は、コントラクトのデバッグ中にデバッグ情報を表示します。 メッセージ情報はノードのログ ファイルに追加されます。 前提条件は、ローカル オントロジー テスト ノードの実行時にログ ファイル レベルをデバッグ モードに設定することです。

runtime::notify(msg) は、コントラクトのデバッグ中に適切なデバッグ情報を出力します。 このメソッドはチェーンに入力された情報を保存し、getSmartCodeEvent メソッドを使用してチェーンからクエリできます。

この記事は、Hashrate&Shares の編集者によって特に OntologyRussia 向けに翻訳されました。 クリック

あなたは開発者ですか? 弊社の技術コミュニティに参加してください。 Discord。 また、こちらもご覧ください 開発者センター 当社の Web サイトでは、開発者ツールやドキュメントなどが見つかります。

オントロジー

出所: habr.com

コメントを追加します