Ich habe 3 Verträge, die ich umsetzen möchte. Die Verträge sind master
, admin
und customer
. Der Rahmenvertrag wird also von einer einzigen Person initiiert, dem Eigentümer der privaten Kette (basierend auf Geth). Der admin
Vertrag sieht den Zugriff auf bestimmte Adressen vor. Diese admin
Instanzen werden von der erstellt master
. Ich verwende a modifier
, um dies sicherzustellen. Mit dem customer
Vertrag kann nur durch den Vertrag interagiert admin
werden master
.
Ich habe diese addresses
Konten (mit Benutzername und Passwort) zugeordnet, die auf meinem lokalen Redis db
. Snipper meiner Vertragsstruktur ist unten:
Master Contract
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;
}
}
Der Admin-Vertrag
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;
}
}
}
Kundenvertrag
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
}
}
Jetzt muss ich weiter verstehen, wie man diese Verträge kombiniert und auf die Master- und Admin-Adresse im Kundenvertrag verweist, um den Modifikator zu verwenden checkMasterAndAdminAccess
. Idealerweise würde ich beim Kompilieren in ABI und Verwenden in meiner Nodejs
App diese Verträge in separaten Dateien platzieren wollen, da sie massiv werden.
Ist das eine empfehlenswerte Praxis?
Es wird nur eine Instanz von master contract
kontrolliert von nur einer Person geben (also hat nur eine Adresse Zugriff darauf). Die anderen Verträge können mehr als einmal instanziiert werden
Kann ich eine Anleitung bekommen, wie ich das oben Gesagte erreichen kann?
Wenn Sie nur anderen Verträgen den Zugriff auf Ihren Code erlauben möchten, sollten Sie die Vererbung verwenden:
Customer is Admin:
Auch wenn mir das wenig Sinn macht. Ich denke, Ihr Problem betrifft weniger die gemeinsame Nutzung von Funktionen als vielmehr die Art und Weise, wie Sie Ihren Code organisieren. Der einfachste Weg, mit Berechtigungen umzugehen, ist ein Telefonbuchvertrag, der die Benutzerberechtigungen verfolgt. Lassen Sie dann alle Ihre Funktionen von diesem Vertrag erben, damit sie die erforderlichen Modifikatoren verwenden können. So was:
contract PhoneBook {
modifier onlyMasterAccess() {
require(msg.sender == master);
_;
}
}
contract Customer is PhoneBook{
function initCustomerContract() onlyMasterAccess {
state = true;
}
}