文章目录
-
- 私有数据
- 访问私有数据实例
- 存储槽
- Solidity 中的数据存储方式
-
- 1. storage(持久化存储)
-
- 定长数组
- 变长数组
- 2. memory(临时内存)
- 3. calldata
- 可见性关键字
- 私有数据存储风险
- 安全措施
私有数据
私有数据(Private Data)通常指的是只对特定主体可见或可访问的数据,在区块链环境中,它通常与隐私保护和访问控制相关。
在智能合约中,标记为 private 的变量或函数,仅在当前合约内部可访问,外部合约无法直接访问它们。
举个例子,对于该合约:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Vault {
// password 是一个 private 字段,只能在当前合约中使用
string private password = "super_secret_password";
address public owner;
constructor() {
owner = msg.sender;
}
function unlock(string memory _password) public view returns (bool) {
// 函数 unlock 接受一个字符串,调用时会判断输入的密码是否等于合约内的 password
return keccak256(abi.encodePacked(_password)) == keccak256(abi.encodePacked(password));
}
}
外部合约不能直接访问 password,如果你写一个别的合约来调用 Vault.password(),会直接报错:变量是 private。
但 Solidity 中的 private 并不意味着区块链层面上的真正“不可见”,因为所有链上数据都是公开透明的,可以通过区块链浏览器或节点还原查看。
我们可以使用 Etherscan 的“Read Contract → storage”工具,或者自己写脚本来读取私有数据。
然后调用 unlock(password),轻松通过验证,进而调用 Vault 合约的其他功能。
访问私有数据实例
1.打开 Remix IDE。
2.在左侧的 File Explorer 中创建一个新文件,命名为 vault.sol。
3.将上文所述的合约代码粘贴到文件中:
4.在 Remix 中,切换到 Solidity Compiler(左侧面板的第二个选项)。
5.确保编译器版本选择的是 0.8.0 或更高版本。
6.点击“Compile vault.sol”按钮来编译合约。
7.切换到 Deploy & Run Transactions 面板(左侧的第三个选项)。
8.环境需要选择线上环境,这里我们选择本地环境,点击“Deploy”按钮部署合约。
9.通过上图的控制台输出可以看到,我们部署的合约地址为:
0x358AA13c52544ECCEF6B0ADD0f801012ADAD5eE3
10.新建 JS 文件,添加以下代码:
(async () => {
const addr =