以太坊價格 以太坊價格
Ctrl+D 以太坊價格
ads
首頁 > XLM > Info

區塊鏈:深入理解 EVM 存儲機制及安全問題

Author:

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

EVM 是一個輕量級的虛擬機,其設計初衷就是提供一種可以忽略硬件、操作系統等兼容性的虛擬的執行環境供以太坊網絡運行智能合約。

簡單來說 EVM 是一個完全獨立的沙盒,在 EVM 中運行的代碼是無法訪問網絡、文件系統和其他進程的,以此來避免錯誤的代碼能讓智能合約毀滅或者影響外部環境。

在此基礎上,知道創宇區塊鏈安全實驗室帶大家一起深入理解 EVM 的存儲機制和安全問題。

可以看到 EVM 存儲數據分為兩類:

存儲在 code 和 storage 里的數據是 non-volatile (不容易丟失的)

存儲在 stack,args,memory 里數據是volatile(容易丟失的)

Code

code 部署合約時儲存 data 字段也就是合約內容的空間,即專門存儲智能合約的二進制源碼的空間

Storage

Storage 是一個可以讀寫修改的持久存儲的空間,也是每個合約持久化存儲數據的地方。Storage 是一個巨大的 map,一共 2^256 個插槽 (slot),每個插糟有 32byte,合約中的“狀態變量”會根據其具體類型分別保存到這些插槽中。

Stack

stack 即所謂的“運行棧",用來保存 EVM 指令的輸入和輸出數據。可以免費使用,沒有 gas 消耗,用來保存函數的局部變量,數量被限制在 16 個。stack 的最大深度為 1024 ,其中每個單元是 32 byte。

云南省委宣傳部副部長:深入推進區塊鏈與各行業領域的深度融合:8月25日,云南省委宣傳部副部長、省新聞出版(版權)局局長楊潤,市委常委、市委宣傳部部長徐曉梅率隊到五華區調研“區塊鏈 ”大文創產業建設情況。云南省區塊鏈中心成立了產業聯盟,數十家國內外企業加入,以商招商的產業氛圍日漸濃厚。中心成立一年以來,以成熟領先的區塊鏈技術助力數字云南發展。上線云南區塊鏈平臺,為企業快速部署應用提供極大便利。楊潤表示,五華區要按照“以應用換市場、以市場換產業”思路,以區塊鏈技術應用為突破口,強化政策引領,加大招商引資力度,引進國內外優秀企業落地園區,聚焦場景應用,深入推進區塊鏈與各行業領域的深度融合,把五華區打造成區塊鏈技術應用試驗場、產業發展聚集區。(五華區委宣傳部)[2021/8/30 22:46:23]

Args

args 也叫 calldata,是一段只讀的可尋址的保存函數調用參數的空間,與棧不同的地方的是,如果要使用 calldata 里面的數據,必須手動指定偏移量和讀取的字節數。

Memory

Memory 一個簡單的字節數組,主要是在運行期間存儲數據,將參數傳遞給內部函數。基于 32byte 進行尋址和擴展。

前面已經說過 Storage 是每個合約持久化存儲數據的地方其儲存數據的方式是通過插槽來實現的,現在就具體介紹它是怎么實現的:

外匯管理局山西省分局深入推進跨境金融區塊鏈服務平臺應用:外匯管理局山西省分局近日出臺了《國家外匯管理局山西省分局關于千方百計支持中小微外貿企業復工復產健康發展的指導意見》,提出多項具體措施精準幫扶中小微外貿企業。在緩解融資難題方面,深入推進跨境金融區塊鏈服務平臺應用,為中小微外貿企業跨境結算與融資擴渠道、增便利。(生活晨報)[2020/5/8]

1.對于大小在 32 字節以內的變量(常量),以其定義的順序作為它的索引值來存儲。即第一個變量的索引為 key(0),第二個變量的索引為 key(1)...

2.對于連續較小的值,可能被優化存儲在同一個位置,比如:合約中前四個狀態變量都是 uint64 類型的,則四個狀態變量的值會被打包成一個 32 字節的值存儲在 0 位置。

未優化:

