SOL:深入Solidity数据存储位置——Storage_COM

这是深入Solidity数据存储位置系列的另一篇。在今天的文章中,我们将更详细地介绍EVM中的一个重要数据位置:存储。

我们将看到合约存储的布局是如何工作的,storage引用。我们还将使用OpenZeppelin和Compound中的一些合约来学习storage引用在实践中如何工作,同时顺便学习这些流行合约和协议背后的Solidity代码。

目录

介绍

存储的布局

存储器的基础知识

与存储交互

函数参数中的存储指针

函数体中的存储指针

读取存储的成本。

结论

介绍

了解以太坊和基于EVM的链中的存储模型对于良好的智能合约开发至关重要。

你可以在智能合约上永久地存储数据,以便将来执行时可以访问它。每个智能合约都在自己的永久存储中保持其状态。它就像*"智能合约的迷你数据库"*,但与其他数据库不同,这个数据库是可以公开访问的。所有存储在智能合约存储器中的值可供外部免费读取,无需向区块链发送交易。

然而,向存储空间写入是相当昂贵的。事实上,就Gas成本而言,它是EVM中最昂贵的操作。存储的内容可以通过sendTransaction调用来改变。这种调用会改变状态。这就是为什么合约变量被称为状态变量的原因。

需要记住的一件事是,在以太坊和EVM的设计中,一个合约既不能读也不能写非自身定义的任何存储。合约A可以从另一个合约B的存储中读取或写入的唯一方法是当合约B暴露出使其能够这样做的函数。

存储的基本原理

智能合约的存储是一个持久的可读可写的数据位置。意思是说,如果数据在一次交易中被写入合约存储,一旦交易完成,它就会持久存在。在这个交易之后,读取合约存储将检索到之前这个交易所写入/更新的数据。

云南省委宣传部副部长:深入推进区块链与各行业领域的深度融合:8月25日,云南省委宣传部副部长、省新闻出版(版权)局局长杨润,市委常委、市委宣传部部长徐晓梅率队到五华区调研“区块链 ”大文创产业建设情况。云南省区块链中心成立了产业联盟,数十家国内外企业加入,以商招商的产业氛围日渐浓厚。中心成立一年以来,以成熟领先的区块链技术助力数字云南发展。上线云南区块链平台,为企业快速部署应用提供极大便利。杨润表示,五华区要按照“以应用换市场、以市场换产业”思路,以区块链技术应用为突破口,强化政策引领,加大招商引资力度,引进国内外优秀企业落地园区,聚焦场景应用,深入推进区块链与各行业领域的深度融合,把五华区打造成区块链技术应用试验场、产业发展聚集区。(五华区委宣传部)[2021/8/30 22:46:23]

每个合约都有自己的存储,可以用以下规则来描述和绑定:

持有状态变量

在交易和函数调用之间持久存在

读取是免费的,但写入是昂贵的

合约存储在合约构建期间被预先分配。

驻留在存储中的变量在Solidity中被称为状态变量。

你应该记住关于合约存储的唯一事情是:

存储是持久保存和昂贵的!

将数据保存到存储中是EVM中需要最多的Gas的操作之一。

写入存储的实际成本是多少?

成本并不总是相同的,计算写入存储的Gas是相当复杂的公式,尤其是在最新的以太坊2

所有静态大小的变量都是按照它们被定义的顺序依次放入存储槽的。

记住:每个存储槽最多可以容纳32字节长的值。

在我们上面的例子中,a和b是32字节长。因此,它们被分配了自己的存储槽。

将状态变量打包在一个存储槽中

高鸿股份:公司正在深入研究可信计算在区块链的应用:高鸿股份在互动平台表示,公司正在深入研究可信计算在区块链的应用,可信计算可以有效提高区块链节点设备的安全,并保护底层软件不被渗透和篡改。公司计划为区块链产业提供以可信计算为核心的安全加固技术支持。(财联社)[2021/4/19 20:36:09]

在我们之前的例子中没有什么特别之处。但是现在让我们考虑这样的情况:你有几个不同大小的uint变量,如下所示:

pragma?solidity?^0

它的存储布局会是这样的:

