wallets について
Ethereum のウォレットやエージェント開発に向けたセキュリティと設計の参考資料で、EIP-7702、Safe マルチシグ、鍵の保護を扱います。オンチェーン操作や AI エージェントを構築する開発者向けに、権限、取引確認、認証情報の安全策をまとめています。
主な機能
- 01EIP-7702 の委任実行機能の解説
- 02Safe マルチシグの構成パターン
- 03鍵と認証情報の保護ルール
- 04AI エージェント向け取引ガードレール
- 05安全な取引送信の確認項目
活用シーン
- 01エージェントのウォレットと権限の設計
- 02高額操作向けマルチシグ復旧の設計
- 03コミット前のコードに含まれる秘密情報の確認
- 04人の承認を伴うオンチェーン取引の実装
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ austintgriffith/ ethskills --skill walletsインストール後、Claude Code で/walletsを入力して読み込まれたか確認します。
詳細
Ethereum のウォレット
よくある誤解
EIP-7702 はすでに稼働しています。 Pectra(2025 年 5 月 7 日)以降、通常の EOA はウォレットを移行せずに、スマートコントラクトのコードに実行を委譲できます。これにより、バッチ処理、ガス代のスポンサー負担、セッションキーのような UX が可能になります。これは「近日公開」ではありません。すでにリリースされています。
アカウント抽象化の状況: ERC-4337 は成長していますが、まだ初期段階です(2026 年 2 月)。主な実装:Kernel(ZeroDev)、Biconomy、Alchemy Account Kit、Pimlico。EntryPoint v0.7:0x0000000071727De22E5E9d8BAf0edAc6f37da032。
最も安全な保管方法: ハードウェアウォレットだけに頼ると、単一障害点になります。監査済みのマルチシグスマートコントラクト(Safe など)のほうが安全です。マルチシグに複数人は必要ありません。1 人のユーザーが、別々のデバイスにある複数のキーを管理できます。2-of-4 の構成では、3 つの署名者をユーザーが別々のデバイスで使うウォレット(例:ハードウェアウォレット、スマートフォンのホットウォレット、ノート PC のウォレット)とします。4 つ目の署名者は、復旧時に頼れる信頼できる連絡先です。攻撃者は 1 台ではなく、複数のデバイスを侵害しなければなりません。
EIP-7702:スマート EOA(2025 年 5 月から稼働)
EOA はスマートコントラクトのコードによる委譲されたコード実行を承認できます。これは自動的に「一度設定したら終わり」になるわけではありません。委譲は置き換えられるか、明示的に解除されるまで有効なままです。
仕組み:
- ウォレットが、EOA で使用できるコントラクトコードを指定するメッセージに署名します。
- 特別な EIP-7702 トランザクションで、その署名済みメッセージを送信します。
- その後、EOA はアカウントのロジックとしてそのコントラクトロジックを実行できます(バッチ処理、スポンサー負担、権限など)。
- これは自動的に「一度設定したら終わり」になるわけではありません。委譲は置き換えられるか、明示的に解除されるまで有効なままです。
- 後続のトランザクションが失敗しても、委譲の更新自体は残る場合があります。
これにより可能になること:
- トークンの承認 10 件を 1 つのトランザクションにまとめる
- EOA ユーザー向けのガス代スポンサー負担/メタトランザクション
- 権限を制限したセッションキー
- カスタムの承認ロジック
- 「承認疲れ」を解消(承認+実行 → 1 ステップ)
状況(2026 年 2 月): メインネットにデプロイ済みです。MetaMask と Rainbow がサポートを追加中です。本番環境のエージェントで使うにはまだ初期段階です。ツールが成熟するまでは、標準の EOA または Safe を使用してください。
Safe(Gnosis Safe)マルチシグ
主要なアドレス(v1.4.1、チェーン間で共通の決定的なアドレス)
| コントラクト | アドレス |
|---|---|
| Safe Singleton | 0x41675C099F32341bf84BFc5382aF534df5C7461a |
| Safe Proxy Factory | 0x4e1DCf7AD4e460CfD30791CCC4F9c8a4f820ec67 |
| MultiSend | 0x38869bf66a61cF6bDB996A6aE40D5853Fd43B526 |
Mainnet、Arbitrum、Base、およびすべての主要なチェーンで同じアドレスです。
AI エージェント向けの Safe
構成例: 2-of-3 Safe
- オーナー 1:エージェントのウォレット(ホット、自動)
- オーナー 2:人間のホットウォレット(ホット、手動)
- オーナー 3:人間のコールドウォレット(コールド、復旧用)
- しきい値:2(エージェントがトランザクションをキューに入れ、人間が実行することも、その逆も可能)
メリット:エージェントのキーが侵害された場合、人間がそのキーを削除できます。人間はいつでも資金を復旧できます。エージェントはトランザクションをまとめて実行できます。
🚨 シークレットを絶対に Git にコミットしないでください
これは、AI エージェントが資金を失い、認証情報を漏えいする最大の原因です。 ボットは GitHub をリアルタイムでスキャンし、漏えいしたシークレットを数秒以内に悪用します。プライベートリポジトリであっても、すぐに削除した場合であっても同じです。Git にコミットされたシークレットは、永久に侵害されたものと考えてください。
これは AI コーディングエージェントで頻繁に発生しています。 エージェントがデプロイスクリプトを生成し、キーをハードコードして git add . を実行し、次のプロンプトを送る前にウォレットの資金が引き出されます。または、エージェントが Alchemy API キーを scaffold.config.ts に貼り付け、それが公開リポジトリに入ってしまいます。
これはすべてのシークレットに当てはまります:
- ウォレットの秘密鍵 — 資金が即座に引き出されます
- API キー — Alchemy、Infura、Etherscan、WalletConnect
- キーが埋め込まれた RPC URL —
https://base-mainnet.g.alchemy.com/v2/YOUR_KEY - OAuth トークン、Bearer トークン、パスワード
防止策
# .gitignore (MUST exist in every project)
.env
.env.*
*.key
*.pem
broadcast/
cache/
# Verify before every commit
git diff --cached --name-only | grep -iE '\.env|key|secret|private'
# If this matches ANYTHING, stop and fix it
# Nuclear option: scan entire repo history
git log --all -p | grep -iE 'private.?key|0x[a-fA-F0-9]{64}'
すでにキーをコミットしてしまった場合
- 漏えいしたものと考えてください。 誰にも見られていないと期待してはいけません。
- すべての資金を直ちに新しいウォレットへ移してください。
- キーをローテーションしてください。 新しいキーを生成します。古いキーは永久に使用できません。
git filter-repoまたは BFG Repo Cleaner を使って Git の履歴をクリーンアップしてください。ただし、これは被害を抑えるための対処であり、予防策ではありません。キーはすでに漏えいしています。
AI エージェントの安全なパターン
# Load key from environment (NEVER hardcode)
cast send ... --private-key $DEPLOYER_PRIVATE_KEY
# Or use encrypted keystore
cast send ... --keystore ~/.foundry/keystores/deployer --password-file .password
# Or use hardware wallet
cast send ... --ledger
経験則: grep -r "0x[a-fA-F0-9]{64}" . がソースコード内で何かに一致する場合は、問題があります。grep -r "g.alchemy.com/v2/[A-Za-z0-9]" や、API キーが埋め込まれた RPC URL についても同様です。
AI エージェント向けの重要なガードレール
キーの安全に関するルール
- 明示的な人間の許可なしに、ウォレットから秘密鍵を決して取り出さないでください。
- 秘密鍵を次の場所に決して保存しないでください: チャットログ、プレーンテキストファイル、共有環境の環境変数、Git リポジトリ、暗号化されていないデータベース。
- 人間の確認なしに資金を決して移動しないでください。 金額、送金先(チェックサム形式)、ガス代、実行内容を提示してください。明示的な「はい」を待ってください。
- 人間が CLI やスクリプトの使用を明示的に選択しない限り、署名にはウォレットのネイティブ UI を優先してください。
- エージェントの操作には、資金を限定した専用ウォレットを使用してください。人間のメインウォレットは決して使用しないでください。
- アドレスを二重に確認してください。チェックサムの検証には
viem.getAddress()または同等のものを使用してください。1 文字間違えるだけで、資金を永久に失う可能性があります。 - まずテストネットでテストしてください。または、ローカルの Anvil フォークを使用してください。
- 支出上限を設定してください。しきい値を超える場合は、人間の承認を必須にしてください。高額な操作には Safe のマルチシグを使用してください。
- すべてのトランザクションを記録してください(キーは決して記録しないでください)。監査証跡を保管してください。
- キーは漏えいするものと考えてください。エージェントのキーが漏えいしても、すべてを失わずに済むよう設計してください。
保存方法(危険なものから安全なものへ)
❌ コードやログ内のプレーンテキスト — 絶対に使用しない
❌ 共有環境の環境変数 — 絶対に使用しない
❌ Git へのコミット — 絶対にしない
⚠️ ローカルの .env ファイル — テスト専用
✅ 暗号化されたキーストア(パスワード保護)
✅ ハードウェアウォレット/Cloud KMS/TEE
安全なトランザクションパターン
async function sendSafely(publicClient, walletClient, to, value) {
const checksummedTo = viem.getAddress(to);
const { account } = walletClient;
const gas = await publicClient.estimateGas({ account, to: checksummedTo, value });
const fees = await publicClient.estimateFeesPerGas();
const totalCostUSD = Number(viem.formatEther(value + gas * fees.maxFeePerGas)) * 2000;
if (totalCostUSD > 10) {
// human approval
}
const hash = await walletClient.sendTransaction({
account,
to: checksummedTo,
value,
gas: (gas * 120n) / 100n,
maxFeePerGas: fees.maxFeePerGas,
maxPriorityFeePerGas: fees.maxPriorityFeePerGas,
});
const receipt = await publicClient.waitForTransactionReceipt({ hash });
logTransaction({ hash, to: checksummedTo, value, block: receipt.blockNumber });
return receipt;
}
参考資料
- Safe のドキュメント: https://docs.safe.global/
- EIP-7702 仕様: https://eips.ethereum.org/EIPS/eip-7702
- ERC-4337 仕様: https://eips.ethereum.org/EIPS/eip-4337