2017-12-17 6 views
1

Benötigen Sie Hilfe bei zwei verwandten Fragen zur Solidität.Fragen zum Vertragsabschluss bei einem anderen Vertrag

  1. 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?

  1. 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?

+0

Danke, Adam. Aber zu der zweiten Frage: Wenn ich B b deklariere, sollte ein Standardkonstruktor aufgerufen werden, oder? Und so bezahle ich dafür ... –

+0

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. –

Antwort

2

Wird msg.sender für f1 gleich wie für f() sein? Von wird es eine Adresse von ein Vertrag A sein?

msg.sender wird die Adresse des Auftrags A. sein Wenn Sie den ursprünglichen Anrufer verweisen möchten, verwenden Sie tx.origin.

Also wie deklariere ich eine Elementvariable und initialisieren sie dann von Adresse?

Sie müssen sich keine Gedanken über die Initialisierung machen, wenn Sie die Elementvariable deklarieren. Alle Variablen in Solidity haben Standardwerte. Sie können etwas wie folgt folgen:

contract B { 
    address sender; 

    function B(address addr) { 
     sender = addr; 
    } 
} 

contract A { 
    B b; 

    function A(){ 
     b = B(msg.sender); 
    } 
} 
Verwandte Themen