Почему функция изменения состояния работает из консоли Truffle, но не работает при вызове из web3?

У меня есть контракт, который предлагает две функции:

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.

Ваша функция солидности помечена как подлежащая оплате?
@Chim Нет, но этого не должно быть, поскольку он не получает эфира.
Если вы измените состояние, то функция должна быть отмечена как подлежащая оплате. И это не проверяется в truffle/testrpc
@ Чим, нет, это не так. Когда я пытаюсь отправить значение из трюфеля следующим образом: i.createNewPlayer('0x35000f8407c2358Fbb089C2aE4e70fE005f4F6cD', 100, { from: '0x3909591500d5037689c7794f501986de7f9e764c', value: 100}); Я получаю: Ошибка: Невозможно отправить значение в неоплачиваемую функцию. Так что Truffle проверяет это.
Просто отметьте функцию как платную и попробуйте. Или поделитесь функцией.

Ответы (1)

Нашел проблему.

Поэтому я попытался вызвать другую функцию, изменяющую состояние, из своего внешнего интерфейса, и это сработало .

На данный момент я знаю, что одна функция изменения состояния работает из внешнего интерфейса, а другая — нет. Пока оба работают от трюфеля.

По наитию я добавил значение gas: к тому, что не работало так:

    contract.methods.createNewPlayer(
      '0x0728f10c5a118883ecfb113a7b43bc627849fb45',
      100
    ).send({
      from: '0xf3b22a49ad7f5ad0ffe9693e4a22121ed3738f73',
      gas: 3000000 
    })

И это сработало. У меня было ошибочное предположение, что web3 обрабатывает необходимое количество газа в фоновом режиме, но это неверно. Кроме того, нет фактического значения газа по умолчанию, которое использует web3.