Solidity-struct Gas优化(1)

本文探讨了Solidity中结构体的两种初始化方式及其在智能合约中的Gas消耗对比。通过测试不同的初始化函数,发现直接赋值方式与逐字段设置的方式在Gas消耗上存在差异。建议在更新状态变量时,先声明storage变量并逐字段设置,以优化Gas效率。
摘要由CSDN通过智能技术生成

结构体

Remix 测试

状态变量两种初始化

Data public _data0 = Data(123, 456, true);
Data public _data1 = Data({
	tokenId: 123, 
	price: 456, 
	state: true
});

Gas消耗对比

各initialize函数传参不同。

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

contract TestStruct {
    struct Data {
        uint256 tokenId;
        uint256 price;
        bool state;
    }

    mapping(uint256 => Data) public Datas;

    Data public _data0 = Data(123, 456, true);
    Data public _data1 = Data({tokenId: 123, price: 456, state: true});

    constructor() {}

    //88271 gas
    function initialize(uint256 tokenId) external {
        Datas[tokenId] = Data(tokenId, 123, true);
    }

    //88158 gas
    function initialize1(uint256 tokenId) external {
        Data storage data = Datas[tokenId];
        data.tokenId = tokenId;
        data.price = 123;
        data.state = true;
    }

    //88302 gas
    function initialize2(uint256 tokenId) external {
        Datas[tokenId].tokenId = tokenId;
        Datas[tokenId].price = 123;
        Datas[tokenId].state = true;
    }

    //88579 gas
    function initialize3(uint256 tokenId) external {
        Data memory data = Datas[tokenId];
        data.tokenId = tokenId;
        data.price = 123;
        data.state = true;
        Datas[tokenId] = data;
    }
}
initialize188158 gas
initialize88271gas
initialize288302 gas
initialize388579 gas

(初始化或更新)建议

先声明storage变量,接收状态变量。

Data storage data = Datas[tokenId];
data.tokenId = tokenId;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值