pragma solidity ^0.4.11;contract C {? ?uint256 a = 12;? ?uint256 c = 12;? ?uint256 b = 12;? ?uint256 d = 12;? ?function m() view public returns(uint256,uint256,uint256,uint256){? ? ? ?return (a,b,c,d);? ?}}

優化后:

pragma solidity ^0.4.11;contract C {? ?uint64 a = 12;? ?uint64 c = 12;? ?uint64 b = 12;? ?uint64 d = 12;? ?function m() view public returns(uint64,uint64,uint64,uint64){? ? ? ?return (a,b,c,d);? ?}}

山西深入推進跨境金融區塊鏈服務平臺應用:國家外匯管理局山西省分局深入推進跨境金融區塊鏈服務平臺應用,為中小微外貿企業跨境結算與融資擴渠道、增便利。目前,山西省已有17家銀行加入該平臺,為16家企業辦理融資業務116筆,累計放款7.67億美元。(中國新聞網)[2020/5/3]

對于大小在 32 字節以內的結構體同樣也是順序存儲,例如結構體變量索引定義在位置 0,結構體內部有兩個成員,則這兩個成員的依序為 0 和 1。

pragma solidity ^0.4.11;contract C {struct Info {? ?uint256 a ;? ?uint256 b ;}? ?function m() ?external returns(uint256,uint256){? ? ? ?Info storage info;? ? ? ?info.a = 12 ;? ? ? ?info.b = 24 ;? ? ? ?return(info.a,info.b);? ?}}

map 存儲位置是通過 keccak256 (bytes32(key) + bytes32(position) ) 計算得到的,position 表示 key 對應 storage 類型變量存儲的位置。

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

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

pragma solidity ^0.4.11;contract Test {?mapping(uint256 => uint256) knownsec;?function go() public {? ? ?knownsec[0x60] = 0x40;?}}

同上,只要在 32 字節以內也是順序存儲,不過在編譯時編譯器會進行邊界檢查防止越界。

pragma solidity ^0.4.11;contract C {? ?uint256 a = [12,24,48] ;? ?? ?function m() public view returns(uint256,uint256,uint256){? ? ? ?return (a,a,a);? ?}? ?}

全球的規則制定者將深入研究數字貨幣:擔任G20金融穩定委員會(FSB)主席和英格蘭銀行行長的馬克·卡尼(Mark Carney)表示,鑒于去年數字貨幣的爆炸式增長,全球的規則制定者將深入研究數字貨幣。卡尼先生告訴財政部特別委員會說,他希望金融穩定委員會能夠討論分布式分類賬技術,這是加密貨幣和數字貨幣本身的基礎。他還表示,收緊有關ICO的規定是十分必要的。卡尼先生被委員會問及如何看待比特幣,他重復了英國官員之前的言論,盡管比特幣的價值在上漲,但當局并不認為這會成為英國整體金融穩定的風險。他補充說,英國央行認為支撐比特幣的分布式賬本技術可以最好地應用于大規模的結算,但仍然需要正確部署接下來的道路。[2017/12/21]

由于可變長度數組長度不定,一般在編譯可變長度數組時會提前預留存儲空間,所以就會使用狀態變量的位置存儲可變長度數組的長度。

而具體的數據地址會通過計算 keccak256 (bytes32(position)) 算得數組首地址,再加數組長度偏移量獲得具體的元素。

pragma solidity ^0.4.11;contract C {? ?uint256[] a = [12,24,48] ;? ?? ?function m() public view returns(uint256,uint256,uint256){? ? ? ?return (a,a,a);? ?}? ?}

如果長度小于等于31字節 :

1.對于定長字節數組則是同定長數組一樣;

2.對于可變字節數組和字符串,會在存儲值位置補0一直到32字節,并用補0的最后一個字節存儲字符串的編碼長度。

pragma solidity ^0.4.4;contract A{? ?string public name0 = "knownsec";?? ?bytes8 public name=0x6b6e6f776e736563;? ?bytes public g ;? ?? ?function test() public {? ? ? ?g.push(0xAA);? ? ? ?g.push(0xBB);? ? ? ?g.push(0xCC);? ?}? ?function go() public view returns(bytes){? ? ? ?return g;? ?}}

當節數組和字符串長度大于31字節時

1.變量位置存儲編碼長度,并且編碼長度公式更換為編碼長度 = 字符數 * 2 + 1

