比特幣價格 比特幣價格
Ctrl+D 比特幣價格
ads

ALL:解構智能合約(3):功能選擇器_CAL

Author:

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

HI,歡迎我一起繼續解構智能合約。本文是系列文章的第三部分,如果您還沒有閱讀之前的文章,請先看一下:前言:基礎代碼與操作方式;創造與運行時間代碼解析;我們正在解構一個簡單的Solidity智能合約的EVM字節碼。在上一篇文章中,我們確定了將智能合約的字節碼分為創建和運行兩部分,并且知道了為什么這么做,深入了解了創建部分后,現在是時候開始我們對運行時部分的探索了。如果你看一下解構圖,我們可以首先看一下名為BasicToken.evm的第二個大拆分塊。這可能看起來有點可怕,因為運行的代碼長度至少是創建代碼大小的四倍!但不要擔心,我們在之前的文章中為了解EVM代碼而開發的技能,加上我們使用絕對可靠的“分而治之”的策略,將使這一挑戰更加系統化,甚至可能更容易。這只是開始,我們將繼續識別獨立結構,繼續拆分直到分解為一個個可解決的問題為止。首先,讓我們回到Remix在線編輯器,并使用運行時字節碼啟動調試會話。我們怎么做?上次,我們部署了智能合約并調試了部署事務。這一次,我們將使用其中一個函數與已部署的智能合約接口進行交互,并調試該事務。首先,一起回想一下我們的智能合約:我們啟用了優化的編譯器的JavascriptVM,v0.4.24版本,并將10000作為初始供應。部署智能合約后,你應該看到它在Remix上的“run”面板“DeployedContracts”的部分中列出。單擊它可以展開看到智能合約的界面。這個界面是什么?它是智能合約中所有公共或外部方法的列表-即任何以太坊帳戶或智能合約都可以與之交互。私人和內部方法不會在這里顯示,如何與智能合約運行時代碼的特定部分進行交互,將是本文解構的重點。我們可以嘗試一下,單擊Remix的“run”面板中的totalSupply按鈕。您應該立即在按鈕下方看到響應,這是我們所期望的,因為我們將智能合約作為初始token供應部署。現在,在Console面板中,單擊Debug按鈕以使用此特定事務啟動調試會話。請注意,Console面板中將有多個Debug按鈕;確保你使用的是最新版本。在這種情況下,我們沒有調試到該0x0地址的事務,正如我們在上一篇文章中看到的那樣,創建了一個智能合約。相反,我們正在調試對智能合約本身的事務-即它的運行時代碼。如果彈出“指令”面板,則應該能夠驗證Remix列出的指令與解構圖中BasicToken.evm部分中的指令相同。如果它們不匹配,則出現問題。嘗試重新開始并確保您使用上述正確的設置。您可能會注意到的第一件事是調試器將您置于指令246并且事務滑塊位于字節碼的大約60%處。為什么?因為Remix是一個非常慷慨的程序,它直接帶你到EVM即將執行totalSupply函數體的部分。然而,在此之前發生了很多事情,這些都是我們在這里要注意的。實際上,我們甚至不會在本文中研究函數體的執行情況。我們唯一關注的是Solidity生成的EVM代碼如何路由傳入的事務,這是我們作為合約的“功能選擇器”將要理解的工作。因此,抓住滑塊并將其一直拖到左邊,這樣我們就從指令零開始。正如我們之前看到的,EVM總是從指令0執行代碼,沒有異常,然后流經其余代碼。讓我們通過操作碼來完成這個執行操作碼。出現的第一個結構是我們以前見過的:

跨鏈錢包Blocto推出100萬美元Polygon生態項目資助計劃:金色財經報道,跨鏈錢包應用程序Blocto推出了一項100萬美元的資助計劃。為了增強Polygon生態系統中用戶對Blocto無縫錢包體驗的可訪問性,這筆贈款使去中心化應用程序能夠將Blocto的無幣、30秒用戶入門體驗直接集成到dApp中。

專門針對Polygon上構建的項目,將在3個月的參與期內部署高達100萬美元的建設者激勵措施。除了財務支持和開發人員工具資源之外,還為選定的項目提供營銷和運營支持,并專門訪問Blocto龐大的用戶群、開發人員關系團隊和溝通渠道。[2023/7/21 15:51:00]

