Как сделать эту функцию более газосберегающей?

У меня есть эта функция:

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;
}

Это очень расточительно?

Как сделать его более экономичным?

Ответы (1)

Как сделать его более экономичным?

Вы можете изменить размер битов вашей uintструктуры.

Если вы используете uint256, вы используете весь 32-байтовый фрагмент. Если бы вы использовали uint128, например, вы могли бы поместить больше данных в одну SSTOREоперацию (из-за оптимизации компилятора Solidity).


Приведу несколько примеров потребления газа:


Функция:

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

структура uint256

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

Стоимость исполнения: 60455 газа

структура uint128

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

Стоимость исполнения: 46264 газа

структура uint64

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

Стоимость исполнения: 31314 газа


Если компилятор Solidity может вычислить размер переменных хранилища, он просто выкладывает их одну за другой в хранилище. Если возможно, компилятор плотно упаковывает данные в куски по 32 байта.

Из погружения в виртуальную машину Ethereum, часть 2 .