我对智能合约的数据如何存储在以太坊区块链中感兴趣。比如我有这个结构体,里面还存储了用户的密码
struct UserInfo {
string password;
uint256 blockTime;
address userAddress;
}
存储在私有映射中
mapping(address => UserInfo) private users;
我还有一个函数,如果用户位于此映射中,则返回密码
function getPass() public view returns (string memory){
require(users[msg.sender].userAddress == msg.sender, "User does not exist");
return users[msg.sender].password;
}
很明显,如果某个用户想要通过此智能合约获取另一个用户的密码,他将无法做到这一点,因为他不会通过此检查
require(users[msg.sender].userAddress == msg.sender, "User does not exist");
。
但是,如果用户安装了完整节点,并且相应地在本地拥有整个区块链,那么他是否能够以某种方式读取智能合约保存的数据呢?
我在solidity文档中找了这个但没有找到,所以我问chatgpt,他说“区块链是一个分布式数据库,存储在区块链中的所有数据对网络中的所有参与者都是可用的。有权访问与网络同步的完整节点的用户将能够查看所有数据,包括位于区块链中的所有智能合约的状态。” 事实证明,用这种方式在区块链上保存机密数据是不可能的(
你是对的。直接将敏感信息存储在 ETH 区块链或任何其他公共区块链上通常并不安全。由于区块链技术的透明性,所有有权访问全节点的人都可以看到所有数据。您的智能合约逻辑可防止通过访问控制(例如您已实施的访问控制)对某些数据进行未经授权的访问,但实际数据仍然可见。例如,即使由于访问控制检查,用户无法通过“getPass”功能访问其他用户的密码,他们仍然可以检查区块链的状态并直接查看存储的密码,而无需与智能合约交互。为了防止这种情况,在将敏感数据存储在区块链上之前对其进行加密是一个好主意。然而,加密带来了安全隐患和漏洞的风险。