Solidity

將布爾值與地址一起打包會降低儲存成本嗎?

  • September 23, 2019

假設我有一個這樣的結構:

struct MyStruct {
   bool foo;
   uint256 bar;
   uint256 baz;
   address qux;
}

如果我這樣重寫:

struct MyStruct {
   bool foo;
   address qux;
   uint256 bar;
   uint256 baz;
}

儲存是否會變得更便宜,因為它是 0 或 1address的別名,uint160並且bool只能是 0 或 1?如果foo是 typeaddress怎麼辦?

是的,它適用於第一種情況,但如果fooaddress,則不,沒有儲存效率提升。

如果我應用問題正文中提到的更改,我最終會少花 20,134 美元來在映射中添加新結構。

查看 Rinkeby 上的交易:

使用的範例合約:

pragma solidity 0.5.11;

contract StorageCostTest {

   struct MyStruct {
       bool foo;
       uint256 bar;
       uint256 baz;
       address qux;
   }

   mapping(uint256 => MyStruct) private myStructs;
   uint256 public nextMyStructId;

   constructor() public {
       nextMyStructId = 1;
   }

   function addItem(bool foo, uint256 bar, uint256 baz, address qux) external {
       myStructs[nextMyStructId] = MyStruct({
          foo: foo,
          bar: bar,
          baz: baz,
          qux: qux
       });
       nextMyStructId += 1;
   }
}

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