У меня есть эта функция:
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;
}
Это очень расточительно?
Как сделать его более экономичным?
Как сделать его более экономичным?
Вы можете изменить размер битов вашей 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 байта.