El método eth_getCode
devuelve el bytecode compilado de un contrato inteligente en una dirección específica. Este método esencial permite a los desarrolladores verificar implementaciones de contratos, realizar auditorías de seguridad y distinguir entre cuentas regulares y contratos inteligentes en la blockchain de Ethereum.
Este método recupera el bytecode EVM implementado en una dirección específica en la altura de bloque solicitada.
La dirección del contrato inteligente
Número de bloque en formato hexadecimal o etiqueta de bloque
El bytecode de la dirección dada como una cadena hexadecimal
{
"jsonrpc": "2.0",
"id": 1,
"result": "0x60806040526004361061016a5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde03811461016f578063095ea7b3146101f957806318160ddd1461023957806323b872dd14610260578063313ce567146102a..." // Truncado por brevedad
}
selfdestruct
Diferentes tipos de contratos tienen patrones de bytecode reconocibles:
0x363d3d37363d73...
// Ejemplo: Verificar si una dirección es un contrato o EOA
async function isContract(address) {
const code = await provider.send('eth_getCode', [address, 'latest']);
return code !== '0x';
}
// Ejemplo: Verificar implementación proxy
async function verifyProxyImplementation(proxyAddress, expectedImplementation) {
// Para proxies EIP-1967, la dirección de implementación se almacena en un slot específico
const implementationSlot = '0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc';
const storageValue = await provider.send('eth_getStorageAt', [proxyAddress, implementationSlot, 'latest']);
// Extraer dirección del valor de almacenamiento (eliminar padding)
const implementationAddress = '0x' + storageValue.slice(26);
// Obtener bytecode de implementación
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,
};
}
// Uso
const addressToCheck = '0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984'; // Token UNI
const isContractResult = await isContract(addressToCheck);
console.log(`${addressToCheck} is ${isContractResult ? 'a contract' : 'an EOA'}`);
// Detector simple de tipo de contrato basado en patrones de bytecode
async function detectContractType(address) {
const code = await provider.send('eth_getCode', [address, 'latest']);
if (code === '0x') return 'Not a contract (EOA or self-destructed)';
// Verificar patrones de proxy
if (code.includes('363d3d37363d73')) return 'EIP-1167 Minimal Proxy';
if (code.includes('5c60806040527f360894')) return 'EIP-1967 Transparent Proxy';
// Verificar estándares ERC comunes (simplificado)
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)';
}