Die Smart-Contract-App, die ich schreibe, folgt dem, was ich für bewährte Verfahren halte – sie ist entkoppelt, sodass ein Controller-Vertrag einen Logikvertrag aufruft, der einen Speichervertrag aufruft. Also Contract A
Anrufe Contract B
Anrufe Contract C
.
Ich frage mich jedoch, ob eine solche Entkopplung aus Sicherheitsgründen eine gute Idee für Smart Contracts ist. Das liegt daran, dass ich den onlyOwner
Modifikator benötige, um festzulegen, wer meine Funktionen aufruft (wie hier beschrieben: https://github.com/ethereum/wiki/wiki/Solidity-Features ). Meiner Meinung nach wäre es toll, wenn ich so etwas machen könnte:
import "Owned.sol";
contract A is Owned {
B private b;
function A(address B) {
b = B(b);
}
function myInterface() public onlyOwner {
a.doStuff({from: msg.sender});
}
}
contract B is Owned {
C private c;
function B(address c) {
c = C(c);
}
function doStuff() public onlyOwner {
c.store(42,{from: msg.sender});
}
}
contract C is Owned {
int private theAnswer;
function store(int value) public onlyOwner {
theAnswer = value
}
}
Ich glaube jedoch, dass ich so nicht senden msg.sender
kann. Wäre ich daher besser zu bündeln und Contract A
in einem einzigen monolithischen Vertrag, wo gültig ist ?Contract B
Contract C
msg.sender
In den Kommentaren zu Ihrem ursprünglichen Beitrag haben Sie festgestellt, dass die Bereitstellung eines großen monolithischen Vertrags aufgrund des Erreichens des Blockgaslimits scheitern kann. Eine DApp, die nicht bereitgestellt werden kann, kann nicht besser sein. :)
Zu den Lösungen: vielleicht verlängern Owned
auf Authable
mit:
mapping (address => bool) public authorised
modifier onlyAuthed {...}
function authAdd (address _addr) public onlyOwner {...}
function authRem (address _addr) public onlyOwner {...}
... und dann Authed
+ onlyAuthed
anstelle von Owned
+ onlyOwner
in abgeleiteten Dapps verwenden? ..
Sie könnten die Teile dann unabhängig voneinander bereitstellen. Sobald eine "vollständige Kette" vorhanden ist, die verknüpft werden kann (z. B. ), können Sie von Ihrem Konto aus A->B->C[several]
anrufen .C.authAdd(<address-of-B>)
owner
Das ist etwas mühsam, aber relativ einfach zu automatisieren. Darüber hinaus müssen Sie sich keine Gedanken über die Reihenfolge der Bereitstellung machen oder darüber, ob einige DApps nicht bereitgestellt werden können.
Das Schema kann an spezielle Bedürfnisse angepasst werden.
Alternativ könntest du Zeppelins Ownable und seine transfer()
Funktion verwenden.
Dies würde gut funktionieren, wenn:
BEARBEITEN:
Andererseits könnten Sie b = B(b)
aus dem Konstruktor heraus zu einer separaten Funktion wechseln (wie function createChildren(...) public onlyOwner onlyOnce {...}
) und eine Möglichkeit hinzufügen, die Anfrage an bereits erstellte Kinder weiterzugeben (wie function nagForGrandChildren(...) public onlyOwner {...}
). Aber das Problem bleibt: Wenn nFGC()
das Blockgaslimit erreicht wird, muss der Funktionsaufruf wiederholt werden – ausgelöst vom ursprünglichen externen owner
Konto von A
.
Auf die eine oder andere Weise müssen Sie vorhersehen, dass ein Teil Ihrer Kette nicht bereitgestellt werden kann. Hier haben Sie die Wahl zwischen „etwas auf der Strecke“ oder „irgendwas dazwischen“.
Tjaden Hess
Glühwächter
Tjaden Hess
msg.sender
im Konstruktor von B verwenden, um den Eigentümer festzulegen. Machen Sie dann dasselbe und erstellen Sie C aus dem Konstruktor von B herausGlühwächter
Tjaden Hess
Glühwächter
new
s machten. Aber ich weiß jetzt ein bisschen mehr, also werde ich nochmal nachforschen.Tjaden Hess
Glühwächter
new
nähern, und tatsächlich ist mir das Gas beim Ausbringen ausgegangen. Es braucht etwa 7M Gas. Daher muss ich Adressen weitergeben. Was ich oben leider nicht erkannt habe, ist, dass ich die Adresse von B nicht an C weitergeben kann, damit C B zu seinem Besitzer machen kann, da B zuerst die Adresse von C benötigt. Es gibt Möglichkeiten, das Eigentum an B zurückzuübertragen, aber sie sind alle ziemlich chaotisch. Das bringt mich zurück zum Titel meines ursprünglichen Beitrags: Bin ich besser dran, diese ganze Komplikation zu vermeiden, indem ich einfach alle meine erforderlichen Funktionen in einem einzigen Vertrag bündele? Ich hoffe nicht, dass es bessere Wege geben muss ...