У меня есть контракт, который предлагает две функции:
1) Функция изменения состояния, которая принимает два параметра
2) Постоянная функция
У меня есть веб-интерфейс в React, вызывающий эти функции. Когда я вызываю константную функцию из интерфейса React, все работает. Но когда я вызываю функцию изменения состояния из внешнего интерфейса с помощью web3, я получаю недопустимую ошибку кода операции. Однако функция работает, когда я вызываю ее из консоли Truffle, поэтому сама функция Solidity верна.
Вот как я звоню из web3 1.0:
contract.methods.createNewPlayer(
'0x35000f8407c2358Fbb089C2aE4e70fE005f4F6cD',
100
).send({ from: '0xc7edb363e01f7964f9fac9bf883afeee64fb2d93' })
.then((receipt) => {
console.log(receipt)
})
.catch((error) => {
console.log(error);
});
Это приводит к недопустимому коду операции. И когда я звоню из консоли Truffle вот так:
inst.createPlayer(
'0x35000f8407c2358Fbb089C2aE4e70fE005f4F6cD',
100, { from: '0xc7edb363e01f7964f9fac9bf883afeee64fb2d93'})
Все работает.
Какие причины могут быть для этого? Контракт развернут на TestRPC.
Нашел проблему.
Поэтому я попытался вызвать другую функцию, изменяющую состояние, из своего внешнего интерфейса, и это сработало .
На данный момент я знаю, что одна функция изменения состояния работает из внешнего интерфейса, а другая — нет. Пока оба работают от трюфеля.
По наитию я добавил значение gas: к тому, что не работало так:
contract.methods.createNewPlayer(
'0x0728f10c5a118883ecfb113a7b43bc627849fb45',
100
).send({
from: '0xf3b22a49ad7f5ad0ffe9693e4a22121ed3738f73',
gas: 3000000
})
И это сработало. У меня было ошибочное предположение, что web3 обрабатывает необходимое количество газа в фоновом режиме, но это неверно. Кроме того, нет фактического значения газа по умолчанию, которое использует web3.
Чим
Бастьен
Чим
Бастьен
Чим