Solidity 访问私有变量
Posted
技术标签:
【中文标题】Solidity 访问私有变量【英文标题】:Solidity accessing private variable 【发布时间】:2018-11-02 17:28:33 【问题描述】:目前,我正在练习 Solidity。但是,我对访问合约中的私有变量有点困惑。
例如这里;
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”?来自不同的合同。
谢谢
【问题讨论】:
【参考方案1】:我不相信你可以。私有变量只能在定义它的合同中使用。 见这里:http://solidity.readthedocs.io/en/v0.4.21/contracts.html
【讨论】:
你说的是内部变量。私有变量也可以在继承的合约中使用。【参考方案2】:即使是私人的,您也可以访问您的合同。
试试这个:
web3.eth.getStorageAt("0x501...", 5)
如果您想访问地图或数组,请查看此文档以了解状态变量的布局:https://solidity.readthedocs.io/en/v0.4.24/miscellaneous.html
顺便说一句,您应该始终使用 getProof 来验证值。
【讨论】:
【参考方案3】:将以太坊视为在您的机器上或远程运行的进程。使用web3.eth.getStorageAt
从进程内存中读取数据。以同样的方式,您可以读取计算机上每个程序的数据。
另一方面,Java、C++ 或 Solidity 等高级编程语言经常定义变量和函数(私有、受保护等)的访问规则。但是这些规则只在程序执行的上下文中成立。对于 Solidity,上下文是事务的执行。
这意味着私有字段仅对试图读取它的其他合约是私有的。但可以被外部(和相当低级的)API 读取,例如web3.eth.getStorageAt
。
【讨论】:
以上是关于Solidity 访问私有变量的主要内容,如果未能解决你的问题,请参考以下文章