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

CODE:以太坊智能合約逆向分析與實戰:(5)深入EVM之合約的部署與調用

Author:

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

當我們部署和調用合約的時候,EVM 都在做些什么?

如果你開發過以太坊智能合約,想必你應該熟悉這樣的操作 (此處以remix為例) :

編寫solidity代碼 -> 編譯 -> 部署-> 交互 。合約的編寫與部署似乎并不是一件很麻煩的操作:編寫階段就不說了,Solidity語言大家都應該會;到了編譯階段,本地的 solc 編譯器會把 Solidity 代碼編譯成字節碼(bytecodes);而在部署階段,部署者通過發起一筆特殊交易(to的地址為空)calldata 帶上編譯后的字節碼,等交易上鏈之后,就完成了合約的部署;而合約交互,就是call合約里的某個函數,等待函數的響應和返回,一切就是這樣的簡單。

但是正如開車一樣,當你踩住油門后,車輛開始前進。然而這看似簡單的操作背后是汽油爆燃、活塞往復、數百個齒輪嚙合傳動、輪胎與地面滾動摩擦的復雜行為。部署和調用合約也是如此,它涉及到 EVM 的堆棧操作,內存讀寫,存儲訪問等一系列底層操作。當部署合約時, EVM 把收到的 calldata 翻譯成操作指令,把它們按照給定的長度和參數讀入內存;當調用合約時,EVM 又根據收到的 calldata ,通過函數選擇器來確定調用哪一段代碼,并返回數值。如果只講理論未免過于枯燥,為了便于講解,我們這次用 ethernaut 的一道題目作為例子,詳細了解 EVM 是如何部署和運行合約的,以及如何充當人肉編譯器,徒手編寫智能合約。

以太坊升級以來已有超336萬枚ETH新存入質押 APR為8.64%:金色財經報道,Token.Unlock數據顯示,自以太坊上海升級完成以來,已有約266萬枚ETH解除質押,約336萬枚ETH新存入質押,凈質押余額約70.4萬枚ETH。即以太坊上海升級完成以來的ETH新存入質押數已超過解除質押數。此外,當前約枚3.29萬ETH處于待提款狀態,質押APR為8.64%。[2023/5/14 15:02:20]

這個題目是這樣的:我們需要部署一個合約,當我們調用合約 **whatIsTheMeaningOfLife()**函數的時候,它需要返回一個數字 “42”。看起來很簡單對吧?我們分分鐘編寫完畢:

慢著,題目后面還有個小小的附加要求:“所部署的合約大小不超過10個操作碼”。好吧,這個要求的確夠“小”,要知道連合約頭部的 “函數選擇器” 都不止 10 個操作碼好吧?可是“函數選擇器” 是什么,為什么會出現在合約里面呢?帶著你的疑問,繼續向下看。

我們通過 ./solc --asm --bin target.sol 來看看這個合約的最終編譯結果:

DeFi研究人員:即將到來的合并將為以太坊創造更好的經濟結構:7月11日消息,DeFi研究人員Vivek Raman在推特上強調,即將到來的以太坊合并將為該智能合約平臺創造更好的經濟結構。根據Raman的說法,向PoS的轉變降低了ETH的通脹,提供了更好的安全性,并將ETH定位為數字債券。

Raman表示,合并后,ETH通脹率將從4.3%降至0.22%。他進一步解釋說,這使得其生態系統的發行量減少了95%,限制了一天可以出售的ETH數量。

Raman還稱,在合并之后,該平臺將擁有更好的安全性。他引用了以太坊聯合創始人Vitalik Buterin(V神)的一篇文章,并強調說,一旦網絡運行在PoS上,攻擊成本會更高。

除此之外,Raman還認為,以太坊合并將使ETH作為一種價值儲存和抵押資產,補充比特幣的用例。他指出,雖然BTC將發揮數字黃金的功能,但ETH將把自己定位為數字債券,以及作為DeFi中的抵押品。(Cointelegraph)[2022/7/11 2:06:14]

608060405234801561001057600080fd5b5060b68061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063650500c114602d575b600080fd5b60336047565b604051603e91906067565b60405180910390f35b6000602a905090565b6000819050919050565b6061816050565b82525050565b6000602082019050607a6000830184605a565b9291505056fea26469706673582212206ef8c7b5177952a701b3b46b69cb3ec296f4c54c946692e8ec901f5e43c1e78a64736f6c63430008110033

