Невозможно получить значение из другого контракта - PullRequest
0 голосов
/ 25 мая 2018

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

Итак, сначала я развернул первый контракт 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 Ответ

0 голосов
/ 26 июля 2018

Я столкнулся с похожими проблемами при составлении контракта с 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, и развертывания их в кворуме или паритете.

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

...