【问题标题】:Solidity accessing private variableSolidity 访问私有变量
【发布时间】: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”?来自不同的合同。

谢谢

【问题讨论】:

    标签: storage ethereum solidity smartcontracts web3js


    【解决方案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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-25
        • 2012-05-09
        • 1970-01-01
        • 1970-01-01
        • 2015-11-14
        • 2011-03-02
        • 1970-01-01
        相关资源
        最近更新 更多