2.真實存儲值第一個位置通過公式 keccak256(bytes32(position)) 獲取,剩余值在獲取到的位置順序存儲,同樣在最后存儲位置補0到32字節。

string public name = "knownsecooooooooooooooooooooooooo";

前面已經講到EVM的存儲結構及存儲機制,現在我們再來探討其安全問題。

漏洞原理:

在官方手冊中提到結構體,數組和映射的局部變量默認是放在 storage 中的,而 solidity 語言中函數中設置的局部變量的默認類型取決于它們本身的類型。

因此如果在函數內部設置以上 storage 類型變量卻沒有進行初始化,他們就相當于存儲指針指向合約中的其他變量,當我們對其進行改變時改變的就是其指向的變量。漏洞合約,目的修改 owner 為自己地址:

pragma solidity ^0.4.0;contract testContract{? ?bool public unlocked = false;? ?address public owner = 0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c;struct Person {? ?bytes32 name;? ?address mappedAddress;}? ?function test(bytes32 _name , address ?_mappedAddress) public{? ? ? ?Person person;? ? ? ?person.name = _name;? ? ? ?person.mappedAddress = _mappedAddress;? ? ? ?require(unlocked);? }}

漏洞合約分析:

可以看到該合約在函數部分創建新的結構體時沒有進行初始化,由此我們可以利用該函數進行對owner的修改。不過使用該函數我們還要通過require驗證,不過這也不難因為狀態變量unlocked也同樣在我們可控的范圍內。

具體操作:

調用test函數分別傳入向_name 傳入:0x0000000000000000000000000000000000000000000000000000000000000001(真值)

_mappedAddress 傳入:0xfB89eCb0188cb83c220aADDa1468C1635208e821(個人地址)

傳參前:

傳參后:

可以看到已經成功更改了地址。

可以看到 EVM 的存儲器就是一個 key=>value 的健值數據庫,存儲的數據可以通過校驗和來確保一致。但是其也是和智能合約語言進行交互的,當其中一些規則發生沖突很可能就被別有用心的人用來作惡,所以規范的使用智能合約語言是避開漏洞的必要條件。

Tags:UININT區塊鏈BLIPenguin Financeint幣最新價格區塊鏈域名選什么后綴好Gamblica

XLM
OIN:新聞周刊 | 美BTC ETF再推遲 交易所等陸續退出中國市場

拜登政府尋求將穩定幣發行者作為銀行進行監管。▌美SEC宣布推遲4支BTC ETF決策時間10月1日消息,美國證券交易委員會(SEC)宣布,將4支 BTC ETF 申請裁定時間延長 45 天.

1900/1/1 0:00:00
COM:Messari報告:COMP錯發的Q3 DeFi“老炮”Compound還好嗎?

注:原作者為Ryan Watkins,以下為全文編譯。 Compound于2018年9月推出,是一個建立在以太坊上的領先利率協議,使用戶能夠去權限地從抵押品池中借出和貸出資產.

1900/1/1 0:00:00
GER:從計算、索引到存儲 Web3網絡收入的黎明已至

Web3的普及早已在預料之中,但由于需要跨越計算、索引、數據管理、托管、存儲和其他重要服務的基礎設施,因此需要時間才能完全體現.

1900/1/1 0:00:00
數字經濟的四大要素:價值、機構、技術、制度

當前,新一輪科技革命快速發展,數字經濟已成為引領全球經濟社會變革、推動我國經濟高質量發展的重要引擎.

1900/1/1 0:00:00
人工智能:深度數字化后:元宇宙會好玩兒嗎

元宇宙從反烏托邦科幻小說《雪崩》里的文學構想,演變為一個用以概括Roblox等UGC(User generated content)游戲的代名詞,最后被寫進招股說明書和行研報告里.

1900/1/1 0:00:00
加密貨幣:金色早報 | 外媒:美國首個比特幣期貨ETF將于下周啟動交易

頭條 ▌外媒:美國首個比特幣期貨ETF將于下周開始交易在美國證券交易委員會 (SEC) 的五位委員舉行會議后,SEC于周五首次批準了比特幣期貨ETF.

1900/1/1 0:00:00
ads