Я пытаюсь развернуть контракт для начинающих в тестовой сети 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
все та же ошибка. Я заметил еще один идентичный вопрос . Однако здесь (на данный момент) он также остается без ответа.
Я добавил '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
функция.
Я почти уверен, что это связано с последней версией 0.0.5 truffle-hdwallet-provider. Если вы удалите его и переустановите версию 0.0.3, эта проблема не появится, и вы сможете продолжить курс Udemy.
'0x' +
внутри тег данных .deploy
. Как видно из этого ответа ЗДЕСЬПроблема для меня заключалась в том, что байт-код был слишком большим. Удаление всех встроенных комментариев сработало для меня.
Марк55
Deploy
сценарий, который вы используете - что это? Это другой файл? Потому что все учебники, которые я видел, говорят, что вы должны делать все это, используяtruffle.js
файл. А затем выполните миграциюTerminal
, чтобы все это развернуть. Так чем ты занимаешься?Финн Ротакер
const result = await new web3.eth.Contract(JSON.parse(interface)) .deploy({ data: bytecode, arguments: ['Hi there!'] }) .send({ gas: '1000000', from: accounts[0] });
Он используетсяHDWalletProvider
для подключения к узлу инфура, который использует web3 для развертывания.