抽象的な
Trapping the Pit の最初の記事では、公式 Web サイトに掲載されている例を書きましたが、この記事では、Contract
Caliper バージョン v0.4.2 を自分でテストする方法を記録します。
リポジトリ
-
この記事では引き続き公式サイトのGithub Repoを利用して新規コントラクトを作成します、簡単にするためにSampleを使って変更します、コントラクト名と関数名は置き換えます、ストレージはLogicと同じです。
-
Github のオープンソース
https://github.com/hyperledger/caliper-benchmarks
目次
第1章
git clone [email protected]:hyperledger/caliper-benchmarks.git
プロジェクトに入る前に初期化する必要があります。そうしないと、次の手順が失敗します。
cd caliper-benchmarks
npm init
キャリパーをインストールし
、besu の最新バージョンにバインドします。ここで、バインディングのバージョンを選択できますが、その後の一連の設定はこのバージョンと一致している必要があることに注意してください。
npm install --only=prod @hyperledger/[email protected]
npx caliper bind --caliper-bind-sut besu:latest
第2章
新しいパス /src/candy/candy.sol の下に新しいコントラクトを作成し(パスは任意で、呼び出し時に場所を指定するだけです)、
新しいコントラクトの内容を追加します
- ここでは、コントラクトの Solidity バージョンに注意を払う必要があります。これは、後続のコンパイラのバージョンと一致している必要があります。
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.10;
contract candy {
mapping(string => int) private accounts;
function open_candy(string memory acc_id, int amount) public {
accounts[acc_id] = amount;
}
function query_candy(string memory acc_id) public view returns (int amount) {
amount = accounts[acc_id];
}
function transfer_candy(string memory acc_from, string memory acc_to, int amount) public {
accounts[acc_from] -= amount;
accounts[acc_to] += amount;
}
}
Caliper に必要なのは abi.json ファイルです。ここでは、solcjs
内部データを生成するツールが使用されます。頻繁に使用する友人は、グローバルに-g
インストール。
npm install solc
ファイルは現在のパスに生成されます
cd caliper/src/ethereum/candy
solcjs --abi ./candy.sol
solcjs --bin ./candy.sol
以下の例外が発生した場合は、コントラクト Solidity のバージョンを変更する必要があります
ParserError: Source file requires different compiler version (current compiler is 0.8.11+commit.d7f03943.Emscripten.clang) - note that nightly builds are considered to be strictly less than the released version
--> candy.sol:1:1:
|
1 | pragma solidity >=0.4.22 <0.6.0;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Caliper には、abi.json ファイルの内容に関する要件があり、契約定義ファイルには次の 4 つのキーワードが必要です。
- 名前: とにかく、キャンディをここに連れて行きます
- ABI: 上記の -abi ディレクティブによって生成されたコンテンツ
- バイトコード: 上記の -bin コマンドによって生成されたコンテンツ
- ガス: 入力する必要があります。Remix でデプロイしてコストを確認するか、シミュレーション ツールを使用して Besu ネットワークを見積もることができます。これはほとんど影響しませんが、あまり小さくしすぎないでください。
次に、新しい json ファイルを作成しcandy.json
、名前を付け、コンテンツを結合します
。バイトコードは -bin によって生成された数値の文字列であり、その前に0x
プレフィックスを付ける必要があることに注意してください。
{
"name": "Candy",
"abi": [{"constant":true,"inputs":[{"nam......ype":"function"}],
"bytecode": "0x608060405234801.........0033",
"gas": 4700000
}
以下の例外が発生した場合は、コントラクトでデプロイされたガスが不足していることを意味しますので、上記のjsonファイル内のガスを大きく変更してください。
2022.02.22-13:59:30.074 error [caliper] [caliper-engine] Error while performing "install" step: Error: The contract code couldn't be stored, please check your gas limit.
<a id="#Chapter3"></a>
第3章
各コントラクトでテストする関数はopen.js
、query.js
、にそれぞれtransfer.js
設定されている
ため、元の Sample を実際の関数名に置き換えます。
async submitTransaction() {
const queryArgs = this.simpleState.getQueryArguments();
await this.sutAdapter.sendRequests(this.createConnectorRequest('query_candy', queryArgs));
}
各テスト関数は utils/operation-base.js から継承されており、utils/simple-state.js で、サンプル コードは乱数に基づいてアカウントと対応する初期残高を生成します。
初期残高は、config.yaml のパラメーターinitialMoney によって設定されます。
config.yamlにはパラメータ設定の他にテストタスクも設定されています。以下は
コードの一部です。変更する必要があるのはワークロードのモジュールパスです。TPSは自分で設定できます。
rounds:
- label: open
description: >-
Test description for the opening of an account through the deployed
contract.
txNumber: *number-of-accounts
rateControl:
type: fixed-rate
opts:
tps: 50
workload:
module: benchmarks/scenario/candy/open.js
arguments: *simple-args
このようにして、独自のコントラクトをデプロイしてテストできます。
ただし、さらに、コントラクトの機能、一部のテスト タスクのパラメーター転送、アカウントの生成などに応じて、ベンチマークのシナリオをさらに深く理解し続ける必要があります。独自の simple-state.js と Operation-base.js を作成します。