Keccak

Keccak256 校驗鍵

  • November 3, 2018

所以我需要一個函式來檢查一個鍵是否適合該鍵的雜湊。這就是我所擁有的:

function checkKey(bytes32 hash, bytes32 privateKey) public returns (bool success) {
   require(keccak256(privateKey) == hash);
   return true;
}

我收到以下警告:

  1. 警告:此函式僅接受單個“字節”參數。請使用“abi.encodePacked(…)”或類似函式對數據進行編碼。
  2. 警告:提供的 bytes32 類型的參數不能隱式轉換為預期的字節類型記憶體。

我想製作一個使用者找到私鑰並基本上獲得獎勵的遊戲。所以我幾乎可以選擇我散列的字元串類型。我需要記住什麼才能完成這項工作?

   bytes32 result = keccak256(abi.encodePacked(privateKey));

這會將 privateKey 轉換為字節,然後 keccak256 函式返回一個 byte32 結果,可以根據您的問題將其與雜湊(bytes32)進行比較。

克里斯是對的。這有點 PSA - 誠然與您的問題相切,但可能對遇到此問題的其他人有用。

一些可能有用的風格評論。

  1. 創建安全檢查功能會很有幫助。“安全”意味著可以安全使用,因為如果響應為“否”,它將不會恢復。
  2. 您可以使用修飾符對任何狀態更改函式嚴格要求此條件,因此您將得到如下內容:
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(or view) 進行檢查,因為它不會更改狀態。這有許多影響,其中包括本地執行。它不會洩露密鑰,因為密鑰不會被廣播到網路。

另一方面,. _ 不是,或者因為我認為它做了一些有用的事情,這將採取交易的形式。因此,“私鑰”實際上將被傳輸到整個網路,並將永遠在區塊鏈歷史中清晰可見。如果密鑰是秘密的話,這顯然是個壞消息。privateKey``protectedFunction()``view``pure

謹慎對待區塊鏈上的秘密。我們必須像每個人都可以看到一切一樣運作,因為他們可以。如果你透露更多關於你想要完成的事情,可能有人會以更好的模式加入進來。

希望能幫助到你。

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