比特幣行情 比特幣行情
Ctrl+D 比特幣行情
ads
首頁 > UNI > Info

SOL:深入Solidity數據存儲位置——Storage

Author:

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

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

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

目錄

介紹

存儲的布局

存儲器的基礎知識

與存儲交互

函數參數中的存儲指針

函數體中的存儲指針

讀取存儲的成本。

結論

介紹

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

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

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

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

存儲的基本原理

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

Bondly獲OKEx Blockdream Ventrues投資 雙方將深入探索NFT領域:據官方消息,Bondly已獲OKEx Blockdream Ventrues(OKEx BDV)投資,雙方將深入探索NFT領域,為NFT優質區塊鏈項目發展提供服務和資源支持。一方面,Bondly將通過NFT形式為OKEx BDV合作的優質項目提供LaunchPad服務;另一方面,雙方共同把優秀品牌帶到Bprotect,也將以NFT創新形式與OKExChain生態資產進行品牌合作。

Bondly是一種可互操作、透明、便捷的資產兌換協議,旨在徹底改變傳統的資產托管方法,并使每個藝術創作人都能進入自己的數字市場,旗下產品包括BSwap(NFT發售平臺)、Bondly LaunchPad(IDO平臺)、BProtect(NFT交易平臺)。OKEx BDV初始資金1 億美金,致力于發現和投資最前沿的產品技術創新類區塊鏈項目,投資方向包括基礎設施、交易及金融項目、公鏈生態類項目、應用類流量入口等。[2021/5/6 21:28:39]

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

持有狀態變量

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

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

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

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

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

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

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

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

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

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

美國國會眾議員提出法案以深入研究商業中的區塊鏈技術:三名美國國會眾議院議員(兩名民主黨和一名共和黨)正式提出了一項新法案,以促使美國國會對區塊鏈技術進行更深入的分析。9月1日,民主黨眾議員Darren Soto、Doris Matsui及共和黨眾議員Brett Guthrie向眾議院提出了一項新法案,該法案隨后被提交給能源和商業委員會。該法案建議美國商務部長在與聯邦貿易委員會(FTC)磋商后“就區塊鏈技術的狀況以及在保護消費者和其他方面的使用情況進行研究并向國會提交報告”。(Cointelegraph)[2020/9/4]

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

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

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

在我們之前的例子中沒有什么特別之處。但是現在讓我們考慮這樣的情況:你有幾個不同大小的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????????}}}

工行業務總監:區塊鏈等技術在金融行業得到深入應用:工商銀行信息科技業務總監呂仲濤在接受記者采訪時表示,從技術基礎上看,中國正在躋身全球金融科技發展的“第一梯隊”,人工智能、大數據、區塊鏈等新技術在金融行業得到深入應用,很多銀行都在積極建設新技術平臺。從實踐運用上看,各行也紛紛加強金融科技的頂層設計和實施運用。他表示,經此一疫,各行業將加快生產要素、生產關系的重組升級和生產方式的變革突破,推動產業互聯網建設,進而推動金融服務供需關系的重塑。(經濟參考報)[2020/5/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????}}

聲音 | 科藍軟件:與螞蟻金服在區塊鏈方面已有廣泛深入的合作:科藍軟件(SZ300663)董秘在互動平臺回復投資者就“恒生減持公司股票,對科藍和螞蟻金服的影響及數字金融行業公司有那些進展”提問表示,科藍與螞蟻在互聯網銀行的前臺、中臺、后臺產品和項目以及區塊鏈方面已經有廣泛深入的合作,雙方是戰略層面的合作,并且還在繼續深化以及向其他領域擴展。 根據恒生電子(75.300,?1.19,1.61%)9月26日發布的公告:“(恒生)公司所持的科藍軟件股票的前期浮動盈利已計入公司本年度凈利潤中,本次出售使得科藍軟件股票部分前期浮動盈利已經轉化為現金收益”,恒生在科藍屬于財務性投資,正常減持。恒生和科藍都屬金融科技公司,因細分領域不同,所以沒有產品和項目合作關系,其減持對科藍發展沒有任何影響!在正在召開的云棲大會上,公司剛剛獲頒“阿里云專有云首批行業ISV合作伙伴認證”,與螞蟻共創的“電子渠道逸平臺解決方案”也在上月通過了V3版本兼容性測試認證。毋庸置疑,國內數字金融行業正在起飛,公司未來會與螞蟻一起,將更多創新的產品提供給客戶。[2019/9/27]

solc編譯器的錯誤報告

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

結論

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

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

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

明日國會聽證會將深入研究區塊鏈在供應鏈管理中的應用:據coindesk消息,國會小組委員會將在明天的聽證會上繼續區塊鏈實況調查任務。明日的會議將比2月份由科學,空間和技術研究和技術及監督小組委員會內部委員會舉行的類似聽證會更加詳細,將深入研究該技術在供應鏈管理中的應用。眾議院科學委員會主席Lamar Smith的一位代表告訴CoinDesk,“知識產權,網絡安全以及航運和物流方面的專家”將參加此次聽證會。[2018/5/8]

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

參考資料

深入以太坊,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:SOLHTTTPSCOMsol幣是什么幣種CHTT價格tps幣行情Decentralized Community Investment Protocol

UNI
WEB:一覽 Web3 身份九大方向及代表項目

原文:MappingtheIdentitySpace撰文:KermanKohli編譯:aididiaojp.eth,ForesightNews? 徽章 鏈上徽章是最常見的類別.

1900/1/1 0:00:00
TOKE:一文淺談理想的代幣分配模式

原文標題:TokenCapTableAllocation原文作者:VaderResearch原文編譯:Leo,BlockBeats token經濟學通常與其餅狀圖分配相關.

1900/1/1 0:00:00
中心化交易所:Web3 入坑第一站 加密貨幣法幣出入金商業

闡述區分出入金項目的主要因素,并梳理七類現有出入金項目。撰文:Steve@ForesightVentures用法定貨幣購買加密貨幣是大多數用戶進入Web3世界的第一站,無論是通過中心化的交易所還.

1900/1/1 0:00:00
CAR:Cardano的DApp生態風起 Haskell會否是下一個「MOVE」?

原文來源:AdaverseAsia9月22日,Cardano主網Vasil硬分叉升級成功激活,此次升級對Cardano的自定義智能合約語言Plutus進行了重大改進.

1900/1/1 0:00:00
NFT:金色Web3.0日報 | SEC正調查Yuga Labs Mango被攻擊

金色財經推出《金色Web3.0日報》,為用戶提供每日DeFi、NFT等行業新聞。 DeFi數據 1、DeFi代幣總市值:437.4億美元 DeFi總市值及前十代幣數據來源:coingecko2、.

1900/1/1 0:00:00
NFT:如何使用NFT購買房地產?

虛擬土地正成為Web3版本的房地產,那是因為區塊鏈技術的特性可以解決房地產行業中存在的許多問題。事實上NFT最有趣的用例之一就是房地產行業,由區塊鏈技術和房地產NFT的平臺提供支持.

1900/1/1 0:00:00
ads