以太坊交易所 以太坊交易所
Ctrl+D 以太坊交易所
ads

深入Solidity數據存儲位置——Storage_SOL:WCOM

Author:

Time:1900/1/1 0:00:00

這是深入Solidity數據存儲位置系列的另一篇。在今天的文章中,我們將更詳細地介紹EVM中的一個重要數據位置:存儲。

我們將看到合約存儲的布局是如何工作的,storage引用。我們還將使用OpenZeppelin和Compound中的一些合約來學習storage引用在實踐中如何工作,同時順便學習這些流行合約和協議背后的Solidity代碼。

目錄

介紹

存儲的布局

存儲器的基礎知識

與存儲交互

函數參數中的存儲指針

函數體中的存儲指針

讀取存儲的成本。

結論

介紹

了解以太坊和基于EVM的鏈中的存儲模型對于良好的智能合約開發至關重要。

你可以在智能合約上永久地存儲數據,以便將來執行時可以訪問它。每個智能合約都在自己的永久存儲中保持其狀態。它就像*"智能合約的迷你數據庫"*,但與其他數據庫不同,這個數據庫是可以公開訪問的。所有存儲在智能合約存儲器中的值可供外部免費讀取,無需向區塊鏈發送交易。

然而,向存儲空間寫入是相當昂貴的。事實上,就Gas成本而言,它是EVM中最昂貴的操作。存儲的內容可以通過sendTransaction調用來改變。這種調用會改變狀態。這就是為什么合約變量被稱為狀態變量的原因。

需要記住的一件事是,在以太坊和EVM的設計中,一個合約既不能讀也不能寫非自身定義的任何存儲。合約A可以從另一個合約B的存儲中讀取或寫入的唯一方法是當合約B暴露出使其能夠這樣做的函數。

存儲的基本原理

智能合約的存儲是一個持久的可讀可寫的數據位置。意思是說,如果數據在一次交易中被寫入合約存儲,一旦交易完成,它就會持久存在。在這個交易之后,讀取合約存儲將檢索到之前這個交易所寫入/更新的數據。

Aurora CEO:彩虹橋已完全恢復,將深入審查相關問題:金色財經報道,Aurora CEO Alex Shevchenko發推稱,彩虹橋已完全恢復。用戶可以進行新的代幣跨鏈,也可以完成暫停前已經開始的代幣跨鏈。接下來將對該問題進行深入審查。

據此前報道,2月11日,Aurora CEO Alex Shevchenko發推稱,彩虹橋(Rainbow Bridge)已采取預防措施而暫停使用,沒有資金損失,團隊正在努力恢復彩虹橋。[2023/2/13 12:03:11]

每個合約都有自己的存儲,可以用以下規則來描述和綁定:

持有狀態變量

在交易和函數調用之間持久存在

讀取是免費的,但寫入是昂貴的

合約存儲在合約構建期間被預先分配。

駐留在存儲中的變量在Solidity中被稱為狀態變量。

你應該記住關于合約存儲的唯一事情是:

存儲是持久保存和昂貴的!

將數據保存到存儲中是EVM中需要最多的Gas的操作之一。

寫入存儲的實際成本是多少?

成本并不總是相同的,計算寫入存儲的Gas是相當復雜的公式,尤其是在最新的以太坊2

所有靜態大小的變量都是按照它們被定義的順序依次放入存儲槽的。

記住:每個存儲槽最多可以容納32字節長的值。

在我們上面的例子中,a和b是32字節長。因此,它們被分配了自己的存儲槽。

將狀態變量打包在一個存儲槽中

在我們之前的例子中沒有什么特別之處。但是現在讓我們考慮這樣的情況:你有幾個不同大小的uint變量,如下所示:

pragma?solidity?^0

對沖基金Third Point CEO:一直在深入研究加密貨幣:美國紐約對沖基金Third Point 首席執行官Daniel Loeb表示其一直在深入研究加密貨幣。(U.Today)[2021/3/1 18:05:03]

它的存儲布局會是這樣的:

因此,一個變量的"地址"由兩個部分組成。

槽號:變量所在的位置。

變量開始的字節偏移量。

讓我們繼續看一些基本的匯編代碼,以便更好地理解。看看下面的合約和它的函數:

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????????}}}

動態 | 國網陜西電力深入研究比特幣反竊電案例 提升員工查處效率:據中國電力網消息,12月13日,陜西省廳與國網陜西省電力公司舉行簽字儀式,正式出臺《陜西省警電部門防范和打擊涉電違法犯罪合作機制》。據悉,國網陜西電力研究反竊電新設備、新技術,對竊電設備和案例開展分析和現場檢測。該公司深入學習分析典型比特幣反竊電案例,掌握比特幣案例中的新型竊電類型、查處方法等;結合應用反竊電監測終端、智能化反竊電現場作業和取證設備,提升基層員工的技術水平和查處效率。[2019/12/21]

通過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????}}

動態 | ZB 創新智庫深入歐洲愛沙尼亞進行調研訪問:ZB 創新智庫正在持續深入歐洲各國進行區塊鏈調研,本周到訪愛沙尼亞的首都蒂蘭,深入了解行業最新發展動態。北歐小國愛沙尼亞在區塊鏈開發方面引領歐洲大陸。愛沙尼亞是歐洲第一個對數字經濟發展采取激進政策的國家,憑借其現已知名的電子居留計劃,該國為數字經濟和區塊鏈公司頒發了最多的許可證。 據 Bitcoin.com 網站報道,截至 2018 年 11 月,愛沙尼亞發放的許可證已經超過 900 張。

