Solidity
在智能合約程式碼中使用密碼和私鑰是否被認為是安全的?
基本上是這樣的:
function transfer(address to, string privkey) { if(privkey == "cd33434343...") { msg.sender.transfer(this.balance); } }
以上顯然是有缺陷的,因為當 if 條件檢查時,privkey 在字元串中,因此有人可以讀取 .sol 原始碼(如果在 etherscan 上……)。但是如果它只是一個函式的參數呢?我的意思是,由於參數以字節為單位傳遞,而像 etherscan 這樣的網站將以字節為單位顯示傳入的交易歷史記錄,那麼這些字節能否被解密為真正的私鑰,或者除非它是一個非常常見的私鑰(“彩虹表攻擊“)?
任何數據,智能合約通過內部鏈上交易進行操作,都應該被認為是公開的。這包括合約初始化字節碼、建構子參數、合約部署字節碼、鏈上交易中傳遞給合約的任何參數,以及合約在此類交易中返回的任何數據。還有在鏈上智能合約執行等過程中出現在記憶體或堆棧中的任何數據。
因此,智能合約無法在鏈上處理任何私人數據,例如私鑰或密碼。但是,它可能會處理私有數據的散列,或關於私有數據的零知識證明,或從私有數據派生的一些其他非私有資訊。