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.
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-cli
mit 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
}
gute Stimmung
abibytecode[0]
ein Objekt und kein String ist? Bist du sicher, dass dasabibytecode[1]
eine Zeichenfolge ist, die mit beginnt0x
?gute Stimmung
Aditya Sahu
Aditya Sahu
gute Stimmung
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 aufrufencontract.deploy
.Aditya Sahu
Aditya Sahu
Aditya Sahu
Aditya Sahu
gute Stimmung