Evm

這個公共數組檢查中由 solc 生成的 evm 程式碼是什麼,為什麼?

  • September 29, 2018

當 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

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