Solidity не может получить доступ к переменной члена из другого контракта в частной цепочке, отлично работает на ремикс javascript vm - PullRequest
0 голосов
/ 30 мая 2018

У меня есть следующий код прочности.

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 для запуска моей частной цепочки.

...