[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-eip-7702-jissen-gaido-pectra-go-sumaato-akaunto-furoo-kouchiku":3},{"article":4,"author":55},{"id":5,"category_id":6,"title":7,"slug":8,"excerpt":9,"content_md":10,"content_html":11,"locale":12,"author_id":13,"published":14,"published_at":15,"meta_title":7,"meta_description":16,"focus_keyword":17,"og_image":18,"canonical_url":18,"robots_meta":19,"created_at":15,"updated_at":15,"tags":20,"category_name":34,"related_articles":35},"d0000000-0000-0000-0000-000000000578","a0000000-0000-0000-0000-000000000042","EIP-7702実践ガイド：Pectra後のスマートアカウントフロー構築","eip-7702-jissen-gaido-pectra-go-sumaato-akaunto-furoo-kouchiku","EIP-7702により、任意のEthereum EOAが単一トランザクション内でスマートコントラクトとして一時的に動作可能になりました。バッチトランザクション、ガススポンサーシップ、ソーシャルリカバリーの実装方法を解説します。","## EIP-7702が実現すること\n\nEIP-7702は、2025年3月のEthereumのPectraアップグレードで有効化され、任意の外部所有アカウント(EOA)が**デリゲーションデシグネーター**を設定できる新しいトランザクションタイプを導入しました。これはスマートコントラクトへのポインターで、EOAがトランザクション中に一時的にそのコードを採用します。つまり、既存のMetaMaskウォレットアドレスが、新しいコントラクトウォレットをデプロイしたりアドレスを変更したりすることなく、任意のスマートコントラクトロジックを実行できます。\n\nこれはEthereum史上最も重要なUX改善です。\n\n## EIP-7702 vs ERC-4337：使い分け\n\n| 特徴 | EIP-7702 | ERC-4337 |\n|------|----------|----------|\n| レベル | プロトコル(新txタイプ) | アプリケーション(スマートコントラクト) |\n| アカウントタイプ | 既存EOAをアップグレード | 新しいスマートコントラクトウォレットが必要 |\n| アドレス | 既存EOAアドレスを維持 | 新アドレス(反事実的) |\n| 永続性 | トランザクションごとのデリゲーション | 永続的スマートコントラクト |\n| バンドラー必要 | 不要(標準txフロー) | 必要(別メンプール) |\n| ガスオーバーヘッド | デリゲーションに~20,000ガス | UserOp検証に~42,000ガス |\n| 対応ウォレット | MetaMask, Coinbase Wallet, Rainbow | 専用(Safe, ZeroDev, Biconomy) |\n| 最適な用途 | 既存ユーザーのアップグレード | 新規ユーザー、複雑なアカウントロジック |\n\n### 判断フレームワーク\n\n**EIP-7702を使用する場合：**\n- ユーザーが既にEOAウォレットを持っている\n- バッチトランザクションやガススポンサーシップが必要\n- 統合の複雑さを最小限にしたい\n\n**ERC-4337を使用する場合：**\n- 新しいウォレットを構築するか新規ユーザーをオンボーディング\n- 永続的なアカウントロジックが必要\n- モジュール、プラグイン、ガーディアンなどの高度な機能が必要\n\n## コード例\n\n### バッチトランザクション\n\n```solidity\n\u002F\u002F SPDX-License-Identifier: MIT\npragma solidity ^0.8.25;\n\n\u002F\u002F\u002F @title BatchExecutor — EIP-7702バッチコール用デリゲーションターゲット\ncontract BatchExecutor {\n    struct Call {\n        address target;\n        uint256 value;\n        bytes data;\n    }\n    \n    function executeBatch(Call[] calldata calls) external payable {\n        for (uint256 i = 0; i \u003C calls.length; i++) {\n            (bool success, bytes memory result) = calls[i].target.call{\n                value: calls[i].value\n            }(calls[i].data);\n            \n            if (!success) {\n                assembly {\n                    revert(add(result, 32), mload(result))\n                }\n            }\n        }\n    }\n}\n```\n\nethers.js v6でのクライアントサイド使用：\n\n```typescript\nimport { ethers } from \"ethers\";\n\nconst batchTx = {\n    type: 4,\n    to: userAddress,\n    authorizationList: [{\n        chainId: 1,\n        address: BATCH_EXECUTOR_ADDRESS,\n        nonce: await provider.getTransactionCount(userAddress),\n        yParity: 0, r: \"0x...\", s: \"0x...\"\n    }],\n    data: batchExecutorInterface.encodeFunctionData(\"executeBatch\", [[\n        {\n            target: USDC_ADDRESS,\n            value: 0,\n            data: usdcInterface.encodeFunctionData(\"approve\", [\n                UNISWAP_ROUTER, ethers.parseUnits(\"1000\", 6)\n            ])\n        },\n        {\n            target: UNISWAP_ROUTER,\n            value: 0,\n            data: routerInterface.encodeFunctionData(\"exactInputSingle\", [{\n                tokenIn: USDC_ADDRESS,\n                tokenOut: WETH_ADDRESS,\n                fee: 3000,\n                recipient: userAddress,\n                amountIn: ethers.parseUnits(\"1000\", 6),\n                amountOutMinimum: 0,\n                sqrtPriceLimitX96: 0\n            }])\n        }\n    ]])\n};\n\nconst tx = await signer.sendTransaction(batchTx);\n```\n\n### ガススポンサーシップ\n\n```solidity\n\u002F\u002F\u002F @title SponsoredExecutor — EIP-7702によるガススポンサーシップ\ncontract SponsoredExecutor {\n    mapping(address => uint256) public nonces;\n    \n    function sponsoredExecute(\n        address user,\n        address target,\n        bytes calldata data,\n        uint256 userNonce,\n        uint256 deadline,\n        bytes calldata signature\n    ) external {\n        require(block.timestamp \u003C= deadline, \"Expired\");\n        require(nonces[user] == userNonce, \"Invalid nonce\");\n        nonces[user]++;\n        \n        bytes32 digest = _hashTypedData(user, target, data, userNonce, deadline);\n        address signer = ECDSA.recover(digest, signature);\n        require(signer == user, \"Invalid signature\");\n        \n        (bool success, bytes memory result) = target.call(data);\n        require(success, \"Call failed\");\n    }\n}\n```\n\n### ソーシャルリカバリー\n\n```solidity\n\u002F\u002F\u002F @title RecoveryModule — EIP-7702によるソーシャルリカバリー\ncontract RecoveryModule {\n    struct RecoveryConfig {\n        address[] guardians;\n        uint256 threshold;\n        uint256 delay;\n    }\n    \n    mapping(address => RecoveryConfig) public configs;\n    mapping(bytes32 => uint256) public recoveryTimestamps;\n    mapping(bytes32 => uint256) public approvalCounts;\n    mapping(bytes32 => mapping(address => bool)) public hasApproved;\n    \n    function setupRecovery(\n        address[] calldata guardians,\n        uint256 threshold,\n        uint256 delay\n    ) external {\n        require(guardians.length >= threshold, \"Invalid threshold\");\n        require(threshold >= 2, \"Min 2 guardians\");\n        configs[msg.sender] = RecoveryConfig(guardians, threshold, delay);\n    }\n    \n    function approveRecovery(\n        address account,\n        address newOwner\n    ) external {\n        RecoveryConfig memory config = configs[account];\n        require(_isGuardian(config, msg.sender), \"Not a guardian\");\n        \n        bytes32 recoveryId = keccak256(abi.encode(account, newOwner));\n        require(!hasApproved[recoveryId][msg.sender], \"Already approved\");\n        \n        hasApproved[recoveryId][msg.sender] = true;\n        approvalCounts[recoveryId]++;\n        \n        if (approvalCounts[recoveryId] >= config.threshold) {\n            recoveryTimestamps[recoveryId] = block.timestamp + config.delay;\n        }\n    }\n    \n    function executeRecovery(\n        address account,\n        address newOwner\n    ) external {\n        bytes32 recoveryId = keccak256(abi.encode(account, newOwner));\n        uint256 timestamp = recoveryTimestamps[recoveryId];\n        require(timestamp > 0 && block.timestamp >= timestamp, \"Not ready\");\n    }\n}\n```\n\n## ウォレット統合状況\n\n### MetaMask\n\nMetaMaskはバージョン12.4(2025年9月)でEIP-7702サポートを追加しました。\n\n### Coinbase Wallet\n\nCoinbase Walletは最も積極的な採用者で、「Smart Wallet」機能(2025年11月ローンチ)にEIP-7702を統合：\n- **自動バッチ処理** — approve+swapシーケンスを自動バッチ\n- **ガススポンサーシップ** — $1以下の手数料のトランザクションをCoinbaseがスポンサー\n- **ワンクリックDeFi** — 一般的なDeFi操作用プリビルトデリゲーションターゲット\n\n### Rainbow、Rabby等\n\nRainbowは2026年1月にサポートを追加。Rabbyはtype-4トランザクションをサポートしていますがバッチ可視化UIはありません。\n\n## マイグレーションガイド\n\n### ステップ1：デリゲーションターゲットのデプロイ\n\n### ステップ2：フロントエンドの更新\n\n```typescript\nasync function supportsEIP7702(provider: ethers.Provider): Promise\u003Cboolean> {\n    try {\n        const capabilities = await provider.send(\n            \"wallet_getCapabilities\", []\n        );\n        return capabilities?.atomicBatch?.supported === true;\n    } catch {\n        return false;\n    }\n}\n```\n\n### ステップ3：グレースフルデグラデーションの実装\n\n```typescript\nasync function executeSwap(tokenIn, tokenOut, amount) {\n    if (await supportsEIP7702(provider)) {\n        return executeBatchSwap(tokenIn, tokenOut, amount);\n    } else {\n        await approve(tokenIn, ROUTER, amount);\n        return swap(tokenIn, tokenOut, amount);\n    }\n}\n```\n\n## セキュリティ上の考慮事項\n\n### デリゲーションターゲットの検証\n\nデリゲーションターゲットコントラクトは、トランザクション中にEOAの資産に対する**完全な制御権**を持ちます。\n\n**対策：** 監査済み、検証済みのコントラクトにのみデリゲートしてください。\n\n### リプレイ保護\n\nEIP-7702認証リストにはリプレイ攻撃を防ぐためのnonceが含まれています。\n\n### デリゲーションを介したフィッシング\n\n**対策：** ウォレットはEOAがデリゲートするコードを明確に表示する必要があります。\n\n### バッチ実行でのリエントランシー\n\n```solidity\nbool private locked;\n\nmodifier noReentrant() {\n    require(!locked, \"Reentrant\");\n    locked = true;\n    _;\n    locked = false;\n}\n```\n\n### ストレージコリジョン\n\nEIP-7201(名前空間ストレージ)を使用：\n\n```solidity\nbytes32 constant STORAGE_SLOT = keccak256(\n    abi.encode(uint256(keccak256(\"batch.executor.storage\")) - 1)\n) & ~bytes32(uint256(0xff));\n```\n\n## よくある質問\n\n### EIP-7702でウォレットアドレスは変わりますか？\n\nいいえ。EOAアドレスはそのままです。EIP-7702は単一トランザクションの間だけスマートコントラクト機能を付与します。\n\n### L2でEIP-7702は使えますか？\n\nはい。すべての主要L2(Arbitrum, Base, Optimism, zkSync)がEIP-7702を採用しています。\n\n### デリゲーションターゲットにバグがあった場合は？\n\n被害は単一トランザクションに限定されます。ただし、そのトランザクション内ではEOAの資産にフルアクセスできます。\n\n### ハードウェアウォレットとの互換性は？\n\nはい。Ledgerはファームウェア2.3.0(2025年12月)でサポートを追加しました。\n\n### EIP-7702でどのくらいガスが節約できますか？\n\n一般的なapprove+swapフローで約**40-50%**のガス節約。複雑なマルチステップDeFi操作では60-70%に達することもあります。","\u003Ch2 id=\"eip-7702\">EIP-7702が実現すること\u003C\u002Fh2>\n\u003Cp>EIP-7702は、2025年3月のEthereumのPectraアップグレードで有効化され、任意の外部所有アカウント(EOA)が\u003Cstrong>デリゲーションデシグネーター\u003C\u002Fstrong>を設定できる新しいトランザクションタイプを導入しました。これはスマートコントラクトへのポインターで、EOAがトランザクション中に一時的にそのコードを採用します。つまり、既存のMetaMaskウォレットアドレスが、新しいコントラクトウォレットをデプロイしたりアドレスを変更したりすることなく、任意のスマートコントラクトロジックを実行できます。\u003C\u002Fp>\n\u003Cp>これはEthereum史上最も重要なUX改善です。\u003C\u002Fp>\n\u003Ch2 id=\"eip-7702-vs-erc-4337\">EIP-7702 vs ERC-4337：使い分け\u003C\u002Fh2>\n\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>特徴\u003C\u002Fth>\u003Cth>EIP-7702\u003C\u002Fth>\u003Cth>ERC-4337\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\n\u003Ctr>\u003Ctd>レベル\u003C\u002Ftd>\u003Ctd>プロトコル(新txタイプ)\u003C\u002Ftd>\u003Ctd>アプリケーション(スマートコントラクト)\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>アカウントタイプ\u003C\u002Ftd>\u003Ctd>既存EOAをアップグレード\u003C\u002Ftd>\u003Ctd>新しいスマートコントラクトウォレットが必要\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>アドレス\u003C\u002Ftd>\u003Ctd>既存EOAアドレスを維持\u003C\u002Ftd>\u003Ctd>新アドレス(反事実的)\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>永続性\u003C\u002Ftd>\u003Ctd>トランザクションごとのデリゲーション\u003C\u002Ftd>\u003Ctd>永続的スマートコントラクト\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>バンドラー必要\u003C\u002Ftd>\u003Ctd>不要(標準txフロー)\u003C\u002Ftd>\u003Ctd>必要(別メンプール)\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>ガスオーバーヘッド\u003C\u002Ftd>\u003Ctd>デリゲーションに~20,000ガス\u003C\u002Ftd>\u003Ctd>UserOp検証に~42,000ガス\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>対応ウォレット\u003C\u002Ftd>\u003Ctd>MetaMask, Coinbase Wallet, Rainbow\u003C\u002Ftd>\u003Ctd>専用(Safe, ZeroDev, Biconomy)\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>最適な用途\u003C\u002Ftd>\u003Ctd>既存ユーザーのアップグレード\u003C\u002Ftd>\u003Ctd>新規ユーザー、複雑なアカウントロジック\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Ch3>判断フレームワーク\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>EIP-7702を使用する場合：\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>ユーザーが既にEOAウォレットを持っている\u003C\u002Fli>\n\u003Cli>バッチトランザクションやガススポンサーシップが必要\u003C\u002Fli>\n\u003Cli>統合の複雑さを最小限にしたい\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>ERC-4337を使用する場合：\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>新しいウォレットを構築するか新規ユーザーをオンボーディング\u003C\u002Fli>\n\u003Cli>永続的なアカウントロジックが必要\u003C\u002Fli>\n\u003Cli>モジュール、プラグイン、ガーディアンなどの高度な機能が必要\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"\">コード例\u003C\u002Fh2>\n\u003Ch3>バッチトランザクション\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-solidity\">\u002F\u002F SPDX-License-Identifier: MIT\npragma solidity ^0.8.25;\n\n\u002F\u002F\u002F @title BatchExecutor — EIP-7702バッチコール用デリゲーションターゲット\ncontract BatchExecutor {\n    struct Call {\n        address target;\n        uint256 value;\n        bytes data;\n    }\n    \n    function executeBatch(Call[] calldata calls) external payable {\n        for (uint256 i = 0; i &lt; calls.length; i++) {\n            (bool success, bytes memory result) = calls[i].target.call{\n                value: calls[i].value\n            }(calls[i].data);\n            \n            if (!success) {\n                assembly {\n                    revert(add(result, 32), mload(result))\n                }\n            }\n        }\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>ethers.js v6でのクライアントサイド使用：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-typescript\">import { ethers } from \"ethers\";\n\nconst batchTx = {\n    type: 4,\n    to: userAddress,\n    authorizationList: [{\n        chainId: 1,\n        address: BATCH_EXECUTOR_ADDRESS,\n        nonce: await provider.getTransactionCount(userAddress),\n        yParity: 0, r: \"0x...\", s: \"0x...\"\n    }],\n    data: batchExecutorInterface.encodeFunctionData(\"executeBatch\", [[\n        {\n            target: USDC_ADDRESS,\n            value: 0,\n            data: usdcInterface.encodeFunctionData(\"approve\", [\n                UNISWAP_ROUTER, ethers.parseUnits(\"1000\", 6)\n            ])\n        },\n        {\n            target: UNISWAP_ROUTER,\n            value: 0,\n            data: routerInterface.encodeFunctionData(\"exactInputSingle\", [{\n                tokenIn: USDC_ADDRESS,\n                tokenOut: WETH_ADDRESS,\n                fee: 3000,\n                recipient: userAddress,\n                amountIn: ethers.parseUnits(\"1000\", 6),\n                amountOutMinimum: 0,\n                sqrtPriceLimitX96: 0\n            }])\n        }\n    ]])\n};\n\nconst tx = await signer.sendTransaction(batchTx);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>ガススポンサーシップ\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-solidity\">\u002F\u002F\u002F @title SponsoredExecutor — EIP-7702によるガススポンサーシップ\ncontract SponsoredExecutor {\n    mapping(address =&gt; uint256) public nonces;\n    \n    function sponsoredExecute(\n        address user,\n        address target,\n        bytes calldata data,\n        uint256 userNonce,\n        uint256 deadline,\n        bytes calldata signature\n    ) external {\n        require(block.timestamp &lt;= deadline, \"Expired\");\n        require(nonces[user] == userNonce, \"Invalid nonce\");\n        nonces[user]++;\n        \n        bytes32 digest = _hashTypedData(user, target, data, userNonce, deadline);\n        address signer = ECDSA.recover(digest, signature);\n        require(signer == user, \"Invalid signature\");\n        \n        (bool success, bytes memory result) = target.call(data);\n        require(success, \"Call failed\");\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>ソーシャルリカバリー\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-solidity\">\u002F\u002F\u002F @title RecoveryModule — EIP-7702によるソーシャルリカバリー\ncontract RecoveryModule {\n    struct RecoveryConfig {\n        address[] guardians;\n        uint256 threshold;\n        uint256 delay;\n    }\n    \n    mapping(address =&gt; RecoveryConfig) public configs;\n    mapping(bytes32 =&gt; uint256) public recoveryTimestamps;\n    mapping(bytes32 =&gt; uint256) public approvalCounts;\n    mapping(bytes32 =&gt; mapping(address =&gt; bool)) public hasApproved;\n    \n    function setupRecovery(\n        address[] calldata guardians,\n        uint256 threshold,\n        uint256 delay\n    ) external {\n        require(guardians.length &gt;= threshold, \"Invalid threshold\");\n        require(threshold &gt;= 2, \"Min 2 guardians\");\n        configs[msg.sender] = RecoveryConfig(guardians, threshold, delay);\n    }\n    \n    function approveRecovery(\n        address account,\n        address newOwner\n    ) external {\n        RecoveryConfig memory config = configs[account];\n        require(_isGuardian(config, msg.sender), \"Not a guardian\");\n        \n        bytes32 recoveryId = keccak256(abi.encode(account, newOwner));\n        require(!hasApproved[recoveryId][msg.sender], \"Already approved\");\n        \n        hasApproved[recoveryId][msg.sender] = true;\n        approvalCounts[recoveryId]++;\n        \n        if (approvalCounts[recoveryId] &gt;= config.threshold) {\n            recoveryTimestamps[recoveryId] = block.timestamp + config.delay;\n        }\n    }\n    \n    function executeRecovery(\n        address account,\n        address newOwner\n    ) external {\n        bytes32 recoveryId = keccak256(abi.encode(account, newOwner));\n        uint256 timestamp = recoveryTimestamps[recoveryId];\n        require(timestamp &gt; 0 &amp;&amp; block.timestamp &gt;= timestamp, \"Not ready\");\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">ウォレット統合状況\u003C\u002Fh2>\n\u003Ch3>MetaMask\u003C\u002Fh3>\n\u003Cp>MetaMaskはバージョン12.4(2025年9月)でEIP-7702サポートを追加しました。\u003C\u002Fp>\n\u003Ch3>Coinbase Wallet\u003C\u002Fh3>\n\u003Cp>Coinbase Walletは最も積極的な採用者で、「Smart Wallet」機能(2025年11月ローンチ)にEIP-7702を統合：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>自動バッチ処理\u003C\u002Fstrong> — approve+swapシーケンスを自動バッチ\u003C\u002Fli>\n\u003Cli>\u003Cstrong>ガススポンサーシップ\u003C\u002Fstrong> — $1以下の手数料のトランザクションをCoinbaseがスポンサー\u003C\u002Fli>\n\u003Cli>\u003Cstrong>ワンクリックDeFi\u003C\u002Fstrong> — 一般的なDeFi操作用プリビルトデリゲーションターゲット\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Rainbow、Rabby等\u003C\u002Fh3>\n\u003Cp>Rainbowは2026年1月にサポートを追加。Rabbyはtype-4トランザクションをサポートしていますがバッチ可視化UIはありません。\u003C\u002Fp>\n\u003Ch2 id=\"\">マイグレーションガイド\u003C\u002Fh2>\n\u003Ch3>ステップ1：デリゲーションターゲットのデプロイ\u003C\u002Fh3>\n\u003Ch3>ステップ2：フロントエンドの更新\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-typescript\">async function supportsEIP7702(provider: ethers.Provider): Promise&lt;boolean&gt; {\n    try {\n        const capabilities = await provider.send(\n            \"wallet_getCapabilities\", []\n        );\n        return capabilities?.atomicBatch?.supported === true;\n    } catch {\n        return false;\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>ステップ3：グレースフルデグラデーションの実装\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-typescript\">async function executeSwap(tokenIn, tokenOut, amount) {\n    if (await supportsEIP7702(provider)) {\n        return executeBatchSwap(tokenIn, tokenOut, amount);\n    } else {\n        await approve(tokenIn, ROUTER, amount);\n        return swap(tokenIn, tokenOut, amount);\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">セキュリティ上の考慮事項\u003C\u002Fh2>\n\u003Ch3>デリゲーションターゲットの検証\u003C\u002Fh3>\n\u003Cp>デリゲーションターゲットコントラクトは、トランザクション中にEOAの資産に対する\u003Cstrong>完全な制御権\u003C\u002Fstrong>を持ちます。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>対策：\u003C\u002Fstrong> 監査済み、検証済みのコントラクトにのみデリゲートしてください。\u003C\u002Fp>\n\u003Ch3>リプレイ保護\u003C\u002Fh3>\n\u003Cp>EIP-7702認証リストにはリプレイ攻撃を防ぐためのnonceが含まれています。\u003C\u002Fp>\n\u003Ch3>デリゲーションを介したフィッシング\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>対策：\u003C\u002Fstrong> ウォレットはEOAがデリゲートするコードを明確に表示する必要があります。\u003C\u002Fp>\n\u003Ch3>バッチ実行でのリエントランシー\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-solidity\">bool private locked;\n\nmodifier noReentrant() {\n    require(!locked, \"Reentrant\");\n    locked = true;\n    _;\n    locked = false;\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>ストレージコリジョン\u003C\u002Fh3>\n\u003Cp>EIP-7201(名前空間ストレージ)を使用：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-solidity\">bytes32 constant STORAGE_SLOT = keccak256(\n    abi.encode(uint256(keccak256(\"batch.executor.storage\")) - 1)\n) &amp; ~bytes32(uint256(0xff));\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"\">よくある質問\u003C\u002Fh2>\n\u003Ch3 id=\"eip-7702\">EIP-7702でウォレットアドレスは変わりますか？\u003C\u002Fh3>\n\u003Cp>いいえ。EOAアドレスはそのままです。EIP-7702は単一トランザクションの間だけスマートコントラクト機能を付与します。\u003C\u002Fp>\n\u003Ch3 id=\"l2-eip-7702\">L2でEIP-7702は使えますか？\u003C\u002Fh3>\n\u003Cp>はい。すべての主要L2(Arbitrum, Base, Optimism, zkSync)がEIP-7702を採用しています。\u003C\u002Fp>\n\u003Ch3 id=\"\">デリゲーションターゲットにバグがあった場合は？\u003C\u002Fh3>\n\u003Cp>被害は単一トランザクションに限定されます。ただし、そのトランザクション内ではEOAの資産にフルアクセスできます。\u003C\u002Fp>\n\u003Ch3 id=\"\">ハードウェアウォレットとの互換性は？\u003C\u002Fh3>\n\u003Cp>はい。Ledgerはファームウェア2.3.0(2025年12月)でサポートを追加しました。\u003C\u002Fp>\n\u003Ch3 id=\"eip-7702\">EIP-7702でどのくらいガスが節約できますか？\u003C\u002Fh3>\n\u003Cp>一般的なapprove+swapフローで約**40-50%**のガス節約。複雑なマルチステップDeFi操作では60-70%に達することもあります。\u003C\u002Fp>\n","ja","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:43.184719Z","EIP-7702バッチトランザクション、ガススポンサーシップ、ソーシャルリカバリーの実装方法。コード例、ウォレット対応状況、セキュリティガイド。","EIP-7702",null,"index, follow",[21,26,30],{"id":22,"name":23,"slug":24,"created_at":25},"c0000000-0000-0000-0000-000000000013","Security","security","2026-03-28T10:44:21.513630Z",{"id":27,"name":28,"slug":29,"created_at":25},"c0000000-0000-0000-0000-000000000014","Solidity","solidity",{"id":31,"name":32,"slug":33,"created_at":25},"c0000000-0000-0000-0000-000000000009","Web3","web3","ブロックチェーン",[36,43,49],{"id":37,"title":38,"slug":39,"excerpt":40,"locale":12,"category_name":41,"published_at":42},"d0000000-0000-0000-0000-000000000671","2026年、なぜBaliは東南アジアのインパクトテックハブになりつつあるのか","naze-bali-2026-tonan-ajia-inpakuto-tekku-habu","Baliは東南アジアのスタートアップエコシステムで第16位にランクイン。Web3ビルダー、AIサステナビリティスタートアップ、エコトラベルテック企業が集積し、この島は地域のインパクトテック首都としてのニッチを確立しつつあります。","エンジニアリング","2026-03-28T10:44:49.081179Z",{"id":44,"title":45,"slug":46,"excerpt":47,"locale":12,"category_name":41,"published_at":48},"d0000000-0000-0000-0000-000000000670","ASEANデータ保護パッチワーク：開発者のためのコンプライアンスチェックリスト","asean-deta-hogo-pacchiwaku-kaihatsusha-kompuraiansu-chekkurisuto","7つのASEAN諸国が包括的なデータ保護法を有し、それぞれ異なる同意モデル、ローカライゼーション要件、罰則構造を持っています。マルチカントリーアプリケーションを構築する開発者のための実用的なコンプライアンスチェックリストです。","2026-03-28T10:44:49.074910Z",{"id":50,"title":51,"slug":52,"excerpt":53,"locale":12,"category_name":41,"published_at":54},"d0000000-0000-0000-0000-000000000669","Indonesiaの290億ドルデジタルトランスフォーメーション：ソフトウェア企業のチャンス","indonesia-290oku-doru-dejitaru-toransufomeshon-sofutowea-kigyo-chansu","IndonesiaのITサービス市場は2026年に290.3億ドルに達すると予測されており、2025年の243.7億ドルから増加します。クラウドインフラ、AI、電子商取引、データセンターが東南アジアで最も速い成長を牽引しています。","2026-03-28T10:44:49.055660Z",{"id":13,"name":56,"slug":57,"bio":58,"photo_url":18,"linkedin":18,"role":59,"created_at":60,"updated_at":60},"Open Soft Team","open-soft-team","The engineering team at Open Soft, building premium software solutions from Bali, Indonesia.","Engineering Team","2026-03-28T08:31:22.226811Z"]