[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-deep-evm-3-entendiendo-gas-costes-contratos":3},{"article":4,"author":54},{"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},"d8000000-0000-0000-0000-000000000103","a0000000-0000-0000-0000-000000000082","Deep EVM #3: Entendiendo el Gas — Por Qué Tu Contrato Cuesta Lo Que Cuesta","deep-evm-3-entendiendo-gas-costes-contratos","Un desglose preciso de los costes de gas de la EVM: gas intrínseco, acceso frío\u002Fcaliente EIP-2929, mecánicas de reembolso y patrones de optimización comprobados.","## El gas como recurso computacional\n\nEl gas en Ethereum no es una tarifa arbitraria — es un sistema de precios preciso para los recursos computacionales. Cada opcode tiene un coste asignado que refleja el trabajo real del hardware: CPU para cálculos, I\u002FO de disco para acceso a almacenamiento, ancho de banda de red para propagación de datos.\n\nEntender el gas a nivel granular separa a los desarrolladores casuales de los optimizadores serios. En mercados competitivos como MEV, cada unidad de gas es margen de beneficio.\n\n## Gas intrínseco de transacción\n\nAntes de que cualquier opcode se ejecute, la transacción ya ha consumido gas:\n\n- **21,000 gas** — Coste base de cada transacción\n- **16 gas** por byte de calldata no cero\n- **4 gas** por byte de calldata cero\n- **32,000 gas** adicional si la transacción crea un contrato (CREATE)\n\nEsto significa que una simple transferencia de ETH cuesta exactamente 21,000 gas. Una llamada a función con un selector de 4 bytes y un parámetro address (20 bytes, mayormente no cero) cuesta aproximadamente 21,000 + (4 * 16) + (12 * 4) + (20 * 16) = 21,432 gas solo en gas intrínseco.\n\n## El sistema de niveles de gas\n\nLos opcodes se agrupan en niveles de coste:\n\n| Nivel | Coste | Opcodes representativos |\n|-------|-------|------------------------|\n| Cero | 0 gas | STOP, RETURN, REVERT |\n| Base | 2 gas | ADDRESS, CALLER, CALLVALUE |\n| Muy bajo | 3 gas | ADD, SUB, LT, GT, AND, OR, XOR |\n| Bajo | 5 gas | MUL, DIV, MOD |\n| Medio | 8 gas | ADDMOD, MULMOD, JUMP |\n| Alto | 10 gas | JUMPI |\n\nLos opcodes de acceso a estado son donde se concentra el coste real.\n\n## EIP-2929: Acceso frío y caliente\n\nAntes de EIP-2929, cada SLOAD costaba 800 gas sin importar cuántas veces leyeras el mismo slot. EIP-2929 cambió esto introduciendo el concepto de \"temperatura\" de acceso:\n\n- La primera lectura de un slot es \"fría\" — 2100 gas\n- Las lecturas posteriores del mismo slot son \"calientes\" — 100 gas\n- Lo mismo aplica para direcciones externas: BALANCE, EXTCODESIZE, etc.\n\nEsto creó un incentivo poderoso para cachear lecturas de storage en variables de memoria:\n\n```solidity\n\u002F\u002F Antes de EIP-2929, esto no importaba tanto:\nfunction gastoInnecesario(uint256[] calldata ids) external {\n    for (uint i = 0; i \u003C ids.length; i++) {\n        \u002F\u002F Cada iteración lee totalSupply de storage\n        require(balances[ids[i]] \u003C= totalSupply);\n    }\n}\n\n\u002F\u002F Post EIP-2929, esto ahorra significativamente:\nfunction gasOptimizado(uint256[] calldata ids) external {\n    uint256 _totalSupply = totalSupply; \u002F\u002F Frío una vez: 2100 gas\n    for (uint i = 0; i \u003C ids.length; i++) {\n        \u002F\u002F Usa variable de stack: 3 gas cada vez\n        require(balances[ids[i]] \u003C= _totalSupply);\n    }\n}\n```\n\n## Listas de acceso (EIP-2930)\n\nEIP-2930 permite declarar de antemano qué direcciones y slots de storage accederás. Esto \"pre-calienta\" esos accesos, pagando un coste reducido por adelantado:\n\n- **2400 gas** por dirección en la lista de acceso\n- **1900 gas** por slot de storage en la lista\n\nComparado con 2600 gas para una dirección fría o 2100 para un slot frío, las listas de acceso ofrecen un descuento modesto cuando sabes de antemano qué vas a acceder.\n\n## Mecánicas de reembolso\n\nHistóricamente, limpiar un slot de storage (ponerlo a cero) daba un reembolso de gas. Post EIP-3529 (London), el reembolso máximo está limitado al 20% del gas total usado:\n\n- SSTORE: establecer un slot no-cero de vuelta a cero reembolsa 4800 gas\n- SELFDESTRUCT: eliminado como fuente de reembolso\n\nEsto mató los tokens de gas (CHI, GST2) que explotaban los reembolsos para obtener beneficio.\n\n## Patrones de optimización comprobados\n\n### 1. Empaquetamiento de storage\nAgrupar variables que se leen juntas en el mismo slot de 32 bytes reduce operaciones SLOAD.\n\n### 2. Errores personalizados vs cadenas de revert\n```solidity\n\u002F\u002F Caro: almacena la cadena en el bytecode\nrequire(balance >= amount, \"Saldo insuficiente\");\n\n\u002F\u002F Barato: solo el selector de 4 bytes\nerror SaldoInsuficiente();\nif (balance \u003C amount) revert SaldoInsuficiente();\n```\n\n### 3. Unchecked blocks para aritmética segura conocida\n```solidity\n\u002F\u002F Cuando sabemos que no habrá overflow:\nunchecked {\n    for (uint256 i = 0; i \u003C length; ++i) {\n        \u002F\u002F Ahorra ~80 gas por iteración\n    }\n}\n```\n\n### 4. Calldata vs memory\nUsar `calldata` para parámetros de funciones externas evita la copia a memoria.\n\n### 5. Eventos vs storage para datos off-chain\nEmitir un evento cuesta ~375 gas por topic + 8 gas por byte de datos. Mucho más barato que escribir al storage.\n\n## Conclusión\n\nEl gas no es un impuesto — es un sistema de precios que refleja el coste real de la computación y el almacenamiento. Entender los costes a nivel de opcode, las mecánicas frío\u002Fcaliente de EIP-2929, y los patrones de optimización es esencial para construir contratos eficientes y competitivos.","\u003Ch2 id=\"el-gas-como-recurso-computacional\">El gas como recurso computacional\u003C\u002Fh2>\n\u003Cp>El gas en Ethereum no es una tarifa arbitraria — es un sistema de precios preciso para los recursos computacionales. Cada opcode tiene un coste asignado que refleja el trabajo real del hardware: CPU para cálculos, I\u002FO de disco para acceso a almacenamiento, ancho de banda de red para propagación de datos.\u003C\u002Fp>\n\u003Cp>Entender el gas a nivel granular separa a los desarrolladores casuales de los optimizadores serios. En mercados competitivos como MEV, cada unidad de gas es margen de beneficio.\u003C\u002Fp>\n\u003Ch2 id=\"gas-intr-nseco-de-transacci-n\">Gas intrínseco de transacción\u003C\u002Fh2>\n\u003Cp>Antes de que cualquier opcode se ejecute, la transacción ya ha consumido gas:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>21,000 gas\u003C\u002Fstrong> — Coste base de cada transacción\u003C\u002Fli>\n\u003Cli>\u003Cstrong>16 gas\u003C\u002Fstrong> por byte de calldata no cero\u003C\u002Fli>\n\u003Cli>\u003Cstrong>4 gas\u003C\u002Fstrong> por byte de calldata cero\u003C\u002Fli>\n\u003Cli>\u003Cstrong>32,000 gas\u003C\u002Fstrong> adicional si la transacción crea un contrato (CREATE)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Esto significa que una simple transferencia de ETH cuesta exactamente 21,000 gas. Una llamada a función con un selector de 4 bytes y un parámetro address (20 bytes, mayormente no cero) cuesta aproximadamente 21,000 + (4 * 16) + (12 * 4) + (20 * 16) = 21,432 gas solo en gas intrínseco.\u003C\u002Fp>\n\u003Ch2 id=\"el-sistema-de-niveles-de-gas\">El sistema de niveles de gas\u003C\u002Fh2>\n\u003Cp>Los opcodes se agrupan en niveles de coste:\u003C\u002Fp>\n\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>Nivel\u003C\u002Fth>\u003Cth>Coste\u003C\u002Fth>\u003Cth>Opcodes representativos\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\n\u003Ctr>\u003Ctd>Cero\u003C\u002Ftd>\u003Ctd>0 gas\u003C\u002Ftd>\u003Ctd>STOP, RETURN, REVERT\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Base\u003C\u002Ftd>\u003Ctd>2 gas\u003C\u002Ftd>\u003Ctd>ADDRESS, CALLER, CALLVALUE\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Muy bajo\u003C\u002Ftd>\u003Ctd>3 gas\u003C\u002Ftd>\u003Ctd>ADD, SUB, LT, GT, AND, OR, XOR\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Bajo\u003C\u002Ftd>\u003Ctd>5 gas\u003C\u002Ftd>\u003Ctd>MUL, DIV, MOD\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Medio\u003C\u002Ftd>\u003Ctd>8 gas\u003C\u002Ftd>\u003Ctd>ADDMOD, MULMOD, JUMP\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Alto\u003C\u002Ftd>\u003Ctd>10 gas\u003C\u002Ftd>\u003Ctd>JUMPI\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Cp>Los opcodes de acceso a estado son donde se concentra el coste real.\u003C\u002Fp>\n\u003Ch2 id=\"eip-2929-acceso-fr-o-y-caliente\">EIP-2929: Acceso frío y caliente\u003C\u002Fh2>\n\u003Cp>Antes de EIP-2929, cada SLOAD costaba 800 gas sin importar cuántas veces leyeras el mismo slot. EIP-2929 cambió esto introduciendo el concepto de “temperatura” de acceso:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>La primera lectura de un slot es “fría” — 2100 gas\u003C\u002Fli>\n\u003Cli>Las lecturas posteriores del mismo slot son “calientes” — 100 gas\u003C\u002Fli>\n\u003Cli>Lo mismo aplica para direcciones externas: BALANCE, EXTCODESIZE, etc.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Esto creó un incentivo poderoso para cachear lecturas de storage en variables de memoria:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-solidity\">\u002F\u002F Antes de EIP-2929, esto no importaba tanto:\nfunction gastoInnecesario(uint256[] calldata ids) external {\n    for (uint i = 0; i &lt; ids.length; i++) {\n        \u002F\u002F Cada iteración lee totalSupply de storage\n        require(balances[ids[i]] &lt;= totalSupply);\n    }\n}\n\n\u002F\u002F Post EIP-2929, esto ahorra significativamente:\nfunction gasOptimizado(uint256[] calldata ids) external {\n    uint256 _totalSupply = totalSupply; \u002F\u002F Frío una vez: 2100 gas\n    for (uint i = 0; i &lt; ids.length; i++) {\n        \u002F\u002F Usa variable de stack: 3 gas cada vez\n        require(balances[ids[i]] &lt;= _totalSupply);\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"listas-de-acceso-eip-2930\">Listas de acceso (EIP-2930)\u003C\u002Fh2>\n\u003Cp>EIP-2930 permite declarar de antemano qué direcciones y slots de storage accederás. Esto “pre-calienta” esos accesos, pagando un coste reducido por adelantado:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>2400 gas\u003C\u002Fstrong> por dirección en la lista de acceso\u003C\u002Fli>\n\u003Cli>\u003Cstrong>1900 gas\u003C\u002Fstrong> por slot de storage en la lista\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Comparado con 2600 gas para una dirección fría o 2100 para un slot frío, las listas de acceso ofrecen un descuento modesto cuando sabes de antemano qué vas a acceder.\u003C\u002Fp>\n\u003Ch2 id=\"mec-nicas-de-reembolso\">Mecánicas de reembolso\u003C\u002Fh2>\n\u003Cp>Históricamente, limpiar un slot de storage (ponerlo a cero) daba un reembolso de gas. Post EIP-3529 (London), el reembolso máximo está limitado al 20% del gas total usado:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>SSTORE: establecer un slot no-cero de vuelta a cero reembolsa 4800 gas\u003C\u002Fli>\n\u003Cli>SELFDESTRUCT: eliminado como fuente de reembolso\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Esto mató los tokens de gas (CHI, GST2) que explotaban los reembolsos para obtener beneficio.\u003C\u002Fp>\n\u003Ch2 id=\"patrones-de-optimizaci-n-comprobados\">Patrones de optimización comprobados\u003C\u002Fh2>\n\u003Ch3>1. Empaquetamiento de storage\u003C\u002Fh3>\n\u003Cp>Agrupar variables que se leen juntas en el mismo slot de 32 bytes reduce operaciones SLOAD.\u003C\u002Fp>\n\u003Ch3>2. Errores personalizados vs cadenas de revert\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-solidity\">\u002F\u002F Caro: almacena la cadena en el bytecode\nrequire(balance &gt;= amount, \"Saldo insuficiente\");\n\n\u002F\u002F Barato: solo el selector de 4 bytes\nerror SaldoInsuficiente();\nif (balance &lt; amount) revert SaldoInsuficiente();\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>3. Unchecked blocks para aritmética segura conocida\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-solidity\">\u002F\u002F Cuando sabemos que no habrá overflow:\nunchecked {\n    for (uint256 i = 0; i &lt; length; ++i) {\n        \u002F\u002F Ahorra ~80 gas por iteración\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>4. Calldata vs memory\u003C\u002Fh3>\n\u003Cp>Usar \u003Ccode>calldata\u003C\u002Fcode> para parámetros de funciones externas evita la copia a memoria.\u003C\u002Fp>\n\u003Ch3>5. Eventos vs storage para datos off-chain\u003C\u002Fh3>\n\u003Cp>Emitir un evento cuesta ~375 gas por topic + 8 gas por byte de datos. Mucho más barato que escribir al storage.\u003C\u002Fp>\n\u003Ch2 id=\"conclusi-n\">Conclusión\u003C\u002Fh2>\n\u003Cp>El gas no es un impuesto — es un sistema de precios que refleja el coste real de la computación y el almacenamiento. Entender los costes a nivel de opcode, las mecánicas frío\u002Fcaliente de EIP-2929, y los patrones de optimización es esencial para construir contratos eficientes y competitivos.\u003C\u002Fp>\n","es","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:31.095853Z","Desglose preciso de costes de gas EVM: gas intrínseco, acceso frío\u002Fcaliente EIP-2929, reembolsos y patrones de optimización comprobados.","EVM optimización gas",null,"index, follow",[21,26,30],{"id":22,"name":23,"slug":24,"created_at":25},"c0000000-0000-0000-0000-000000000016","EVM","evm","2026-03-28T10:44:21.513630Z",{"id":27,"name":28,"slug":29,"created_at":25},"c0000000-0000-0000-0000-000000000020","Gas Optimization","gas-optimization",{"id":31,"name":32,"slug":33,"created_at":25},"c0000000-0000-0000-0000-000000000014","Solidity","solidity","Blockchain",[36,42,48],{"id":37,"title":38,"slug":39,"excerpt":40,"locale":12,"category_name":34,"published_at":41},"d0000000-0000-0000-0000-000000000614","La capa de interoperabilidad de Ethereum: Como 55+ L2s se convierten en una sola cadena","capa-interoperabilidad-ethereum-55-l2s-una-sola-cadena","Ethereum tiene 55+ rollups Layer 2, fragmentando la liquidez y la experiencia del usuario. La capa de interoperabilidad de Ethereum — combinando mensajeria cross-rollup, secuenciadores compartidos y based rollups — busca unificarlos en una red componible unica.","2026-03-28T10:44:45.451917Z",{"id":43,"title":44,"slug":45,"excerpt":46,"locale":12,"category_name":34,"published_at":47},"d0000000-0000-0000-0000-000000000613","Pruebas ZK mas alla de los rollups: Inferencia de IA verificable en Ethereum","pruebas-zk-mas-alla-rollups-inferencia-ia-verificable-ethereum","Las pruebas de conocimiento cero ya no son solo una herramienta de escalabilidad. En 2026, zkML permite la inferencia de IA verificable on-chain, los coprocesadores ZK mueven el calculo pesado off-chain con verificacion on-chain, y nuevos sistemas de prueba como SP1 y Jolt lo hacen practico.","2026-03-28T10:44:45.446211Z",{"id":49,"title":50,"slug":51,"excerpt":52,"locale":12,"category_name":34,"published_at":53},"d0000000-0000-0000-0000-000000000590","EIP-7702 en la practica: construir flujos de cuenta inteligente despues de Pectra","eip-7702-en-la-practica-construir-flujos-cuenta-inteligente-despues-pectra","EIP-7702 permite a cualquier EOA de Ethereum actuar temporalmente como contrato inteligente en una sola transaccion. Asi se implementan transacciones por lotes, patrocinio de gas y recuperacion social con la nueva primitiva de account abstraction.","2026-03-28T10:44:43.986612Z",{"id":13,"name":55,"slug":56,"bio":57,"photo_url":18,"linkedin":18,"role":58,"created_at":59,"updated_at":59},"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"]