Solidity
如何隱藏/保護智能合約參數
在 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
。大多數依賴這種基於密碼的功能的系統將使用散列來隱藏值。
您沒有直接設置密碼,而是設置
password
為keccak256(password)
. 然後,當你想解鎖合約時,你以實際密碼作為數據進行交易,合約會計算keccak256(input)
,然後驗證它是否與之前提供的雜湊匹配。當然,這會在解鎖 tx 中顯示密碼。為避免這種情況,您可以在
_newpassword
解鎖時傳入一個新的雜湊 ( )。如果解鎖成功,請將密碼散列更新為這個新的,下次您希望解鎖時,提供此散列的密碼(連同第三個設置它的密碼)。