了解 Mantle:Solidity 系列第 1 部分

了解 Mantle:Solidity 系列第 1 部分-1

Solidity 是一種編程語言,用於在以太坊區塊鏈和其他以太坊虛擬機 (EVM)區塊鏈(包括 Mantle)上編寫智能合約。與任何編程語言一樣,Solidity 有自己的一套獨特的功能和怪癖,其中之一是存儲槽,它通常是從用戶那裡抽象出來的。

在 Solidity 中,存儲槽是指合約數據在區塊鏈上存儲的位置。這些存儲槽本質上是一個鍵值存儲,其中每個鍵是一個索引,每個值是一個 32 位元組的字。這些存儲槽可以被認為是一個 32 位元組字的數組,其中每個字都可以使用其索引進行訪問。

[0x...0000]: 0x0000000000000000000000000000000000000000000000000000000000000000[0x...0001]: 0x0000000000000000000000000000000000000000000000000000000000000000[0x...0002]: 0x0000000000000000000000000000000000000000000000000000000000000000[0x...0003]: 0x0000000000000000000000000000000000000000000000000000000000000000…[0x...FFFF]: 0x0000000000000000000000000000000000000000000000000000000000000000

當您在 Solidity 中編寫智能合約時,您聲明了合約將使用的變數。這些變數可以是不同的數據類型,例如 uint、bool、address 等。當你聲明一個變數時,Solidity 會根據它的類型和在合約中的位置自動為其分配一個存儲槽。例如,存儲中的 bool 表示為 256 位值,true 由值 1 表示,false 由值 0 表示。

0x0000000000000000000000000000000000000000000000000000000000000000: true0x0000000000000000000000000000000000000000000000000000000000000000: false

例如,如果您將名為「myNumber」的 uint 變數聲明為合約中的第一個變數,Solidity 將為它分配第一個存儲槽,其索引為 0。如果您將另一個名為「myOtherNumber」的 uint 變數聲明為第二個變數,Solidity 將為其分配第二個存儲槽,其索引為 1。

contract MyContract { uint myNumber; // Slot 0 uint myOtherNumber; // Slot 1}

重要的是要注意,Solidity 將始終按照變數在合約中聲明的順序分配存儲槽。這意味著如果您稍後聲明另一個變數,它將被分配到下一個可用的存儲槽,該存儲槽可能與前一個變數的存儲槽不連續。這是需要注意的重要事項,特別是如果您要升級代理合約,因為它可能會產生不可逆轉的結果。避免這種情況的一種方法是在單個文件中聲明所有變數,並且  附加一個變數列表。

您還可以手動覆蓋/訪問存儲槽中存儲的數據,您需要通過 SSTORE 和 SLOAD 操作碼通過內聯彙編調用它。例如:

function getStorageValue(uint slot) public view returns (uint256 result) { assembly { result := sload(slot) } }function setStorageValue(uint slot, uint value) public { assembly { sstore(slot, value) } }

總之,Solidity 中的存儲槽是一種在區塊鏈上存儲合約數據的方式。它們本質上是一個鍵值存儲,其中每個鍵都是一個索引,每個值都是一個 32 位元組的字。通過巧妙的編碼,人們甚至可以在一個存儲槽中存儲大量數據以節省 gas 😉

提示:投資有風險,入市需謹慎,本資訊不作為投資理財建議。請理性投資,切實提高風險防範意識;如有發現的違法犯罪線索,可積極向有關部門舉報反映。
你可能還喜歡