Benötigen Sie Hilfe bei zwei verwandten Fragen zur Solidität.Fragen zum Vertragsabschluss bei einem anderen Vertrag
Frage 1. Sprich, ich habe einen Vertrag einen anderen Aufruf:
Vertrag B { Funktion f1() { ... } }
Vertrag A { B b;
Funktion f() { b.f1(); } }
Wird msg.sender
für f1
wie für f()
gleich sein? Wird es eine Adresse eines Vertrages A
sein?
Frage 2. Sag mal, habe ich Verträge A und B. I
Vertrag A { B b haben wollen;
A (Adresse addr) {b = B (addr); }}
In anderer Sprache, würde ich B b = null;
in Deklaration verwenden, doppelte Initialisierung zu vermeiden, aber es funktioniert nicht in Solidity. Wie deklariere ich eine Membervariable und initialisiere sie dann nach Adresse?
Danke, Adam. Aber zu der zweiten Frage: Wenn ich B b deklariere, sollte ein Standardkonstruktor aufgerufen werden, oder? Und so bezahle ich dafür ... –
Nein, Konstruktoren werden nur einmal aufgerufen und es gibt nur einen Konstruktor pro Vertrag (Von https://github.com/ethereum/solidity/blob/develop/docs/control-structures.rst # scoping-and-declarations: "Wenn ein Vertrag erstellt wird, wird sein Konstruktor (eine Funktion mit dem gleichen Namen wie der Vertrag) einmal ausgeführt. Ein Konstruktor ist optional. Nur ein Konstruktor ist erlaubt, und das heißt, das Überladen wird nicht unterstützt. "). Vertragsvariablen werden auf interne Byte-Darstellung für 0 initialisiert. Siehe https://github.com/ethereum/solidity/blob/develop/docs/control-structures.rst#scoping-and-clarations. –