Unbehandelte Ablehnung von Versprechungen (Gaslimit) bei der Bereitstellung von Contract auf rinkeby mit truffle-hdwallet-provider

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.

Dieses DeploySkript, das Sie verwenden - was ist das? Ist das eine andere Datei? Denn alle Tutorials, die ich gesehen habe, besagen, dass Sie dies alles mit der truffle.jsDatei tun sollen. Und dann eine Migration durchführen Terminal, um all dies bereitzustellen. Also wie geht's dir?
@ Sirab33 Der Code, den ich oben gepostet habe, ist ein Bereitstellungsskript. Die eigentliche Bereitstellung erfolgt in const result = await new web3.eth.Contract(JSON.parse(interface)) .deploy({ data: bytecode, arguments: ['Hi there!'] }) .send({ gas: '1000000', from: accounts[0] }); Es wird verwendet HDWalletProvider, um eine Verbindung zu einem Infura-Knoten herzustellen, über den web3 bereitgestellt wird.

Antworten (5)

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-providerwenn 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 awaitund deploy(...)eins awaitbrauchen 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 awaitbeim Aufruf von auch ein benötigen deploy(), da dies eine asyncFunktion ist.

Ich habe Ihren gesamten Code hinzugefügt, keine Änderung. Als ich dem deploy(); Unten hat es einen Fehler "unerwartete Kennung" ausgegeben. Also habe ich es gelöscht. Ich bin immer noch verloren, leider.

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.

Ich habe mich anfangs geirrt, es ist Version 0.0.3 verfügbar. Ich habe versucht, es zu aktualisieren, und es kann nicht installiert werden. Ich werde mein Git aktualisieren und sehen, ob es dann funktioniert.
Ich kann 0.0.3 nicht installieren. Stattdessen habe ich einfach ein '0x' +innerhalb des Daten-Tags von hinzugefügt .deploy. Wie in dieser Antwort HIER zu sehen

Das Problem für mich war, dass der Bytecode zu groß war. Das Löschen aller Inline-Kommentare hat bei mir funktioniert.