目前,我实践稳固。但是,我对在合同中访问私有变量感到有些困惑。
例如这里;
address private a;
address private b;
mapping (bytes32 => uint) public people;
mapping (bytes32 => mapping(address => uint)) public listOfEmp;
bytes32[] public list;
bytes32 private z;
我可以访问' a'与
web3.eth.getStorageAt("0x501...", 0)
我如何访问' z'这里?来自不同的合同。
谢谢
答案 0 :(得分:0)
即使您的合同是私人的,您也可以访问它。
尝试一下:
web3.eth.getStorageAt("0x501...", 5)
如果要访问映射或数组,请检查此文档以获取状态变量的布局:https://solidity.readthedocs.io/en/v0.4.24/miscellaneous.html
顺便说一句,您应该始终使用getProof来验证值。
答案 1 :(得分:0)
将以太坊视为在计算机上或远程运行的进程。使用web3.eth.getStorageAt
从过程存储器中读取数据。您可以用相同的方式读取计算机上每个程序的数据。
另一方面,诸如Java,C ++或Solidity之类的高级编程语言经常定义对变量和函数(私有,受保护等)的访问规则。但是这些规则仅在程序执行的上下文中成立。对于Solidity,上下文是事务的执行。
这意味着专用字段仅对尝试读取该字段的其他合同专用。但是可以通过外部{和[{1}}}这样的API读取。
答案 2 :(得分:-3)
我不相信你可以。私有变量仅用于定义它的合同中。 见这里:http://solidity.readthedocs.io/en/v0.4.21/contracts.html