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 访问私有变量的主要内容,如果未能解决你的问题,请参考以下文章

js:私有变量和静态私有变量 | 访问私有属性

区块链实战如何创建一个带参数的智能合约

区块链实战如何创建一个带参数的智能合约

GHUnit 访问私有变量

Python私有变量与私有方法

.net 反射访问私有变量和私有方法