Solidity

組裝:擴展儲存陣列長度

  • September 7, 2022

是否可以直接在 Assembly 中“擴展”數組長度?

理想情況下,這將用等效的“”值填充新0值。

例子:

 address[] internal owners;
 
 function mint(to, amount) {
   owners.push(to);

   assembly {
     // owners.length += amount - 1... :-S
   }
 }

我試圖避免/優化這一點:

 function mint(to, amount) {
   owners.push(to);

   for (uint256 i; i < amount - 1; i++) {
     owners.push(address(0));
   }
 }

是否可以直接在 Assembly 中“擴展”數組長度?

是的,您需要增加位於數組儲存槽的數組的長度:

 function mint(to, amount) {
   owners.push(to);

   assembly {
    sstore(owners.slot, add(sload(owners.slot), sub(amount, 1)))
   }
 }

根據文件:https ://docs.soliditylang.org/en/develop/internals/layout_in_storage.html#mappings-and-dynamic-arrays

假設映射或數組的儲存位置在應用儲存佈局規則後最終成為插槽 p。對於動態數組,此槽儲存數組中元素的數量(字節數組和字元串除外,見下文)。

然後預設情況下,數組中項目的值已設置為 0x0000…000 等。

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