我有以下可靠性代码。
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中的代码运行良好。这就是为什么我认为从isUpdated
访问Child
的成员变量Parent
会导致问题。
这里有什么问题?可能我的私人连锁店成立了?它与Javascript VM Remix使用的是什么不同?
我正在使用geth-linux-amd64-1.8.6-12683来运行我的私人链。