Solidity

如何檢查映射是否尚未編寫?

  • January 22, 2020

我有這個映射:

mapping (uint256 => string ) private storedData;

我正在嘗試這樣做:

modifier dataNotStored(uint256 _index) {
       require( keccak256(abi.encodePacked(storedData[_index])) == keccak256(abi.encodePacked('')) );
       _;
   }

   function set(uint _index, string calldata _data_to_store) external dataNotStored(_index) {
       storedData[_index] = _data_to_store;
   }

我的目標是只允許對映射的每個條目進行一次寫入。

我認為它正在工作,因為從 Remix IDE 我只有在嘗試重寫時才會出錯。

是否有更有效和更智能的方法來避免覆蓋映射?

您可以避免修飾符和散列。這樣做更簡單:

function set(uint _index, string calldata _data_to_store) external {
   require(bytes(storedData[_index]).length == 0);
   storedData[_index] = _data_to_store;
}

檢查的長度bytes受到這個答案的啟發。

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