因此,一个变量的"地址"由两个部分组成。

槽号:变量所在的位置。

变量开始的字节偏移量。

让我们继续看一些基本的汇编代码,以便更好地理解。看看下面的合约和它的函数:

contract?Storage?{??uint64?a?=?1;??uint64?b?=?2;??uint128?c?=?3;function?getSlotNumbers()?public?view?returns(uint256?slotA,?uint256?slotB,?uint256?slotC)?{????assembly?{????slotA?:=?a.slot??????slotB?:=?b.slot??????slotC?:=?c.slot????}}??function?getVariableOffsets()?public?view?returns(uint256?offsetA,?uint256?offsetB,?uint256?offsetC)?{??assembly?{??????????offsetA?:=?a.offset????????????offsetB?:=?b.offset????????????offsetC?:=?c.offset????????}}}

声音 | 王天宇:打造银企协同平台 深入拓展人工智能、区块链等的应用:据证券日报消息,10月19日,2019第四届中国物流与供应链金融峰会暨第三届中国商贸物流银行联盟峰会在郑州举行。中国商贸物流银行联盟主席王天宇表示:“我们联盟有银行、有电商平台,有行业的龙头,汇聚了金融商贸的领军企业,今后共同打造银企的协同平台,免费为联盟平台提供金融服务科技,深入拓展人工智能、区块链、大数据、物联网等的应用,加速金融科技赋能,创新商业模式和业态,发挥联盟成员互补优势,加快信息流、商流、物流、资金流的四流合一,融合发展互利共赢。”[2019/10/20]

通过Remix运行这两个函数可以得到以下输出:

要检索变量c所指向的槽,使用c.slot,要检索字节偏移量,使用c.offset。仅使用c本身会导致错误:

function?ReadVariableC()?public?view?returns?(uint64?value)?{assembly?{????????value?:=?sload(c)????}}

上面的代码将不会被编译,并会出现以下错误

有一点也要提到的是,在内联汇编中,你不能向存储变量的.slot或.offset赋值:

function?doesNotCompile()?public?{????assembly?{????????a.slot?:=?8????????a.offset?:=?9????}}

动态 | 北大光华成立金融科技联合实验室 向区块链等五大领域深入研究:10月12日,北京大学光华管理学院与度小满金融宣布合作成立金融科技联合实验室,并在北京大学为实验室揭牌。联合实验室主任刘晓蕾表示实验室将围绕数字化资产配置、超大规模关联网络、在线机器人、监管科技、区块链技术等五大领域深入研究,积极探索前沿技术在金融场景中的应用,同时推动跨学科人才的培养和输出。[2018/10/12]

solc编译器的错误报告

Yul中存储指针的偏移量的值是多少呢?在函数体中,一些变量可以是存储指针/存储引用。例如,这包括struct、array和mapping。对于这样的变量,在Yul中.offset总是为零,因为这样的变量总是占据了一个完整的存储槽,不能与其他变量紧密地挤在一起存储。

结论

智能合约的存储空间,无论是初始化还是修改里面的数据,都要付出高昂的代价。虽然从合约存储中读取数据是免费的,但如果这些读取操作是改变状态的交易的一部分,我们还是应该考虑到向智能合约的存储读取时的Gas成本。

由于对存储的操作有很高的Gas成本,Solidity文档中指出了一个重要的考虑。

应该将你存储在持久性存储中的内容减少到合约运行所需的程度。

建议尽可能地将某些数据存储在合约存储之外,以减少相关的Gas成本。

参考资料

深入以太坊,Part2

Solidity文档:状态变量在储存中的布局g

openzeppelin-contracts/StorageSlot.sol

Solidity中的数据表示

Binance Labs主管Christy Choi:正与对区块链和加密货币有深入见解的基金进行合作:今日Binance Labs主管Christy Choi在reddit的Ask Me Anything环节表示,币安生态系统基金的目的是确定和支持对整个生态系统产生持久影响的项目。因此目前正在与关心整个行业、对投资负责、对区块链和加密货币有深入见解的基金进行合作。只要关心生态系统并建立一个健康的产业,BNB最终会变得更好。[2018/6/7]

