¿Cómo hacer que esta función sea más eficiente con el gas?

tengo esta funcion:

function foo(uint256 _a, uint256 _b, uint256 _c) {
    require(map[msg.sender].a == 1);
    require(map[msg.sender].b < 1);
    require(map[msg.sender].c > 1);

    deposits[msg.sender].a = _a;
    deposits[msg.sender].b = _b;
    deposits[msg.sender].c = _c;
}

¿Es esto extremadamente derrochador?

¿Cómo podría hacerlo más eficiente en el consumo de combustible?

Respuestas (1)

¿Cómo podría hacerlo más eficiente en el consumo de combustible?

Puede cambiar el tamaño de los bits de su uintestructura.

Si está utilizando uint256, está utilizando un fragmento completo de 32 bytes. Si estuviera usando uint128, por ejemplo, podría incluir más datos en una sola SSTOREoperación (debido a la optimización del compilador de solidez).


Permítanme dar algunos ejemplos de consumo de gas:


Función:

function getVariables() public {
    deposits[msg.sender].a = 1;
    deposits[msg.sender].b = 1;
    deposits[msg.sender].c = 1;
}

estructura uint256

struct demo {
        uint256 a;
        uint256 b;
        uint256 c;
    }

Costo de ejecución: 60455 gas

estructura uint128

struct demo {
        uint128 a;
        uint128 b;
        uint128 c;
    }

Costo de ejecución: 46264 gas

estructura uint64

struct demo {
        uint64 a;
        uint64 b;
        uint64 c;
    }

Costo de ejecución: 31314 gas


Si el compilador de Solidity puede determinar el tamaño de las variables de la tienda, simplemente las coloca una tras otra en el almacenamiento. Si es posible, el compilador empaqueta los datos de forma compacta en fragmentos de 32 bytes.

De sumergirse en la VM de Ethereum Parte 2 .