El costo de creación de un smart contract puede ir desde los $10 hasta los $2,000 asumiendo que el precio de ETH está entre $1,500 y $2,000. Los factores más importantes son 1) el precio de Ethereum, 2) el tamaño del contrato compilado (en bytes), 3) el precio actual del gas en la red Ethereum.
Hay un total de seis componentes que determinan la cantidad de gas requerida para desplegar el contrato. El costo del gas en dólares depende de las condiciones del mercado y las condiciones de la red. Desglosaremos todos estos números en este artículo.
Costo de despliegue de un smart contract
- Los 21,000 de gas que todas las transacciones de Ethereum deben pagar
- Un costo fijo de 32,000 de gas por crear un nuevo contrato
- 22,100 por cada variable de almacenamiento establecida
- 4 de gas por cada byte cero en los datos de la transacción, y 16 de gas por cada byte distinto de cero en la transacción.
- El costo de ejecutar cada bytecode durante la inicialización
- 200 de gas por byte de bytecode desplegado
Utilicemos un ejemplo de despliegue de un contrato de Solidity mínimo en Remix
pragma solidity 0.8.7;
contract Minimal {
constructor() payable {
}
}

costo de gas de la creación de un smart contract
Ten en cuenta que el costo de despliegue según Remix fue de 66,862. Desglosaremos este costo en este artículo.
Hemos hecho que el constructor sea payable y configuramos el optimizer a 200 ejecuciones. Esto tiene el efecto de hacer que el smart contract sea más pequeño.
Sumemos
21,000 gas | deployment
32,000 gas | creation
Total: 53,000
Todavía nos quedan 13,862 de gas por justificar
Costo de gas del bytecode de la transacción (tx.data)
El bytecode de la transacción fue
0x6080604052603f8060116000396000f3fe6080604052600080fdfea2646970667358221220c5cad0aa1e64e2ca6a6cdf28a25255a8ebbf3cdd5ea0b8e4129a3c83c4fbb72a64736f6c63430008070033
Cada par hexadecimal es un byte, así que agreguemos espacios para hacerlo más legible.
Para dividirlo de esa manera, podemos usar el siguiente código en Python
import itertools
# note that we manually removed the "0x" at the beginning
s = "6080604052603f8060116000396000f3fe6080604052600080fdfea2646970667358221220c5cad0aa1e64e2ca6a6cdf28a25255a8ebbf3cdd5ea0b8e4129a3c83c4fbb72a64736f6c63430008070033"
s = " ".join(["".join(group) for group in itertools.zip_longest(s[::2], s[1::2])])
print(s)
Obtenemos
60 80 60 40 52 60 3f 80 60 11 60 00 39 60 00 f3 fe 60 80 60 40 52 60 00 80 fd fe a2 64 69 70 66 73 58 22 12 20 c5 ca d0 aa 1e 64 e2 ca 6a 6c df 28 a2 52 55 a8 eb bf 3c dd 5e a0 b8 e4 12 9a 3c 83 c4 fb b7 2a 64 73 6f 6c 63 43 00 08 07 00 33
Cada byte distinto de cero cuesta 16 de gas, y cada byte cero (00) cuesta 4 de gas. Para contarlos, podemos usar esta línea de código en Python:
s = "60 80 60 40 52 60 3f 80 60 11 60 00 39 60 00 f3 fe 60 80 60 40 52 60 00 80 fd fe a2 64 69 70 66 73 58 22 12 20 c5 ca d0 aa 1e 64 e2 ca 6a 6c df 28 a2 52 55 a8 eb bf 3c dd 5e a0 b8 e4 12 9a 3c 83 c4 fb b7 2a 64 73 6f 6c 63 43 00 08 07 00 33"
# non-zero bytes
print(len(list(filter(lambda x: x != '00', s.split(' ')))))
# zero bytes
print(len(list(filter(lambda x: x == '00', s.split(' ')))))
Tenemos 75 bytes distintos de cero y 5 bytes cero. Las matemáticas dan como resultado de gas
21,000 gas | deployment
32,000 gas | creation
1,220 gas | bytecode cost
Total: 54,220 gas.
Tenemos 12,642 de gas por justificar para llevar el costo total a 66,862.
Código de despliegue
Miremos el bytecode de nuevo
60 80 60 40 52 60 3f 80 60 11 60 00 39 60 00 f3 fe 60 80 60 40 52 60 00 80 fd fe a2 64 69 70 66 73 58 22 12 20 c5 ca d0 aa 1e 64 e2 ca 6a 6c df 28 a2 52 55 a8 eb bf 3c dd 5e a0 b8 e4 12 9a 3c 83 c4 fb b7 2a 64 73 6f 6c 63 43 00 08 07 00 33
Las partes en negrita son el código de despliegue. La primera parte es el código de inicialización. Necesitamos multiplicar cada byte del código de despliegue por 200 de gas para obtener el costo. Esto tiene un costo más alto que el costo del bytecode anterior porque esto se almacena en el estado de Ethereum.
Hagamos eso en Python de nuevo
deployment_code = '60 80 60 40 52 60 00 80 fd fe a2 64 69 70 66 73 58 22 12 20 c5 ca d0 aa 1e 64 e2 ca 6a 6c df 28 a2 52 55 a8 eb bf 3c dd 5e a0 b8 e4 12 9a 3c 83 c4 fb b7 2a 64 73 6f 6c 63 43 00 08 07 00 33'
print(len(deployment_code.split(' ')))
# 63
de gas
Así que este es el desglose hasta ahora
21,000 gas | deployment
32,000 gas | creation
1,220 gas | bytecode cost
12,600 gas | deployed bytecode
Total: 66,820
¡Casi terminamos! Nos faltan 42 de gas para alcanzar nuestro objetivo de 66,862.
Costo de gas de la ejecución del bytecode
También necesitamos tener en cuenta la ejecución real del bytecode de inicialización.
60 80 60 40 52 60 3f 80 60 11 60 00 39 60 00 f3 fe
Podemos traducir eso a un formato más conveniente usando la herramienta evm playground.
PUSH1 0x80 | 3 gas
PUSH1 0x40 | 3 gas
MSTORE | 12 gas
PUSH1 0x3f | 3 gas
DUP1 | 3 gas
PUSH1 0x11 | 3 gas
PUSH1 0x00 | 3 gas
CODECOPY | 9 gas
PUSH1 0x00 | 3 gas
RETURN | 0 gas
INVALID | not executed
Y el total es 42, como se esperaba. Estos costos de gas se obtuvieron ejecutando el depurador de Remix.

depuración de gas en el despliegue de un smart contract
Y hemos terminado, hemos justificado cada componente del despliegue de un smart contract.
Así que aquí está el desglose final
21,000 gas | deployment
32,000 gas | creation
1,220 gas | bytecode cost
12,600 gas | deployed bytecode
42 gas | deployment execution cost
Total: 66,862 gas
Ten en cuenta que si estableciéramos variables de almacenamiento en el constructor, el costo sería mayor. Tendríamos que pagar 22,100 de gas por cada variable establecida. Pero para mantener este tutorial manejable, hemos omitido ese caso.
Consulta nuestro artículo sobre la optimización de gas en Solidity para aprender cómo reducir los costos de despliegue. Todos los números de los costos de gas obtenidos aquí provienen del Ethereum Yellow Paper.
Traduciendo a dólares
Para convertir unidades de “gas” a dólares, la fórmula es
.
El gas por gwei se puede obtener de sitios como ethgasstation o etherscan. En nuestro ejemplo, asumiendo que el ETH cuesta $1,000 y el precio del gas es de 20 gwei, el costo en dólares sería
Publicado originalmente el 31 de diciembre de 2022