Cómo minimizar el consumo de gas durante la creación del contrato

Tengo problemas para implementar un contrato en la red principal y creo que esto se debe al alto consumo de gas. Una versión anterior del contrato funcionaba en la red principal. La versión actual funciona en mi red de prueba privada (creada con geth --dev). En la red de prueba, estas creaciones de contratos utilizan alrededor de 2,4 millones de unidades de gas. Intenté implementarlo en la red principal con 2 millones de gasolina al principio y obtuve una excepción de falta de gasolina (sin embargo, TA se extrajo, la creación del contrato simplemente no tuvo éxito).

Después de eso lo probé con 3 millones y obtuve esto (no extraído):

"{"jsonrpc":"2.0","error":{"code":-32010,"message":"Transaction cost exceeds current gas limit. Limit: 2200000, got: 3000000. Try decreasing supplied gas.","data":null},"id":1}[\n]"

Estoy completamente atascado y no tengo idea de cómo puedo implementar mi contrato ahora. Principalmente tengo dos preguntas:

  1. ¿Por qué puedo enviar un TA con 2,4 millones de gas a la red de prueba pero no a la red principal? Sé que son cadenas diferentes, pero ¿no debería usar la misma lógica para la validación de TA? ¿Cómo puedo enviar TA con límite de gas de 3mill a la red principal?
  2. No entiendo por qué mi contrato requiere tanta gasolina. Son solo 264 líneas de código. Son tres asignaciones, dos estructuras, cinco enumeraciones, un evento y algunas funciones relativamente simples. ¿Cómo puedo saber qué parte de mi contrato está consumiendo tanta gasolina? ¿Hay una herramienta para eso?

Respuestas (1)

La razón por la que geth se niega a enviar la transacción es porque el límite de gas del bloque varía . En una red de prueba privada, puede ser cualquier cosa, pero por defecto serán 5,5 millones. En la red principal, actualmente son solo 2 millones, por lo que una transacción de gas de 3 millones no encajaría en absoluto. Esto se debe a los recientes ataques de spam en la red: los desarrolladores pidieron a los mineros que redujeran el límite y lo hicieron. Con suerte, los mineros lo volverán a aumentar al valor predeterminado después de la bifurcación entrante. (Digo "con suerte" porque es la decisión de los mineros, los desarrolladores solo pueden sugerir).

Las únicas cosas que usan gas en el momento de la creación son lo que sucede en el constructor y el tamaño del código compilado en sí. Es posible que pueda reducir el tamaño activando el optimizador, pero es muy posible que ya esté activado.

Sin embargo, no estoy tan sorprendido por la cifra que está dando. 264 LoC es en realidad mucho en Ethereum. Tengo un contrato de LoC de 400 ~ que está optimizado para 3 ~ millones de gas .

Hay tres formas de reducir el costo del gas:

  1. Simplificar el contrato. Esto podría ser imposible, dependiendo de lo que estés haciendo exactamente.
  2. Dividirlo en varios contratos.
  3. Refactorícelo para usar bibliotecas . Si usa muchas estructuras y asignaciones, esto puede hacer que su código sea notablemente más legible.

La forma más sencilla puede ser simplemente esperar. No eres el único que está atascado con grandes contratos, por lo que los mineros tienen un incentivo para aumentar el límite de gasolina nuevamente, y pronto.

ok, eso realmente hace las cosas mucho más claras. ¿Cómo implementó su contrato con 3mill? Anteriormente intenté dividirlo en varios contratos, pero tuve algunos problemas y decidí dejarlo como si fuera solo un prototipo de cajero automático. Simplifiqué mi contrato a alrededor de 2,05 mill de gas y lo envié con un límite de 2,15 mill. Pero cuando miro etherscan, todos los bloques tienen un límite de 2 millones. ¿Mi TA tiene la posibilidad de ser minado en las próximas 24 horas o necesito absolutamente ir por debajo de 2 millones?
De hecho, nunca implementé dicho contrato gigante en la red principal, pero dividí una gran parte en una biblioteca. En, re: límite de gas, es poco probable que mejore dentro de las 24 horas, particularmente cuando la próxima bifurcación es inminente. Sospecho (pero no tengo garantía) que dentro de unos días los mineros comenzarán a aumentar su objetivo de límite de gas.
De hecho, reduje mi contrato al mínimo (ya que es solo un prototipo) a alrededor de 200 LoC. En la testnet desplegó con alrededor de 1.995 millones de gas. ¡Usé ese código de bytes de esa implementación y aún obtuve una excepción de falta de combustible! :-( Supongo que tengo que intentar algo más. Cuanto más tiempo trabaje en esto, más tiempo creo que le tomará a Ethereum estar listo para el mercado real, en este momento calculo diez años.