前言
EVM是一個輕量級的虛擬機,其設計初衷就是提供一種可以忽略硬件、操作系統等兼容性的虛擬的執行環境供以太坊網絡運行智能合約。
簡單來說EVM是一個完全獨立的沙盒,在EVM中運行的代碼是無法訪問網絡、文件系統和其他進程的,以此來避免錯誤的代碼能讓智能合約毀滅或者影響外部環境。
在此基礎上,知道創宇區塊鏈安全實驗室帶大家一起深入理解EVM的存儲機制和安全問題。
EVM存儲結構
可以看到EVM存儲數據分為兩類:
存儲在code和storage里的數據是non-volatile(不容易丟失的)
聲音 | 科藍軟件:公司與螞蟻金服在區塊鏈方面有廣泛深入合作:科藍軟件(SZ300663)在互動平臺表示,公司與螞蟻金服在互聯網銀行的前臺、中臺、后臺產品和項目以及區塊鏈方面已經有廣泛深入的合作,雙方是戰略層面的合作,并且還在繼續深化以及向其他領域擴展,具體請參考公司相關公告。[2019/11/20]
存儲在stack,args,memory里數據是volatile(容易丟失的)
各個存儲位置的含義
Code
code部署合約時儲存data字段也就是合約內容的空間,即專門存儲智能合約的二進制源碼的空間
聲音 | 科藍軟件:與螞蟻金服在區塊鏈方面已有廣泛深入的合作:科藍軟件(SZ300663)董秘在互動平臺回復投資者就“恒生減持公司股票,對科藍和螞蟻金服的影響及數字金融行業公司有那些進展”提問表示,科藍與螞蟻在互聯網銀行的前臺、中臺、后臺產品和項目以及區塊鏈方面已經有廣泛深入的合作,雙方是戰略層面的合作,并且還在繼續深化以及向其他領域擴展。 根據恒生電子(75.300,?1.19,1.61%)9月26日發布的公告:“(恒生)公司所持的科藍軟件股票的前期浮動盈利已計入公司本年度凈利潤中,本次出售使得科藍軟件股票部分前期浮動盈利已經轉化為現金收益”,恒生在科藍屬于財務性投資,正常減持。恒生和科藍都屬金融科技公司,因細分領域不同,所以沒有產品和項目合作關系,其減持對科藍發展沒有任何影響!在正在召開的云棲大會上,公司剛剛獲頒“阿里云專有云首批行業ISV合作伙伴認證”,與螞蟻共創的“電子渠道逸平臺解決方案”也在上月通過了V3版本兼容性測試認證。毋庸置疑,國內數字金融行業正在起飛,公司未來會與螞蟻一起,將更多創新的產品提供給客戶。[2019/9/27]
Storage
聲音 | 中國平安:深入開展人工智能、區塊鏈、云三大核心技術的研發與應用:中國平安(601318)昨日發布了即將在年度股東大會及H股類別股東大會上的決議資料,其中包括《公司2019-2021年發展規劃》,規劃在發展措施中指出,公司持續夯實基礎,深入開展人工智能、區塊鏈、云三大核心技術的研發與應用,深度賦能核心業務的客戶經營、渠道管理、客戶服務、風險管控等方面,推動業務價值提升和創新公司孵化。[2019/3/29]
Storage是一個可以讀寫修改的持久存儲的空間,也是每個合約持久化存儲數據的地方。Storage是一個巨大的map,一共2^256個插槽(slot),每個插糟有32byte,合約中的“狀態變量”會根據其具體類型分別保存到這些插槽中。
Facebook創始人稱要深入的學習和了解加密貨幣技術:扎克伯格在Facebook發帖稱,2018年他的新挑戰是解決Facebook存在的一些問題,并且還要深入了解和學習加密技術和加密貨幣,并運用到Facebook的服務中去。[2018/1/5]
Stack
stack即所謂的“運行棧",用來保存EVM指令的輸入和輸出數據。可以免費使用,沒有gas消耗,用來保存函數的局部變量,數量被限制在16個。stack的最大深度為1024,其中每個單元是32byte。
Args
args也叫calldata,是一段只讀的可尋址的保存函數調用參數的空間,與棧不同的地方的是,如果要使用calldata里面的數據,必須手動指定偏移量和讀取的字節數。
Memory
Memory一個簡單的字節數組,主要是在運行期間存儲數據,將參數傳遞給內部函數。基于32byte進行尋址和擴展。
EVM數據存儲概述
前面已經說過Storage是每個合約持久化存儲數據的地方其儲存數據的方式是通過插槽來實現的,現在就具體介紹它是怎么實現的:
狀態變量
1.對于大小在32字節以內的變量(常量),以其定義的順序作為它的索引值來存儲。即第一個變量的索引為key(0),第二個變量的索引為key(1)...
2.對于連續較小的值,可能被優化存儲在同一個位置,比如:合約中前四個狀態變量都是uint64類型的,則四個狀態變量的值會被打包成一個32字節的值存儲在0位置。
未優化:
pragmasolidity^0
??functionm()?externalreturns(uint256,uint256){????Infostorageinfo;????info
??functiontest(bytes32_name,address?_mappedAddress)public{????Personperson;????person.name=_name;????person.mappedAddress=_mappedAddress;????require(unlocked);?}}
漏洞合約分析:
可以看到該合約在函數部分創建新的結構體時沒有進行初始化,由此我們可以利用該函數進行對owner的修改。不過使用該函數我們還要通過require驗證,不過這也不難因為狀態變量unlocked也同樣在我們可控的范圍內。
具體操作:
調用test函數分別傳入向_name傳入:0x0000000000000000000000000000000000000000000000000000000000000001(真值)
_mappedAddress傳入:0xfB89eCb0188cb83c220aADDa1468C1635208e821(個人地址)
傳參前:
傳參后:
可以看到已經成功更改了地址。
總結
可以看到EVM的存儲器就是一個key=>value的健值數據庫,存儲的數據可以通過校驗和來確保一致。但是其也是和智能合約語言進行交互的,當其中一些規則發生沖突很可能就被別有用心的人用來作惡,所以規范的使用智能合約語言是避開漏洞的必要條件。
吳說作者|談叔 本期編輯|ColinWuCoinbase收到來自SEC的“宣戰”本月,Coinbase的CEO和聯合創始人BranArmstrong發了一系列的推.
1900/1/1 0:00:00鏈聞消息,據福布斯報道,加密貨幣交易平臺Coinrule完成220萬美元種子輪融資,投資者包括Fitbit聯合創始人兼CEOJamesPark、Twitch聯合創始人KevinLin和Kayak.
1900/1/1 0:00:00尊敬的用戶: 因節點升級,WBF暫時關閉ZEC的充提幣,給您帶來的不便,敬請諒解。掃碼加入WBF官方QQ群 WBF風險提示: Ripple CEO敦促美立法者處理SEC主席關于“現有證券法足以監.
1900/1/1 0:00:00金色財經報道,RobinhoodCrypto首席運營官ChristineBrown早前曾表示Robinhood正在考慮質押、借貸和其他DeFi工具.
1900/1/1 0:00:00前言 在以太坊上,我們可以通過部署智能合約來實現我們需要的功能,合約代碼中我們往往需要定義一些變量,這就涉及到了智能合約變量的存儲機制.
1900/1/1 0:00:00尊敬的中幣用戶: ???HarricaneSwap福利申購活動已圓滿完成,感謝所有用戶的熱情參與!???HCT福利申購活動結束后的BTC第一個區塊哈希值為:0000000000000000000.
1900/1/1 0:00:00