Я написал контракт A, который создает новый контракт B и возвращает адрес нового контракта B, который был создан. Когда я тестировал это в браузере Solidity, он работал хорошо, но когда я пытался запустить метод создания с помощью web3, я продолжал получать эту ошибку:
throw errors.InvalidResponse(result);
^
Error: VM Exception while processing transaction: out of gas
Вот мой код контракта:
pragma solidity ^0.4.2;
contract B {
int public id;
function B(int _id) {
id = _id;
}
}
contract A {
address Baddress;
function createB(int _id) returns (address) {
Baddress = new B(_id);
return Baddress;
}
}
Вот мой код Javascript, который пытается запустить метод createB A:
web3.eth.defaultAccount = web3.eth.coinbase;
var Acontract = web3.eth.contract([{"constant":false,"inputs":[],"name":"getdum","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"num","type":"int256"}],"name":"create","outputs":[],"payable":false,"type":"function"}]);
var A = Acontract.new({from: web3.eth.accounts[0],
data: '{{compiled byte code}}',
gas: '47000000'}, function (e, contract){
console.log(e, contract);
if (typeof contract.address !== 'undefined') {
console.log('Contract mined! address: ' + contract.address);
contract.createB(5000).then(console.log); // This line throws the error
}
})
Я прочитал много других связанных сообщений и смог найти только ответы, которые предлагают использовать больше газа, но независимо от того, сколько газа я отправил с транзакцией, это выдавало ту же ошибку. Вы можете видеть, что я использую очень большое значение для газа в коде. Может ли кто-нибудь помочь мне определить, что я делаю неправильно? Я использую версию solc: 0.4.9+commit.364da425.Darwin.appleclang, EthereumJS TestRPC v3.0.3 и node v6.4.0.
После повторения этого я обнаружил проблему.
Вам нужно будет снова указать газ при отправке .createB()
транзакции. То есть, если вы используете .createB(5000)
, он использует только лимит газа по умолчанию 90000 и терпит неудачу. Установка лимита газа на более высокий уровень .createB(5000, {gas: 200000})
прошла успешно для меня. browser-solidity дает более точное значение 113598
для стоимости транзакции.
web3.eth.contract(abi).at(baddress).getB()
, где он выдал эту ошибку . Хотя предыдущая ошибка была устранена, здесь у меня были проблемы раньше с трюфелем, а теперь с web3.
Мэтью Шмидт
.create(5000)
..createB(5000)
тальский
A.deployed().then(function(instance){return instance.createB(50)}).then(console.log)
, он вернул нулевой адрес контракта. Как мне получить адрес контракта только что созданного B..?Мэтью Шмидт
.createB().then()
не будет работать. Тем не менее, вы все равно можете использовать библиотеку, такую как bluebird, для обещания web3.тальский
createB()
без обещания?Мэтью Шмидт
тальский