比特幣交易所 比特幣交易所
Ctrl+D 比特幣交易所
ads
首頁 > 火星幣 > Info

EVM 深入探討_INT

Author:

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

導語

在智能合約世界中,“以太坊虛擬機(EVM)”及其算法和數據結構是首要原則。我們創建的智能合約就是建立在這個基礎之上的。不管是想要成為一名出色的 Solidity 智能合約開發人員還是安全人員都必須對 EVM 有深入的了解。

此系列我們將引介翻譯 noxx 的文章(https://noxx.substack.com/),深入探討 EVM 的基礎知識。

基礎知識:Solidity → 字節碼 → 操作碼

在閱讀本篇文章之前,你需要了解一些智能合約相關基礎知識以及如何將智能合約代碼部署到以太坊鏈上。正如我們所知,智能合約在部署到以太坊網絡之前需要先將 Solidity 代碼編譯成字節碼,EVM 會根據編譯后的字節碼執行相應的操作。本篇重點介紹編譯后的字節碼以及其如何被 EVM 執行的。

智能合約被部署后編譯生成的字節碼代表了整個合約的內容,其中存在多個可調用的函數。那么 EVM 是如何知道不同函數所對應的字節碼是哪個呢?下面我們將通過一個 Solidity 智能合約及其字節碼和操作碼來向大家演示 EVM 在執行代碼時是如何在字節碼中選擇對應的函數的。

1_Storage.sol Breakdown

我們使用在線 Solidity IDE 工具 Remix 來編譯 Storage 合約。

此合約中存在兩個函數 store() 和 retrieve(),在進行函數調用時 EVM 需要判斷我們調用的是哪個函數。我們可以通過 remix 看到整個合約編譯后的字節碼。

EOS EVM即將上線,主網9月將進行硬分叉升級:8月17日消息,EOS 網絡基金會創始人和首席執行官 Yves La Rose 在社交媒體發文表示,本周 EOSIO 聯盟將公布核心協議的新代碼庫以重塑品牌;9 月 21 日,EOS 將硬分叉并激活其 v3.1 共識升級(hardfork)。EOS EVM(TrustEVM)將很快在 EOS 網絡上可用。

此前報道,Yves La Rose 曾表示,EOS 推出的 Trust EVM 或將成為以太坊首選的 L2 解決方案。Trust EVM 是官方 EOS EVM 平臺,具有確定性的 Gas 計算、指令集級別的 EVM 兼容性以及完全的 RPC 兼容等特性并即將登陸 EOS 主網。[2022/8/17 12:30:21]

下面這段字節碼是我們需要重點關注的,這段就是 EVM 判斷被調用函數的選擇器。與其對應的是 EVM 操作碼及輸入值。

我們可以通過 Ethervm.io 來查看 EVM 操作碼列表。一個操作碼長度為 1 個字節(byte),這使得它可以存在 256 種不同的操作碼。但 EVM 僅使用其中的 140 個操作碼。

下面是我們將上述字節碼解析成與其對應的操作碼。這些操作碼會由 EVM 在調用棧上按順序執行。

智能合約函數調用

在深入研究操作碼之前,我們需要快速了解如何調用合約中的函數。調用智能合約中的函數有以下方式:

EOS網絡基金會創始人:TrustEVM可成為以太坊可行擴容方案:7月1日消息,關于摩根士丹利報告的一條推文顯示,轉向PoS并不能解決以太坊的擴容問題。EOS網絡基金會創始人和首席執行官Yves La Rose轉發此條推文并表示:合并(The Merge)無助于解決以太坊擴容問題,但EOS可以,Trust EVM推出后,以太坊終于有了一個可行的擴容解決方案。據悉,此前Yves La Rose就曾在推特表示:EOS一直是高性能、低成本的L1區塊鏈網絡。脫離Block.one桎梏之后,EOS社區資金到位、人才回歸,正在重新煥發活力卷土重來。EOS并不旨在成為“以太坊殺手”,EOS推出的Trust EVM或將成為以太坊首選的L2解決方案。Trust EVM是官方EOS EVM平臺,具有確定性的Gas計算、指令集級別的EVM兼容性以及完全的RPC兼容等特性并即將登陸EOS主網。[2022/7/1 1:43:50]

abi.encode(...) returns (bytes):計算參數的 ABI 編碼。

abi.encodePacked(...) returns (bytes):計算參數的緊密打包編碼。

abi. encodeWithSelector(bytes4 selector, ...) returns (bytes):計算函數選擇器和參數的 ABI 編碼。

abi.encodeWithSignature(string signature, ...) returns (bytes):等價于?abi.encodeWithSelector(bytes4(keccak256(signature), ...)。

abi.encodeCall(function functionPointer, (...)) returns (bytes memory):使用 tuple 類型參數 ABI 編碼調用 functionPointer()。執行完整的類型檢查,確保類型匹配函數簽名。結果和?abi.encodeWithSelector(functionPointer.selector, (...)) 一致。

基于Evmos的DEX EvmoSwap公布空投分配計劃,總計空投1150萬枚EMO:金色財經消息,基于Evmos的DEX EvmoSwap公布空投分配計劃,總計空投1150萬枚EMO(總量的2.3%),空投對象涵蓋早期的支持者、合格的測試網參與者、Evmos社區和Cosmos生態系統(包括Osmosis、Juno、SecretNetwork、Terra社區)。其中早期社區支持者100萬枚EMO、合格的測試網參與者50萬枚EMO、EvmoSwap早期流動性提供商500萬枚EMO,而Evmos社區和Cosmos生態系統的空投標準和快照時間待定,將由社區投票決定,將很快發布有關分發和申領方法的公告。[2022/4/28 2:35:20]

這里我們以第四種為例,調用 store() 并傳入參數 10:

下面是通過?abi.encodeWithSignature (" store (uint256)",10)?編碼后的內容:

這段數據就是編碼后的函數簽名。

我們可以使用在線工具(“https://emn178.github.io/online-tools/keccak_256.html”)來查看?store(uint256) 和?retrieve() 哈希后的結果。

動態 | 加速器公司Coinsilium宣布與技術公司Devmons合作 推出區塊鏈軟件工作室:據CryptoNinjas今日報道,區塊鏈技術公司發展加速器公司Coinsilium宣布與直布羅陀技術管理公司Devmons簽署諒解備忘錄(MoU),并將聯合推出區塊鏈軟件和智能合同開發工作室TerraStream。[2019/11/26]

也可以通過以太坊函數簽名數據庫(https://www.4byte.directory/signatures/)進行反查。

再回到上面的那組函數簽名數據,其中前 4 個字節對應的是 store(uint256)。而剩余的 32 個字節則對應的是一個十六進制的值 “a”,也就是我們調用函數時傳入的 uint256 類型的 10。

這里我們可以得到一個結論,通過?abi.encodeWithSignature()?編碼后得到的數據,共 36 個字節。這 36 個字節的數據就是函數簽名,其中前 4 個字節為函數選擇器,它將指引 EVM 去選擇我們調用的目標函數,后 32 個字節的數據則是我們調用函數時傳入的參數。

操作碼和調用棧

這里相信大家已經大致了解了智能合約中函數調用的原理了,下面我們將通過解讀每個操作碼的作用及其對棧調用的影響。如果你不熟悉棧數據結構的工作原理,可以觀看此視頻來快速入門:https://www.youtube.com/watch?v=FNZ5o9S9prU

動態 | 迅雷鏈發布“支持EVM、WASM雙虛擬機模式”等四項技術升級:4月10日,在2019中國國際區塊鏈技術與應用大會上,迅雷鏈總工程師來鑫受邀出席并發表了\"支撐億級用戶的區塊鏈技術革新\"的演講,在迅雷鏈原有的百萬TPS、秒級確認的領先性能的基礎上,發布四大技術革新:1.首家支持EVM、WASM雙虛擬機模式,兼容能力再擴展;2.率先實現國密體系中簽名逆推公鑰的算法,提升主鏈運行效率;3.創新實現存儲快照化,從根本上降低節點存儲壓力,提高節點啟動速度;4.實用可行的隱私保護方案。此次技術革新將極大提升區塊鏈開發效率、降低開發門檻,進一步促進區塊鏈技術賦能實體經濟。[2019/4/10]

我們將得到的字節碼分解成相對應的操作碼后依次開始分析。

?PUSH1 操作,將一個?1 字節的值壓入棧,它會告訴 EVM 將下一個數據字節 0x00(也是十進制的 0)?壓入棧中。

接下來是 CALLDATALOAD,其作用是從消息數據中讀取 32 個字節的值,其中使用 “輸入” 值作為偏移量將 calldata 加載到棧中。棧項大小為 32 字節,但是當前我們的 calldata 有 36 個字節。推送的值是 msg.data[i:i+32] 其中 “i” 就是這個輸入值。此操作確保只有 32 個字節被推送到棧,同時也能保證我們能夠訪問 calldata 中的任何部分。

當前輸入值為 0 也就是沒有偏移量(從棧中彈出的值是前一個 PUSH1 的值 0),因此 calldata 的前 32 個字節會被推送到調用棧。

還記得之前所獲取到的函數簽名嗎?如果要傳入這 36 個字節,這就意味著后面的 4 個字節“0000000a”將會丟失。如果想訪問這個 uint256 類型的參數,需要設置 4 的偏移量來省略函數簽名,這樣就可以保證參數的完整性。

第二次進行 PUSH1 的操作將傳入十六進制的數據 0xe0,也就是十進制的 224。我們上面提到過,函數簽名是 4 個字節也就是 32 位。我們加載的 calldata 是 32 個字節也就是 256 位,而 256 - 32 =224 正好滿足。

SHR,是向右移位指令。它從棧中獲取第一項 224 表示要位移的位數,從棧中獲取第二項?(0x6057361d0…00)?表示需要移位的內容。在這個操作之后調用棧上有了 4 個字節的函數選擇器。

如果對于位移的工作原理不熟悉的小伙伴,可以查看這個視頻了解:https://www.youtube.com/watch?v=fDKUq38H2jk&t=176s

接下來的操作碼, DUP1,它用來獲取并復制棧頂部的值。

PUSH4 將?retrieve() (0x2e64cec1) 的 4 個字節函數簽名推入調用棧。

如果你好奇是這個值是如何獲得的,那是因為 solidity 代碼被編譯成字節碼中。編譯器可以從字節碼中獲取所有函數名稱和參數類型的信息。

EQ 用于判斷從棧中彈出的 2 個值,在當前事例中為 0x2e64cec1 和 0x6057361d 并檢查它們是否相等。如果相等,則將 1 推回棧,如果不相等則為 0。

PUSH2 將 2 字節的十六進制數據 0x003b,十進制值為 59,推送到調用棧中。

調用棧中有一個叫做程序計數器的東西,它會指定下一個執行命令在字節碼中的位置。這里的 59,是通過 retrieve()?字節碼的開始位置所得到的。

JUMPI 代表“如果條件為真,則跳轉”,它從棧中彈出 2 個值作為輸入,第一個 59 表示的是跳轉位置,第二個 0 是是否應該執行此跳轉條件的布爾值。其中 1 為真,0 為假。

如果條件為真,程序計數器將被更新,執行將跳轉到該位置。但我們的例子中條件為假的,程序計數器沒有改變并且繼續執行。

再次進行DUP1。

PUSH4 將 store(uint256) (0x6057361d)?的 4 字節函數簽名推送到調用棧上。

再次進行 EQ,但這次結果為真,因為函數簽名相同。

PUSH2 推送 2 個字節的十六進制數據?0x0059 也就是十進制的 89, 到 store(uint256) 字節碼的程序計數器位置。

執行 JUMPI,此次 bool 值為真,執行跳轉。因此會將程序計數器更新為 89,這會將執行移動到字節碼的不同部分。在這個位置,會有一個 JUMPDEST 操作碼,如果沒有這個操作碼在這里的話,JUMPI 操作就會失敗。

有了它,在執行此操作碼后,將被帶到 store(uint256)?對應的字節碼的位置,并且函數的執行將繼續。雖然這個合約只有 2 個函數,但基礎原理都是相同的。

通過上面的例子我們知道了 EVM 是如何根據合約函數調用來確定它需要執行的函數字節碼的位置。簡單來說就是由合約中每個函數及其跳轉位置所組成的一組簡單的“if 語句”。

EVM Playground

這是一個 EVM Playground(https://www.evm.codes/playground)測試平臺,在平臺上我們可以設置剛剛運行的字節碼。就能夠通過交互方式來查看棧的變化,并且傳入 JUMPDEST(注:可能跳轉的目標元數據),可以看到 JUMPI 之后會發生什么。

敬請期待《EVM 深入探討-Part 2》,讓我們共同探索合約內存是什么以及它在 EVM 下的工作方式。

慢霧科技

個人專欄

閱讀更多

金色早8點

Bress

鏈捕手

財經法學

PANews

成都鏈安

Odaily星球日報

Tags:EOSTORINT以太坊EOS AuctionTORC價格Artificial Liquid Intelligence以太坊幣最高價格是多少人民幣

火星幣
金色早報 | 穩定幣總流通供應量超過1500億美元_加密貨幣

頭條 ▌穩定幣總流通供應量超過1500億美元金色財經報道,根據CryptoRank數據顯示,市場上的穩定幣總流通供應量超過 1500 億美元.

1900/1/1 0:00:00
預祝以太坊合并成功 這些有趣的紀念版 NFT 值得收藏_ESI

撰文:William M. Peaster編譯:aididiaojp.eth,Foresight News距離區塊鏈智能合約網絡最大的進化以太坊合并還有一周時間.

1900/1/1 0:00:00
探究加密市場下個階段核心敘事及賽道梳理_Solana

原文:《A Soft-ish Landing》by Ansem編譯:Amber丨Foresight News隨著美國通脹壓力的減輕和以太坊合并臨近,加密市場迎來了一定的復蘇.

1900/1/1 0:00:00
二次方治理規模化的現實約束與解法探索_ERIC

Shaun:Hello,大家好!歡迎收聽本期 Yaki 叨叨 DAO,我是主持人 Shaun。熟悉加密圈的朋友們一定會經常聽到一個詞叫“治理”.

1900/1/1 0:00:00
深入理解靈魂綁定代幣:起源、應用場景與技術實現_WEB3

原文標題:《SBT 綜述》 撰文:Solv 研究組 5 月初 SBT 論文發表之后,迅速成為整個 Web3 領域最熱門的話題之一.

1900/1/1 0:00:00
從Celsius到三箭:加密百億巨頭們的多米諾 史詩級流動性的枯竭_ELS

自今年 5 月以來,加密市場就再也沒有太平過。短短一個月,我們見證了 Luna 400 億美元金融帝國一夜崩塌、ETH 2.0 全球最大去中心化節點 Lido 衍生品脫錨、美國最大加密銀行 Ce.

1900/1/1 0:00:00
ads