Solidity-struct Gas优化(1)

结构体

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;
    }
}
initialize1 88158 gas
initialize 88271gas
initialize2 88302 gas
initialize3 88579 gas

(初始化或更新)建议

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

Data storage data = Datas[tokenId];
data.tokenId = tokenId;

猜你喜欢

转载自blog.csdn.net/weixin_43405220/article/details/121479687
gas