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.
El costo de su implementación se basa en 5 cosas, con una sexta que afecta el costo estimado de la implementación:
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.
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.
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.
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
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.
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:
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,000
y el precio de la gasolina establecido en 20 gwei
, entonces el cliente requerirá que tenga al menos 0.134 ETH
en 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:
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
V. Kartoplya
Prashant Prabhakar Singh
mikko ohtamaa