以太坊網絡當前已銷毀超215萬枚ETH:金色財經報道,據Ultrasound數據顯示,截止目前,以太坊網絡總共銷毀2154261.43枚ETH。其中,OpenSea銷毀230047.02枚ETH,ETH transfers銷毀203222.97枚ETH,Uniswap V2銷毀130783.06枚。

注:自以太坊倫敦升級引入EIP-1559后,以太坊網絡會根據交易需求和區塊大小動態調整每筆交易的BaseFee,而這部分的費用將直接燃燒銷毀。[2022/4/24 14:45:39]

這么一大坨十六進制數據,就是上述 Solidity 程序編譯之后的字節碼。當我們部署合約時,把這一堆 data 發給以太坊節點,等廣播完成后,合約就部署完畢了。這是 solc 編譯器編譯 Solidity程序得到的代碼,看似雜亂無章的的數據,其實都是和 opcodes 一一對應的。我們來一段一段地看這些代碼:

合約部署代碼:

合約運行代碼:

auxdata:

我們先簡單地把這堆代碼分為合約的部署代碼、運行代碼、auxdata 三部分,如何理解這三種代碼呢?我覺得可以理解為向太空發射衛星:“部署代碼” 就是運載火箭,而“運行代碼”就是衛星。運載火箭只在發射衛星時才起到作用,一旦衛星進入軌道,火箭就廢棄了,只留下衛星在太空中與地球通信。 部署合約也是如此,在部署合約時,部署代碼把一些初始化工作作完之后,就把合約的運行代碼送入EVM,只留下運行代碼在鏈上與用戶進行交互。 (至于auxdata,它是緊跟在runtime代碼后面的43個字節,相當于源碼的指紋,可以用來驗證。這只是數據,并不會被EVM執行。)

ECN以太坊中文社區Esther:以太坊2.0不用等3-5年:2020年12月30日下午3點,火幣尖峰對話《12.30火幣尖峰對話:為什么我們如此需要以太坊2.0以及它現在到底怎么樣?》主題線上活動在社群舉行。ECN以太坊中文社區負責人Esther表示,以太坊2.0的新路線圖是“可執行PoS信標鏈+數據分片+layer2”的架構,可能加速ETH2.0的步伐。根據Vitalik的說法,輕客戶端支持在2021年實現沒有問題;合并和分片可能在2021年末迎來成熟的測試網版本,因為我們需要等待PoS信標鏈在產品環境中平穩安全地運行較長一段時間,同時不斷進行合并測試。

以太坊社區一向是穩中求進,比起更新速度更加注重整個網絡的穩定性和安全性。總的來說,新路線圖縮短了ETH的鎖定周期,提前為以太坊帶來數千倍的吞吐量,加速了以太坊2.0完全可用的步伐,很可能將不再需要等待3—5年。[2020/12/30 16:05:52]

那么言歸正傳,我們題目要求我們合約運行代碼的 opcedes 不超過 10 條,那么,這段代碼對應的 opcodes 是多少條呢?答:71 條。(通過查看 Remix : ./artifacts/MagicNum.json 中的 bytecode 里的 opcodes 可以看到。而 deployedBytecode 里的 opcodes 卻是 92 條,因為它的長度是 部署代碼 + 運行代碼 )

美國保險信用機構NAFCU加入以太坊聯盟 共同致力于構建DLT:美國聯邦保險信用聯盟協會(NAFCU)是美國的一個貿易組織,已經成為企業以太坊聯盟(EEA)的最新成員。隨著這一舉措,該機構加入了已經簽署了聯盟的300多家企業,共同致力于構建與以太坊區塊鏈兼容的以企業為中心的分布式賬本技術(DLT)。[2017/12/9]

那么問題來了,如何把 71 條 opcodes 精簡到 10 條以內呢? 這就需要我們對 EVM 運行智能合約的方式有著一定的了解。如果不了解也沒關系,拿起你手邊的 EVM 指令集 ,我們一起來看看吧:

首先我們要知道,EVM 執行代碼時是按照自上而下的順序執行的,代碼中沒有其他入口點,始終從頂部 (也就是第一行 opcode ) 開始執行。(這點和 Windows 軟件不一樣,PE文件是有固定的入口點的,而且不同的 Windows 版本或不同的 PE 文件 入口點也會有所不同)。也就是說,當我們部署合約時, EVM 會從第一個bytecode開始讀起。

所以我們看字節碼最前面的部分,也就是它的部署代碼:608060405234801561001057600080fd5b5060b68061001f6000396000f3fe

對照 EVM 指令,我們可以識別出這段代碼的含義:

