У меня есть следующий код прочности.
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").
Однако, когда я переключаюсь на частную цепочку Ethereum,т. е. внедренный Web3, я все еще могу создать дочерний, но не удается переименовать с помощью childInstance.renameViaParent ("newName").Он выдает сообщение:
Оценка газа с ошибкой в следующем сообщении (см. Ниже).Выполнение транзакции, вероятно, не удастся.Вы хотите принудительно отправить?Неверный ответ JSON RPC: {"id": 1830, "jsonrpc": "2.0", "error": {"code": - 32603}}
Я попытался удалить условие thisChild.isUpdated()
отметьте renameChild(index, newName)
, и код работает нормально как в виртуальной машине JS, так и в частной сети Web3.Вот почему я считаю, что доступ к переменной-члену isUpdated
из Child
из Parent
вызывает проблему.
Что здесь не так?Возможно, с моей частной сетью?Чем он отличается от используемого Javascript VM Remix?
Я использую geth-linux-amd64-1.8.6-12683 для запуска моей частной цепочки.