了解以太坊智能合约的存储

解剖智能合约的结构--功能、数据和变量

译文出自:登链翻译计划译者:翻译小组?校对:Tiny熊

本翻译由DuetProtocol赞助支持。

原文链接:https://betterprogramming.pub/all-about-solidity-data-locations-part-i-storage-e50604bfc1ad

参考资料

登链翻译计划:https://github.com/lbc-team/Pioneer

翻译小组:https://learnblockchain.cn/people/412

Tiny熊:https://learnblockchain.cn/people/15

深入Solidity数据存储位置:https://learnblockchain.cn/article/4864

OpenZeppelin:https://docs.openzeppelin.com/

Compound:https://compound.finance/docs

OpenZeppelin在他们的深入EVM第二部分文章中:https://blog.openzeppelin.com/ethereum-in-depth-part-2-6339cf6bddb9/

在他的文章中,SteveMarx:https://programtheblockchain.com/posts/2018/03/09/understanding-ethereum-smart-contract-storage/

Solidity文档:https://learnblockchain.cn/docs/solidity/internals/layout_in_storage.html

Pool:https://docs.aave.com/developers/core-contracts/pool

来源:Aavev3Protocol,Pool.sol:https://github.com/aave/aave-v3-core/blob/master/contracts/protocol/pool/Pool.sol

来源:Aavev3,PoolStorage.sol:https://github.com/aave/aave-v3-core/blob/master/contracts/protocol/pool/PoolStorage.sol

来源:OpenZeppelinGithub代码库,ERC20.sol:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol

在Remix上试试:https://remix.ethereum.org/?#code=Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVApwcmFnbWEgc29saWRpdHkgXjAuOC40OwoKaW1wb3J0ICJAb3BlbnplcHBlbGluL2NvbnRyYWN0c0A0LjcuMC90b2tlbi9FUkMyMC9FUkMyMC5zb2wiOwppbXBvcnQgIkBvcGVuemVwcGVsaW4vY29udHJhY3RzQDQuNy4wL2FjY2Vzcy9Pd25hYmxlLnNvbCI7Cgpjb250cmFjdCBNeVRva2VuIGlzIEVSQzIwLCBPd25hYmxlIHsKICAgIGNvbnN0cnVjdG9yKCkgRVJDMjAoIk15VG9rZW4iLCAiTVRLIikgewogICAgICAgIF9taW50KG1zZy5zZW5kZXIsIDEwMDAwICogMTAgKiogZGVjaW1hbHMoKSk7CiAgICB9CgogICAgZnVuY3Rpb24gbWludChhZGRyZXNzIHRvLCB1aW50MjU2IGFtb3VudCkgcHVibGljIG9ubHlPd25lciB7CiAgICAgICAgX21pbnQodG8sIGFtb3VudCk7CiAgICB9Cn0K&optimize=false&runs=200&evmVersion=null&version=soljson-v0.8.7+commit.e28d00a7.js

faheelfromTwitter.:https://twitter.com/721Orbit/status/1511961744238948356?s=20&t=KDGCQ4OwQ47e2NACgQ8WWg

来源:OpenZeppelinGithub资源库中的Timer.sol:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Timers.sol

Uniswap:https://github.com/Uniswap/governance/blob/master/contracts/GovernorAlpha.sol

IndexedFinance:https://github.com/indexed-finance/governance/blob/master/contracts/governance/GovernorAlpha.sol

应该将你存储在持久性存储中的内容减少到合约运行所需的程度:https://learnblockchain.cn/docs/solidity/introduction-to-smart-contracts.html#index-10

深入以太坊,Part2:https://blog.openzeppelin.com/ethereum-in-depth-part-2-6339cf6bddb9/

Solidity文档:状态变量在储存中的布局g:https://learnblockchain.cn/docs/solidity/internals/layout_in_storage.html

openzeppelin-contracts/StorageSlot.sol:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/StorageSlot.sol

Solidity中的数据表示:https://ethdebug.github.io/solidity-279"??src="https://img.jinse.cn/5363788_image3.png"?>

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

大币网

[0:15ms0-4:250ms