Keccak
Keccak256 校驗鍵
所以我需要一個函式來檢查一個鍵是否適合該鍵的雜湊。這就是我所擁有的:
function checkKey(bytes32 hash, bytes32 privateKey) public returns (bool success) { require(keccak256(privateKey) == hash); return true; }
我收到以下警告:
- 警告:此函式僅接受單個“字節”參數。請使用“abi.encodePacked(…)”或類似函式對數據進行編碼。
- 警告:提供的 bytes32 類型的參數不能隱式轉換為預期的字節類型記憶體。
我想製作一個使用者找到私鑰並基本上獲得獎勵的遊戲。所以我幾乎可以選擇我散列的字元串類型。我需要記住什麼才能完成這項工作?
bytes32 result = keccak256(abi.encodePacked(privateKey));
這會將 privateKey 轉換為字節,然後 keccak256 函式返回一個 byte32 結果,可以根據您的問題將其與雜湊(bytes32)進行比較。
克里斯是對的。這有點 PSA - 誠然與您的問題相切,但可能對遇到此問題的其他人有用。
一些可能有用的風格評論。
- 創建安全檢查功能會很有幫助。“安全”意味著可以安全使用,因為如果響應為“否”,它將不會恢復。
- 您可以使用修飾符對任何狀態更改函式嚴格要求此條件,因此您將得到如下內容:
pragma solidity 0.4.25; contract CheckKey { modifier onlyIfKeyMatches(bytes32 hash, bytes32 key) { require(isKey(hash, key)); _; } function isKey(bytes32 hash, bytes32 privateKey) public pure returns (bool success) { return keccak256(abi.encodePacked(privateKey)) == hash; } function protected(bytes32 hash, bytes32 privateKey) public onlyIfKeyMatches(hash, privateKey) { // carry on // WARN: privateKey is compromised } }
您想使用
pure
(orview
) 進行檢查,因為它不會更改狀態。這有許多影響,其中包括本地執行。它不會洩露密鑰,因為密鑰不會被廣播到網路。另一方面,. _ 不是,或者因為我認為它做了一些有用的事情,這將採取交易的形式。因此,“私鑰”實際上將被傳輸到整個網路,並將永遠在區塊鏈歷史中清晰可見。如果密鑰是秘密的話,這顯然是個壞消息。
privateKey``protectedFunction()``view``pure
謹慎對待區塊鏈上的秘密。我們必須像每個人都可以看到一切一樣運作,因為他們可以。如果你透露更多關於你想要完成的事情,可能有人會以更好的模式加入進來。
希望能幫助到你。