2

我有以下可靠性代码。

pragma solidity ^0.4.21;

contract Parent {
    uint public childCount;
    Child[] public children;

    function makeChild(string name) external {
        children.push(new Child(address(this), childCount, name));
        childCount++;
    }

    function renameChild(uint index, string newName) external {
        require(address(children[index]) != 0);
        Child thisChild = Child(address(children[index]));
        if (thisChild.isUpdated()) {
            thisChild.rename(newName);
        }
    }
}

contract Child {
    address parentAddress;
    uint index;
    string public name;
    bool public isUpdated;

    constructor(address parent, uint _index, string _name) public {
        parentAddress = parent;
        index = _index;
        name = _name;
        isUpdated = false;
    }

    function rename(string newName) external {
        name = newName;
    }

    function renameViaParent(string updateName) external {
        isUpdated = true;
        Parent(parentAddress).renameChild(index, updateName);
    }
}

我一直在通过Remix Solidity IDE测试这段代码。当我在 Javascript VM 中运行时,我可以从 parentInstance.makeChild("childName") 创建一个孩子,并使用 childInstance.renameViaParent("newName") 重命名它。

但是,当我切换到以太坊私有链,即 Injected Web3 时,我仍然可以创建孩子,但使用 childInstance.renameViaParent("newName") 重命名失败。它给出了以下信息:

气体估算错误并显示以下消息(见下文)。事务执行可能会失败。是否要强制发送?无效的 JSON RPC 响应:{"id":1830,"jsonrpc":"2.0","error":{"code":-32603}}

我试图删除thisChild.isUpdated()条件检查,renameChild(index, newName)代码在 JS VM 和私有 Web3 中运行良好。这就是为什么我认为访问from的成员变量isUpdated会导致问题。ChildParent

这里有什么问题?可能与我的私人连锁店有关?它与使用的 Javascript VM Remix 有何不同?

我正在使用 geth-linux-amd64-1.8.6-12683 来运行我的私有链。

4

0 回答 0