我有 3 份合同要执行。合同是master
和。所以主合约是由一个人发起的,即私有链的所有者(基于geth)。管理合约提供对某些地址的访问。这些管理实例由主创建。我正在使用修饰符来确保这一点。客户合同只能由管理员和主合同进行交互。admin
customer
我已将这些地址映射到存储在本地 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
}
}
现在我需要进一步了解如何组合这些合约,并参考客户合约中的 master 和 admin 地址来使用修饰符checkMasterAndAdminAccess
。理想情况下,当编译成 ABI 并在我的 Nodejs 应用程序中使用它时,我希望将这些合约放入单独的文件中,因为它们会变得很大。
这是推荐的做法吗?
只有一个人控制一个主合约实例(因此只有一个地址可以访问它)。其他合约可能被多次实例化
我可以就如何实现上述目标获得一些指导。