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.
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.
Chim
Bastien
Chim
Bastien
Chim