圖1.空閑內存指針這是Solidity生成的EVM代碼將始終在調用之前執行的任何操作:將一個點保存在內存中以便稍后使用。讓我們看看接下來會發生什么:

圖2.Calldata長度檢查。如果在Debug選項卡中打開Remix的Stack面板并跳過指令5到7,您將看到堆棧現在包含兩次數字。如果您在閱讀這些超長數字時遇到問題,請注意您調整Remix調試面板的寬度,以便數字很好地適合單行。第一個來自常規推送,但第二個是執行操作碼的結果,正如黃皮書所述,沒有參數并返回“當前環境中的輸入數據”的大小,或者我們經常稱為calldata:4CALLDATASIZE什么是calldata?正如Solidity的文檔ABI規范中所解釋的,calldata是一個十六進制數字的編碼塊,其中包含有關我們要調用的智能合約函數的信息,以及它的參數或數據。簡單地說,它由一個“函數id”組成,它是通過散列函數的簽名然后是壓縮參數數據生成的。如果需要,您可以詳細研究文檔鏈接,但不要擔心這個包裝如何工作到最精細的細節。它在文檔中有解釋,但有點難以一次掌握。用實際例子來理解它會容易得多。讓我們看看這個calldata是什么。在Remix的調試器中打開“調用數據”面板,查看:0x18160ddd。這是通過將keccak256函數簽名上的算法應用為字符串來精確生成的四個字節"totalSupply()"?并執行所述截斷。由于此特定函數不帶參數,因此它只是:一個四字節的函數id。當CALLDATASIZE被調用時,它只是將第二個推4入堆棧。然后,指令8LT用于驗證calldata大小是否小于4。如果是,則以下兩條指令執行JUMPI指令86。這不到四個字節,因此在這種情況下不會有跳轉,執行流將繼續執行指令13.但在我們這樣做之前,讓我們假設我們用空的calldata調用我們的智能合約-也就是說,0x0而不是0x18160ddd。你不能用Remixbtw做到這一點,但你可以手動構建交易。在這種情況下,我們最終會進入指令86,它基本上將幾個零推送到堆棧并將它們提供給REVERT操作碼。為什么?好吧,因為這個智能合約沒有后備功能。如果字節碼沒有識別傳入數據,它會將流轉移到回退函數,如果該結構沒有“捕獲”調用,則此恢復結構將終止執行,絕對沒有回滾。如果沒有什么可以回歸,那么就沒有任何事可做,而且呼叫完全恢復了。現在,讓我們做一些更有趣的事情。返回Remix的Run選項卡,復制Account地址,并將其用作參數來調用balanceOf而不是totalSupply調試該事務。這是一個全新的調試會話;讓我們暫時忘記吧totalSupply。導航到指令8,CALLDATASIZE現在將36推入堆棧。如果你看看calldata,那就是現在0x70a08231000000000000000000000000ca35b7d915458ef540ade6068dfe2f44e8fa733c。這個新的calldata實際上非常容易分解:前四個字節70a08231是簽名的散列,后面"balanceOf(address)"的32個字節包含我們作為參數傳遞的地址。為什么32個字節,如果以太坊地址只有20個字節長,好奇的讀者可能會問?ABI總是使用32字節“字”或“槽”來保存函數調用中使用的參數。繼續在我們的balanceOf調用環境中,讓我們在指令13處離開我們離開的地方,此時堆棧中沒有任何內容。指令13然后推0xffffffff送到堆棧,并且下一條指令將29字節長的0x000000001000…000數字推送到堆棧。我們馬上就會明白為什么。現在,只需要注意一個包含四個字節,另一個包含四個字節的0's'。接下來CALLDATALOAD取一個參數并從該位置的calldata讀取一個32字節的塊,在這種情況下,在Yul中將是:calldataload基本上將我的整個calldata推到堆棧。現在來了有趣的部分。DIV從堆棧中消耗兩個參數,獲取calldata并將其除以奇怪的0x000000001000…000數字,有效地過濾除了calldata中的函數簽名之外的所有內容,并將其留在堆棧中:0x000…000070a08231。下一條指令使用AND,它也消耗堆棧中的兩個元素:我們的函數id和帶有四個字節的數字f。這是為了確保簽名哈希正好是八個字節長,如果存在任何其他內容,則屏蔽其他任何內容。我認為,Solidity使用的安全措施。簡而言之,我們只是檢查calldata是否太短,如果是這樣,還原,然后稍微改進,以便我們在堆棧中有我們的函數,另外,我們差不多完成了。下一部分會很容易理解:

