Solidity
映射不儲存唯一值
我編寫這段程式碼的目的是儲存唯一的文件雜湊。使用映射來實現這一點。
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
而沒有契約給我返回錯誤,這告訴我有些東西不適用於您的驗證?