battlechain について
battlechainは、BattleChainで開発する開発者向けのセキュリティとデプロイのガイドです。EVMプロトコルやコントラクトを対象に、クロスチェーンデプロイ、安全港契約、攻撃モード、検証、Foundryの問題を扱います。
主な機能
- 01BattleChainのネットワークとコントラクト情報
- 02battlechain-libによるデプロイ
- 03Safe Harbor契約の作成と採用
- 04攻撃モードの申請
- 05Foundryのデプロイと検証ガイド
活用シーン
- 01BattleChainのテストネットやメインネットへのデプロイ
- 02対応するEVMチェーンへのコントラクト展開
- 03プロトコルのSafe Harbor契約の作成
- 04コントラクト検証とデプロイ問題の調査
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ cyfrin/ solskill --skill battlechainインストール後、Claude Code で/battlechainを入力して読み込まれたか確認します。
詳細
BattleChain 開発標準
Cyfrin のセキュリティチームによる、BattleChain の使用手順です。
BattleChain とは
BattleChain は ZKSync ベースの L2 ブロックチェーンで、テストネットとメインネットの間に実戦テスト段階を設けています。開発 -> テストネット -> BattleChain -> メインネット。プロトコルは監査済みコントラクトを実資金とともにデプロイし、ホワイトハットがセーフハーバー契約のもとで合法的にバグ報奨金を狙って攻撃します。攻撃を耐え抜いたコントラクトは本番環境へ昇格します。
ネットワーク
| ネットワーク | チェーン ID | RPC | エクスプローラー | CAIP-2 | ステータス |
|---|---|---|---|---|---|
| BattleChain | 626 | https://mainnet.battlechain.com | https://explorer.mainnet.battlechain.com/ | eip155:626 | 稼働中 — 本番ネットワーク |
| BattleChain Testnet | 627 | https://testnet.battlechain.com | https://explorer.testnet.battlechain.com/ | eip155:627 | 稼働中 — ツールのデフォルト |
両ネットワークには、API とコントラクト検証に対応したブロックエクスプローラーがあります(メインネット API:https://block-explorer-api.mainnet.battlechain.com/api、テストネット API:https://block-explorer-api.testnet.battlechain.com/api)。モック依存コントラクト(トークン、Chainlink、Uniswap など)はテストネット専用です。battlechain-lib のツールはデフォルトでテストネットを使用します。メインネットを対象にするには NETWORK=mainnet を設定します。
メインネットの主要コントラクト(チェーン 626)
| コントラクト | アドレス |
|---|---|
| Safe Harbor Registry(プロキシ) | 0xd229f4EE1bAE432010b72a9d1bD682570F4C6eBe |
| Registry Implementation | 0xBFF0ec94740c287932B50E64c2e8b380129B99a1 |
| Agreement Factory(プロキシ) | 0xCdB7F5C0F708baBaabE82afE1DbA8362023AcFdd |
| AgreementFactory Implementation | 0x8d4fEDF4462E3876Ae7C70CC0C5cebA482003Ad5 |
| Attack Registry(プロキシ) | 0x24876e481eC7198CAC95af739Df2a852CE65A415 |
| AttackRegistry Implementation | 0x03A3228A4ce38362289E715bbc26Cac8b98e421B |
| BattleChainDeployer | 0xD12765D21dDba418B8Fc0583c4716763e03Aa078 |
| Registry Moderator | 0x445d5685c4Ae71550Da0716b82B434AEA140E0c7 |
| CreateX | 0xa397f06F07251A3AEd53f6d3019A2a6cbd83E53e |
メインネットの CreateX は Cyfrin によってデプロイされており、既知の 0xba5Ed... アドレスにはありません。battlechain-lib はチェーンごとに正しいアドレスを解決します。BattleChain で 0xba5Ed... をハードコードしないでください。
メインネットの Safe コントラクト(チェーン 626)
Cyfrin によってデプロイされた実際の Safe コントラクトです(Safe チームによるものではありません)。
| コントラクト | アドレス |
|---|---|
| Safe | 0xFF716747B4D28EAE844Dc069387C9bFC00e51737 |
| SafeL2 | 0xb6524C4fBcEd314EAad98Bc750B6AD76B64d7f8A |
| SafeProxyFactory | 0x8d0D56f72E266a4BfA05340f68409dEBbdbdc9e2 |
| CreateCall | 0x5A499D08755a9dC90208Ef5b031a3118789EBF5A |
| MultiSend | 0x28E369665036bFe0041c1E5838A608b1a818296f |
| MultiSendCallOnly | 0xed4c81c91602CDD5c1e396a1AF28735E03EdA9e2 |
| SignMessageLib | 0x95cb704BFF25b8943BcE3fAE5D1b4665f7b08115 |
| SafeToL2Setup | 0xa8fB860254764C68360596f64BA841b077bebBA4 |
| TokenCallbackHandler | 0x63b920c6D0B5EC07345d9810169376192654d38F |
| CompatibilityFallbackHandler | 0x2744C4f8336B6e2A8a182495FbB327Db493F303f |
| ExtensibleFallbackHandler | 0x115b290ecDe805FD846E0C347f3419A4234Fd673 |
テストネットのコントラクトアドレスについては、以下の完全版ドキュメントを取得してください。
完全版ドキュメント
最新のコントラクトアドレス、関数シグネチャ、構造体の定義、列挙型、状態遷移、バグ報奨金の計算ルール、セーフハーバー契約の詳細、その他すべての技術リファレンス資料については、完全版ドキュメントを取得してください。
https://docs.battlechain.com/llms-full.txt
BattleChain の技術的な詳細が必要な場合は、必ずこの URL を取得してください。ドキュメントは唯一の信頼できる情報源であり、プロトコルの進化に合わせて最新の状態に保たれます。
デプロイ
BattleChain(または任意の EVM チェーン)にデプロイするプロジェクトでは、cyfrin/battlechain-lib を使用してください。
forge install cyfrin/battlechain-lib
foundry.toml にリマッピングを追加します。
remappings = ["battlechain-lib/=lib/battlechain-lib/src/"]
継承階層
| コントラクト | 用途 |
|---|---|
BCScript | ライフサイクル全体:デプロイ+合意+攻撃モード |
BCDeploy | デプロイのみ(任意のチェーンでは CreateX 経由、BC では BattleChainDeployer 経由) |
BCSafeHarbor | 合意の作成のみ |
主なヘルパー
| ヘルパー | 機能 |
|---|---|
bcDeployCreate(bytecode) | BattleChain では BattleChainDeployer 経由、その他 190 以上のチェーンでは CreateX 経由でデプロイします |
bcDeployCreate2(salt, bytecode) | 決定論的にデプロイします。すべてのチェーンで同じアドレスになります |
bcDeployCreate3(salt, bytecode) | アドレスはバイトコードではなく salt のみで決まります |
defaultAgreementDetails(name, contacts, contracts, recovery) | チェーンごとに適切なスコープと URI を使用して合意を構築します |
createAndAdoptAgreement(details, owner, salt) | 1 回の呼び出しで合意の作成+14 日間のコミットメント+採用を行います |
requestAttackMode(agreement) | 攻撃モードに移行します(BattleChain 専用。他のチェーンではリバートします) |
_isBattleChain() | 実行時チェック:チェーン ID 626、627 では true |
getDeployedContracts() | このセッションで bcDeploy* を通じてデプロイされたすべてのアドレス |
クロスチェーン動作
| BattleChain(626/627) | その他の EVM チェーン(190 以上) | |
|---|---|---|
bcDeployCreate* | BattleChainDeployer(CreateX + AttackRegistry) | CreateX(0xba5Ed...)を直接使用 |
defaultAgreementDetails | BattleChain のスコープ + BATTLECHAIN_SAFE_HARBOR_URI | 現在のチェーンの CAIP-2 スコープ + SAFE_HARBOR_V3_URI |
requestAttackMode | 動作します | BCSafeHarbor__NotBattleChain でリバートします |
createAndAdoptAgreement | 動作します | 動作します(そのチェーンにレジストリ/ファクトリーが必要です) |
BattleChain 専用なのは requestAttackMode のみです。それ以外はすべて、サポートされている任意のチェーンで動作します。
攻撃モードの承認
requestAttackMode により合意は ATTACK_REQUESTED に移行します。UNDER_ATTACK に移行するには、レジストリモデレーターの承認が必要です。
-
テストネット(627): モデレーターはパーミッションレスな
MockRegistryModerator(0x3DdA228A38b4d7438bBF5D5137c8D1090DcaF6bF)です。誰でも自身の攻撃リクエストを即座に承認できます。cast send 0x3DdA228A38b4d7438bBF5D5137c8D1090DcaF6bF \ "approveAttack(address)" <AGREEMENT_ADDRESS> \ --rpc-url https://testnet.battlechain.com --account <your-account> -
メインネット(626): 承認はレジストリモデレーター(
0x445d5685c4Ae71550Da0716b82B434AEA140E0c7)による管理された DAO アクションです。
Foundry
Foundry スクリプトを使用する場合、現時点ではシミュレーションをスキップするフラグを渡す必要があります。例:
forge script scripts/Deploy.s.sol --skip-simulation
そうしないと、ガス見積もりに関するエラーが発生します。これに -g を組み合わせることもできます。
forge script scripts/Deploy.s.sol --skip-simulation -g 300
問題が解消しない場合は、justfile または makefile を使用している場合、それらのファイル内のターゲットにこれらのフラグを追加してください。
検証
BattleChain では、コントラクトの検証にカスタムのブロックエクスプローラー API を使用します。検証はテストネット(チェーン 627)とメインネット(チェーン 626)の両方で動作します。以下の例はテストネットを対象としています。メインネットの場合は、チェーン ID 626、検証 URL https://block-explorer-api.mainnet.battlechain.com/api、RPC https://mainnet.battlechain.com に置き換えてください。battlechain-lib には、検証ターゲットを備えた再利用可能な justfile モジュールが含まれています。
検証ターゲットをインストールする
justfile に追加します。
import "lib/battlechain-lib/battlechain.just"
以下のターゲットが使用できるようになります。
| ターゲット | 用途 |
|---|---|
bc-verify <addr> <path:name> | 単一のコントラクトを検証します |
bc-verify-broadcast <script> | broadcast ファイル内のすべてのコントラクトを検証します(CreateX/BCDeploy ファクトリーによる作成に対応) |
bc-deploy <script> <account> <sender> | 標準の BC フラグを使ってデプロイします |
bc-deploy-verify <script> <account> <sender> | デプロイと検証を一度に行います |
ターゲットはネットワークに応じて動作します。デフォルトはテストネットで、NETWORK=mainnet を指定すると RPC とエクスプローラー API がメインネットに切り替わります。
手動で検証する
forge verify-contract <ADDRESS> src/MyVault.sol:MyVault \
--chain-id 627 \
--verifier-url https://block-explorer-api.testnet.battlechain.com/api \
--verifier custom \
--etherscan-api-key "1234" \
--rpc-url https://testnet.battlechain.com
API キーは検証されません。空でない文字列であれば何でも使用できます。
デプロイ時に検証する
forge script の呼び出しに --verify を追加します。
forge script script/Deploy.s.sol \
--rpc-url https://testnet.battlechain.com \
--broadcast --skip-simulation -g 300 \
--verify \
--verifier-url https://block-explorer-api.testnet.battlechain.com/api \
--verifier custom \
--etherscan-api-key 1234
これにより、デプロイ時にコントラクトが検証されます。ファクトリー経由でデプロイしたコントラクト(CreateX/BCDeploy 経由)の場合は、デプロイ後に bc-verify-broadcast を使用してください。
トラブルシューティング
AnyTxType(2) transaction can't be built due to missing keys: ["gas_limit"]
このエラーは、コントラクトが EVM のコントラクトサイズ上限(24,576 バイト)を超えていることを示します。サイズ超過したコントラクトのガスを Forge は見積もれないため、デプロイトランザクションの構築に失敗します。
診断: コンパイル後にコントラクトのサイズを確認します。
forge build --sizes
24,576 バイトを超えるコントラクトはデプロイに失敗します。
解決方法:
- コントラクトを小さな単位(ライブラリや個別のコントラクト)に分割します
foundry.tomlでoptimizer = trueとoptimizer_runs = 200を設定し、オプティマイザーの実行回数を増やします- より高度な最適化を行うために
--via-irを使用します(コンパイルは遅くなりますが、出力サイズは小さくなります) - 定数や長い文字列リテラルを別のライブラリに切り出します
Hardhat
近日公開…