Невозможно получить значение из другого контракта

Я столкнулся с проблемой царапин на голове. Я создал два контракта UserRole с картой имени пользователя и базовым контрактом с модификатором, который проверяет, является ли роль < 10.

Поэтому я сначала развернул первый контракт UserRole, а затем вызвал функцию set с параметрами _username = "jamesbond" и _role=7.

После завершения транзакции я вызываю getRole с передачей _username = "jamesbond" и возвращаюсь 7.

Теперь я развертываю Base и передаю адрес контракта UserRole, который я развернул ранее. Я вызываю функцию testModifier и передаю ее _username = "jamesbond". Я ожидаю, что я получу значение 7 обратно.

Сначала я проверил это на http://remix.ethereum.org/. Тогда я попробовал это на кворуме и паритете. На ремиксе он работает как положено, но как при кворуме, так и при паритете я не получаю никаких значений обратно.

Я не уверен, что я делаю неправильно.

pragma solidity ^0.4.24;

contract UserRole {
    address owner;

    mapping (string => uint8) userRoles;

    constructor() 
        public
    {
        owner = msg.sender;
    }

    function set(string _username, uint8 _role) 
        public
        returns (bool sucesss)
    {
        userRoles[_username] = _role;
        return true;
    }

    function getRole(string _username) 
        public
        view
        returns (uint8 _role)
    {
        return userRoles[_username];
    }
}

contract Base {
    address owner;
    UserRole userRole;
    address public userRoleAddress;

    constructor(address _t) 
        public
    {
        owner = msg.sender;
        userRoleAddress = _t;
        userRole = UserRole(_t);
    }


    modifier isAuthorized(string _username) {
        uint8 role = 5;
        require(role < 10);
        _;
    }

    function testModifier(string _username)
        public
        isAuthorized(_username)
        view
        returns (uint8 result)
    {
        return userRole.getRole(_username);
    }
}

1 ответ

Я столкнулся с похожими проблемами при составлении контракта с Remix. Решение заключается в следующем:

  1. Установите solcjs используя

    npm install -g solc Это обеспечит исполняемый двоичный файл solcjs.

    2. Создайте два файла с именем UserRole.sol а также Base.sol и скопируйте соответствующий код в файлы. Скомпилируйте оба контракта, используя компилятор solcjs (двоичный файл, установленный в вашей системе).

    solcjs -o output --bin --abi UserRole.sol

    solcjs -o output --bin --abi Base.sol

  2. Это произведет два abi и два файла bin внутри output папка.

  3. Используйте эти abi и bin соответствующих контрактов для создания похожих скриптов, таких как web3deploy и разверните их в кворуме или паритете.

Это будет работать

Другие вопросы по тегам