當我們部署和調用合約的時候,EVM都在做些什么?
如果你開發過以太坊智能合約,想必你應該熟悉這樣的操作(此處以remix為例):
編寫solidity代碼->編譯->部署->交互。合約的編寫與部署似乎并不是一件很麻煩的操作:編寫階段就不說了,Solidity語言大家都應該會;到了編譯階段,本地的solc編譯器會把Solidity代碼編譯成字節碼;而在部署階段,部署者通過發起一筆特殊交易calldata帶上編譯后的字節碼,等交易上鏈之后,就完成了合約的部署;而合約交互,就是call合約里的某個函數,等待函數的響應和返回,一切就是這樣的簡單。
但是正如開車一樣,當你踩住油門后,車輛開始前進。然而這看似簡單的操作背后是汽油爆燃、活塞往復、數百個齒輪嚙合傳動、輪胎與地面滾動摩擦的復雜行為。部署和調用合約也是如此,它涉及到EVM的堆棧操作,內存讀寫,存儲訪問等一系列底層操作。當部署合約時,EVM把收到的calldata翻譯成操作指令,把它們按照給定的長度和參數讀入內存;當調用合約時,EVM又根據收到的calldata,通過函數選擇器來確定調用哪一段代碼,并返回數值。如果只講理論未免過于枯燥,為了便于講解,我們這次用ethernaut的一道題目作為例子,詳細了解EVM是如何部署和運行合約的,以及如何充當人肉編譯器,徒手編寫智能合約。
數據:2022年以太坊占據所有區塊空間費用的80%,BNB Chain占據剩余的80%:1月3日消息,加密研究員Data_Always發布文章表示,2022年以太坊占據所有區塊空間費用的80%,BNB Chain占據了剩余費用的80%,而最大的簡單傳輸模型(Bitcoin、Dogecoin和Litecoin)相比之下僅占微不足道的費用。在Otherdeed NFT鑄造的一天里,以太坊上產生的費用就超過了2022年比特幣全年費用。
L2使用的Gas份額增加了兩倍,但采用率仍不高,但隨著EIP-4844的推出可能會改善。對于以太坊而言,必須繼續擴展并優先考慮協議的可用性,盡管費用將始終是KPI,但擴展速度比采用速度快是新的目標,這將是推高價格和鞏固以太坊在加密生態系統的關鍵。
盡管采取補貼交易模式,Tron在區塊空間需求上仍超過了比特幣,并且全年費用保持相對穩定,最重要原因是Tron對低價值USDT轉賬的捕獲。比特幣閃電網絡尚未看到有意義的增長,對閃電網絡采用預期過于樂觀,大部分交易費用峰值可歸因于加密機構的崩潰。[2023/1/3 22:22:25]
這個題目是這樣的:我們需要部署一個合約,當我們調用合約**whatIsTheMeaningOfLife()**函數的時候,它需要返回一個數字“42”。看起來很簡單對吧?我們分分鐘編寫完畢:
比特幣及以太坊交易費用在過去幾周分別下降93%和95%:根據Bitinfocharts的數據,比特幣的平均交易費在4月24日達到62.77美元,這一數字超過了自 2017年12月以來創下的55美元的歷史新高,到上周日,費用已降至 4.38 美元,減少93%。以太坊5月12日平均交易費用上漲至 69.92 美元,到上周日,以太坊的平均費用低至3.44美元,減少了95%。(Cointelegraph)[2021/6/9 23:25:15]
慢著,題目后面還有個小小的附加要求:“所部署的合約大小不超過10個操作碼”。好吧,這個要求的確夠“小”,要知道連合約頭部的“函數選擇器”都不止10個操作碼好吧?可是“函數選擇器”是什么,為什么會出現在合約里面呢?帶著你的疑問,繼續向下看。
我們通過./solc--asm--bintarget.sol來看看這個合約的最終編譯結果:
608060405234801561001057600080fd5b5060b68061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063650500c114602d575b600080fd5b60336047565b604051603e91906067565b60405180910390f35b6000602a905090565b6000819050919050565b6061816050565b82525050565b6000602082019050607a6000830184605a565b9291505056fea26469706673582212206ef8c7b5177952a701b3b46b69cb3ec296f4c54c946692e8ec901f5e43c1e78a64736f6c63430008110033
以太坊基金會發起關于“支持Rollup發展”的社區捐款:3月7日消息,以太坊基金會發起關于Rollup的社區捐款提案,并呼吁所有對在以太坊上搭建Rollup感興趣的人參與進來,捐款截止日期為2021年4月16日。以太坊基金會表示,以太坊生態系統很可能將Rollup作為近期和中期未來擴容方案,Optimistic Rollup和zkRollup已經在籌備中,也許很快就會投入使用,捐款目標是發展Rollup社區,幫助啟動完善的生態系統,讓更多應用建立在Rollup方案之上。[2021/3/7 18:23:03]
這么一大坨十六進制數據,就是上述Solidity程序編譯之后的字節碼。當我們部署合約時,把這一堆data發給以太坊節點,等廣播完成后,合約就部署完畢了。這是solc編譯器編譯Solidity程序得到的代碼,看似雜亂無章的的數據,其實都是和opcodes一一對應的。我們來一段一段地看這些代碼:
合約部署代碼:
608060405234801561001057600080fd5b5060b68061001f6000396000f3fe
合約運行代碼:
6080604052348015600f57600080fd5b506004361060285760003560e01c8063650500c114602d575b600080fd5b60336047565b604051603e91906067565b60405180910390f35b6000602a905090565b6000819050919050565b6061816050565b82525050565b6000602082019050607a6000830184605a565b9291505056fe
區塊鏈服務網絡BSN將集成以太坊和Nervos區塊鏈:加密貨幣風投基金DragonflyCapital管理合伙人HaseebQureshi發布推特稱,區塊鏈服務網絡(BSN)將集成兩款區塊鏈,以太坊和Nervos區塊鏈。BSN是一個區塊鏈基礎服務設施,旨在為企業提供一站式服務,方便企業以超低的成本使用區塊鏈云計算服務。
BSN由中國國家信息中心、中國移動、中國銀聯和北京紅棗科技共同發起,并得到了眾多大型中國企業的支持。HaseebQureshi稱,BSN公開支持公鏈的努力將幫助中國加快加密領域的創新。[2020/6/29]
auxdata:
a26469706673582212206ef8c7b5177952a701b3b46b69cb3ec296f4c54c946692e8ec901f5e43c1e78a64736f6c63430008110033
我們先簡單地把這堆代碼分為合約的部署代碼、運行代碼、auxdata三部分,如何理解這三種代碼呢?我覺得可以理解為向太空發射衛星:“部署代碼”就是運載火箭,而“運行代碼”就是衛星。運載火箭只在發射衛星時才起到作用,一旦衛星進入軌道,火箭就廢棄了,只留下衛星在太空中與地球通信。部署合約也是如此,在部署合約時,部署代碼把一些初始化工作作完之后,就把合約的運行代碼送入EVM,只留下運行代碼在鏈上與用戶進行交互。
PAX Treasury在以太坊網絡增發超過796.7枚BUSD:Whale Alert數據顯示,北京時間6月22日18:09,PAX Treasury在以太坊網絡增發7967037枚BUSD(價值7967037美元)。[2020/6/22]
那么言歸正傳,我們題目要求我們合約運行代碼的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
作者:Matti,下文由DeFi之道編譯當我們已經開始些許適應熊市節奏的時候,我注意到有些人已經按捺不住想快速跳轉到下一個市場階段了.
1900/1/1 0:00:00原文作者:Yilan 原文來源:LDCapitalResearch 摘要 作為第三代區塊鏈,CosmosSDK和TendermintBFT降低了開發和運行公鏈的門檻.
1900/1/1 0:00:00全球頂級虛擬資產交易所HuobiGlobal今天宣布,HuobiGlobal控股股東公司已向百域資本旗下基金轉讓所持有的全部HuobiGlobal股份.
1900/1/1 0:00:00本文作者:EquityMates?內容整理和編譯:ColinBrianAmstrong是Coinbase的聯合創始人兼首席執行官,于2012年創立了Coinbase.
1900/1/1 0:00:00以太坊合并完成后,VitalikButerin?接受Bankless專訪,分享了他對合并、以太坊路線路、質押等的看法,比推編輯部為您整理了采訪中的關鍵要點.
1900/1/1 0:00:00撰文:DeFiSurfer編譯:Blockunicorn以太坊在市場上,贏得了人們使用最頻繁的加密貨幣,不僅僅是成為最硬的錢.
1900/1/1 0:00:00