簡體   English   中英

鑽頭操作員和堅固性節省氣體

[英]Bit operators and gas saving on solidity

一個月前我才開始研究可靠性,我正在嘗試了解並運行一些關於減少氣體消耗的測試。 我讀過這篇文章( https://medium.com/@novablitz/storing-structs-is-costing-you-gas-774da988895e ),這似乎是一種減少存儲/讀取調用次數的超級有趣的方法,但是當我試試這個,我得到了完全不同的結果。 不確定我是否做錯了事情,或者是否 Solidity 最近更新了位運算符,但它似乎沒有工作。 使用solidity 0.8.9版本。

我的代碼:

uint224 entryRange = uint224(uint160(msg.sender));
entryRange |= ref.entryCount<<160;
entryRange |= (ref.entryCount + amount)<<192;
ref.raffleEntries.push(entryRange);

entryCount 是一個 uint32,所以如果我理解正確,地址占用 160 個字節,所以可以轉換為 uint160,每個 uint32 總共是 32 個字節,我需要 224 個字節。 所以 uint224 應該足以適合我的數據。

我的閱讀如下:

console.log(address(uint160(entryRange)));
console.log(uint32(entryRange>>160));
console.log(uint32(entryRange>>192));

結果是,地址被很好地讀取,但兩個 uint 始終為 0。我試圖將控制台日志放在存儲中,我注意到結果沒有改變,所以:

    uint224 entryRange = uint224(uint160(msg.sender));
    console.log(entryRange);
    entryRange |= ref.entryCount<<160;
    entryRange |= (ref.entryCount + amount)<<192;
    ref.raffleEntries.push(entryRange);
    console.log(entryRange);

這輸出了兩倍相同的值,幾乎就像 |= 根本沒有做任何事情,或者 console.log 只是由於某些原因而獲取結果......如果有的話? 即使我相信在孤獨中情況並非如此。

無論如何,在讀取時我得到 0 為 uints 和一個正確的地址。 有什么想法可能是這里的問題嗎?

謝謝,若昂。

我希望你能解決這個問題。 如果不是,entryCount 需要在左移之前轉換為 uint224。 否則,這就像將一個 4 位數字移動 4 次或更多次。

1101 << 4:
1010
0100
1000
0000

如您所見,移動 4 次后所有信息都丟失了。 當將 entryCount 移動 160 或 192 次並且 entryRange 與 0 進行按位或運算時,也會發生同樣的情況,但沒有任何效果。 這就是 entryRange 只有地址信息的原因。

entryRange |= uint224(ref.entryCount)<<160;
entryRange |= uint224(ref.entryCount + amount)<<192;

這應該可以解決其他兩個 uint 為 0 的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM