[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-deep-evm-12-huff-avanzado-ejecucion-adaptativa":3},{"article":4,"author":59},{"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":38,"related_articles":39},"d8000000-0000-0000-0000-000000000112","a0000000-0000-0000-0000-000000000082","Deep EVM #12: Huff Avanzado — Ejecución Adaptativa y Computación On-Chain","deep-evm-12-huff-avanzado-ejecucion-adaptativa","Técnicas avanzadas de Huff: ejecución adaptativa que modifica su comportamiento basándose en el estado de la blockchain, computación on-chain optimizada y patrones para contratos que se auto-optimizan.","## Más allá de los contratos estáticos\n\nLos contratos que hemos construido hasta ahora son estáticos — su bytecode es inmutable y su lógica es fija. Pero hay un mundo de posibilidades en contratos que adaptan su comportamiento basándose en condiciones on-chain: precios de gas, estado del mempool, o datos de oráculos.\n\n## Ejecución condicional basada en gas\n\nUn bot de MEV puede ajustar su estrategia según el precio actual del gas:\n\n```huff\n#define macro ADAPTIVE_SWAP() = takes(0) returns(0) {\n    gasprice                    \u002F\u002F [gasPrice]\n    0x0BA43B7400 gt            \u002F\u002F [gasPrice > 50 gwei?]\n    modo_economico jumpi        \u002F\u002F Saltar si gas alto\n    \n    \u002F\u002F Gas bajo: ejecutar swap completo con verificaciones\n    FULL_SWAP()\n    stop\n    \n    modo_economico:\n    \u002F\u002F Gas alto: ejecutar swap mínimo sin verificaciones extras\n    MINIMAL_SWAP()\n    stop\n}\n```\n\n## Lectura eficiente de estado multi-pool\n\nPara un bot de arbitraje que lee reservas de múltiples pools:\n\n```huff\n#define macro READ_RESERVES_BATCH() = takes(0) returns(0) {\n    \u002F\u002F Leer número de pools del calldata\n    0x04 calldataload           \u002F\u002F [numPools]\n    \n    \u002F\u002F Offset inicial en calldata (después de numPools)\n    0x24                        \u002F\u002F [offset, numPools]\n    \n    loop:\n    \u002F\u002F Verificar si terminamos\n    dup2 iszero fin jumpi       \u002F\u002F [offset, remaining]\n    \n    \u002F\u002F Leer dirección del pool\n    dup1 calldataload           \u002F\u002F [poolAddr, offset, remaining]\n    \n    \u002F\u002F STATICCALL a getReserves()\n    0x0902f1ac                  \u002F\u002F [selector, poolAddr, offset, remaining]\n    0xe0 shl                    \u002F\u002F [selector\u003C\u003C224, poolAddr, ...]\n    0x00 mstore                 \u002F\u002F [poolAddr, offset, remaining]\n    \n    \u002F\u002F Preparar staticcall\n    0x40                        \u002F\u002F retSize (64 bytes: 2 uint112)\n    0x00                        \u002F\u002F retOffset\n    0x04                        \u002F\u002F argSize\n    0x00                        \u002F\u002F argOffset\n    dup5                        \u002F\u002F pool address\n    gas                         \u002F\u002F gas\n    staticcall                  \u002F\u002F [success, poolAddr, offset, remaining]\n    \n    \u002F\u002F Almacenar resultado en memoria para retorno batch\n    \u002F\u002F ...\n    \n    \u002F\u002F Avanzar\n    swap2 0x20 add swap2        \u002F\u002F [offset+32, remaining]\n    swap1 0x01 swap1 sub swap1  \u002F\u002F [offset+32, remaining-1]\n    loop jump\n    \n    fin:\n    \u002F\u002F Retornar todos los datos leídos\n}\n```\n\n## Computación de producto constante optimizada\n\nEl cálculo de amountOut en un AMM requiere multiplicación y división de enteros grandes:\n\n```huff\n\u002F\u002F amountOut = (amountIn * 997 * reserveOut) \u002F (reserveIn * 1000 + amountIn * 997)\n#define macro CONSTANT_PRODUCT() = takes(3) returns(1) {\n    \u002F\u002F Stack: [amountIn, reserveIn, reserveOut]\n    \n    \u002F\u002F Calcular numerador = amountIn * 997 * reserveOut\n    dup1 0x03E5 mul             \u002F\u002F [amountIn*997, amountIn, reserveIn, reserveOut]\n    dup4 mul                    \u002F\u002F [numerador, amountIn, reserveIn, reserveOut]\n    \n    \u002F\u002F Calcular denominador = reserveIn * 1000 + amountIn * 997\n    swap2                       \u002F\u002F [reserveIn, amountIn, numerador, reserveOut]\n    0x03E8 mul                  \u002F\u002F [reserveIn*1000, amountIn, numerador, reserveOut]\n    swap1 0x03E5 mul            \u002F\u002F [amountIn*997, reserveIn*1000, numerador, reserveOut]\n    add                         \u002F\u002F [denominador, numerador, reserveOut]\n    \n    \u002F\u002F amountOut = numerador \u002F denominador\n    swap1 div                   \u002F\u002F [amountOut, reserveOut]\n    swap1 pop                   \u002F\u002F [amountOut]\n}\n```\n\n## Verificación de overflow en Huff\n\nSin checks automáticos, debemos verificar manualmente:\n\n```huff\n#define macro SAFE_MUL() = takes(2) returns(1) {\n    \u002F\u002F Stack: [a, b]\n    dup2 dup2                   \u002F\u002F [a, b, a, b]\n    mul                         \u002F\u002F [a*b, a, b]\n    dup1                        \u002F\u002F [a*b, a*b, a, b]\n    swap2                       \u002F\u002F [a, a*b, a*b, b]\n    dup1 iszero safe jumpi      \u002F\u002F [a, a*b, a*b, b]\n    swap1 div                   \u002F\u002F [a*b\u002Fa, a*b, b]\n    dup3 eq                     \u002F\u002F [a*b\u002Fa == b, a*b, b]\n    safe jumpi\n    0x00 0x00 revert\n    \n    safe:\n    pop pop                     \u002F\u002F [a*b]\n}\n```\n\n## Patrones de auto-optimización\n\n### Caché de rutas frecuentes\nUn contrato que almacena las rutas de arbitraje más rentables y las reutiliza:\n\n```huff\n\u002F\u002F Slot 100+: caché de rutas\n\u002F\u002F Formato: [token0, token1, pool, amountMin]\n#define macro CHECK_CACHED_ROUTE() = takes(2) returns(1) {\n    \u002F\u002F Stack: [token0, token1]\n    \u002F\u002F Calcular hash de la clave del par\n    0x00 mstore\n    0x20 mstore\n    0x40 0x00 sha3              \u002F\u002F [routeKey]\n    \n    \u002F\u002F Buscar en caché\n    0x64 add sload              \u002F\u002F [cachedPool]\n    dup1 iszero                 \u002F\u002F [isEmpty, cachedPool]\n}\n```\n\n## Interacción con contratos proxy\n\nHuff puede implementar el patrón proxy EIP-1967 con overhead mínimo:\n\n```huff\n#define macro PROXY_DELEGATECALL() = takes(0) returns(0) {\n    \u002F\u002F Leer la dirección de implementación del slot EIP-1967\n    0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc\n    sload                       \u002F\u002F [impl]\n    \n    \u002F\u002F Copiar todo el calldata a memoria\n    calldatasize 0x00 0x00 calldatacopy\n    \n    \u002F\u002F Delegatecall\n    0x00                        \u002F\u002F retOffset\n    calldatasize                \u002F\u002F argSize\n    0x00                        \u002F\u002F argOffset\n    dup4                        \u002F\u002F impl\n    gas                         \u002F\u002F gas\n    delegatecall                \u002F\u002F [success]\n    \n    \u002F\u002F Copiar returndata\n    returndatasize 0x00 0x00 returndatacopy\n    \n    \u002F\u002F Retornar o revertir\n    iszero error jumpi\n    returndatasize 0x00 return\n    \n    error:\n    returndatasize 0x00 revert\n}\n```\n\n## Conclusión\n\nHuff avanzado va más allá de la simple optimización de gas — permite crear contratos que se adaptan a las condiciones on-chain, leen estado de múltiples fuentes eficientemente, y ejecutan computaciones complejas con overhead mínimo. Estas técnicas son la base de los bots de MEV más competitivos y los protocolos DeFi más eficientes del ecosistema Ethereum.","\u003Ch2 id=\"m-s-all-de-los-contratos-est-ticos\">Más allá de los contratos estáticos\u003C\u002Fh2>\n\u003Cp>Los contratos que hemos construido hasta ahora son estáticos — su bytecode es inmutable y su lógica es fija. Pero hay un mundo de posibilidades en contratos que adaptan su comportamiento basándose en condiciones on-chain: precios de gas, estado del mempool, o datos de oráculos.\u003C\u002Fp>\n\u003Ch2 id=\"ejecuci-n-condicional-basada-en-gas\">Ejecución condicional basada en gas\u003C\u002Fh2>\n\u003Cp>Un bot de MEV puede ajustar su estrategia según el precio actual del gas:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-huff\">#define macro ADAPTIVE_SWAP() = takes(0) returns(0) {\n    gasprice                    \u002F\u002F [gasPrice]\n    0x0BA43B7400 gt            \u002F\u002F [gasPrice &gt; 50 gwei?]\n    modo_economico jumpi        \u002F\u002F Saltar si gas alto\n    \n    \u002F\u002F Gas bajo: ejecutar swap completo con verificaciones\n    FULL_SWAP()\n    stop\n    \n    modo_economico:\n    \u002F\u002F Gas alto: ejecutar swap mínimo sin verificaciones extras\n    MINIMAL_SWAP()\n    stop\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"lectura-eficiente-de-estado-multi-pool\">Lectura eficiente de estado multi-pool\u003C\u002Fh2>\n\u003Cp>Para un bot de arbitraje que lee reservas de múltiples pools:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-huff\">#define macro READ_RESERVES_BATCH() = takes(0) returns(0) {\n    \u002F\u002F Leer número de pools del calldata\n    0x04 calldataload           \u002F\u002F [numPools]\n    \n    \u002F\u002F Offset inicial en calldata (después de numPools)\n    0x24                        \u002F\u002F [offset, numPools]\n    \n    loop:\n    \u002F\u002F Verificar si terminamos\n    dup2 iszero fin jumpi       \u002F\u002F [offset, remaining]\n    \n    \u002F\u002F Leer dirección del pool\n    dup1 calldataload           \u002F\u002F [poolAddr, offset, remaining]\n    \n    \u002F\u002F STATICCALL a getReserves()\n    0x0902f1ac                  \u002F\u002F [selector, poolAddr, offset, remaining]\n    0xe0 shl                    \u002F\u002F [selector&lt;&lt;224, poolAddr, ...]\n    0x00 mstore                 \u002F\u002F [poolAddr, offset, remaining]\n    \n    \u002F\u002F Preparar staticcall\n    0x40                        \u002F\u002F retSize (64 bytes: 2 uint112)\n    0x00                        \u002F\u002F retOffset\n    0x04                        \u002F\u002F argSize\n    0x00                        \u002F\u002F argOffset\n    dup5                        \u002F\u002F pool address\n    gas                         \u002F\u002F gas\n    staticcall                  \u002F\u002F [success, poolAddr, offset, remaining]\n    \n    \u002F\u002F Almacenar resultado en memoria para retorno batch\n    \u002F\u002F ...\n    \n    \u002F\u002F Avanzar\n    swap2 0x20 add swap2        \u002F\u002F [offset+32, remaining]\n    swap1 0x01 swap1 sub swap1  \u002F\u002F [offset+32, remaining-1]\n    loop jump\n    \n    fin:\n    \u002F\u002F Retornar todos los datos leídos\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"computaci-n-de-producto-constante-optimizada\">Computación de producto constante optimizada\u003C\u002Fh2>\n\u003Cp>El cálculo de amountOut en un AMM requiere multiplicación y división de enteros grandes:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-huff\">\u002F\u002F amountOut = (amountIn * 997 * reserveOut) \u002F (reserveIn * 1000 + amountIn * 997)\n#define macro CONSTANT_PRODUCT() = takes(3) returns(1) {\n    \u002F\u002F Stack: [amountIn, reserveIn, reserveOut]\n    \n    \u002F\u002F Calcular numerador = amountIn * 997 * reserveOut\n    dup1 0x03E5 mul             \u002F\u002F [amountIn*997, amountIn, reserveIn, reserveOut]\n    dup4 mul                    \u002F\u002F [numerador, amountIn, reserveIn, reserveOut]\n    \n    \u002F\u002F Calcular denominador = reserveIn * 1000 + amountIn * 997\n    swap2                       \u002F\u002F [reserveIn, amountIn, numerador, reserveOut]\n    0x03E8 mul                  \u002F\u002F [reserveIn*1000, amountIn, numerador, reserveOut]\n    swap1 0x03E5 mul            \u002F\u002F [amountIn*997, reserveIn*1000, numerador, reserveOut]\n    add                         \u002F\u002F [denominador, numerador, reserveOut]\n    \n    \u002F\u002F amountOut = numerador \u002F denominador\n    swap1 div                   \u002F\u002F [amountOut, reserveOut]\n    swap1 pop                   \u002F\u002F [amountOut]\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"verificaci-n-de-overflow-en-huff\">Verificación de overflow en Huff\u003C\u002Fh2>\n\u003Cp>Sin checks automáticos, debemos verificar manualmente:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-huff\">#define macro SAFE_MUL() = takes(2) returns(1) {\n    \u002F\u002F Stack: [a, b]\n    dup2 dup2                   \u002F\u002F [a, b, a, b]\n    mul                         \u002F\u002F [a*b, a, b]\n    dup1                        \u002F\u002F [a*b, a*b, a, b]\n    swap2                       \u002F\u002F [a, a*b, a*b, b]\n    dup1 iszero safe jumpi      \u002F\u002F [a, a*b, a*b, b]\n    swap1 div                   \u002F\u002F [a*b\u002Fa, a*b, b]\n    dup3 eq                     \u002F\u002F [a*b\u002Fa == b, a*b, b]\n    safe jumpi\n    0x00 0x00 revert\n    \n    safe:\n    pop pop                     \u002F\u002F [a*b]\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"patrones-de-auto-optimizaci-n\">Patrones de auto-optimización\u003C\u002Fh2>\n\u003Ch3>Caché de rutas frecuentes\u003C\u002Fh3>\n\u003Cp>Un contrato que almacena las rutas de arbitraje más rentables y las reutiliza:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-huff\">\u002F\u002F Slot 100+: caché de rutas\n\u002F\u002F Formato: [token0, token1, pool, amountMin]\n#define macro CHECK_CACHED_ROUTE() = takes(2) returns(1) {\n    \u002F\u002F Stack: [token0, token1]\n    \u002F\u002F Calcular hash de la clave del par\n    0x00 mstore\n    0x20 mstore\n    0x40 0x00 sha3              \u002F\u002F [routeKey]\n    \n    \u002F\u002F Buscar en caché\n    0x64 add sload              \u002F\u002F [cachedPool]\n    dup1 iszero                 \u002F\u002F [isEmpty, cachedPool]\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"interacci-n-con-contratos-proxy\">Interacción con contratos proxy\u003C\u002Fh2>\n\u003Cp>Huff puede implementar el patrón proxy EIP-1967 con overhead mínimo:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-huff\">#define macro PROXY_DELEGATECALL() = takes(0) returns(0) {\n    \u002F\u002F Leer la dirección de implementación del slot EIP-1967\n    0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc\n    sload                       \u002F\u002F [impl]\n    \n    \u002F\u002F Copiar todo el calldata a memoria\n    calldatasize 0x00 0x00 calldatacopy\n    \n    \u002F\u002F Delegatecall\n    0x00                        \u002F\u002F retOffset\n    calldatasize                \u002F\u002F argSize\n    0x00                        \u002F\u002F argOffset\n    dup4                        \u002F\u002F impl\n    gas                         \u002F\u002F gas\n    delegatecall                \u002F\u002F [success]\n    \n    \u002F\u002F Copiar returndata\n    returndatasize 0x00 0x00 returndatacopy\n    \n    \u002F\u002F Retornar o revertir\n    iszero error jumpi\n    returndatasize 0x00 return\n    \n    error:\n    returndatasize 0x00 revert\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"conclusi-n\">Conclusión\u003C\u002Fh2>\n\u003Cp>Huff avanzado va más allá de la simple optimización de gas — permite crear contratos que se adaptan a las condiciones on-chain, leen estado de múltiples fuentes eficientemente, y ejecutan computaciones complejas con overhead mínimo. Estas técnicas son la base de los bots de MEV más competitivos y los protocolos DeFi más eficientes del ecosistema Ethereum.\u003C\u002Fp>\n","es","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:31.383942Z","Técnicas avanzadas de Huff: ejecución adaptativa, lectura batch multi-pool, computación optimizada y patrones de auto-optimización.","huff avanzado ejecución adaptativa",null,"index, follow",[21,26,30,34],{"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-000000000017","Huff","huff",{"id":31,"name":32,"slug":33,"created_at":25},"c0000000-0000-0000-0000-000000000019","MEV","mev",{"id":35,"name":36,"slug":37,"created_at":25},"c0000000-0000-0000-0000-000000000013","Security","security","Blockchain",[40,47,53],{"id":41,"title":42,"slug":43,"excerpt":44,"locale":12,"category_name":45,"published_at":46},"d0000000-0000-0000-0000-000000000683","Por qué Bali se está convirtiendo en el hub de impact-tech del Sudeste Asiático en 2026","por-que-bali-hub-impact-tech-sudeste-asiatico-2026","Bali ocupa el puesto 16 entre los ecosistemas startup del Sudeste Asiático. Con una concentración creciente de constructores Web3, startups de AI sostenible y empresas de eco-travel tech, la isla se consolida como capital de impact-tech de la región.","Ingeniería","2026-03-28T10:44:49.926489Z",{"id":48,"title":49,"slug":50,"excerpt":51,"locale":12,"category_name":45,"published_at":52},"d0000000-0000-0000-0000-000000000682","El mosaico de protección de datos de ASEAN: checklist de cumplimiento para desarrolladores","mosaico-proteccion-datos-asean-checklist-cumplimiento-desarrolladores","Siete países de ASEAN tienen ahora leyes integrales de protección de datos, cada una con diferentes modelos de consentimiento, requisitos de localización y estructuras de sanciones. Un checklist práctico de cumplimiento para desarrolladores.","2026-03-28T10:44:49.919345Z",{"id":54,"title":55,"slug":56,"excerpt":57,"locale":12,"category_name":45,"published_at":58},"d0000000-0000-0000-0000-000000000681","La transformación digital de 29 mil millones de dólares de Indonesia: oportunidades para empresas de software","transformacion-digital-29-mil-millones-dolares-indonesia-oportunidades-empresas-software","El mercado de servicios IT de Indonesia alcanzará los 29.030 millones de dólares en 2026, frente a los 24.370 millones de 2025. La infraestructura cloud, la AI, el comercio electrónico y los centros de datos impulsan el crecimiento más rápido del Sudeste Asiático.","2026-03-28T10:44:49.897658Z",{"id":13,"name":60,"slug":61,"bio":62,"photo_url":18,"linkedin":18,"role":63,"created_at":64,"updated_at":64},"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"]