gas優(yōu)化:使用storage臨時存儲避免重復(fù)索引

在比較下面合約中的兩個方法時:

contract MyTest {
    uint256 public nonce = 0;
    mapping(address => mapping(uint256 => MyStruct)) public getStructByNonceByAccount;

    constructor(uint256 value_, bool isTrue_) {
        MyStruct memory _myStruct;
        _myStruct.account = msg.sender;
        _myStruct.value = value_;
        _myStruct.isTrue = isTrue_;

        getStructByNonceByAccount[msg.sender][nonce] = _myStruct;

        nonce++;
    }

    function getMyStructAttributes() external view returns(address, uint256, bool) {
        address account = getStructByNonceByAccount[msg.sender][0].account;
        uint256 value = getStructByNonceByAccount[msg.sender][0].value;
        bool isTrue = getStructByNonceByAccount[msg.sender][0].isTrue;

        return (account, value, isTrue);
    }

    function getMyStructAttributesWithTempStorage() external view returns(address, uint256, bool) {
        MyStruct storage myStruct = getStructByNonceByAccount[msg.sender][0];
        address account = myStruct.account;
        uint256 value = myStruct.value;
        bool isTrue = myStruct.isTrue;

        return (account, value, isTrue);
    }
}
函數(shù) 寫入類型 gas消耗量
getMyStructAttributes 重復(fù)索引 7528
getMyStructAttributesWithTempStorage 以storage變量為中繼 7291

可以發(fā)現(xiàn)第二個方法 getMyStructAttributesWithTempStorage()更節(jié)約gas。原因如下:

在第一個方法 getMyStructAttributes() 中,我們在每次調(diào)用該函數(shù)時都要使用 getStructByNonceByAccount()函數(shù)查詢映射中的值,并將其存儲在新的變量中。這意味著我們需要進行多次映射查詢多次變量分配,從而增加了燃氣成本。

而在第二個方法 getMyStructAttributesWithTempStorage()中,我們首先將 MyStruct 變量存儲在一個Storage變量中,然后使用該Storage變量進行映射訪問和屬性查詢。這減少了映射訪問和變量分配的次數(shù),從而減少了燃氣成本。

因此,第二個方法更節(jié)約gas。雖然節(jié)約的gas有限,但是第二種方法能使得代碼更為簡潔,因此很鼓勵使用。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容