ethereum-development について
ethereum-developmentは、Ethereum開発者向けにEVMの動作、ガス最適化、トランザクションの仕組み、ノードとの連携を解説するスキルです。概念説明に加え、Solidity、viem、Foundryの例やトラブルシューティング用コマンドを含みます。
主な機能
- 01EVMの実行とストレージを解説
- 02ガス最適化手法を紹介
- 03トランザクション種別と手数料を説明
- 04Ethereum RPCと状態照会を紹介
- 05Foundryとcastのコマンドを収録
活用シーン
- 01Solidityコントラクトのガス使用量を最適化
- 02ストレージスロットとコントラクト状態を確認
- 03トランザクション手数料の見積もりや調査
- 04ガス不足やnonceエラーの追跡
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ pluginagentmarketplace/ custom-plugin-blockchain --skill ethereum-developmentインストール後、Claude Code で/ethereum-developmentを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
assets/config.yamlschema.jsonreferences/GUIDE.mdPATTERNS.mdscripts/validate.py詳細
Ethereum 開発スキル
EVM の内部構造、ガス最適化、トランザクションの仕組み、クライアントとのやり取りなど、Ethereum 開発を習得します。
クイックスタート
# Invoke this skill for Ethereum development
Skill("ethereum-development", topic="gas", network="mainnet")
対象トピック
1. EVM(Ethereum Virtual Machine)
実行環境について理解します。
- スタックマシン:256 ビットワード、深さ 1024
- メモリ:線形バイト配列、拡張コスト
- ストレージ:永続的なキーと値のペア、32 バイトのスロット
- オペコード:コスト、効果、ガス消費量
2. ガス最適化
トランザクションのコストを削減します。
- ストレージのパッキング:複数の値を 1 つのスロットに格納
- Calldata と Memory の使い分け:効率的に選択
- ループの最適化:ストレージの読み取りをキャッシュ
- カスタムエラー:リバート時のガスを節約
3. トランザクションの仕組み
トランザクションのライフサイクルを習得します。
- タイプ:Legacy(0)、Access List(1)、EIP-1559(2)
- 手数料の見積もり:ベース手数料、優先手数料、最大手数料
- ナンスの管理:順次処理
- レシート:ステータス、ログ、使用ガス量
4. クライアントとのやり取り
Ethereum ノードを操作します。
- RPC メソッド:eth_、debug_、trace_
- 状態の照会:ストレージスロット、コード、残高
- イベントのサブスクリプション:ログ、トピックのフィルタリング
コード例
ガス効率の高いストレージ
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
contract Optimized {
// Pack into single slot (32 bytes)
struct User {
uint128 balance; // 16 bytes
uint64 lastUpdate; // 8 bytes
uint32 nonce; // 4 bytes
bool active; // 1 byte
// 3 bytes padding
}
mapping(address => User) public users;
}
ストレージスロットの読み取り
import { createPublicClient, http, keccak256, encodePacked, pad } from 'viem';
import { mainnet } from 'viem/chains';
const client = createPublicClient({ chain: mainnet, transport: http() });
// Read mapping value: balances[address]
async function getBalance(contract: `0x${string}`, user: `0x${string}`) {
const slot = keccak256(encodePacked(['address', 'uint256'], [user, 0n]));
return await client.getStorageAt({ address: contract, slot });
}
EIP-1559 トランザクション
import { createWalletClient, http, parseEther } from 'viem';
const client = createWalletClient({ transport: http() });
const hash = await client.sendTransaction({
to: '0x...',
value: parseEther('0.1'),
type: 'eip1559',
maxFeePerGas: parseGwei('30'),
maxPriorityFeePerGas: parseGwei('2'),
});
ガス最適化の早見表
| 手法 | 削減量 | 例 |
|---|---|---|
| ストレージのパッキング | 約20k/スロット | 1 つのスロットに uint128 + uint128 |
| Calldata と memory の使い分け | 約3/バイト | 読み取り専用には calldata を使用 |
| チェックなしの演算 | 約80/演算 | unchecked { i++; } |
| カスタムエラー | 約200以上 | error Unauthorized() |
| 短絡評価 | 変動 | 先に低コストのチェックを実行 |
よくある落とし穴
| 落とし穴 | 問題 | 解決策 |
|---|---|---|
| ループ内でのストレージアクセス | 読み取りコストが高い | 先にメモリへキャッシュ |
| 文字列のストレージ保存 | 複数のスロットを使用 | 可能な場合は bytes32 を使用 |
| ゼロ値のストレージ保存 | 全額返金がなくなる | SSTORE の返金に頼らない |
トラブルシューティング
"Transaction underpriced"
# Check current gas prices
cast gas-price --rpc-url $RPC
cast basefee --rpc-url $RPC
maxFeePerGas を現在のベース手数料の少なくとも 2 倍に設定してください。
"Out of gas"
# Trace transaction to find issue
cast run --trace $TX_HASH --rpc-url $RPC
"Nonce too low"
# Get current nonce
cast nonce $ADDRESS --rpc-url $RPC
CLI コマンド
# Foundry essentials
forge build --sizes # Contract sizes
forge test --gas-report # Gas consumption
forge snapshot # Gas snapshots
cast storage $ADDR $SLOT # Read storage
cast call $ADDR "fn()" # Simulate call
テストテンプレート
contract GasTest is Test {
function test_GasOptimization() public {
uint256 gasBefore = gasleft();
target.optimizedFunction();
uint256 gasUsed = gasBefore - gasleft();
assertLt(gasUsed, 50000, "Too much gas used");
}
}
相互参照
- Bonded Agent:
02-ethereum-development - 関連スキル:
solidity-development、web3-frontend
バージョン履歴
| バージョン | 日付 | 変更内容 |
|---|---|---|
| 2.0.0 | 2025-01 | viem とガス最適化に対応した本番品質のリリース |
| 1.0.0 | 2024-12 | 初回リリース |
コメント
Markdown 対応