以太坊交易所 以太坊交易所
Ctrl+D 以太坊交易所
ads
首頁 > NEAR > Info

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

Author:

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

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

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

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

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

美SEC在Ian Balina的起訴書中稱所有以太坊都在其管轄范圍內:9月20日消息,美國證券交易委員會(SEC)已對加密貨幣投資者Ian Balina參與推廣2018年未注冊加密資產SPRK一案發起訴訟,但加密社區在美國證券交易委員會的起訴書中發現,該監管機構認為所有以太坊都在其管轄范圍內。

在起訴書第69段中,美國證券交易委員會指出發送給Ian Balina的ETH通過以太坊區塊鏈上的節點網絡進行驗證,這些節點在美國的集群密度比任何其他國家都高,因此這些交易都發生在美國,意味著該監管機構認為在美國運營的以太坊驗證節點比在任何其他國家都多,因此全球所有以太坊交易都應被視為源自美國,而且美國證券交易委員會對以太坊網絡上的所有活動擁有管轄權。

肯塔基大學法學教授Brian Fyre表示,這是第一次看到美國證券交易委員會真正闡述其如何理解以太坊生態系統運作,以及他們為什么認為以太坊屬于SEC的監管范圍。根據Etherscan數據顯示,目前45.85%的以太坊節點來自美國,相比之下排名第二的德國只有19%。(decrypt)[2022/9/20 7:07:21]

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

孫宇晨:波場TRON、BNBChain、以太坊網絡目前均已支持USDD兌換:據最新消息,波場TRON創始人孫宇晨在直播中表示:目前,在波場TRON、BNBChain、Ethereum上均可通過去中心化交易所等DeFi平臺兌換獲取USDD,具體包括SunSwap、PancakeSwap、Ellipsis Finance、Uniswap和Curve。未來,USDD還將陸續上線更多交易所及錢包。[2022/5/5 2:52:28]

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

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

608060405234801561001057600080fd5b5060b68061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063650500c114602d575b600080fd5b60336047565b604051603e91906067565b60405180910390f35b6000602a905090565b6000819050919050565b6061816050565b82525050565b6000602082019050607a6000830184605a565b9291505056fea26469706673582212206ef8c7b5177952a701b3b46b69cb3ec296f4c54c946692e8ec901f5e43c1e78a64736f6c63430008110033

以太坊Ropsten測試網將首先激活倫敦升級:金色財經報道,以太坊開發者Tim Beiko今日發文宣布,以太坊倫敦升級現已準備好在測試網上部署。升級將首先在Ropsten測試網的區塊10499401激活,預計將于2021年6月24日左右進行;Goerli測試網將在區塊5062605激活升級,預計時間為6月30日;Rinkeby測試網將在區塊8897988激活,預計時間為7月7日。Kovan測試網將在稍后升級,預計在主網區塊通過之后。Tim Beiko還表示,截止目前,只有測試網(Ropsten、Goerli、Rinkeby)已安排了倫敦升級。在這些網絡上成功激活升級后,將為以太坊主網設置一個升級區塊。[2021/6/19 23:48:59]

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

合約部署代碼:

608060405234801561001057600080fd5b5060b68061001f6000396000f3fe

dYdX的二層網絡版本已正式上線以太坊主網:4月6日消息,去中心化衍生品交易所dYdX宣布其采用以太坊二層擴容方案StarkWare在主網正式上線,此前dYdX于2月上線了Alpha內測版本。dYdX稱,選擇Layer2意味著可以大幅降低交易費、支持更多交易對、即時交易結算、更快的價格預言機、提供更高杠桿倍數和更好的隱私保護。

dYdX表示,StarkWare的zkSTARKS技術是ZK-Rollup技術的一種形式,可顯著提高dYdX的交易結算能力,同時仍將其安全性置于基礎的以太坊區塊鏈上。StarkWare的dYdX集成把用于數據完整性的STARK證明與鏈上數據可用性結合在一起,以確保完全非托管協議。除了遷移到Layer2,dYdX還搭建了新產品和交易系統,并且提供高級交易功能。[2021/4/7 19:52:22]

合約運行代碼:

