Warum funktioniert eine Zustandsänderungsfunktion von der Truffle-Konsole aus, aber nicht beim Aufruf von web3?

Ich habe einen Vertrag, der zwei Funktionen bietet:

1) Eine zustandsmodifizierende Funktion, die zwei Parameter annimmt

2) Eine konstante Funktion

Ich habe ein Web-Frontend in React, das diese Funktionen aufruft. Wenn ich die konstante Funktion vom React-Frontend aus aufrufe, funktioniert alles. Aber wenn ich die Zustandsänderungsfunktion vom Frontend mit web3 aufrufe, erhalte ich einen ungültigen Opcode-Fehler. Die Funktion funktioniert jedoch, wenn ich sie von der Truffle-Konsole aus aufrufe, sodass die Solidity-Funktion selbst korrekt ist.

So rufe ich von web3 1.0 aus an:

    contract.methods.createNewPlayer(
      '0x35000f8407c2358Fbb089C2aE4e70fE005f4F6cD',
      100
    ).send({ from: '0xc7edb363e01f7964f9fac9bf883afeee64fb2d93' })
     .then((receipt) => {
       console.log(receipt)
    })
    .catch((error) => {
      console.log(error);
    });     

Dies führt zu einem ungültigen Opcode. Und wenn ich von der Truffle-Konsole aus so anrufe:

    inst.createPlayer(
    '0x35000f8407c2358Fbb089C2aE4e70fE005f4F6cD',
    100, { from: '0xc7edb363e01f7964f9fac9bf883afeee64fb2d93'})

Funktioniert alles.

Welche Gründe könnte es dafür geben? Der Vertrag wird auf TestRPC bereitgestellt.

Ist Ihre Soliditätsfunktionsnote als zahlbar?
@Chim Nein, aber es soll nicht sein, da es keinen Äther erhält.
Wenn Sie den Status ändern, sollte die Funktion als zahlbar markiert werden. Und dies checkt nicht truffle / testrpc ein
@Chim, nein das ist es nicht. Wenn ich versuche, den Wert von Trüffel wie folgt zu senden: i.createNewPlayer('0x35000f8407c2358Fbb089C2aE4e70fE005f4F6cD', 100, { from: '0x3909591500d5037689c7794f501986de7f9e764c', value: 100 }); Ich erhalte: Fehler: Wert kann nicht an nicht zahlbare Funktion gesendet werden. Truffle sucht also danach.
Markieren Sie einfach die Funktion als kostenpflichtig und probieren Sie es aus. Oder teilen Sie die Funktion.

Antworten (1)

Habe das Problem gefunden.

Also habe ich versucht, eine andere zustandsmodifizierende Funktion von meinem Frontend aus aufzurufen, und das hat funktioniert .

An diesem Punkt weiß ich, dass eine Zustandsänderungsfunktion vom Frontend aus funktioniert und die andere nicht. Während beide aus Trüffel arbeiten.

Aus einer Ahnung heraus habe ich einen gas: value zu dem hinzugefügt, der nicht so funktionierte:

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

Und es hat funktioniert. Ich war fälschlicherweise davon ausgegangen, dass web3 im Hintergrund die erforderliche Gasmenge handhabt, aber das ist falsch. Außerdem gibt es keinen tatsächlichen Standardgaswert, den web3 verwendet.