Solidez: ¿Cómo podría disminuir el uso de gas de estructuras complejas?

La estructura es muy costosa como se indica aquí: parece extremadamente costosa cuando se almacena el tipo de estructura.

https://www.cryptocompare.com/coins/guides/what-is-the-gas-in-ethereum/ :

sstore 100 Pagado por una operación SSTORE normal (duplicado o renunciado a veces).

[P] ¿Qué decidió duplicarlo?

Por ejemplo, tengo la siguiente estructura definida dentro de una biblioteca: la siguiente operación en el interior insert()cuesta casi 150,000 de gas . Almacenando string, uinty bytebajo la estructura.

lib.sol

library Lib {
  struct job {
    string      hash;  // string hash_index_folderType;
    uint       index;  //
    byte  folderType;  //
  }
}

Ejemplo.sol

import "./Lib.sol"
contract Example{
   using Lib for Lib.data;
   function insert( string key, byte folderType ){
     uint currentIndex = cluster.jobStatus[jobKey].length;
     cluster.submittedJobs.push( Lib.job({hash: key, index: 
   currentIndex, folderType: folderType }) );
  }
}

Sé que almacenar datos es la operación más costosa en un contrato inteligente.

Pero como sabemos, el éter sigue aumentando (pasó de 50 $ a 240 $, lo que significa que el costo de la memoria aumentó 5 veces) y el precio del almacenamiento también aumenta rápidamente para los clientes, ya que el precio de la minería no disminuye. Así que estoy buscando la forma más compacta y eficiente de usar la memoria.

=> Mientras ether aumentaba, ¿por qué el precio del gas no disminuye para la memoria?

[P] Mi pregunta está relacionada con el lugar de almacenamiento structdentro de la biblioteca y si lo almaceno en el mismo archivo que insert()existe, ¿disminuye el uso de gas? Si no es así: ¿es una buena idea combinar todas las variables agregándolas a una cadena y almacenarlas como una variable de cadena única en lugar de una estructura? ¿Podría ayudar a disminuir el uso de gas?

Como ejemplo:

import "github.com/Arachnid/solidity-stringutils/strings.sol";
string hash_index_folderType = key.toSlice().concat(currentIndex.toSlice().concat(folderType.toSlice());

Respuestas (1)

  1. El costo de operación del gas puede depender de sus parámetros. Por ejemplo, escribir en un almacenamiento algunos datos distintos de cero cuesta una cantidad diferente de gas que escribir datos cero, además, si vacía datos distintos de cero, incluso se le reembolsará con gas.
    Precios de gasolina actualizados.
    Por cierto, almacenar una cadena de longitud variable en una estructura no es la mejor idea.
  2. Parece que la razón es que todos usan el precio predeterminado del gas sugerido por los clientes de Ethereum como niebla o paridad, por lo que el "mercado" de transacciones está superpoblado con transacciones de alto precio del gas.
    El único propósito del precio del gas es medir el costo del minero para procesar su transacción, por lo que está completamente determinado por los mineros. Hoy en día, la mayor parte de la recompensa de los mineros proviene de la recompensa por bloque (5 ETH) y a los mineros realmente no les importan las tarifas de transacción. Debido a la recompensa, la minería sería económicamente rentable incluso si el precio del gas se establece en 0. Y no existe una conexión real entre el precio ETH/USD y los costos de operación de transacción. Por lo tanto, es muy poco probable que el precio baje hasta que se adopte el algoritmo de consenso de prueba de participación o cambie la forma en que se calcula el precio sugerido por los clientes.