Evm
這個公共數組檢查中由 solc 生成的 evm 程式碼是什麼,為什麼?
當 solc 在聲明數組時為數組創建程式碼時
public
。特別是,它包含對數組長度的檢查。例如,這個:contract OutOfBoundsException { uint256[8] public array; }
編譯
solc --optimize
產生:... tag_3: pop /* "contracts/oobtest.sol":46:68 uint256[8] public array */ tag_4 calldataload(0x4) jump(tag_5) tag_4: # dead code tag_5: 0x0 dup1 sload dup3 swap1 dup2 lt tag_6 jumpi invalid tag6 # ...
該
--optimize
標誌用於刪除一些雜物並簡化上述一些內容。開始的基本塊中發生了什麼
tag_5
以及為什麼需要它?
array
簡短的回答:如果合約嘗試使用訪問器函式訪問,則將使用該程式碼。但是solc
還不夠聰明,無法注意到這種情況在這里和許多其他類似的情況下都不會發生。這是需要此檢查的情況:
contract PublicArray { uint256[8] public array; } contract InvalidAccess { PublicArray array_contract; constructor() { array_contract = PublicArray.at(0x(...)) } function go() { return array_contract.array[1000]; } }
這些資訊和上面的程式碼來自著名的Bernhard Mueller。
由於
array
是公共的,solc
因此為它創建一個訪問器函式。
tag3
是該功能的開始。calldataload(0x4)
從 calldata 載入索引,然後tag_5
檢查calldataload(0x4)
<array.length
。