Evm
澄清“256 位字”語義
EVM 具有“256 位字”。在某些情況下,將短於 32 字節(256 位)的字元串視為左對齊 ascii(打包到單詞的最高有效字節中)。
這是否意味著字元串 ‘*’ 的單詞值等於: 42 << 148 ?
請注意,單個 ASCII 字元“*”的 RLP 編碼是兩個字節,而 42 << 148 的 RLP 編碼是不同的。是否存在 EVM 詞語義和 RLP 編碼不完全匹配的安全性和正確性的重要邊緣案例?
如果我們做出這兩個定義會更容易理解(注意:這可能不完全正確,但對於以下解釋來說已經足夠了):
- EVM是執行指令的機器,它有輸入和輸出
- 狀態管理器作為將數據輸入/輸出區塊鏈的人。
與區塊鏈(和狀態管理器)的許多互動都是通過RLP編碼數據發生的。一個值得注意的例外是帶有合約的 ABI(
data
交易中的欄位)。EVM 本身在 256 位字上執行,這意味著每個堆棧和每個儲存空間都是 256 位寬,通常您可以這樣定址它們(有幾種字節定址方法)。EVM 本身並不真正關心數據是如何儲存的。算術指令將期望數據具有某種格式,但事實就是如此。
契約 ABI文件定義瞭如何與契約互動以及它們如何相互互動。據我所知,Solidity 作為一種語言也以類似的方式在內部儲存資料結構。
Contract ABI 定義了不同的數據類型,每種數據類型都有自己的佈局。數字 (
int*
/uint*
) 儲存在左側填充,而bytes
/string
儲存在右側填充。