以字元串形式儲存在智能合約中的數據是否可以公開讀取?
作為初學者,我出於學習目的編寫了以下合約,旨在創建一個“安全消息系統”:
pragma solidity ^0.4.24; contract SafeMessage { string message; string password; string enterPassword; function sendMessage(string _message, string _password) public { require (bytes(_message).length > 0 && bytes(_password).length > 0 ); message = _message; password = _password; } function readMessage (string _enterPassword) view public returns (string) { require (stringsEqual(password, _enterPassword) == true); return (message); } function stringsEqual(string storage _a, string memory _b) internal pure returns(bool) { bytes storage a = bytes(_a); bytes memory b = bytes(_b); if (keccak256(a) != keccak256(b)) { return false; } return true; } }
因此,使用上面的程式碼,我可以設置一條消息,呼叫“readMessage”只會返回帶有正確密碼的消息。問題是,據我了解,以字元串形式儲存的數據(消息和密碼)可以被其他人讀取。真的嗎?那是如何工作的?
另外,對於密碼,我可以只獲取它的雜湊值,而不是直接將其儲存為字元串,但如果無論如何都可以讀取消息,那將無法解決問題。如果上一段中提到的是真的,那麼如何真正創建一個帶有智能合約的“安全消息系統”?
是的,區塊鏈中的所有內容都是公開的,任何人都可以閱讀。
請參閱https://programtheblockchain.com/posts/2018/01/02/making-smart-contracts-with-public-variables/的“沒有什麼是隱藏的”部分。
智能合約無法保守秘密,因此區塊鏈上唯一可以存在的秘密是在區塊鏈之外加密和解密的秘密。(即加密,然後儲存在區塊鏈上,然後檢索,然後解密。一旦加密,在 Twitter 上發布數據也是安全的。)
Etherscan 可以輕鬆讀取任何合約的程式碼和狀態變數,甚至與之互動。
這是一個直接的例子:CryptoKitties 合約: https ://etherscan.io/address/0x06012c8cf97bead5deae237070f9587f8e7a266d#readContract
對於簡單的狀態變數,您會看到值,例如 paused = False bool
對於映射,您會得到一個表單來輸入密鑰:例如,kittyIndexToOwner 接受一個代表小貓索引的 uint256,然後點擊“查詢”返回所有者地址。
對於公共或外部函式,您會得到一個用於輸入所有參數的表單,例如,canBreedWith 接受一個 _matronId (uint256) 和一個 _sireId (uint256),返回一個布爾值。