Solidity

為什麼solidity只檢查calldata的前4個字節來確定方法?

  • January 23, 2019

我正在研究 EVM 和可靠性,我發現呼叫數據/輸入數據是使用 RLP 編碼和其他東西創建的。我知道這個過程,我不想詳細說明。我的問題是,選擇前 4 個字節數據來辨識方法背後的邏輯或數學是什麼?為什麼不是5?為什麼不是其他號碼?例如,如果呼叫數據是: 0xee919d50000000000000000000000000000000000000000000000000000000000000001 那為什麼我們只取前4個字節,即ee919d50作為方法id,而不是更多或更少的字節?

我還閱讀了這個問題的第一個答案:EVM 如何找到被呼叫函式的入口?也就是說,如果你想實現自己的邏輯,你可以考慮前 8 個字節的數據而不是前 4 個字節。我有興趣知道選擇數字“4”的實際原因。

如果有人可以解釋或指出對此問題有詳細解釋的資源,我將不勝感激。

與任何工程選擇一樣,這是一種權衡。

這樣,您理論上可以在任何單個合約中處理 4.294.967.296 種不同的方法。

這是一個合理的選擇,因為即使在 100000 個案例中有 99999 個發生衝突的(瘋狂的大)可能性,您也可以放心,在任何情況下,單個合約中的方法都有很多獨特的條目!

對於任何可能的合約來說,這似乎已經足夠了,此外還有 24 KB 左右的程式碼大小限制(誰見過有 500 或 1000 種方法的智能合約?他們中的主要有 5 到 20 種方法,僅此而已) .

另一方面,使用最多 32 位(即 4 字節)是一個合理的選擇,以便有效地處理雜湊表,而目前大部分 CPU 可能用於執行 EVM 節點。

假設 4 字節(即 32 位)是使用大多數目前 CPU 易於定址的最大可能條目數。

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