Smart Contract wird bereitgestellt, aber der Anruf gibt nach der Bereitstellung keine Vertragsadresse zurück

Also habe ich versucht, einen Smart Contract mit nodejs bereitzustellen, aber wenn ich die Funktion zum Bereitstellen aufrufe, erhalte ich keine Vertragsadresse auf meiner Konsole. Es ist, als hätte die Funktion send() ihre Ausführung nie abgeschlossen. Und deshalb beginnt die nächste Anweisung nie mit der Ausführung, obwohl ich weiß, dass der Vertrag immer noch in meinem lokalen Blockchain-Netzwerk bereitgestellt wird (ich weiß es, weil ich an der cmd-Eingabeaufforderung sehen kann, wo mein ganache-cli ausgeführt wird. Ich bin Wenn Sie versuchen, die bereitgestellte Vertragsadresse zu erhalten, teilen Sie mir bitte mit, wie Sie dasselbe tun können.

Erwartetes Verhalten Der Aufruf von await contract.deploy({..}).send({..}) sollte eine Antwort zurückgeben, und danach sollte die Vertragsadresse auf der Konsole ausgegeben werden.

Tatsächliches Verhalten Stattdessen wird danach keine Ausgabe auf der Konsole ausgegeben: 'Deploy function called, about to deploy'.

Die Ausgabe der Eingabeaufforderung stoppt nach:

D:/User/project>node src/deploy

Kein web3? Sie sollten in Erwägung ziehen, MetaMask auszuprobieren!

[AsyncFunction: deploy] eingegeben, wird gerade bereitgestellt

Obwohl ich weiß, dass der Vertrag bereitgestellt wurde, weil mein Ganache-Cli diese Ausgabe zeigt:

Transaktion: 0x12345

Vertrag erstellt: 0x12345

Gasverbrauch: 1605526

Blocknummer: 6

Sperrzeit: Datum und Uhrzeit der Bereitstellung werden angezeigt

Hier ist der Code, den ich ausführen möchte: (deploy.js)

var Web3 = require('web3');

// abibytecode[0] has abi, abibytecode[1] has bytecode
const abibytecode = require('../src/compile');
var web3;

if (typeof web3 !== 'undefined') {
    web3 = new Web3(web3.currentProvider);
} else {
    // set the provider you want from Web3.providers
    console.log('No web3? You should consider trying MetaMask!');
    web3 = new Web3('ws://localhost:8545');
}

let account = 'my account address is here';

const contract = new web3.eth.Contract(abibytecode[0]);

const deploy = async () => {
    console.log('Deploy function called, about to deploy');
    const response = await contract.deploy({data: abibytecode[1]}).send({
      from: account,
      gas: '3000000'
    });
    console.log('Contract deployed to:', response.address);
    console.log('Contract deployed to:', response.options.address);

    return response;
};
console.log(deploy);
deploy((res)=>{console.log(res)});

Versionen:

  • web3.js: 1.0.0-beta.55

  • nodejs: v10.16.0

  • Browser: Keiner, das Skript wird vom Befehl ausgeführt

  • Ethereum-Knoten: ganache-cli

Außerdem ist dies mein allererster Beitrag auf Stackexchange. Wenn ich also einige Informationen verpasst habe, lassen Sie es mich wissen, und ich werde die Lücken füllen.

Bist du sicher, dass das abibytecode[0]ein Objekt und kein String ist? Bist du sicher, dass das abibytecode[1]eine Zeichenfolge ist, die mit beginnt 0x?
Sie können sich meinen Vorschlag für die Vertragsbereitstellung unter ethereum.stackexchange.com/a/71580/16043 ansehen . Vielleicht möchten Sie das stattdessen versuchen (beachten Sie jedoch, dass es auf web3.js 1.0.0-beta.34 basiert).
> Sind Sie sicher, dass abibytecode[0] ein Objekt und kein String ist? Sind Sie sicher, dass abibytecode[1] eine Zeichenfolge ist, die mit 0x beginnt? typeof abibytecode[0] gibt 'object' zurück und typeof abibytecode[1] gibt 'string' zurück. Der Bytecode beginnt jedoch nicht mit 0x. Und ich glaube nicht, dass es so sein sollte, denn wenn ich den Smart Contract in Remix IDE schreibe, gibt er mir den gleichen Bytecode (der nicht mit 0x beginnt)
Entschuldigung, ich schreibe tatsächlich zum ersten Mal einen Kommentar zu Stackexchange.
Ich hatte schon früher Probleme damit, und vielleicht haben sie es in späteren Versionen von web3.js behoben, aber für alle Fälle schlage ich vor, dass Sie data: '0x' + abibytecode[1]stattdessen verwenden. Wenn der Konstruktor Ihres Vertrags Eingabeargumente entgegennimmt, sollten Sie außerdem hinzufügen, arguments: [your argument values]wenn Sie aufrufen contract.deploy.
Habe das versucht. Hat nicht funktioniert, Ausgabe wird immer noch nicht angezeigt. Bitte beachten Sie, dass der Smart Contract bereitgestellt wird und die Vertragsadresse auf ganache-cli gedruckt wird.
Ich habe keinen Konstrukteur in meinem Vertrag :P
Ich stecke jetzt seit fast einem Tag in dieser Situation fest. Wenn jemand helfen kann, bin ich dankbar.
Ich habe auch eine Alternative zum Bereitstellen des Vertrags ausprobiert, aber das scheint mir die gleichen Ergebnisse zu liefern. Siehe hier: pastebin.com/jAY5kef4
Hast du meinen Vorschlag (2. Kommentar von oben) ausprobiert?

Antworten (1)

Um einen Vertrag bereitzustellen, ist ein Unterzeichner erforderlich. Die Verwendung von web3 erfordert, dass der private Schlüssel für die Adresse im Knoten vorhanden ist. Stellen Sie sicher, dass der private Kontoschlüssel im lokalen Testknoten vorhanden ist. Eine Möglichkeit besteht darin, ständig ganache-climit einem Satz privater Schlüssel zu beginnen.

Es gibt ein Problem mit der Art und Weise, wie die Deploy Async-Funktion aufgerufen wird, wie es sein sollte

deploy().then(function(response){ console.log(response)})

Sie können auch zu ethers.js wechseln , da es entwicklerfreundlicher ist

const { ContractFactory, Wallet, providers } = require('ethers')
const provider = new providers.JsonRpcProvider('http://localhost:8545')
const wallet = new Wallet(privateKey, provider)
async function deployContracts() {
    let token = new ContractFactory(tokenabi, tokenbytecode, wallet)
    // this deploys the contract
    token = await token.deploy()
    // we must wait until it is mined
    token = await token.deployed()
    return token
}