Evm

ABI 如何儲存在字節碼中?

  • October 17, 2021

我試圖了解一個簡單的十六進製字元串0x25d8dcf2是如何足以在契約中執行函式的資訊。我已經閱讀了 ABI並了解十六進製字元串基本上只是函式簽名的雜湊,但是如何確定這段數據最終會跳轉到字節碼中該函式的適當地址契約?

編譯器的工作是生成正確的 EVM 字節碼,以便正如您所說的 MethodID“數據片段將最終跳轉到合約字節碼中該函式的適當地址”。

由於 MethodID 只有 4 個字節,因此可能會發生散列衝突(在 2 個不同函式之間)。在這種情況下,Solidity 編譯器會出錯,並且根本不會產生任何字節碼。

如果這有幫助,僅出於概念目的,以下是 EVM 編譯器將生成的“跳轉表”字節碼的一個非常粗略的範例:

method_id = first 4 bytes of msg.data
if method_id == 0x25d8dcf2 jump to 0x11
if method_id == 0xaabbccdd jump to 0x22
if method_id == 0xffaaccee jump to 0x33
other code
0x11:
code for function with method id 0x25d8dcf2
0x22:
code for another function
0x33:
code for another function

引用自:https://ethereum.stackexchange.com/questions/7973