¿Cuál es el precio real de implementar un contrato en Mainnet?

Estoy tratando de implementar un contrato en la red principal, pero he tenido algunos problemas al implementar con Truffle.

➜  ballot git:(master) ✗ truffle migrate --network mainnet --dry-run
Using network 'mainnet' (dry run).

Running migration: 1_initial_migration.js
  Deploying Migrations...
Error encountered, bailing. Network state unknown. Review successful transactions manually.
sender doesn't have enough funds to send tx. The upfront cost is: 670197500000000000 and the sender's account only has: 120000000000000000

Según este error, implementar el contrato costaría 0,67 ETH (~US$750). Encuentro esto muy difícil de creer.

¿La complejidad del código influye en el precio de implementación? No estoy seguro de qué más sería.

Parece que Truffle está pidiendo un precio de gasolina ridículo para pagar por implementar el contrato. Intenté ajustar la configuración de gasPrice en truffle.js a algo más bajo (21 Gwei), pero nada cambia. Todavía no estoy seguro de por qué sucede eso.
Puede usar remix para estimar el costo de transacción de su contrato. E incluso desplegar el contrato de remix.
Si el nodo Ethereum estima que el costo del gas es el costo máximo de gas por bloque, generalmente significa que su código es defectuoso de alguna manera y causaría un salto no válido (requerir(), lanzar o alguna otra forma de excepción)

Respuestas (5)

El costo de su implementación se basa en 5 cosas, con una sexta que afecta el costo estimado de la implementación:

  1. La tarifa plana de 32k de gas. El código de operación CREATE, que se llama durante la creación del contrato, cuesta un gas fijo de 32k. Por supuesto, esto se suma al gas de 21k de un tx normal. Nota: Durante la creación del contrato desde un EOA (dirección sin contrato), el código de operación CREAR no se llama explícitamente. El valor de retorno del tx en realidad se usa para crear el contrato, pero la tarifa fija de 32k es la misma.

  2. La cantidad de bytecode en el contrato compilado. Más bytecode significa más almacenamiento, y cada byte cuesta 200 de gas. Esto se suma muy rápidamente. Tenga en cuenta que los contratos principales heredados también se incluyen en el código de bytes.

  3. Los datos de transmisión. Todo el código de bytes que envía como datos tx cuesta 68 para bytes distintos de cero y 4 para bytes cero.

  4. El código que se ejecuta antes de la creación del contrato, por ejemplo, el constructor del contrato. Si el constructor requiere muchos cálculos para generar el código de bytes, entonces será más costoso. Nota: Pagará por las escrituras/lecturas estatales que ocurran en su constructor aquí, y pueden ser costosas

  5. El precio de la gasolina. Cuanto mayor sea el precio de la gasolina que utilice, mayor será su costo. Visite ethgasstation.info para obtener buenos precios de gasolina para usar ahora mismo. Al momento de escribir, 2 gwei es un precio de gasolina rápido para usar.

  6. Límite de gases. Deje que cualquier herramienta que esté utilizando para la implementación calcule esto por usted y luego aumente un poco. Devolverá el gas no utilizado, pero solo asegúrese de suministrar al menos la cantidad de gas que necesita o fallará y aún tendrá que pagar por el gas.

En general, si estuviera implementando un contrato con un constructor simple y 5k bytes de código de bytes compilado, estaría pagando aproximadamente:

CREAR 32k

Texas 21k

CÓDIGO DE CONTRATO 5k*200

BYTES DE TX DISTINTOS DE CERO ESTIMADOS 5.5k*(.95*68)

BYTES CERO TX ESTIMADOS 5.5k*(.05*4)

CONSTRUCTOR 1k

Esto equivale a ~1,41 millones de gasolina, que es menos de $5 USD en este momento. Los precios de la gasolina eran 20 veces superiores a lo que son ahora hace un par de semanas, por lo que podría haber pagado $100 por la misma creación de contrato.

Puede leer más sobre los costos basados ​​en código de bytes en el papel amarillo

Si necesita ayuda para optimizar los contratos, estaría dispuesto a ayudarlo, pero no de forma gratuita.

Editar: se agregó el n. ° 3 entre el n. ° 2 y el n. ° 4

Edición 2: números fijos y matemáticas posteriores para costos de txdata distintos de cero (64 => 68)

Si su contrato cuesta tanto, entonces debe estar haciendo un montón de inicialización de almacenamiento. El almacenamiento, con diferencia, es el que más cuesta leer/escribir.

La ironía de Solidity es que cuesta menos rehacer las cosas en la memoria, por lo que si tiene algunas variables, puede reiniciar y recalcular. Probablemente sea mejor hacerlo en la memoria cada vez que se llame a un método de contrato.

Debe probar su proceso de implementación en una red privada o probar la red a fondo antes de probar la red principal. Estoy probando el mío en Rinkeby porque el límite de gas del bloque Ropsten es demasiado bajo.

En mi experiencia, la configuración de gasPrice en truffle.js es efectiva. He implementado con éxito mis contratos usando la siguiente sintaxis:

    geth_mainnet: {
      host: "127.0.0.1",
      port: 8545, // geth-mainnet
      network_id: "1",
      gasPrice: 2000000000, // 2 GWei
      from: "0x...your-address-goes-here..."
    }

Ver 2'505'437 Gas * 2 Gwei = $6 y 5'435'035 Gas * 2 Gwei = $13 .

Advertencias de pareja:

  • Asegúrese de que su cuenta tenga fondos suficientes no solo para la implementación de su contrato inteligente, sino también para la implementación del contrato de migración de truffle y las llamadas a ese contrato.
  • Si usa gasPrice bajo, es mejor que se asegure de que la red principal no esté demasiado ocupada, consulte https://ethgasstation.info/ . Si su transacción no tiene suficiente prioridad y no se extrae en 50 bloques, truffle/web3 expirará. Dependiendo de qué tan lejos se encuentre en el proceso de migración de trufas, es posible que la implementación de su contrato real aún esté en curso y finalice con éxito, pero la dirección del contrato no se registrará en build/.

Esta no es la respuesta a la pregunta, pero me gustaría agregar esto a las respuestas anteriores.

Cuando realiza su transacción, el cliente de Ethereum calcula cuánto costaría la transacción si la transacción utiliza todo el gas proporcionado hasta el límite de gas.

Por lo tanto, si tiene el límite de gasolina establecido en 6,700,000y el precio de la gasolina establecido en 20 gwei, entonces el cliente requerirá que tenga al menos 0.134 ETHen su billetera. No estoy seguro de si es posible deshabilitar esta verificación.

Puede intentar reducir el límite de gas para sus transacciones o el precio del gas, pero esto causaría un tiempo de confirmación más largo

Mi enfoque es:

  1. Implemente en una red de prueba como ropsten y observe el gas utilizado
  2. Vaya a https://web3-tools.com/ y escriba el gas para retrocalcular el gas requerido en USD

Como la respuesta aceptada, mi contrato básico era de unos 1.400.000 (frente a 21.000) por un traspaso

Divulgación: escribí web3-tools.com