Solidity

在 Solidity 中聲明儲存指針的記憶體數組

  • February 14, 2020

我想將一個變數聲明為指向儲存數組的指針的記憶體數組uint256

例如:

pragma solidity ^0.4.24;

contract A
{
   uint256[] public array0;
   uint256[] public array1;
   constructor () public
   {
       array0.push(123);
       array1.push(456);
   }
   function test() public
   {
       uint256[][] memory storageArrays = new uint256[][](2);
       storageArrays[0] = array0;
       storageArrays[1] = array1;

       storageArrays[0][0]++;
       storageArrays[1][0]--;
   }
}

我希望這改變 and 的值array0array1但它們不會改變,因為儲存數組被隱式複製到記憶體中。此程式碼僅更改其在記憶體中的副本。

這是因為數組的兩個維度都設置為memory。我希望數組的第一個維度是storage,第二個維度memory

我試圖這樣聲明storageArrays

uint256[] storage [] memory storageArrays = new uint256[][](2);

但它給出了這個語法錯誤:

ParserError: Expected identifier but got '['
uint256[] storage [] memory storageArrays = new uint256[][](2);
                  ^

是否可以?如果是這樣,怎麼做?提前致謝。

Solidity 故意不支持記憶體指針“a la C”,也沒有任何指針算法。這意味著遞增或遞減指針變數不是有意義的操作。你可以在彙編中做類似的事情,但你必須在盡可能低的級別管理整個事情,而不是考慮能夠為任何未來版本的乙太坊協議同步solidity變數和彙編變數。

我知道您想將儲存指針放入記憶體數組(storageArrays[0] = array0)中,以便以後可以更有效地更新儲存值…

…不幸的是,對這些記憶體數組中儲存指針的引用storageArrays[0 or 1]基本上是一個記憶體副本,以及對該副本本身的任何更新,這就是為什麼您只會看到storageArrays記憶體變化中uint 值的遞增和遞減變化.

就我而言,這是不可能的……實際上,臨時數據(記憶體)能夠指向和更改硬碟儲存中的任何數據,這實際上會帶來安全風險。

至少在 Solidity 中,情況似乎如此。

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