6080604052348015600f57600080fd5b506004361060285760003560e01c8063650500c114602d575b600080fd5b60336047565b604051603e91906067565b60405180910390f35b6000602a905090565b6000819050919050565b6061816050565b82525050565b6000602082019050607a6000830184605a565b9291505056fe

近一周以太坊的鏈上交易手續費下降54%:據歐科云鏈OKLink數據顯示,近一周以太坊的交易手續費用為1.045億美元,環比下降54.40%;同期比特幣的交易手續費用為3982.13萬美元,環比下降30.74%;比特幣和以太坊的鏈上交易費均出現回落。[2021/3/5 18:17:15]

auxdata:

a26469706673582212206ef8c7b5177952a701b3b46b69cb3ec296f4c54c946692e8ec901f5e43c1e78a64736f6c63430008110033

我們先簡單地把這堆代碼分為合約的部署代碼、運行代碼、auxdata三部分,如何理解這三種代碼呢?我覺得可以理解為向太空發射衛星:“部署代碼”就是運載火箭,而“運行代碼”就是衛星。運載火箭只在發射衛星時才起到作用,一旦衛星進入軌道,火箭就廢棄了,只留下衛星在太空中與地球通信。部署合約也是如此,在部署合約時,部署代碼把一些初始化工作作完之后,就把合約的運行代碼送入EVM,只留下運行代碼在鏈上與用戶進行交互。

那么言歸正傳,我們題目要求我們合約運行代碼的opcedes不超過10條,那么,這段代碼對應的opcodes是多少條呢?答:71條。

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

首先我們要知道,EVM執行代碼時是按照自上而下的順序執行的,代碼中沒有其他入口點,始終從頂部(也就是第一行opcode)開始執行。。也就是說,當我們部署合約時,EVM會從第一個bytecode開始讀起。

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

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

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

6080604052348015600f57600080fd5b506004361060285760003560e01c8063650500c114602d575b600080fd5b60336047565b604051603e91906067565b60405180910390f35b6000602a905090565b6000819050919050565b6061816050565b82525050565b6000602082019050607a6000830184605a565b9291505056fe

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

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

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

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

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

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

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

你將得到一個超級小巧、只有10個字節、無論傳遞什么參數都只會返回?42?的“智能合約”

全文完。

關于作者:

https://twitter.com/0xNezha

來源:bress

Tags:以太坊SOLDYDXODE以太坊幣在中國合法嗎SOLXdydx幣會漲到50美元0xnodes

NEAR
微信公眾平臺《行為規范》:提供數字藏品二級交易服務將被封號_nem:XMETA價格

微信公眾平臺《行為規范》新增數字藏品交易行為相關條款,明確提出從事虛擬貨幣或數字藏品類業務為違規經營行為,提供數字藏品二級交易服務將被封號.

1900/1/1 0:00:00
莫斯科交易所起草數字金融資產和證券交易法案_BTC:DFAI

9月24日消息,莫斯科交易所正在起草一項法案,旨在允許數字金融資產以及基于DFA的證券交易。MOEX監事會主席SergeiShvetsov表示,該法案目前正在接受俄羅斯中央銀行的審查.

1900/1/1 0:00:00
晚間必讀 | Web3 社交與游戲融合的萬字淺析_EFI:灰度為什么看好etc幣

1.金色觀察|Cardano?Vasil升級上線將帶來什么繼以太坊合并硬分叉升級之后,Cardano?也迎來了其自去年9月Alonzo硬分叉以來最重要的升級——Vasil硬分叉.

1900/1/1 0:00:00
金色觀察|GameFi的發展路徑_EFI:MetaGameSpace

P2E是GameFi1.0,那么P&E是2.0?AxieInfinity在2021年初的持續流行,讓一個詞火了——P2E.

1900/1/1 0:00:00
金色Web3.0日報 | 歐洲AML規則可能涉及DeFi、DAO和NFT_以太坊:區塊鏈

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

1900/1/1 0:00:00
DApp這么火 是手機App的升級版嗎?_APP:聚幣交易所app下載

作者:JackyLHH 智能手機的普及和移動互聯網的爆發,讓我們更加離不開各種手機應用程序:微信、支付寶、抖音、手機淘寶、微博、網易云音樂……除了我們日常使用的各種App外.

1900/1/1 0:00:00
ads