メインコンテンツまでスキップ

Foundryを使用したスマートコントラクトのデプロイ

このチュートリアルでは、Foundryを使用してStatus Networkテストネットにスマートコントラクトをデプロイする手順を説明します。

前提条件

開始する前に、以下が必要です:

  • Foundry: 公式Foundryブックからインストール
  • Ethereumウォレット: Status Networkテストネット用のプライベートキー
  • テストネットETH: Status NetworkテストネットのETHが必要です
  • 基本知識: Solidityとコマンドラインの基礎知識

達成目標

  • Foundryプロジェクトの初期化
  • 基本的なEthereumスマートコントラクトの作成
  • Status Networkテストネットデプロイ用のFoundryの設定
  • スマートコントラクトのデプロイ

手順

1. Foundryプロジェクトの初期化

まず、新しいFoundryプロジェクトを作成します:

# 新規プロジェクトの作成
forge init hello_status
cd hello_status

# プライベートキー用の.envファイルを作成
touch .env
echo "PRIVATE_KEY=your_private_key_here" >> .env

2. スマートコントラクトの作成

src/Counter.solHelloWorld.solに置き換えます:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

contract HelloWorld {
string public greet = "Hello, Status Network!";

function setGreet(string memory _greet) public {
greet = _greet;
}

function getGreet() public view returns (string memory) {
return greet;
}
}

3. Status Network用のFoundryの設定

foundry.tomlを作成または更新します:

[profile.default]
src = "src"
out = "out"
libs = ["lib"]
solc = "0.8.24"

[rpc_endpoints]
status_testnet = "https://public.sepolia.rpc.status.network"

4. コントラクトのデプロイ

デプロイメントスクリプトscript/Deploy.s.solを作成します:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

import "forge-std/Script.sol";
import "../src/HelloWorld.sol";

contract DeployScript is Script {
function run() external {
uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY");

vm.startBroadcast(deployerPrivateKey);

HelloWorld hello = new HelloWorld();
console.log("HelloWorld deployed to:", address(hello));

vm.stopBroadcast();
}
}

forgeを使用してデプロイします:

# 環境変数の読み込み
source .env

# Status Networkテストネットにデプロイ
forge script script/Deploy.s.sol:DeployScript \
--rpc-url https://public.sepolia.rpc.status.network \
--broadcast \

5. コントラクトとの対話

コントラクトと対話するスクリプトscript/Interact.s.solを作成します:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

import "forge-std/Script.sol";
import "../src/HelloWorld.sol";

contract InteractScript is Script {
function run() external {
uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY");
address contractAddress = address(0x...); // コントラクトアドレスに置き換えてください

vm.startBroadcast(deployerPrivateKey);

HelloWorld hello = HelloWorld(contractAddress);

// 現在の挨拶を読み取り
string memory currentGreeting = hello.getGreet();
console.log("Current greeting:", currentGreeting);

// 挨拶を更新
hello.setGreet("Hello from Foundry!");

vm.stopBroadcast();
}
}

対話スクリプトを実行します:

forge script script/Interact.s.sol:InteractScript \
--rpc-url https://public.sepolia.rpc.status.network \
--broadcast

6. 簡単な対話のためのCastコマンド

castを使用してコントラクトと対話することもできます:

# 挨拶を読み取り
cast call <CONTRACT_ADDRESS> "getGreet()" \
--rpc-url https://public.sepolia.rpc.status.network

# 新しい挨拶を設定
cast send <CONTRACT_ADDRESS> "setGreet(string)" "New greeting!" \
--private-key $PRIVATE_KEY \
--rpc-url https://public.sepolia.rpc.status.network

7. テスト

テストファイルtest/HelloWorld.t.solを作成します:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

import "forge-std/Test.sol";
import "../src/HelloWorld.sol";

contract HelloWorldTest is Test {
HelloWorld hello;

function setUp() public {
hello = new HelloWorld();
}

function testGreeting() public {
assertEq(hello.getGreet(), "Hello, Status Network!");

hello.setGreet("New greeting");
assertEq(hello.getGreet(), "New greeting");
}
}

テストを実行します:

forge test

サポート

問題が発生した場合:

追加リソース