Solidity

映射不儲存唯一值

  • June 19, 2020

我編寫這段程式碼的目的是儲存唯一的文件雜湊。使用映射來實現這一點。

pragma solidity ^0.5.16;

contract DocumentHash{

   string public documentHash;
   mapping (string => string) hashAlreadyRegistered;
       
   function setDocumentHash(string memory hash) public {
       require(keccak256( abi.encodePacked((""))) != keccak256(abi.encodePacked((hash))), "Empty hash!");
       require(keccak256( abi.encodePacked((hashAlreadyRegistered[documentHash]))) != keccak256(abi.encodePacked((hash))), "Hash already registered");
       
       documentHash = hash;
       hashAlreadyRegistered[documentHash] = hash;
   }

   function getDocumentHash() public view returns(string memory) {
       return documentHash;
   }
}

當我使用 geth 連接啟動本地伺服器(npm start)並向該合約發送雜湊時,它工作正常。當我嘗試發送相同的雜湊時,它會啟動預期的行為(需要條件)。但是,例如,如果我重新啟動本地伺服器和 geth 連接,我就可以儲存我已經儲存的相同雜湊值。雜湊不會是唯一的嗎?還是我的程式碼在某處失敗?

聽起來可能很傻,但你確定你沒有在重啟時重新部署契約嗎?確保您正在處理具有相同狀態(數據)的相同契約。如果是,那麼您可以嘗試用這個替換您目前的驗證:

require(bytes(hash).length  > 0, "Empty hash!");
require(bytes(hashAlreadyRegistered[hash]).length  == 0, "Hash already registered");

我注意到,如果我傳遞123給方法setDocumentHash並且在此之後我通過1234了,那麼我可以再次通過123而沒有契約給我返回錯誤,這告訴我有些東西不適用於您的驗證?

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