以太坊交易所 以太坊交易所
Ctrl+D 以太坊交易所
ads

EVM 深入探討_TUR:Sint-Truidense Voetbalvereniging Fan Token

Author:

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

導語

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

此系列我們將引介翻譯noxx的文章,深入探討EVM的基礎知識。

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

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

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

1_Storage.solBreakdown

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

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

Polygon的模塊化區塊鏈項目Avail已開源OpEVM SDK新原型:7月28日消息,Polygon的模塊化區塊鏈項目Avail已開源Optimism EVM(OpEVM)軟件開發工具包(SDK)的新原型,開發者可以使用OpEVM構建主權的、EVM兼容的Optimistic Rollups。該技術為開發者提供了用于運行在L2上的去中心化基礎設施,支持去中心化定序器集、無需再L1上簡歷嵌入式跨鏈橋,并真正以樂觀的方式驗證狀態轉換。OpEVM建立在Avail數據可用性層之上,可以幫助創建獨立于智能合約運行的 Rollup。OpEVM是Avail與Equilibrium Group的合作項目,OpEVM原型有其局限性,尚未投入生產。[2023/7/28 16:03:45]

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

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

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

智能合約函數調用

Ripple兼容EVM側鏈XRP Ledger提出跨鏈橋以提高網絡和Token利用率:金色財經報道,Ripple 兼容 EVM 側鏈 XRP Ledger(XRPL)與 Ripple 開發實驗室 RippleX 的開發人員為跨鏈橋提出了一個新的 XRPL 標準,該標準將實現不同網絡之間的互操作性。據悉,XRPL 標準為開發人員在 XRP Ledger 上構建應用程序提供了規范和指南,確保了網絡間的兼容性和通信,擬議的標準將允許來自一個區塊鏈的 Token 鎖定在 XRP 分類賬上的智能合約中,而在另一個區塊上發行等量的 Token。[2023/2/23 12:25:27]

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

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

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

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

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

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

Larry Cermak:Nexo所有EVM地址中NEXO占比近70%,價值2.64億美元:金色財經報道,TheBlock副總裁Larry Cermak在社交媒體上稱,這些都是我數據庫中Nexo的EVM地址,目前在19個錢包中總持有3.78億美元,其中2.64億美元是NEXO代幣。所有EVM地址加起來只有1.14億美元的非NEXO資產。[2023/1/13 11:11:07]

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

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

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

我們可以使用在線工具來查看?store(uint256)和?retrieve()哈希后的結果。

也可以通過以太坊函數簽名數據庫進行反查。

zkSync發布端到端驗證器,正式在公共測試網上運行zkEVM:10月18日消息,以太坊Layer2擴容解決方案zkSync已完成“里程碑3:證明合并”(Milestone 3: Proof Merging),在測試網上發布了zkSync端到端驗證器,通過集成有效性證明,zkSync 2.0正式在公共測試網上運行zkEVM,并將在主網發布前11天展示一個完全運行的ZK-rollup,這也是在11天后上線主網之前的最后一步。

此外在接下來的11天里,zkSync團隊將對其性能和驗證進行重大測試,以確保完全準備好于10月28日在主網上發布。在初步測試后,四季度開發人員可以在主網上進行移植和開發;今年年底前一旦所有安全檢查都通過,將向外部用戶開放。[2022/10/18 17:30:03]

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

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

Frax即將在Evmos上部署FRAX穩定幣:2月16日消息,Frax Finance將在Evmos上部署FRAX穩定幣。部署后,Evmos DeFi協議將能夠集成FRAX穩定幣,為用戶提供穩定性、可靠性和流動性。用戶還可以使用FRAX與其他基于Cosmos的鏈上的DeFi協議進行交互。[2022/2/16 9:54:26]

操作碼和調用棧

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

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

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

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

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

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

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

SHR,是向右移位指令。它從棧中獲取第一項224表示要位移的位數,從棧中獲取第二項??表示需要移位的內容。在這個操作之后調用棧上有了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語句”。

EVMPlayground

這是一個EVMPlayground測試平臺,在平臺上我們可以設置剛剛運行的字節碼。就能夠通過交互方式來查看棧的變化,并且傳入JUMPDEST,可以看到JUMPI之后會發生什么。

EVMPlaygrpund還能有助于我們理解程序計數器的運行,每條命令旁都能看到相對應的注釋以及偏移量所代表的程序計數器的位置,同時在左邊框內還能看到calldata的輸入。當點擊運行指令,可以通過右上角的箭頭單步調試每個操作碼例如更改為retrieve()?調用數據0x2e64cec1來查看執行的變化。

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

Tags:TORINTSTOTURGATOR價格Sint-Truidense Voetbalvereniging Fan TokenStonkBasefuture幣挖礦

以太坊價格今日行情
簽名在數字資產和加密貨幣中的作用_DSA:Lido Staked ETH

撰文:?IraklisLeontiadis 編譯:Hahaho 可能你正在閱讀本文的時,所使用的瀏覽器和內容終端之間的通信保密也正在運行中,這一過程得益于核心密碼原語實現的身份驗證.

1900/1/1 0:00:00
PFP 現狀與未來:找到 PFP 真正的敘事_WEB3:BAYC

最近由于SudoAMM創新,BendDAO大規模清算,讓NFT市場又有了一點活力。趁這個機會,我來聊聊PFP真正的敘事,算是我PFP系列三部曲最后一篇文章.

1900/1/1 0:00:00
晚間必讀5篇 | Web3有可能失敗的因素有哪些?_WEB3:stETH價格

1.CoinbaseCEO:如果被迫審查交易將放棄以太坊Staking業務經過幾天不斷增加的壓力,Coinbase聯合創始人兼首席執行官布賴恩·阿姆斯特朗表示,他寧愿關閉公司的以太坊質押服務.

1900/1/1 0:00:00
Fuse Capital推出5000萬美元專注于Web 3的新基金_SCR:GUSD幣

金色財經報道,總部位于巴西的FuseCapital已經開始募集FuseCapitalFundII,其核心主題是投資拉美的下一代Web3創業公司.

1900/1/1 0:00:00
以太坊合并常見的8個誤解 你必須知道_POS:以太坊官網

下個月以太坊主網有望合并,一些用戶仍對以太坊合并存在誤解,比如,「合并將降低Gas費」、「合并后交易會明顯加快」、「合并將導致以太坊區塊鏈停機」等等.

1900/1/1 0:00:00
金色Web3.0日報 | 以太坊官網:合并不會降低gas費用_區塊鏈:ethylcy

DeFi數據 1.DeFi代幣總市值:505.1億美元 DeFi總市值數據來源:coingecko2.過去24小時去中心化交易所的交易量36.

1900/1/1 0:00:00
ads