這是深入Solidity數據存儲位置系列的另一篇。在今天的文章中,我們將更詳細地介紹EVM中的一個重要數據位置:存儲。
我們將看到合約存儲的布局是如何工作的,storage引用。我們還將使用OpenZeppelin和Compound中的一些合約來學習storage引用在實踐中如何工作,同時順便學習這些流行合約和協議背后的Solidity代碼。
目錄
介紹
存儲的布局
存儲器的基礎知識
與存儲交互
函數參數中的存儲指針
函數體中的存儲指針
讀取存儲的成本。
結論
介紹
了解以太坊和基于EVM的鏈中的存儲模型對于良好的智能合約開發至關重要。
你可以在智能合約上永久地存儲數據,以便將來執行時可以訪問它。每個智能合約都在自己的永久存儲中保持其狀態。它就像*"智能合約的迷你數據庫"*,但與其他數據庫不同,這個數據庫是可以公開訪問的。所有存儲在智能合約存儲器中的值可供外部免費讀取,無需向區塊鏈發送交易。
然而,向存儲空間寫入是相當昂貴的。事實上,就Gas成本而言,它是EVM中最昂貴的操作。存儲的內容可以通過sendTransaction調用來改變。這種調用會改變狀態。這就是為什么合約變量被稱為狀態變量的原因。
需要記住的一件事是,在以太坊和EVM的設計中,一個合約既不能讀也不能寫非自身定義的任何存儲。合約A可以從另一個合約B的存儲中讀取或寫入的唯一方法是當合約B暴露出使其能夠這樣做的函數。
存儲的基本原理
智能合約的存儲是一個持久的可讀可寫的數據位置。意思是說,如果數據在一次交易中被寫入合約存儲,一旦交易完成,它就會持久存在。在這個交易之后,讀取合約存儲將檢索到之前這個交易所寫入/更新的數據。
彭博社:美國聯邦貿易委員會對推特的隱私和安全問題進行更深入審查:12月21日消息,據知情人士透露,在Elon Musk收購推特后,美國聯邦貿易委員會(FTC)正在對推特的隱私和數據安全做法進行更深入的調查。在過去的一個月里,美國聯邦貿易委員會的律師詢問了兩名前高管,自Elon Musk上任以來,推特是否能夠遵守該機構2011年的同意令。Elon Musk的收購導致推特的許多法律、隱私和合規高管離職,引發了更為廣泛的調查。
據悉,這次調查標志著FTC至少第三次就其隱私和數據安全做法對推特進行審查,審查可能導致數百萬美元的罰款,以及FTC對馬斯克本人施加義務的新命令,這些義務將適用于他的公司,即使他卸任CEO或離開推特也仍然有效。(彭博社)[2022/12/21 21:57:50]
每個合約都有自己的存儲,可以用以下規則來描述和綁定:
持有狀態變量
在交易和函數調用之間持久存在
讀取是免費的,但寫入是昂貴的
合約存儲在合約構建期間被預先分配。
駐留在存儲中的變量在Solidity中被稱為狀態變量。
你應該記住關于合約存儲的唯一事情是:
存儲是持久保存和昂貴的!
將數據保存到存儲中是EVM中需要最多的Gas的操作之一。
寫入存儲的實際成本是多少?
成本并不總是相同的,計算寫入存儲的Gas是相當復雜的公式,尤其是在最新的以太坊2
所有靜態大小的變量都是按照它們被定義的順序依次放入存儲槽的。
記住:每個存儲槽最多可以容納32字節長的值。
在我們上面的例子中,a和b是32字節長。因此,它們被分配了自己的存儲槽。
將狀態變量打包在一個存儲槽中
印度央行行長:有必要就加密貨幣進行更深入的討論:印度央行行長沙克蒂坎塔·達斯:有必要就加密貨幣進行更深入的討論,當一家央行表示,加密貨幣的存在導致他們對宏觀經濟和金融穩定感到擔憂時,這是一個非常深刻的問題。[2021/11/16 21:55:38]
在我們之前的例子中沒有什么特別之處。但是現在讓我們考慮這樣的情況:你有幾個不同大小的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????????}}}
央行上海總部:深入推進金融科技創新監管試點:5月12日,央行上海總部發布通知稱,下一步將加強對金融科技應用創新試點工程的組織領導,并會同上海市地方金融監管局等單位,深入推進金融科技創新監管試點,提升金融科技支撐能力。中國人民銀行于2020年4月26日支持在上海等6市(區)擴大金融科技創新監管試點,這標志著金融科技創新監管工作正式在上海啟動,也為加快推進上海金融科技中心建設再添助力。
近年來,人民銀行上海總部把大力發展金融科技作為推動上海國際金融中心和科技創新中心聯動發展的重要著力點,積極探索設計上海金融科技中心的建設與發展路徑,發布了《關于促進金融科技發展 支持上海建設金融科技中心的指導意見》(銀總部發〔2019〕67號)。
央行上海總部明確,下一步將以《發展規劃》為指引,加強對金融科技應用創新試點工程的組織領導,并會同上海市地方金融監管局等單位,深入推進金融科技創新監管試點,加大試點項目橫向交流和成果共享,深化金融市場科技應用,提升金融科技支撐能力,為把上海建設成為與國際金融中心地位相適應的金融科技中心提供有力支撐。(中新經緯APP)[2020/5/12]
通過Remix運行這兩個函數可以得到以下輸出:
要檢索變量c所指向的槽,使用c.slot,要檢索字節偏移量,使用c.offset。僅使用c本身會導致錯誤:
function?ReadVariableC()?public?view?returns?(uint64?value)?{assembly?{????????value?:=?sload(c)????}}
聲音 | 英國財政部金融服務副主任:希望更深入地研究加密行業:據unhashed報道,英國財政部金融服務副主任Gillian Dorner表示,政府相關部門希望能更深入地研究加密行業,以采取相應的應對辦法。英國正面臨著創新經濟、保護消費者和打擊金融犯罪的多重挑戰。[2018/11/23]
上面的代碼將不會被編譯,并會出現以下錯誤
有一點也要提到的是,在內聯匯編中,你不能向存儲變量的.slot或.offset賦值:
function?doesNotCompile()?public?{????assembly?{????????a.slot?:=?8????????a.offset?:=?9????}}
solc編譯器的錯誤報告
Yul中存儲指針的偏移量的值是多少呢?在函數體中,一些變量可以是存儲指針/存儲引用。例如,這包括struct、array和mapping。對于這樣的變量,在Yul中.offset總是為零,因為這樣的變量總是占據了一個完整的存儲槽,不能與其他變量緊密地擠在一起存儲。
結論
智能合約的存儲空間,無論是初始化還是修改里面的數據,都要付出高昂的代價。雖然從合約存儲中讀取數據是免費的,但如果這些讀取操作是改變狀態的交易的一部分,我們還是應該考慮到向智能合約的存儲讀取時的Gas成本。
由于對存儲的操作有很高的Gas成本,Solidity文檔中指出了一個重要的考慮。
應該將你存儲在持久性存儲中的內容減少到合約運行所需的程度。
建議盡可能地將某些數據存儲在合約存儲之外,以減少相關的Gas成本。
動態 | 金融時報:未來區塊鏈等技術與銀行業的融合一定會越來越深入:據金融時報今日刊文指出,銀行業“變革的思維”,還體現在科技與傳統銀行的結合上。未來,云計算、大數據、區塊鏈與銀行業的融合一定會越來越深入。數據和信息會成為未來銀行的生命線。擁有數據和信息,就能精準勾畫出消費者所需要的場景,從而提高銀行服務和產品的覆蓋范圍與個性化程度,進而滿足金融消費者的獲得感、幸福感和安全感。并且,數字技術與普惠金融、小微金融、消費金融相結合,可以產生事半功倍的效果,因為小微企業與消費者是最需要數字技術所帶來的金融服務便利性的客戶群體。[2018/9/8]
參考資料
深入以太坊,Part2
Solidity文檔:狀態變量在儲存中的布局g
openzeppelin-contracts/StorageSlot.sol
Solidity中的數據表示
了解以太坊智能合約的存儲
解剖智能合約的結構--功能、數據和變量
譯文出自:登鏈翻譯計劃譯者:翻譯小組?校對: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"?>
原文作者:Longsolitude,ZeePrimeCapital投資人原文來源:Bankless 原文編譯:DeFi之道 大家對以太坊充滿好感,并為核心開發者為合并做出的努力鼓掌.
1900/1/1 0:00:00本文由CoinMarkCap&TokenInsight授權發布,轉載請注明出處。嘉楠耘智2022全年收入為6.3億美元,利潤同比下降38%:金色財經報道,比特幣挖礦硬件制造商嘉楠耘智(納.
1900/1/1 0:00:00DeFi數據 1、DeFi代幣總市值:421.52億美元 DeFi總市值及前十代幣數據來源:coingecko2、過去24小時去中心化交易所的交易量22.
1900/1/1 0:00:00撰文:SalQadir、GabeParker,分別為Galaxy研究合伙人和研究員編譯:派蒙,ForesightNewsNFT?不斷發展,版稅的未來卻依然懸而未決.
1900/1/1 0:00:00最近幾周,比特幣價格異常穩定,與股票、信貸和外匯市場形成鮮明對比,在這些市場中,加息、通貨膨脹和美元強勢繼續造成了劇烈的沖擊。在這種背景下,比特幣一直非常穩定.
1900/1/1 0:00:00作者:LitProtocol?聯合創始人,DavidSneider 來源:Coindesk 親愛的馬斯克先生, 首先,恭喜您收購Twitter!由于您一直強調權力下放和去中心化的重要性.
1900/1/1 0:00:00