Wie erhalte ich die Vertragsadresse nach der Bereitstellung des Vertrags ohne Verwendung von Trüffel?

Ich verwende derzeit web3 0.20.6 und plane, in web3@0.20.6 zu bleiben, da es Probleme mit HTTP in den Beta-Versionen von web3@1.0.0-beta.* gibt

Der aktuelle Anbieter unterstützt keine Abonnements: HttpProvider

Jetzt versuche ich herauszufinden, wie ich die Vertragsadresse nach der Bereitstellung bekomme. Denn in web3@1.0.0-beta.* können wir wie im folgenden Beispiel verwenden, um die Vertragsadresse zu erhalten.

    contract.deploy({
        data: '0x'+bin,
        arguments: [request.body.vin, cost, request.body.buyer]
    })
    .send({
        from: request.body.dealer,
        gas: gas
    })
    .on('receipt', receipt => {
        util.log(`>>>>> contractApi - Contract sucessfully deployed @ address: ${receipt.contractAddress}`);

        data.contract_address = receipt.contractAddress;

        response.json(data);
    });

Aber wie macht man das in web3@0.20.6 ? Ich konnte die Lösungen online nicht finden, ohne Trüffel zu verwenden. Ich habe nicht vor, auch Trüffel zu verwenden.

Was ich versucht habe, war,

const deployedContract = LoginContract.new ({
    data: '0x'+binLogin,
    from: '6ded1c5b448819a6cde4293e33fbe54583ef5c52',
    gas: 4700000
});

contractData = deployedContract.address;
util.log(`>>>>> setup - Login Contract sucessfully deployed @ address: ${contractData}`)

Das Ergebnis in der Konsole ist jedoch eine undefinierte Adresse

22. März 14:04:15 - >>>>> Einrichtung - Login-Vertrag erfolgreich bereitgestellt @ Adresse: undefiniert

Dann, nach etwa 5-10 Sekunden, tauchte dies in der Konsole auf

Fehler: Der Vertragscode konnte nicht gespeichert werden, bitte überprüfen Sie Ihre Gasmenge.

Ich bin gerade super verwirrt, weil die Gasmenge ausreichen sollte.

BEARBEITEN 1 Dank der Antwort von @mirg ist die Bereitstellung erfolgreich. Mir ist jedoch aufgefallen, dass die Anweisungen unter der Vertragsbereitstellung:

contractData = deployedContract.address;
util.log(`>>>>> setup - Login Contract sucessfully deployed @ address: ${contractData}`)

weiter ausgeführt und wartet nicht, bis die Vertragsbereitstellung abgeschlossen/beendet ist.

Wie geben Sie weitere Anweisungen zum Abwarten und Verarbeiten des Ergebnisses dieser Vertragsbereitstellung? In web3@1.0.0-beta.* ist es durch Verwendung von erreichbar

.on('receipt', receipt => {}

Aber ich habe keine Ahnung, wie es mit web3@0.20.6 erreicht wird.

Antworten (1)

Im zweiten Fall übergeben Sie die Konstruktorparameter nicht an die Bereitstellungsfunktion.

const deployedContract = LoginContract.new (request.body.vin, Kosten, request.body.buyer, {
    Daten: '0x'+binLogin,
    aus: '6ded1c5b448819a6cde4293e33fbe54583ef5c52',
    Benzin: 4700000
}, Funktion(err, meinVertrag){
    wenn (! err) {
       // HINWEIS: Der Callback wird zweimal ausgelöst!
       // Sobald der Vertrag die Eigenschaft transactionHash festgelegt hat und einmal auf einer Adresse bereitgestellt wird.

       // z. B. tx-Hash beim ersten Aufruf prüfen (Transaktion senden)
       if(!myContract.address) {
           console.log(myContract.transactionHash) // Der Hash der Transaktion, die den Vertrag bereitstellt

       // Adresse beim zweiten Aufruf prüfen (Vertrag bereitgestellt)
       } anders {
           console.log(myContract.address) // die Vertragsadresse
       }

       // Beachten Sie, dass das zurückgegebene "myContractReturned" === "myContract",
       // Das zurückgegebene "myContractReturned"-Objekt erhält also auch die festgelegte Adresse.
    }
  }));

das sollte funktionieren ref

Danke für die Antwort @mirg, mir ist aufgefallen, dass die Anweisungen nach der Vertragsbereitstellung weiter ausgeführt werden, ohne auf das Ende der Bereitstellung zu warten. Wie macht man die Anweisungen zum Warten in web3@0.20.6 genauso wie in web3@1.0.0-beta.*?
Sie müssen einen Rückruf bereitstellen (der zweimal ausgelöst wird). Siehe meine aktualisierte Antwort