«Ошибка: базовая плата превышает лимит газа» при создании нового экземпляра контракта (с использованием Truffle, Web3Js и testrpc)

У меня есть следующий код в app.jsфайле моего проекта трюфеля.

импортировать {по умолчанию как Web3} из 'web3';
импортировать {по умолчанию как контракт} из 'трюфельного контракта'
импортировать conferrence_artifacts из '../../build/contracts/Conferrence.json'

var web3 = новый Web3(новый Web3.providers.HttpProvider("http://localhost:8545"));

// Конференция — это наша обычная абстракция, которую мы будем использовать в приведенном ниже коде.
var Конференция = контракт (conference_artifacts);
Конференция.setProvider(web3.currentProvider);

учетные записи var = web3.eth.accounts;
переменная учетная запись = учетные записи [0];
Conference.new({из: учетной записи}).then(функция(экземпляр){
   console.log(экземпляр);
});

Как указано в документации Truffle добавить новый контракт

Примечание. При вызове Conferrence.new({from: account})... {from: account} использовался, потому что я получал сообщение "ошибка неверного адреса"

Журнал ошибок консоли

Ошибка: Ошибка: базовая плата превышает лимит газа
    в runCall (C:\Users\Devendra\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\node_modules\ethereumjs-vm\lib\runTx.js:111:17)
    в C:\Users\Devendra\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\node_modules\ethereumjs-vm\node_modules\async\dist\async.js:3686:9
    при пополнении (C:\Users\Devendra\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\node_modules\ethereumjs-vm\node_modules\async\dist\async.js:881:17)
    at iterateeCallback (C:\Users\Devendra\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\node_modules\ethereumjs-vm\node_modules\async\dist\async.js:866:17)
    в C:\Users\Devendra\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\node_modules\ethereumjs-vm\node_modules\async\dist\async.js:843:16
    в C:\Users\Devendra\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\node_modules\ethereumjs-vm\node_modules\async\dist\async.js:3691:13
    при применении (C:\Users\Devendra\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\node_modules\ethereumjs-vm\node_modules\async\dist\async.js:21:25)
    в C:\Users\Devendra\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\node_modules\ethereumjs-vm\node_modules\async\dist\async.js:56:12
    в Object.async.eachSeries (C:\Users\Devendra\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\node_modules\async-eventemitter\node_modules\async\lib\async.js:130:20)
    в VM.AsyncEventEmitter.emit (C:\Users\Devendra\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\node_modules\async-eventemitter\lib\AsyncEventEmitter.js:42:9)
    в runCall (C:\Users\Devendra\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\node_modules\ethereumjs-vm\lib\runTx.js:111:17)
    в C:\Users\Devendra\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\node_modules\ethereumjs-vm\node_modules\async\dist\async.js:3686:9
    при пополнении (C:\Users\Devendra\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\node_modules\ethereumjs-vm\node_modules\async\dist\async.js:881:17)
    at iterateeCallback (C:\Users\Devendra\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\node_modules\ethereumjs-vm\node_modules\async\dist\async.js:866:17)
    в C:\Users\Devendra\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\node_modules\ethereumjs-vm\node_modules\async\dist\async.js:843:16
    в C:\Users\Devendra\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\node_modules\ethereumjs-vm\node_modules\async\dist\async.js:3691:13
    при применении (C:\Users\Devendra\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\node_modules\ethereumjs-vm\node_modules\async\dist\async.js:21:25)
    в C:\Users\Devendra\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\node_modules\ethereumjs-vm\node_modules\async\dist\async.js:56:12
    в Object.async.eachSeries (C:\Users\Devendra\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\node_modules\async-eventemitter\node_modules\async\lib\async.js:130:20)
    в VM.AsyncEventEmitter.emit (C:\Users\Devendra\AppData\Roaming\npm\node_modules\ethereumjs-testrpc\node_modules\async-eventemitter\lib\AsyncEventEmitter.js:42:9)
    в Object.InvalidResponse (http://localhost:8080/app.js:8374:16)
    на http://localhost:8080/app.js:32995:36
    в XMLHttpRequest.request.onreadystatechange (http://localhost:8080/app.js:35321:13)

Но это прекрасно работает при выполнении в консоли трюфелей -

трюфель (разработка) > Conferrence.new().then(функция(ins){console.log(ins.address)})
0x7e796caed4202ae58bb58afc214f281969f995b2

NVM об опечатке «Конференция»: p

Трюфель отстой. Я решил эту проблему и теперь могу запускать тесты мокко-ганаша без трюфелей. эфириум.stackexchange.com/questions/46957/…

Ответы (5)

Поскольку в вашем примере кода используется truffle-contract , вы можете указать значения по умолчанию для своих транзакций и развертываний контрактов, например ( Conference — это имя вашего контракта. Я использовал значения по умолчанию для truffle):

Conferrence.defaults({
  from: account,
  gas: 4712388,
  gasPrice: 100000000000
})

У меня была та же проблема ( base fee exceeds gas limit), и браузер-солидность дал мне Gas requirement of function xyz.sol:Xyz.doSomething(address) unknown or not constant.Указание значений по умолчанию помогло в конечном итоге.

При запуске вашего кода в консоли Truffle он гарантирует, что установлены определенные значения по умолчанию:

Для каждой сети, если они не указаны, параметры транзакций по умолчанию будут иметь следующие значения:

  • газ: лимит газа, используемый для развертывания. По умолчанию 4712388.
  • gasPrice: цена газа, используемая для развертывания. По умолчанию 100000000000 (100 Шеннон).
  • from: с адреса, использованного во время миграции. По умолчанию используется первая доступная учетная запись, предоставленная вашим клиентом Ethereum.

(из http://truffleframework.com/docs/advanced/configuration#networks )

Но когда вы работаете в другой среде, например в браузере, эти значения по умолчанию будут недоступны, и вам придется указывать их для каждой транзакции. В вашем случае это означает не только предоставление, fromно и gas.

Вам нужно увеличить количество газа, которое вы готовы заплатить за создание контракта. Например:

Conferrence.new({from: account, gas: SOME AMOUNT HERE});

В основном ожидаемая стоимость транзакции больше, чем сумма, которую вы предоставляете по умолчанию. Так что вам нужно увеличить газ в вашем звонке в new.

У меня та же проблема, и я полагаю, что люди путаются в том, что на самом деле означает параметр газа в файле truffle.js.

Я ответил на свой вопрос здесь. Надеюсь, поможет.

Развертывание контракта Truffle либо превышает лимит газа на блокировку, либо закончился газ

Возможно, это не совсем связано с этим вопросом, но я обнаружил ту же ошибку при выполнении truffle testконтракта на твердость, и указанная ошибка газа вводила в заблуждение. Вы можете перевести это как «Неизвестная ошибка при развертывании». В моем случае я мог получить настоящую ошибку, запустив truffle deploy --reset.