比特幣交易所 比特幣交易所
Ctrl+D 比特幣交易所
ads
首頁 > Coinw > 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暴露出使其能夠這樣做的函數。

存儲的基本原理

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

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

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

持有狀態變量

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

動態 | 2019年7月國內一級市場區塊鏈融資10強發布 區塊鏈行業的發展不斷向產業端深入:據中國金融信息網報道,8月8日,中國金融信息網與烯牛數據聯合發布2019年7月份國內一級市場區塊鏈項目融資10強榜單。從榜單來看,在整體融資大幅下滑的趨勢下,2019年7月份國內區塊鏈項目融資數量出現回升。監測數據顯示,數字貨幣和交易平臺類融資項目明顯增多,天秤幣白皮書的發布在一定程度上提振了市場預期,但是此類項目將面臨與天秤幣的直接競爭,其商業邏輯未來或將受到天秤幣嚴酷打壓。與實體經濟結合的項目依然占據著榜單的主流,分別涉及金融、大數據、交通運輸、電商、傳媒、產權、房地產和游戲領域。從連續發布的榜單來看,區塊鏈行業的發展不斷向產業端深入,應用端的開發落地越來越具體,與實體經濟結合發展的想象空間逐漸立體化。從技術角度來看,加密、數據庫、共識、P2P和智能合約的發展日益成熟,區塊鏈作為集成性創新技術的發揮邊界正在逐步拓展。[2019/8/8]

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

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

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

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

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

聲音 | 李東榮:依托區塊鏈研究工作組等 就國內外金融科技熱點重點問題開展深入研究:據人民網報道,中國互聯網金融協會會長李東榮做客人民網視頻訪談表示,從四方面加強金融科技發展,其中提到: 第一,依托移動金融專委會、網絡與信息安全專委會、金融科技發展與研究工作組、區塊鏈研究工作組等,牽頭組織行業研究力量,就國內外金融科技熱點重點問題開展深入研究,主要包括英美及部分新興市場國家金融科技監管最新進展,網絡借貸、股權眾籌等金融科技業態國際比較,監管科技、監管沙箱發展情況,大數據、云計算、人工智能、區塊鏈等技術在金融領域的應用情況等。其次是持續加強金融科技標準化建設,提升行業標準化規范化水平。三是履行社會組織對外交往職能,不斷加強金融科技國際交流合作。 第四,協會綜合運用自身掌握數據,以及司法系統、科技公司等第三方合作數據,針對互聯網資管、網絡借貸、ICO、互聯網非法外匯交易、涉嫌違法違規宣傳活動等重點領域持續開展監測。[2018/12/27]

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

solc編譯器的錯誤報告

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

結論

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

聲音 | 法中委員會秘書長林碧溪:中法兩國深入區塊鏈及人工智能合作:據人民網消息,2018年第五屆中法團隊合作創新獎即將在巴黎揭幕,法中委員會秘書長林碧溪表示,今年提交的候選項目中,區塊鏈、人工智能、數字化工具的項目明顯增加,且涉及領域非常廣泛,覆蓋核電站老化預測的解決方案、區塊鏈學歷認證及智慧城市能源管理等領域。林碧溪指出,中法兩國創新合作的多樣性,體現在創新合作的跨領域特征中。當今世界技術革新非常迅速,從區塊鏈、人工智能到數字應用,都需要中法合作團隊及時掌握并適應形勢,才能致力于開發未來的新技術。[2018/11/30]

由于對存儲的操作有很高的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:SOLHTTTPS區塊鏈MSOL價格https://etherscan.iotps幣行情區塊鏈適合什么人做

Coinw
名詞解釋:Web3 賬戶相關概念大梳理_ING

剛剛結束的Devcon上,賬戶抽象算是是最熱的幾個話題之一,最近可以經常看到AA/EOA/SCW/4337等縮寫和代號在各種talk、panel和信息流里出現.

1900/1/1 0:00:00
晚間必讀 | 趙長鵬分享的15條為人處事原則及70條忠告_數字貨幣

1.趙長鵬分享的15條為人處事原則及70條忠告按:2022年10月13日Binance首席執行官趙長鵬發文分享了自己遵循的一些原則,非常值得大家學習。以下為15條為人處事原則.

1900/1/1 0:00:00
「不授權」到底安全嗎:Move背后的設計思想_SWAP

原文作者:@jolestar最近關于用戶和Move智能合約交互,不需要授權(Approve)是更安全還是更不安全的爭論很多.

1900/1/1 0:00:00
「空城」希壤折射大廠焦慮_ETA

元宇宙被視為下一個十年「最具張力的風口」,海內外叫得上名的互聯網巨頭則是最強勁的追風者,雄心勃勃的Facebook在2021年直接更名為Meta,百度在年底造出了希壤.

1900/1/1 0:00:00
NFT百花齊放 一文盤點主要國家監管態度_SOR

2021年以來,NFT市場爆發勢增長,即便在2022年熊市背景下,知名藍籌NFT也頻頻大額融資,NFT的基礎設施、形式等也在朝著多樣化發展,受眾也越來越廣泛,多國監管機構也逐漸開始關注起來.

1900/1/1 0:00:00
金色Web3.0日報 | 傳蘋果將推出專屬“獨特元宇宙品牌”_DEF

DeFi數據 1、DeFi代幣總市值:441.15億美元 DeFi總市值及前十代幣數據來源:coingecko2、過去24小時去中心化交易所的交易量25.

1900/1/1 0:00:00
ads