使用修饰函数实现智能合约层次的ACL

时间:2016-11-05 11:38:36

标签: node.js ethereum solidity smartcontracts

我想要实施3份合约。合同为masteradmincustomer。因此,主合同由一个人发起,即私人链的所有者(基于geth)。管理合同提供对某些地址的访问权限。这些管理实例由主服务器创建。我正在使用修饰符来确保这一点。客户合同只能通过管理员和主合同进行交互。

我已将这些地址映射到存储在我的本地Redis数据库中的帐户(使用用户名和密码)。合同结构的狙击手如下:

主合同

contract MasterContract{
    bool public state = false;
    address public masterAddress;
    bool permCheck;


    // ACL
    // Subject(Role) - Object/Subject - permission - On/Off
    mapping (uint => mapping(uint => perm)) public acl;

    // Init Function
    function masterContractInit(string name,string detail){
      if(msg.sender!="0x0"){
        throw;
      }else{
        masterAddress = msg.sender;
      }
    }

    modifier onlyMasterAccess{
      if (msg.sender == masterAddress) _
      else throw;
    }
}

管理合同

contract AdminContract{
  bool state=false;
  struct Admin{
      bool status;
      string name;
  }
  mapping (address => admin ) public admins;

  // How to reference this masterAddress?
  modifier checkMasterAndAdminAccess{
    if (msg.sender == masterAddress || admins[msg.sender].status) _
    else throw;
  }

  function initAdminContract() onlyMasterAccess{    
    state = true;
  }

  function addAdmin(address addr, string name) onlyMasterAccess{
    admins[addr]=Admin(true, name);
  }

  function revokeAdmin(address addr) onlyMasterAccess{
    if(addr!="0x0"){
      throw;
    }else{
      admins[addr].status = false;
    }
  }
}

客户合同

contract Customer{
  bool public state = false;

  function initCustomerContract() onlyMasterAccess{    
    state = true;
  }

  function foo() checkMasterAndAdminAccess{
    // Do something here
    // only admin or master can call this function
  }

  function bar(){
    // Do something, but allow others to modify this
  }   
}

现在我需要进一步了解如何组合这些合同并引用客户合同中的主管理地址和管理地址以使用修饰符checkMasterAndAdminAccess。理想情况下,在编译成ABI并在我的Nodejs应用程序中使用它时,我希望将这些合同放在单独的文件中,因为它们会变得很大。

这是推荐做法吗?

只有一个主合同的实例由人控制(因此只有一个地址可以访问它)。其他合同可以多次实例化

我可以获得一些如何实现上述目标的指导。

0 个答案:

没有答案