加密貨幣交易所 加密貨幣交易所
Ctrl+D 加密貨幣交易所
ads
首頁 > DAI > Info

深入Solidity數據存儲位置——Storage_SOL:區塊鏈運用的技術中不包括哪一項內容

Author:

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

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

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

目錄

介紹

存儲的布局

存儲器的基礎知識

與存儲交互

函數參數中的存儲指針

函數體中的存儲指針

讀取存儲的成本。

結論

介紹

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

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

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

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

存儲的基本原理

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

《廣東省深入推進資本要素市場化配置改革行動方案》:粵港澳以區塊鏈技術為基礎共建征信鏈:金色財經報道,廣東省人民政府昨日印發關于深入推進資本要素市場化配置改革行動方案的通知,方案提出,支持深圳深化央行數字人民幣應用創新試點,適時申請擴大試點城市范圍,以區塊鏈技術為基礎,粵港澳共建征信鏈,促進粵港澳大灣區征信合作。發展數字綠色金融,利用金融科技推動環境信息披露與共享,探索以區塊鏈為基礎的綠色資產交易。此外,方案還提出加快推進外資金融機構落地落戶及推進人民幣可自由使用和資本項目可兌換先行先試。[2021/9/15 23:25:48]

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

持有狀態變量

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma?solidity?^0

南寧市深入推進“區塊鏈+”人社應用和“打包快辦”服務改革:8月20日,南寧市人社局召開專題黨組會,傳達學習市委十二屆十次全體(擴大)會議精神,并就抓好貫徹落實作出部署。會議強調,局系統廣大黨員干部要將思想認識統一到市委決策部署上來,將學習貫徹市委十二屆十次全體(擴大)會議精神和年度工作任務相結合,扎實推進各項中心工作;抓重點攻難點,切實保障和改善民生,千方百計保就業,兜住基本民生底線,深入推進“智慧人社”工作,深化“一門式”服務改革,深入推進“區塊鏈+”人社應用和“打包快辦”服務改革,確保完成全年目標任務。(南寧日報)[2020/8/23]

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

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

槽號:變量所在的位置。

變量開始的字節偏移量。

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

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

北京方正公證處楊和平:與騰訊在多個方面達成深入合作:金色財經報道,4月17日,騰訊安全領御區塊鏈-北京方正公證取證平臺正式發布。在發布會上,北京方正公證處副主任楊和平表示:“區塊鏈作為一種可以在完全不信任的節點之間建立信任機制的技術,具有高可靠度、高透明度、可追溯、永久保存和無法篡改的特性,這些特性與公證的職業要求和行業發展需求具有天然的融合性、互補性,特別是在公證三大效力之一的證據效力方面雙方高度契合。騰訊安全與北京市方正公證處聯合打造的領御區塊鏈北京方正公證取證平臺,就是要在深度整合兩者優勢基礎上通過國家公信力+技術信任力的雙重增信,向社會提供電子證據安全存儲、取證維權、在線公證等智能化服務,從而形成一套規范和標準的互聯網數據公證服務新模式。”

此外,北京方正公證處副主任楊和平還介紹說,未來方正公證處與騰訊將在以下幾方面進行深度合作:1、構件新型公證法律服務業態上進行新的探索;2、拓展公證服務領域上取得新的突破;3、提升公證服務效率上再上新臺階;4、人才培養方面積累新經驗;5、體制機制建設上走出新路子;6、公證服務助力互聯網方面走出新天地。[2020/4/17]

通過Remix運行這兩個函數可以得到以下輸出:

要檢索變量c所指向的槽,使用c.slot,要檢索字節偏移量,使用c.offset。僅使用c本身會導致錯誤:

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