據 ZB 創新智庫當地調研顯示,近期這個數字現在已翻了一番。目前在愛沙尼亞獲得數字資產許可證已變得較為困難,2019 年 5 月 3 日愛沙尼亞政府財政部對數字資產許可程序進行修改,增加了一系列正式義務,將處理時間從 30 天延長至 90 天,并確定了在愛沙尼亞注冊成立公司或分支機構的要求。[2019/12/12]

solc編譯器的錯誤報告

Yul中存儲指針的偏移量的值是多少呢?在函數體中,一些變量可以是存儲指針/存儲引用。例如,這包括struct、array和mapping。對于這樣的變量,在Yul中.offset總是為零,因為這樣的變量總是占據了一個完整的存儲槽,不能與其他變量緊密地擠在一起存儲。

結論

智能合約的存儲空間,無論是初始化還是修改里面的數據,都要付出高昂的代價。雖然從合約存儲中讀取數據是免費的,但如果這些讀取操作是改變狀態的交易的一部分,我們還是應該考慮到向智能合約的存儲讀取時的Gas成本。

由于對存儲的操作有很高的Gas成本,Solidity文檔中指出了一個重要的考慮。

應該將你存儲在持久性存儲中的內容減少到合約運行所需的程度。

建議盡可能地將某些數據存儲在合約存儲之外,以減少相關的Gas成本。

參考資料

聲音 | 菲律賓參議員:菲律賓不急于出臺加密法規,建議成立專項小組做深入研究:菲律賓參議員Grace Poe表示,該國議員們并不急于出臺使金融技術和加密貨幣等數字資產合法化的法律措施:“這是一件非常復雜的事情。事實上,立法者真的不應該急著起草一項有關這方面的法律。我們仍然需要學習很多東西,特別是在金融技術和數字資產方面。對我們大多數國人來說,這是陌生的領域,雖然他們中的一些人已經通過在線貸款接觸了這一領域。但在沒有適當的信息和教育的前提下,許多人實際上是受害者。”

參議員Francis Tolentino表示,監管機構應“放慢腳步”,研究“未成熟的”領域。對于具體應對方案,參議員建議成立一個工作小組來研究這一領域。該小組將由以下機構組成:菲律賓央行(BSP)、菲律賓證交會(SEC)、菲律賓存款保險公司、財政部以及卡加延經濟區管理局。Tolentino還建議,如果有涉及海外菲律賓工人的擔憂,勞工和就業部也應包括在該小組中。據證交會專員Luis Amatong稱,委員會將頒布新規則,要求擁有數字產品的公司必須注冊并受到監管審查,特別是如果其具有投資計劃。另外,BSP和SEC已經同意進行定期討論,以便可以提出實際的立法建議。(Rappler)[2019/9/23]

深入以太坊,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"?>

Tags:SOLTPSHTTCOMVSOL價格https://etherscan.ioBHTTWCOM

比特幣最新價格
Buidler DAO: 我所理解的Layer0、1、2層到底是什么?

原文標題:《BuidlerDAO:我所理解的Layer0、1、2層到底是什么?》原文作者:BuidlerDAOLayer0:跨鏈通信?Layer0是我認為目前行業對其定義最模糊也是理解最復雜的一.

1900/1/1 0:00:00
Pantera合伙人解讀Dynamic:統一多鏈錢包身份驗證_DYN:DYNA

文/PaulVeradittakit,PanteraCapital合伙人在DeFi以及NFT快速躥紅的帶動下,去中心化應用程序生態系統在過去幾年間增勢迅猛.

1900/1/1 0:00:00
NFT 游戲新模式遐想:讓“永久性死亡”在加密游戲中成為現實_TOS:APT

撰文:davestanton 編譯:DeFi之道 圖片來源:由無界版圖AI工具生成讓死亡在元宇宙中成為現實準確點來講,我的意思是,在加密游戲中引入永久性死亡的概念,就像在現實生活中一樣.

1900/1/1 0:00:00
Web3的未來:7 個潛在的億級機會_WEB3:NFT

原文作者:azf.eth原文來源:twitterWeb3的未來將不僅僅是PFP的jpegs、NFT市場、CEXs/DEXs和DeFi協議.

1900/1/1 0:00:00
猖獗黑客“薅”交易所羊毛?FTX交易所遭到Gas竊取攻擊事件分析_GAS:FTX

2022年10月13日,據據BeosinEagleEyeWeb3安全預警與監控平臺的輿情消息,FTX交易所遭到gas竊取攻擊,黑客利用FTX支付的gas費用鑄造了大量XENTOKEN.

1900/1/1 0:00:00
DAO 太卷了怎么辦?七個技巧讓你堅持走下去_HDA:PathDAO

撰文:FrankAmerica編譯:aididaojp.eth,ForesightNewsWeb3世界中,Discord服務器是最常見的辦公軟件之一,也這導致用戶的社區服務器頻道數不勝數.

1900/1/1 0:00:00
ads