実装したい契約が3つあります。コントラクトはmaster
、admin
およびcustomer
です。そのため、マスター コントラクトは、(geth に基づく) プライベート チェーンの所有者である 1 人の人物によって開始されます。管理コントラクトは、特定のアドレスへのアクセスを提供します。これらの管理インスタンスは、マスターによって作成されます。これを確実にするために修飾子を使用しています。顧客コントラクトは、管理者とマスター コントラクトによってのみ操作できます。
これらのアドレスを、ローカルの Redis db に保存されているアカウント (ユーザー名と pw を使用) にマップしました。私の契約構造のスニッパーは以下の通りです:
基本契約
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 アドレスを参照して modifier を使用する方法をさらに理解する必要がありますcheckMasterAndAdminAccess
。理想的には、ABI にコンパイルして Nodejs アプリで使用する場合、これらのコントラクトは大きくなるため、これらのコントラクトを別々のファイルに配置したいと考えています。
これは推奨される方法ですか?
マスター コントラクトのインスタンスは 1 人だけによって管理されます (そのため、アクセスできるアドレスは 1 つだけです)。他のコントラクトは複数回インスタンス化される可能性があります
上記を達成する方法についてのガイダンスを得ることができますか。