Ich versuche, einen Anfängervertrag über den Infura-Knoten im Rinkeby-Testnetzwerk bereitzustellen. Es wirft den folgenden Fehler.
(node:35183) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: The contract code couldn't be stored, please check your gas limit.
(node:35183) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
Vertrag
pragma solidity ^0.4.17;
contract Inbox {
string public message;
function Inbox(
string initialMessage) public {
message = initialMessage;
}
function setMessage(string newMessage) public {
message = newMessage;
} }
Ich habe einige Konsolenprotokolle verwendet, um festzustellen, wo der Fehler ausgegeben wird, ich habe ihn unten mit einem //COMMENT markiert.
Skript bereitstellen
const HDWalletProvider = require('truffle-hdwallet-provider');
const Web3 = require('web3');
const { interface, bytecode } = require('./compile');
const provider = new HDWalletProvider(
'word frog gentle happy chicken book sneeze provide stick handle four fan',
'https://rinkeby.infura.io/myStringOfRandomLetters'
);
const web3 = new Web3(provider);
const deploy = async () => {
const accounts = await web3.eth.getAccounts();
console.log('Attempting to Deploy from account', accounts[0]);
//ERROR OCCURS HERE
const result = await new web3.eth.Contract(JSON.parse(interface))
.deploy({ data: bytecode, arguments: ['Hi there!'] })
.send({ gas: '1000000', from: accounts[0] });
console.log('Contract deployed to', result.options.address);
};
deploy();
Dinge, die ich versucht habe, um es zu beheben:
Erhöhung des Gaslimits auf 2.000.000, 4.000.000 und Verringerung auf etwa 500.000 und 21.000. Ich habe einen Fehler "zu wenig Gas" erhalten, daher weiß ich, dass die Gasmenge nicht das Problem ist.
Möglicherweise wurde das npm-Modul „truffle-hdwallet-provider“ nicht richtig installiert, also habe ich es deinstalliert, dann sudo installiert und dann die Fehlerbehebung im Internet gefunden (fügen Sie dem Befehl --unsafe-perm hinzu). Wie unten
$ sudo npm install truffle-hdwallet-provider --unsafe-perm
immer noch der gleiche Fehler. Ich habe hier eine andere identische Frage bemerkt, die jedoch (bis jetzt) ebenfalls unbeantwortet ist.
Ich habe '0x' +
vor dem Bytecode in hinzugefügt .deploy
, damit es funktioniert.
.deploy({ data: '0x' + bytecode, arguments: ['Hi there!'] })
Wenn dies nicht '0x'
der Fall ist, konvertiert der Bytecode die gesamte Zeichenfolge in Hexadezimal, was die doppelte Größe hat und den Gasfehler auslöst.
Ich habe auch den Truffle Wallet-Anbieter mit neu installiert
$ sudo uninstall truffle-hdwallet-provider
und dann
$ sudo install --save truffle-hdwallet-provider
wenn ich mich in meinem Projektordner befinde.
Ich habe auch Git aktualisiert, indem ich diesem Tutorial gefolgt bin
Diese Antwort ist von der Antwort HIER inspiriert
Das Hinzufügen des '0x' zum Bytecode funktionierte für mich, ich musste den Wallet-Anbieter nicht neu installieren. Aus irgendeinem Grund verbrauchte ich das ganze Gas, als ich das '0x' nicht zum Bytecode hinzufügte.
Wenn Sie https://rinkeby.etherscan.io/ überprüfen und nach dem Konto scannen, das Sie für die Bereitstellung verwendet haben, wird deutlich angezeigt, wie viel Gas verbraucht wurde. vor dem '0x' zeigt es, dass das gesamte Gas verbraucht wurde (3.000.000 Gas), aber nachdem das '0x' hinzugefügt wurde, zeigt es, dass 281.572 Gas verbraucht wurden.
const Web3 = require('web3');
const Compiler = require('./Compiler');
const HDwalletProvider = require('truffle-hdwallet-provider');
const {interface,bytecode} = Compiler.parse('Inbox');
const walletProvider = new HDwalletProvider('Mnemonic','Rinkeby_link');
const web3 = new Web3(walletProvider);
async function deploy(){
let accounts = await web3.eth.getAccounts();
console.log('Deploying from Contract : ',accounts[0]);
let details = await new web3.eth.Contract(JSON.parse(interface)).deploy({data:'0x'+bytecode,arguments:['Msg for rinkeby']}).send({from:accounts[0],gas:'3000000'});
console.log(details.options.address);
}
deploy();
Ich glaube, dass Sie eins await
und deploy(...)
eins await
brauchen send(...)
.
Etwas wie das:
let x = new web3.eth.Contract(JSON.parse(interface));
let y = await x.deploy({ data: bytecode, arguments: ['Hi there!'] });
let z = await y.send({ gas: '1000000', from: accounts[0] });
console.log('Contract deployed to', z.options.address);
Und es sieht so aus, als ob Sie await
beim Aufruf von auch ein benötigen deploy()
, da dies eine async
Funktion ist.
Ich bin mir ziemlich sicher, dass es an der neuesten Version 0.0.5 des truffle-hdwallet-Providers liegt. Wenn Sie es deinstallieren und Version 0.0.3 neu installieren, tritt dieses Problem nicht auf und Sie können am Udemy-Kurs teilnehmen.
'0x' +
innerhalb des Daten-Tags von hinzugefügt .deploy
. Wie in dieser Antwort HIER zu sehenDas Problem für mich war, dass der Bytecode zu groß war. Das Löschen aller Inline-Kommentare hat bei mir funktioniert.
Mark55
Deploy
Skript, das Sie verwenden - was ist das? Ist das eine andere Datei? Denn alle Tutorials, die ich gesehen habe, besagen, dass Sie dies alles mit dertruffle.js
Datei tun sollen. Und dann eine Migration durchführenTerminal
, um all dies bereitzustellen. Also wie geht's dir?Finn Rothacker
const result = await new web3.eth.Contract(JSON.parse(interface)) .deploy({ data: bytecode, arguments: ['Hi there!'] }) .send({ gas: '1000000', from: accounts[0] });
Es wird verwendetHDWalletProvider
, um eine Verbindung zu einem Infura-Knoten herzustellen, über den web3 bereitgestellt wird.