Ethereum 无法从另一个合同中获取价值

Ethereum 无法从另一个合同中获取价值,ethereum,solidity,parity,geth,quorum,Ethereum,Solidity,Parity,Geth,Quorum,我面临着一个令人头疼的问题。我已经创建了两个契约UserRole,它有一个用户名到角色的映射,还有一个基本契约,它有一个修饰符来检查角色是否uint8)用户角色; 构造函数() 公众的 { 所有者=msg.sender; } 函数集(字符串\用户名,uint8 \角色) 公众的 返回(bool成功) { 用户角色[\u用户名]=\u角色; 返回true; } 函数getRole(字符串\u用户名) 公众的 看法 返回(uint8\u角色) { 返回userRoles[_username]; }

我面临着一个令人头疼的问题。我已经创建了两个契约UserRole,它有一个用户名到角色的映射,还有一个基本契约,它有一个修饰符来检查角色是否<10

因此,我首先部署了第一个UserRole契约,然后使用参数_username=“jamesbond”和_role=7调用set函数

挖掘完事务后,我调用getRole passing _username=“jamesbond”,然后返回7

现在,我部署Base并传递我先前部署的UserRole契约的地址。我调用testModifier函数并传递它_username=“jamesbond”。我希望我得到值7

我首先测试了这个。然后我试了试法定人数和均等人数。在remix上,它按预期工作,但在仲裁和奇偶校验上,我没有得到任何值

我不确定我做错了什么

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);
    }
}
pragma-solidity^0.4.24;
合同用户角色{
地址所有者;
映射(string=>uint8)用户角色;
构造函数()
公众的
{
所有者=msg.sender;
}
函数集(字符串\用户名,uint8 \角色)
公众的
返回(bool成功)
{
用户角色[\u用户名]=\u角色;
返回true;
}
函数getRole(字符串\u用户名)
公众的
看法
返回(uint8\u角色)
{
返回userRoles[_username];
}
}
合同基础{
地址所有者;
用户角色用户角色;
地址:公共用户RoleAddress;
构造器(地址)
公众的
{
所有者=msg.sender;
userRoleAddress=\u t;
userRole=userRole(\u t);
}
修饰符已授权(字符串\u用户名){
uint8角色=5;
要求(角色<10);
_;
}
函数testModifier(字符串\u用户名)
公众的
未授权(\u用户名)
看法
返回(uint8结果)
{
返回userRole.getRole(\u username);
}
}

我在与客户编写合同时遇到过类似的问题。 解决办法如下:

  • 使用安装solcjs

    npm安装-g solc
    它将提供solcjs的可执行二进制文件

    2.创建两个名为
    UserRole.sol
    Base.sol
    的文件,并在文件中复制相应的代码。使用solcjs编译器(系统中安装的二进制文件)编译两个合同

    solcjs-o输出--bin--abi UserRole.sol

    solcjs-o输出--bin--abi Base.sol

  • 它将在
    输出
    文件夹内生成两个abi和两个bin文件

  • 使用各自合同的这些abi和bin创建类似的脚本,如
    web3deploy
    ,并在仲裁或对等中部署它们

  • 这会奏效的