Evm

澄清“256 位字”語義

  • March 27, 2016

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儲存在右側填充。

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