了解 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 😉

提示:投资有风险,入市需谨慎,本资讯不作为投资理财建议。请理性投资,切实提高风险防范意识;如有发现的违法犯罪线索,可积极向有关部门举报反映。
你可能还喜欢