電影《華爾街之狼》制作公司將推出NFT:4月20日消息,擁有《華爾街之狼(The Wolf of Wall Street》版權的制作公司 Red Granite Pictures 正尋求出售基于標志性場景的 NFT,以幫助其從粉絲基礎中獲利,并打擊盜版。該公司表示,只要支付100美元以上,粉絲就有機會擁有與《華爾街之狼》中場景相關的 NFT 收藏品,買家將成為在線社區的成員,可以購買道具和服裝等物品,并聆聽原聲帶中的混音歌曲。(彭博社)[2023/4/20 14:16:18]

圖3.函數選擇器在指令53處,代碼將18160ddd推送到堆棧,然后使用aDUP2來復制70a08231當前存在于堆棧中第二位置的傳入calldata值。為什么要復制?因為EQ指令59處的操作碼將消耗堆棧中的兩個值,并且我們希望保持70a08231值,因為我們經歷了從calldata中提取它的麻煩。代碼現在將嘗試將calldata中的函數id與已知函數id之一進行匹配。由于70a08231進入,它將不匹配18160ddd,跳過JUMPIat指令63.但它將在下一次檢查中匹配并在指令74跳轉到JUMPI。讓我們花點時間觀察一下這些平等檢查對智能合約的每個公共或外部功能。這是函數選擇器的核心:充當某種switch語句,只是簡單地將執行路由到代碼的正確部分。這是我們的“中心”。因此,由于最后一個案例是匹配,執行流程將我們帶到JUMPDESTat位置130,正如我們將在本系列的下一部分中看到的那樣,該balanceOf函數的ABI“包裝器”。正如我們將看到的,這個包裝器將負責解包事務的數據以供函數體消耗。繼續嘗試transfer這次調試功能。功能選擇器真的沒有神秘感。這是一個簡單而有效的結構,位于每個合約的門口并將執行重定向到代碼中的適當位置。這就是Solidity為智能合約的字節碼提供模擬多個入口點的能力的方式,因此也就是界面。看一下解構圖,這就是我們剛剛解構的:

2022年共有17個2010年的早期比特幣區塊獎勵被花費:1月3日消息,據Bitcoin.com統計數據顯示,2020年和2021年早期比特幣區塊獎勵的支出創歷史新高,但2022年活動放緩。其中2020年、2021年花費了20個2010年的早期區塊獎勵(1000枚比特幣),

然而在2022年中,2010年的早期區塊獎勵只花掉了17個(850枚比特幣),此外2022年3月10日一個實體移動了自2010年以來一直處于休眠狀態的489.091枚比特幣;2022年4月2009年的5個區塊獎勵也被花掉了,這也是自2020年以來首次有2009年的區塊獎勵被花掉。[2023/1/3 22:22:16]

圖4.函數選擇器和智能合約的運行時代碼主入口點。總而言之,伙計們,不知不覺中你對solidity的底層代碼熟悉程度超過了大部分人,堅持下去,你就能徹底把它打開。*本文由AlejandroSantander首發于medium,由獵豹區塊鏈安全翻譯并整理*獵豹區塊鏈安全以金山霸的技術為依托,結合人工智能、nlp等技術,為區塊鏈用戶提供合約審計、情感分析等生態安全服務。Ratingtoken官網https://www.ratingtoken.net/?from=z

PoolTogether聯合創始人發起關于Uniswap費用開關的討論提案:7月20日消息,PoolTogether聯合創始人Leighton Cusack在Uniswap治理論壇發布Uniswap費用開關的討論提案,討論包括是否應該開啟Uniswap費用開關及如何使用費用。提案建議如果要打開費用開關,先從兩個最大的池(ETH/USDC 和USDC/USDT)開始嘗試,如果在“費用開關”打開的情況下交易執行沒有減少,實驗則是成功的。此外,Leighton還在Snapshot發起了關于打開ETH/USDC和USDC/USDT池費用開關的 “Temp Check(民意調查)”投票。目前贊同票占比100%,暫無反對票,投票截止時間為7月22日12:00。

此前前TheBlock研究員Mika Honkasalo發布“UNI持有者控制Uniswap協議的簡要路線圖”,以改善Uniswap使其進一步去中心化。方案包括交易費用調整實驗,指Uniswap擁有一個交易費用開關,可以打開給指定池10-25%的LP費用。交易費用收入可以收集到國庫或向UNI持有者分發,具體細節需要一份數據驅動的研究報告。[2022/7/20 2:25:22]

美國紐約市長呼吁州長拒絕簽署加密挖礦禁令法案:6月14日消息,據《紐約郵報》報道,美國紐約市市長Eric Adams呼吁紐約州州長Kathy Hochul拒絕簽署加密挖礦禁令法案。Adams的發言人表示,Adams認為,隨著我們繼續規劃經濟復蘇,紐約市必須處于創新經濟的前沿,其中包括加密貨幣和Web3。他擔心該州對加密采礦的禁令是全國首例,該禁令過于嚴格,并有可能在我們最負擔不起的時候犧牲我們的競爭優勢。政府致力于與州長和州立法者合作,制定負責任的法規,解決與加密采礦相關的環境問題,同時繼續鼓勵紐約這個新興行業的發展。

報道稱,州長們通常要等到年底才能決定立法者每年通過的數百項法案的命運。州長Hochul目前尚未就是否簽署該法案發表評論。

此前消息,紐約參議院通過了一項法案,該法案規定將在兩年內禁止發放POW挖礦許可證。[2022/6/14 4:25:11]

Tags:ALLATACALDATAMALLData Delivery Networkethical怎么記Datamine

火幣下載
EOS:公鏈治理與“社區”的幾種意思_tron

編者按:本文來自以太坊愛好者,作者:阿劍,星球日報經授權發布。以賽亞·伯林曾引述過一段軼事:有人問凱恩斯:爵士,人們說思想的工具無非是語言和圖像,那么您是用哪一種工具來思想的呢?凱恩斯俏皮地回應.

1900/1/1 0:00:00
USD:穩定幣市場競爭日趨激烈,USDT份額下降了23%_SDT

數據顯示,USDT在穩定幣流通總額中的占比目前低于73%,創下三年以來的新低。而三個月之前,USDT所占比重大約為96%.

1900/1/1 0:00:00
比特幣:從“披薩”到“上帝”,三個最有意思的比特幣分叉_比特幣完整走勢圖

最近的比特幣價格暴跌,幾乎所有分析師都把“矛頭”指向了比特幣現金硬分叉,也對基于比特幣的加密貨幣信任生態系統造成了巨大沖擊。然而,很多人似乎忘記了比特幣現金本身就是從比特幣“分叉”出來的.

1900/1/1 0:00:00
區塊鏈:區塊鏈+游戲的現狀與夢想_區塊鏈游戲

作者:Crystal犇睿資本分析師 Part1 區塊鏈游戲現狀 1.現狀 目前,根據網絡上的資料整理,可以發現,區塊鏈的用戶數已經達到3000萬,用戶基數能給區塊鏈游戲帶來很大的流量.

1900/1/1 0:00:00
USD:最新區塊鏈二級市場周報丨熊市尋底路漫漫,縮量陰跌創新低_lbank怎么充值usdt

本周報告重點內容 本周大盤走勢:熊市尋底路漫漫,縮量陰跌創新低八大交易所成交量:主流交易所總成交量下降23.7%數字資產換手率:下降21個百分點.

1900/1/1 0:00:00
ETH:距離區塊鏈項目方恐慌性拋售 ETH 還有多久?_比特幣

編者按:本文來自區塊律動BlockBeats,作者:0x22,星球日報經授權發布。十一個月后,在關著燈吃面的時候,韭菜們還是會想起那個比特幣突然之間漲到兩萬美金的遙遠的下午.

1900/1/1 0:00:00
ads