Solidity

如何隱藏/保護智能合約參數

  • August 2, 2018

在 Ethernaut 8 級中,您將獲得此合約來破解:

pragma solidity ^0.4.18;

contract Vault {
 bool public locked;
 bytes32 private password;

 function Vault(bytes32 _password) public {
   locked = true;
   password = _password;
 }

 function unlock(bytes32 _password) public {
   if (password == _password) {
     locked = false;
   }
 }
}

通過建構子參數傳遞給合約的密碼很容易找到;通過轉到 Etherscan 中的創建事務並閱讀文本中的 init 輸入程式碼。或通過:

web3.eth.getStorageAt(contractAddress, 1,  function(error, result) {password = result}))

有沒有辦法對這些參數(bytes32 _password)進行編碼並使其沒有人可以通過 etherscan 或 web3 檢索它們?

您將永遠無法真正隱藏本質上是相等檢查的數據a == b

大多數依賴這種基於密碼的功能的系統將使用散列來隱藏值。

您沒有直接設置密碼,而是設置passwordkeccak256(password). 然後,當你想解鎖合約時,你以實際密碼作為數據進行交易,合約會計算keccak256(input),然後驗證它是否與之前提供的雜湊匹配。

當然,這會在解鎖 tx 中顯示密碼。為避免這種情況,您可以在_newpassword解鎖時傳入一個新的雜湊 ( )。如果解鎖成功,請將密碼散列更新為這個新的,下次您希望解鎖時,提供此散列的密碼(連同第三個設置它的密碼)。

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