聲音 | 大連港:將繼續開拓區塊鏈技術 深入開展創新工作:金色財經報道,大連港(601880)被提問“除了區塊鏈電子放貨平臺之外,接下來還有什么區塊鏈項目落地”時表示,目前,大連港利用區塊鏈的去中心化、不可篡改、共享賬本等特征所建立的區塊鏈信任機制,使業務信息公開透明公正,借助區塊鏈的數據加密作用強化數據信息安全功能,確保數據的安全性、完整性和一致性,使船、輪駁公司、智慧港口平臺各方都能實時、安全、無縫地傳遞拖輪作業信息,實現全程留痕和全程可追溯,滿足輪駁業務的安全性和準確性要求。未來大連港還將繼續開拓區塊鏈技術業務實現場景,深入開展創新工作,在全港口領域推行區塊鏈技術應用落地。(上證e互動)[2019/10/30]

上面的代碼將不會被編譯,并會出現以下錯誤

有一點也要提到的是,在內聯匯編中,你不能向存儲變量的.slot或.offset賦值:

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

solc編譯器的錯誤報告

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

結論

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

現場 | 姜海:密碼學將隨著黎曼猜想等理論研究的深入迎來大發展:金色財經現場報道,今日,2018可信區塊鏈峰會在北京召開。在主題為“區塊鏈安全焦點關注”的區塊鏈安全論壇上,丁牛科技有限公司CEO姜海結合最近黎曼猜想被證明引起了密碼學界的高度關注,分析了黎曼猜想與區塊鏈密碼安全。他提出,盡管黎曼猜想的證明對于傳統密碼安全有極大的沖擊,但是區塊鏈技術的安全建立在SHA-256、橢圓曲線、算法校驗等基礎之上,在使用過程中能夠極大地抵抗密碼攻擊。盡管最近有很多的安全事件發生,而其根本原因在于程序的違規操作。未來隨著隨機發生器、量子計算機以及黎曼幾個等基礎理論的研究,密碼學將會有更大的發展空間。[2018/10/10]

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

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

建議盡可能地將某些數據存儲在合約存儲之外,以減少相關的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:SOLTPSHTT區塊鏈VSOLhttps://etherscan.iohtt幣價格今日行情區塊鏈運用的技術中不包括哪一項內容

DAI
三大藍籌NFT熊市融資 誰能熬過寒冬?_NFT:ZUKI

9月22日,有媒體披露,日系動漫風格NFT項目Azuki的母公司ChiruLabs在最新的A輪融資中籌集了3000萬美元,估值將因此上升至3-4億美元.

1900/1/1 0:00:00
一覽當前的比特幣層格局 DeFi 生態正在建設中_比特幣:STAC

原文作者:Stacks創始人MuneebAli,來源:Bankless,本文由DeFi之道編譯當前比特幣的市值約為4000億美元。作為OG鼻祖級加密貨幣,這是相當了不起的.

1900/1/1 0:00:00
揭秘「加密之王」a16z:「沒有人比Dixon更有信心」_DIX:ITZ

原文標題:《ChrisDixonKeepstheCryptoFaith》原文作者:CoryWeinberg,TheInformation 原文編譯:餅干.

1900/1/1 0:00:00
金色早報 | 狗狗幣市值重返150億美元上方_區塊鏈:加密貨幣

頭條 ▌狗狗幣市值重返150億美元上方金色財經報道,據Coingecko最新數據顯示,狗狗幣市值已反彈至150億美元上方,本文撰寫時達到15,735,458,539美元.

1900/1/1 0:00:00
Chainlink Labs:NFT的核心價值到底是什么?_NFT:HAI

原文作者:AriJuelsAriJuels是紐約康奈爾大學的教授,也是IC3的聯合董事。另外,他還是ChainlinkLabs的首席科學家.

1900/1/1 0:00:00
各自精彩:Aptos、Sui、Caduceus三大公鏈新勢力橫評_UCE:CAD

原文標題:《三大公鏈新貴對比:Aptos、Sui、Caduceus如何蓄力下一個市場熱點?》原文作者:WebX實驗室本文來自微信公眾號:WebX實驗室在越來越快的行業周期循環中.

1900/1/1 0:00:00
ads