Необработанный отказ от обещания (лимит газа) при развертывании контракта на ринке с использованием truffle-hdwallet-provider

Я пытаюсь развернуть контракт для начинающих в тестовой сети rinkeby через узел Infura. Выдает следующую ошибку.

(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.

Договор

    pragma solidity ^0.4.17;

    contract Inbox {
        string public message;

        function Inbox(

string initialMessage) public {
        message = initialMessage;
    }

    function setMessage(string newMessage) public {
        message = newMessage;
    } }

Я использовал некоторые журналы консоли, чтобы определить, где выдается ошибка, я отметил ее ниже с помощью //КОММЕНТАРИЙ.

Развернуть скрипт

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();

Вещи, которые я пытался исправить:

Увеличение лимита газа до 2 000 000, 4 000 000 и снижение примерно до 500 000 и 21 000. Я столкнулся с ошибкой «слишком малое количество газа», поэтому я знаю, что проблема не в количестве газа.

Возможно, модуль npm «truffle-hdwallet-provider» не установился должным образом, поэтому я удалил его, затем установил sudo, а затем нашел исправление ошибки в Интернете (добавьте --unsafe-perm к команде). как ниже

$ sudo npm install truffle-hdwallet-provider --unsafe-perm

все та же ошибка. Я заметил еще один идентичный вопрос . Однако здесь (на данный момент) он также остается без ответа.

этот Deployсценарий, который вы используете - что это? Это другой файл? Потому что все учебники, которые я видел, говорят, что вы должны делать все это, используя truffle.jsфайл. А затем выполните миграцию Terminal, чтобы все это развернуть. Так чем ты занимаешься?
@ Sirab33 Sirab33 код, который я разместил выше, представляет собой сценарий развертывания. на самом деле развертывание происходит в разделе const result = await new web3.eth.Contract(JSON.parse(interface)) .deploy({ data: bytecode, arguments: ['Hi there!'] }) .send({ gas: '1000000', from: accounts[0] }); Он используется HDWalletProviderдля подключения к узлу инфура, который использует web3 для развертывания.

Ответы (5)

Я добавил '0x' +перед байт-кодом, .deployчтобы заставить его работать.

.deploy({ data: '0x' + bytecode, arguments: ['Hi there!'] })

Если нет, '0x'байт-код преобразует всю строку в шестнадцатеричный формат, который будет удвоен по размеру и выдаст ошибку газа.

Я также переустановил провайдера трюфельного кошелька, используя

$ sudo uninstall truffle-hdwallet-provider

а потом

$ sudo install --save truffle-hdwallet-providerкогда внутри папки моего проекта.

Я также обновил git, следуя этому руководству .

Этот ответ вдохновлен ответом ЗДЕСЬ

Добавление «0x» к байт-коду сработало для меня, мне не нужно было переустанавливать поставщика кошелька. По какой-то причине, когда я не добавлял «0x» к байт-коду, я использовал весь газ.

Если вы проверите https://rinkeby.etherscan.io/ и просканируете учетную запись, которую вы использовали для развертывания, она четко покажет, сколько газа было использовано. до «0x» он показывает, что весь газ был израсходован (3 000 000 газа), но после добавления «0x» показывает, что было использовано 281 572 газа.

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();

Я считаю, что вам нужно один awaitна deploy(...)и один awaitна send(...).

Что-то вроде этого:

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);

И похоже, что вам также нужно awaitпри вызове deploy(), так как это asyncфункция.

Я добавил весь ваш код, без изменений. Когда я добавил ожидание в deploy(); внизу выдало ошибку "неожиданный идентификатор". Поэтому я удалил его. Я все еще потерян, к сожалению.

Я почти уверен, что это связано с последней версией 0.0.5 truffle-hdwallet-provider. Если вы удалите его и переустановите версию 0.0.3, эта проблема не появится, и вы сможете продолжить курс Udemy.

Я ошибся изначально, есть версия 0.0.3. Я попытался обновить его, и он не может установить. Я обновлю свой git и посмотрю, работает ли он тогда.
Я не могу установить 0.0.3. Вместо этого я просто добавил '0x' +внутри тег данных .deploy. Как видно из этого ответа ЗДЕСЬ

Проблема для меня заключалась в том, что байт-код был слишком большим. Удаление всех встроенных комментариев сработало для меня.