这是深入Solidity数据存储位置系列的另一篇。在今天的文章中,我们将更详细地介绍EVM中的一个重要数据位置:存储。
我们将看到合约存储的布局是如何工作的,storage引用。我们还将使用OpenZeppelin和Compound中的一些合约来学习storage引用在实践中如何工作,同时顺便学习这些流行合约和协议背后的Solidity代码。
目录
介绍
存储的布局
存储器的基础知识
与存储交互
函数参数中的存储指针
函数体中的存储指针
读取存储的成本。
结论
介绍
了解以太坊和基于EVM的链中的存储模型对于良好的智能合约开发至关重要。
你可以在智能合约上永久地存储数据,以便将来执行时可以访问它。每个智能合约都在自己的永久存储中保持其状态。它就像*"智能合约的迷你数据库"*,但与其他数据库不同,这个数据库是可以公开访问的。所有存储在智能合约存储器中的值可供外部免费读取,无需向区块链发送交易。
然而,向存储空间写入是相当昂贵的。事实上,就Gas成本而言,它是EVM中最昂贵的操作。存储的内容可以通过sendTransaction调用来改变。这种调用会改变状态。这就是为什么合约变量被称为状态变量的原因。
需要记住的一件事是,在以太坊和EVM的设计中,一个合约既不能读也不能写非自身定义的任何存储。合约A可以从另一个合约B的存储中读取或写入的唯一方法是当合约B暴露出使其能够这样做的函数。
存储的基本原理
智能合约的存储是一个持久的可读可写的数据位置。意思是说,如果数据在一次交易中被写入合约存储,一旦交易完成,它就会持久存在。在这个交易之后,读取合约存储将检索到之前这个交易所写入/更新的数据。
何宝宏:元宇宙将推动数字经济与实体经济走向深入融合:金色财经报道,中国信息通信研究院云计算与大数据研究所所长何宝宏在接受采访时表示,我国产业数字化规模仍有不小的提升空间,数字技术创新应用依然迫切,此外,元宇宙将推动数字经济与实体经济走向深入融合。当前的数字经济更像是传统经济的数字化转型,而未来的数字原生世界,元宇宙或者Web3.0里面企业的组织形态理应发生非常大的变化。
元宇宙是数字技术、数字产品、数字产业发展的必然形态,将推动数字经济与实体经济走向深入融合。何宝宏表示,当前,元宇宙概念边界仍在持续探索,技术工具还有较大优化空间,现象级应用有待开发,整体还处于起步培育的初级阶段。[2023/4/9 13:52:13]
每个合约都有自己的存储,可以用以下规则来描述和绑定:
持有状态变量
在交易和函数调用之间持久存在
读取是免费的,但写入是昂贵的
合约存储在合约构建期间被预先分配。
驻留在存储中的变量在Solidity中被称为状态变量。
你应该记住关于合约存储的唯一事情是:
存储是持久保存和昂贵的!
将数据保存到存储中是EVM中需要最多的Gas的操作之一。
写入存储的实际成本是多少?
成本并不总是相同的,计算写入存储的Gas是相当复杂的公式,尤其是在最新的以太坊2
所有静态大小的变量都是按照它们被定义的顺序依次放入存储槽的。
记住:每个存储槽最多可以容纳32字节长的值。
在我们上面的例子中,a和b是32字节长。因此,它们被分配了自己的存储槽。
将状态变量打包在一个存储槽中
在我们之前的例子中没有什么特别之处。但是现在让我们考虑这样的情况:你有几个不同大小的uint变量,如下所示:
Fireblocks Web3负责人:传统金融公司正在深入研究加密货币:金色财经报道,Fireblocks的Web3负责人表示,传统金融公司正在进一步进入加密领域。Fireblocks代表1,500多家金融机构托管资金,并使它们能够与区块链和加密服务进行交互。
Amsel表示,这些公司,尤其是更传统的公司,从托管服务开始,然后慢慢转向更多的加密原生交互。Amsel说,“我们看到越来越多的传统金融正在探索进入加密货币的方式,也许他们正在采取一种更加胆小的方法”。
Amsel举了一个假设的例子,一家公司可能在一两年前开始使用加密货币托管。他说,这些公司迈出了第一步,看到没问题,然后开始更多地探索这项技术。[2022/11/6 12:21:55]
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????????}}}
GameStop董事会成员Larry Cheng计划深入研究加密货币:金色财经报道,6月初被选为GameStop董事会成员的Larry Cheng在推特上宣布,本月他将休两天假,以加深对加密货币的了解。这位企业家正在向他的粉丝征求有关如何打发这些时间的建议。据悉,Cheng已宣布持有GameStop 13%的股份。[2021/11/13 6:49:48]
通过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????}}
solc编译器的错误报告
江苏银行年报:将对区块链等技术持续深入研究:4月20日消息,日前,江苏银行年报指出,江苏银行将不断优化IT治理体系,加快重大创新项目建设,对5G、区块链、人工智能等技术持续深入研究,在互联网贷款、智能投顾、线上票据贴现、线上动产质押、跨境业务等领域落地的产品扩面成势。(经济参考网)[2020/4/20]
Yul中存储指针的偏移量的值是多少呢?在函数体中,一些变量可以是存储指针/存储引用。例如,这包括struct、array和mapping。对于这样的变量,在Yul中.offset总是为零,因为这样的变量总是占据了一个完整的存储槽,不能与其他变量紧密地挤在一起存储。
结论
智能合约的存储空间,无论是初始化还是修改里面的数据,都要付出高昂的代价。虽然从合约存储中读取数据是免费的,但如果这些读取操作是改变状态的交易的一部分,我们还是应该考虑到向智能合约的存储读取时的Gas成本。
由于对存储的操作有很高的Gas成本,Solidity文档中指出了一个重要的考虑。
应该将你存储在持久性存储中的内容减少到合约运行所需的程度。
建议尽可能地将某些数据存储在合约存储之外,以减少相关的Gas成本。
参考资料
深入以太坊,Part2
Solidity文档:状态变量在储存中的布局g
openzeppelin-contracts/StorageSlot.sol
Solidity中的数据表示
了解以太坊智能合约的存储
解剖智能合约的结构--功能、数据和变量
译文出自:登链翻译计划译者:翻译小组?校对:Tiny熊
本翻译由DuetProtocol赞助支持。
北京方正公证处杨和平:与腾讯在多个方面达成深入合作:金色财经报道,4月17日,腾讯安全领御区块链-北京方正公证取证平台正式发布。在发布会上,北京方正公证处副主任杨和平表示:“区块链作为一种可以在完全不信任的节点之间建立信任机制的技术,具有高可靠度、高透明度、可追溯、永久保存和无法篡改的特性,这些特性与公证的职业要求和行业发展需求具有天然的融合性、互补性,特别是在公证三大效力之一的证据效力方面双方高度契合。腾讯安全与北京市方正公证处联合打造的领御区块链北京方正公证取证平台,就是要在深度整合两者优势基础上通过国家公信力+技术信任力的双重增信,向社会提供电子证据安全存储、取证维权、在线公证等智能化服务,从而形成一套规范和标准的互联网数据公证服务新模式。”
此外,北京方正公证处副主任杨和平还介绍说,未来方正公证处与腾讯将在以下几方面进行深度合作:1、构件新型公证法律服务业态上进行新的探索;2、拓展公证服务领域上取得新的突破;3、提升公证服务效率上再上新台阶;4、人才培养方面积累新经验;5、体制机制建设上走出新路子;6、公证服务助力互联网方面走出新天地。[2020/4/17]
原文链接: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"?>
标签:TPSHTTBLOCOMhttps://etherscan.iohtt币被Blockchain Monster HuntComodo Coin
来源:JoonasK?pp?一个真实的故事,讲述了我在2013年比特币的第一次淘金热期间如何全力挖掘加密货币。2013年3月的一个寒冷的夜晚,在芬兰的Yl?j?rvi市.
能来参加波哥大的ETHDevCon,是出国后的一大惊喜。大会讨论了很多干货,既具备现实的迫切性又具备对未来的引导性。遗憾的是条件所限,国内媒体几乎没有报道,讨论廖廖.
文/PaulVeradittakit,PanteraCapital合伙人在DeFi以及NFT快速蹿红的带动下,去中心化应用程序生态系统在过去几年间增势迅猛.
2022年10月9日一开始,加密社区都在谈论XEN。因为据ultrasound.money数据,XEN上线仅7个小时,XEN燃烧的ETH就达到1300枚ETH.
原文:Jake_xbt 编译:Crush 01 什么是MEV? 我经常被问到MEV是什么,以及抢先交易和尾随交易是如何工作的,那么我就以我自己的机器人工作机制为例,在这篇长文中做一个解释.
美国SEC突然对无聊猿母公司进行调查,是否会影响NFT的未来?免责声明:本文内容仅用于信息展示和分享,不对任何经营与投资行为进行推广与背书,本文不提供任何投资建议.