eth_getCode
方法返回指定地址处智能合约的编译字节码。这个基本方法允许开发者验证合约实现、执行安全审计,以及区分以太坊区块链上的普通账户和智能合约。
此方法在请求的区块高度检索特定地址部署的 EVM 字节码。
智能合约的地址
十六进制格式的区块号或区块标签
给定地址的字节码,以十六进制字符串表示
{
"jsonrpc": "2.0",
"id": 1,
"result": "0x60806040526004361061016a5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde03811461016f578063095ea7b3146101f957806318160ddd1461023957806323b872dd14610260578063313ce567146102a..." // 为简洁起见而截断
}
selfdestruct
被销毁后,返回 "0x"不同类型的合约有可识别的字节码模式:
0x363d3d37363d73...
开头// 示例:验证地址是合约还是 EOA
async function isContract(address) {
const code = await provider.send('eth_getCode', [address, 'latest']);
return code !== '0x';
}
// 示例:验证代理实现
async function verifyProxyImplementation(proxyAddress, expectedImplementation) {
// 对于 EIP-1967 代理,实现地址存储在特定插槽
const implementationSlot = '0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc';
const storageValue = await provider.send('eth_getStorageAt', [proxyAddress, implementationSlot, 'latest']);
// 从存储值中提取地址(移除填充)
const implementationAddress = '0x' + storageValue.slice(26);
// 获取实现字节码
const implementationCode = await provider.send('eth_getCode', [implementationAddress, 'latest']);
const expectedCode = await provider.send('eth_getCode', [expectedImplementation, 'latest']);
return {
isProxy: implementationCode !== '0x',
implementationAddress,
implementationMatches: implementationCode === expectedCode,
};
}
// 使用
const addressToCheck = '0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984'; // UNI token
const isContractResult = await isContract(addressToCheck);
console.log(`${addressToCheck} is ${isContractResult ? 'a contract' : 'an EOA'}`);
// 基于字节码模式的简单合约类型检测器
async function detectContractType(address) {
const code = await provider.send('eth_getCode', [address, 'latest']);
if (code === '0x') return 'Not a contract (EOA or self-destructed)';
// 检查代理模式
if (code.includes('363d3d37363d73')) return 'EIP-1167 Minimal Proxy';
if (code.includes('5c60806040527f360894')) return 'EIP-1967 Transparent Proxy';
// 检查常见 ERC 标准(简化)
if (code.includes('6e0a6eecd9d3362a2dcfb7fac5fea5d4bd0a73001ddb12dd96e21df6ab138d72'))
return 'Likely ERC-20 Token';
if (code.includes('80ac58cd')) return 'Likely ERC-721 NFT';
if (code.includes('d9b67a26')) return 'Likely ERC-1155 Multi-Token';
return 'Standard contract (type unknown)';
}