然后我們看合約的運行代碼:

綜合以上可以發現,合約的運行代碼的架構是這樣的:

初始化操作、函數選擇器這些,是 solc 在編譯 Solidity 程序的時候自動生成的。如果我們砍掉這些復雜的東西,直接把我們想要的核心功能編碼上去,不就可以在 10 條以內opcodes 實現既定功能了嗎?

通過分析 圖4 的 whatIsTheMeaningOfLife() 函數調用棧可以得知,讓智能合約返回 “42” ( 十六進制 0x2a) 的關鍵在于 先用 mstore 指令將 0x2a 放入 Memory , 再用 return 指令將內存里的 0x2a 返回即可。至于那些函數名稱和函數簽名,只是高級語言的編譯產物,直接用匯編實現的話,我們直接用這段代碼讀寫內存,完全沒有必要搞那些花里胡哨:

以上代碼相當于構造了一個十分小的合約“運行代碼”。前面我們說過,EVM 執行代碼時是按照自上而下的順序執行的,代碼中沒有其他入口點,始終從頂部 (也就是第一行 opcode ) 開始執行。而且我們編寫的代碼并沒有函數選擇器,也就是說,當外部賬戶調用該它時,無論傳遞給它什么樣的參數、什么樣的函數簽名, EVM 都只會從它的 [00] 處開始執行,老老實實地走到 [09],然后 return 給我們一個 0x20.

但這只是運行代碼,還記得本文開頭說的那三段字節碼嗎?是的,我們還差一個“運載火箭”(部署代碼),把這段運行代碼給發射出去:

部署代碼的結構基本沒怎么變,之前已有解析,此處就不羅嗦了,唯一的區別是把復制到內存的長度由 b6 改為 0a  : 608060405234801561001057600080fd5b50600a8061001f6000396000f3fe

然后把他們拼接到一起,記得部署代碼在前、運行代碼在后,最后我們把這段代碼發射出去就 OK了:

你將得到一個超級小巧、只有 10 個字節、無論傳遞什么參數都 只 會 返 回  42  的 “智能合約” (這么說看起來并不智能的樣子……)

全文完。

關于作者:

https://twitter.com/0xNezha

來源:bress

Bress

個人專欄

閱讀更多

金色早8點

Odaily星球日報

潘達看Web3

DeFi之道

區塊律動BlockBeats

比推 Bitpush News

Tags:以太坊ETHCODECOD怎么得到以太坊幣etherparty幣前景code幣怎么挖COD幣

AVAX
UNI:從 MEV 和價值捕獲的角度談 Uniswap 轉向 UNIchain 的必然性

關于應用鏈未來的一個案例研究。 在過去的幾個月里,人們對特定于應用的區塊鏈(或 rollup)越來越感興趣,通常我們稱它們為應用鏈.

1900/1/1 0:00:00
KEN:VC對11類NFT初創企業的看法與建議

早在 2018 年,我們就決定獨樹一幟投資鏈游,因為在我們看來,Crypto 將成為加速開放經濟體在虛擬世界中大規模采用的基礎層。現在看來,在 2018 年那時投資鏈游確實是個不錯的選擇.

1900/1/1 0:00:00
區塊鏈:體育 NFT 想「割韭菜」不容易?

撰文:MetaPost 有人堅信 NFT 的價值,有人則質疑其科技的幻象外衣;有人認為泡沫破滅了,也有人認為目前只是周期性波動。 當前的 NFT 行業宛若一個矛盾綜合體.

1900/1/1 0:00:00
ROL:漫游以太:過去、現在、未來

原文標題:《漫游以太:過去、現在、未來》原文作者:Hakeen,W3.Hitchhiker;修訂:Evelyn,W3.Hitchhiker 在 The Merge 階段.

1900/1/1 0:00:00
ETH:嘗試推出NFT的11個行業 誰最熱衷于發NFT ?

CoinGecko考察了自 2020 年以來獨立或與合作伙伴推出可交易NFT 系列的歐美“傳統”品牌。隨著2021年帶起的NFT熱潮,有越來越多的品牌加入了 NFT 的行列.

1900/1/1 0:00:00
TPS:TPS低?過度中心化?Aptos上線首日遭質疑

作者:Corn 出品:鴕鳥區塊鏈 今日消息,公鏈Aptos已正式上線主網“Aptos Autumn”,其中主網采用Move語言,利用流水線和模塊化方法進行交易處理的關鍵階段.

1900/1/1 0:00:00
ads