Foundryを使用してスマートコントラクトをデプロイする
はじめに
FoundryはRustで書かれたスマートコントラクト開発フレームワークで、開発者はコマンドラインからsolidityスクリプトを使ってコントラクトの管理とコンパイル、テストの実行、コントラクトのデプロイ、ネットワークとのやり取りができる。
Foundryは、高速でモジュール化されたスマート・コントラクト開発を可能にする4つの主要CLIツールで構成されている:
- Forge: Forgeを使ってスマートコントラクトのデプロイ、テスト、コンパイルができる。
- Cast:CastはEVMスマートコントラクトとのやり取りを簡単にするものであり、 チェーンデータの取得、トランザクションの送信などが含まれる。 これには、チェーンデータの取得、トランザクションの送信などが含まれる。
- Anvil:ローカルノードをスピンアップする必要がありますか? AnvilはFoundryが提供するローカルノード環境である。 AnvilはFoundryが提供するローカルノード環境である。
- Chisel:高速で便利で冗長なsolidity REPL。
このガイドでは、次のことを説明する:
- 簡単な鋳造プロジェクトを立ち上げる。
- Foundryを使用してスマート・コントラクトのサンプルをコンパイルし、テストします。
- Foundryを使用してスマートコントラクトをKaia Kairosネットワークにデプロイします。
- キャストとアンビルでメインネットをフォークする。
前提条件
このチュートリアルに従うには、次のことが前提条件となる:
- コードエディタ: VS Codeなどのソースコードエディタ。
- MetaMask:コントラクトのデプロイ、トランザクションへの署名、コントラクトとの対話に使用される。
- RPCエンドポイント:サポートされているエンドポイント・プロバイダーの1つから取得できます。
- FaucetからKAIAをテスト: 口座に十分なKAIAを入金してください。
- RustとFoundryをインストールする。
開発環境のセットアップ
Foundryのインストールが成功したかどうかを確認するには、以下のコマンドを実行してください:
forge -V
出力
foundryのインストールに成功すると、foundryで使用できるCLIツール(forge、cast、anvil、chisel)にアクセスできるようになります。 次のステップでfoundryプロジェクトをセットアップしてみよう:
**ステップ1新しいプロジェクトを開始するには、以下のコマンドを実行します:
forge init foundry_example
ステップ 2:プロジェクトフォルダに移動します。
cd foundry_examplels
ファウンドリー・プロジェクトを初期化した後、ディレクトリーには 以下が含まれます:
- src:スマートコントラクトのデフォルトディレクトリ。
- tests:テスト用のデフォルト・ディレクトリ。
- foundry.toml:デフォルトのプロジェクト設定ファイル。
- lib: プロジェクトの依存関係のデフォルト・ディレクトリ。
- script:solidityスクリプトファイルのデフォルトディレクトリです。
スマート・コントラクトのサンプル
このセクションでは、初期化されたFoundryプロジェクトのサンプル・カウンター契約を使用する。 src/
フォルダにあるcounter.sol
ファイルは以下のようになるはずだ:
// SPDX-License-Identifier: UNLICENSEDpragma solidity ^0.8.13;contract Counter { uint256 public number; function setNumber(uint256 newNumber) public { number = newNumber; } function increment() public { number++; }}
**コード・チュートリアル
これがスマート・コントラクトだ。 行1は、Solidityバージョン0.8.13以上を使用していることを示しています。 4-12行目から**、スマート・コントラクト Counter
が作成される。 このコントラクトは、単純にsetNumber関数を使用して新しい数値を格納し、increment関数を呼び出してその数値をインクリメントする。
スマートコントラクトのテスト
Foundry allows us to write tests in solidity as opposed to writing tests in javascript in other smart contract development frameworks. 初期化されたfoundryプロジェクトでは、test/Counter.t.sol
がsolidityで書かれたテストの例です。 コードは次のようになる: コードは次のようになる:
// SPDX-License-Identifier: UNLICENSEDpragma solidity ^0.8.13;import "forge-std/Test.sol";import "../src/Counter.sol";contract CounterTest is Test { Counter public counter; function setUp() public { counter = new Counter(); counter.setNumber(0); } function testIncrement() public { counter.increment(); assertEq(counter.number(), 1); } function testSetNumber(uint256 x) public { counter.setNumber(x); assertEq(counter.number(), x); }}
上のコードでは、forge標準ライブラリとCounter.solをインポートしています。
上記のテス トは以下のことをチェックする:
- その数は増えているのか?
- 数は設定された数と等しいか?
テストがうまくいくかどうかを確認するには、以下のコマンドを実行する:
forge test
出力
テストの書き方や高度なテスト、その他の機能については、Foundryのドキュメントを参照してください。
契約書の作成
このコマンドで契約書をコンパイルする:
forge build
契約の展開
ファウンドリを使用してコントラクトをデプロイするには、RPC URLと、コントラクトをデプロイするアカウントの秘密鍵を提供する必要があります。 ファウンドリを使用 してコントラクトをデプロイするには、RPC URLと、コントラクトをデプロイするアカウントの秘密鍵を提供する必要があります。 Kaiaのrpc-providersのリストを見て、あなたのrpc-urlを見つけ、MetaMaskを使ってアカウントを作成してください。
ステップ1: 契約をカイア・カイロス・ネットワークに展開するには、以下のコマンドを実行します。
$ forge create --rpc-url <your_rpc_url> --private-key <your_private_key> src/Counter.sol:Counter
例
forge create --rpc-url https://public-en-kairos.node.kaia.io --private-key hhdhdhprivatekey hhdhdhud src/Counter.sol:Counter
警告:引数の秘密鍵は、MetaMaskの秘密鍵に置き換えてください。 秘密鍵を公開しないよう、十分注意してください。
出力
ステップ2:Kaiascope を開き、カウンター契約が正常にデプロイさ れたかチェックする。
ステップ 3:取引ハッシュをコピーして検索フィールドに貼り付け、Enterキーを押します。 最近配備された契約が表示されるはずだ。
契約とのやり取り
スマート・コントラクトのデプロイに成功したら、関数を正しく呼び出して実行したいだろう。 Cast を使って、Kaia Kairos Networkに配備されたコントラクトとやりとりしてみましょう。 スマート・コントラクトのデプロイに成功したら、関数を正しく呼び出して実行したいだろう。 Cast を使って、Kaia Kairos Networkに配備されたコントラクトとやりとりしてみましょう。 このセクションでは、cast call を使って read-only
関数を実行し、cast send を使って write
関数を実行する方法を学びます。
A. cast call:コントラクトに格納されている数字を取得するには、number
関数を呼び出します。 以下のコマンドを実行し、その動きを見てみよう。
cast call YOUR_CONTRACT_ADDRESS "number()" --rpc-url RPC-API-ENDPOINT-HERE
例
cast call 0xe4d576c447733da7ca9197e88d34a74c3c865cff "number()" --rpc-url https://public-en-kairos.node.kaia.io
出力
このデータを16進数で取得してください:
0x0000000000000000000000000000000000000000000000000000000000000000
しかし、希望する結果を得るには、上記の結果をキャストで変換する。 この場合、データは数字なので、10進数に変換すれば結果は0になる:
cast --to-base 0x0000000000000000000000000000000000000000000000000000000000000000 10
出力
B. cast send:カウンターのコントラクトで setNumber
関数を実行するようなトランザクションに署名して発行するには、以下のコマンドを実行する:
cast send --rpc-url=<RPC-URL> <CONTRACT-ADDRESS> “setNumber(uint256)” arg --private-key=<PRIVATE-KEY>
例
cast send --rpc-url=https://public-en-kairos.node.kaia.io 0xe4d576c447733da7ca9197e88d34a74c3c865cff "setNumber(uint256)" 10 --private-key=<private key>
出力
クロスチェック番号
cast call 0xe4d576c447733da7ca9197e88d34a74c3c865cff "number()" --rpc-url https://public-en-kairos.node.kaia.io
出力
このデータを16進数で取得してください:
0x000000000000000000000000000000000000000000000000000000000000000a
しかし、希望する結果を得るには、上記の結果をキャストで変換する。 しかし、希望する結果を得るには、上記の結果をキャストで変換する。 この場合、データは数字なので、それを基数10に変換して、結果10を得ることができる:
cast --to-base 0x000000000000000000000000000000000000000000000000000000000000000a 10
出力
キャストとアンヴィルによるメインネットのフォーク
Foundryでは、メインネットをローカル開発ネットワーク(Anvil)にフォークすることができる。 Foundryでは、メインネットをローカル開発ネットワーク(Anvil)にフォークすることができる。 また、Castを使って、実際のネットワーク上でコントラクトと対話し、テストすることができます。
はじめに
Now that you have your Foundry project up and running, you can fork the mainnet (cypress) by running the command below:
anvil --fork-url rpc-url
例
anvil --fork-url https://archive-en.node.kaia.io
出力
このコマンドをうまく実行すると、ターミナルは上の画像のようになる。 10,000トークンと公開鍵、秘密鍵で10アカウントが作成されます。 フォークされたチェーンの RPC サーバーは 127.0.0.1:8545
で待ち受けている。
ネットワークをフォークしたことを確認するには、最新のブロック番号を照会することができる:
curl --data '{"method":"eth_blockNumber","params":[],"id":1,"jsonrpc":"2.0"}' -H "Content-Type: application/json" -X POST localhost:8545
上記のタスクの結果は、16進数から10進数を使って変換できる。 ネットワークをフォークした時点から最新のブロック番号を取得する必要がある。 これを確認するには、Kaiascopeのブロック番号をクロスリファレンスする。 ネットワークをフォークした時点から最新のブロック番号を取得する必要がある。 これを確認するには、Kaiascopeのブロック番号をクロスリファレンスする。
イラスト
このセクションでは、oUSDC を保持している誰かから Anvil が作成したアカウントに oUSDC トークンを転送する方法について説明します (0x70997970C51812dc3A010C7d01b50e0d17dc79C8 - Bob)
OUSDCを譲渡する。
Kaiascopeに行き、oUSDCトークンの保有者を検索する(ここ)。 ランダムにアカウントを選んでみよう。 この例では、0x8e61241e0525bd45cfc43dd7ba0229b422545bca
を使用する。
契約とアカウントを環境変数としてエクスポートしよう:
export BOB=0x70997970C51812dc3A010C7d01b50e0d17dc79C8export oUSDC=0x754288077d0ff82af7a5317c7cb8c444d421d103export oUSDCHolder=0x8e61241e0525bd45cfc43dd7ba0229b422545bca
キャストコールを使ってボブの残高をチェックできる:
cast call $oUSDC \ "balanceOf(address)(uint256)" \ $BOB
出力
同様に、キャスト・コールを使ってoUSDCホルダーの残高をチェックすることもできる:
cast call $oUSDC \ "balanceOf(address)(uint256)" \ $oUSDCHolder
出力
幸運なユーザーからアリスへ、キャスト送信を使ってトークンを転送してみましょう:
cast rpc anvil_impersonateAccount $oUSDCHolder cast send $oUSDC \--unlocked \--from $oUSDCHolder\ "transfer(address,uint256)(bool)" \ $BOB \ 1000000```0000
出力
転送がうまくいったか確認してみよう:
cast call $oUSDC \ "balanceOf(address)(uint256)" \ $BOB
出力
cast call $oUSDC \ "balanceOf(address)(uint256)" \ $oUSDCHolder
出力
ファウンドリーに関するより詳細なガイドについては、ファウンドリードキュメントを参照してください。 ファウンドリーに関するより詳細なガイドについては、ファウンドリードキュメントを参照してください。 また、このガイドのコードの完全な実装はGitHubにあります。