Solidity

Solidity 儲存指針

  • April 21, 2022
contract X{

  uint256 public x=2;
  uint256[] public array= [9,8];
  
  function X(){}
  
  function getLength() public constant returns(uint256){
     return array.length;
  }
  
  function modifyArray( uint256 _index, uint256 _value){
     array[_index]= _value;
  }
  
  function popLength(){
     array.length--;
  }
}

Roman Storm 在此影片中展示瞭如何在此影片https://www.youtube.com/watch?v=gUqHgFuSsqg中使用儲存指針更改變數 x,最後使用 modifyArray-function,我無法得到它. 有人可以詳細而簡單地解釋一下這裡發生了什麼。提前致謝。程式碼屬於他(在連結中)。

沒什麼好解釋的。一個uint256[] public arrayin storage 的組織如下:

| length |   0   |   1   | ... | length-1 |

每個| X |代表一個 32 字節的插槽。

問題是舊的solidity 版本在修改數組長度時允許下溢。

例如array有 2 個元素,所以呼叫popLength()兩次後長度將為零。

如果第三次呼叫它將是115792089237316195423570985008687907853269984665640564039457584007913129639935which is 2**256 - 1

因此,array[X]您幾乎可以在合約儲存中的任何位置寫入。

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