我有一份非常直截了当的合同,让你买ERC721代币。
我的问题是,我的"buyToken“函数工作了一半时间--并且在另一半时间里失败了,出现了以下错误:
MetaMask - RPC Error: Error: [ethjs-query] while formatting outputs from RPC
'{"value" :
{"code" :-32603, "data":
{"message" : "VM Exception while processing transaction: invalid opcode",
"code" : -32000,
"data":
{"0xfd7b08996eb28759737deb2d695baaee53aaa0cea819d9f27a79181ccba021ae":
{"error" : "invalid opcode",
"program_counter" : 2687,
"return" : "0x"},
"stack" : "c: VM Exception while processing transaction: invalid opcode\n
at Function.c.fromResults (/usr/local/lib/node_modules/ganache-
cli/build/ganache-core.node.cli.js:4:194812)\n
at w.processBlock (/usr/local/lib/node_modules/ganache-cli/build/ganache-
core.node.cli.js:42:53376)\n a
t processTicksAndRejections (internal/process/task_queues.js:93:5)",
"name" : "c"
}
}
}
}' 我真正想知道的是,我们应该如何破译这些invalid opcode错误。比如"code" :-32603和"code" :-32000到底是什么意思?我应该寻找的问题有哪些可能的候选人?
要明确的是:如果我的代码每次都失败了100%,并且给了我同样的错误,我肯定会100%地知道我的代码是错误的。但是它至少在50%的时间里起作用--而且在失败中完全没有一致性。
我想这可能与代币的价格有关--从0.5 ETH到15 ETH,我都有。但我可以为1.5 ETH购买一个令牌,并使Tx成功,然后立即尝试以完全相同的1.5 ETH金额购买另一个令牌--而Tx将失败。所以这毫无意义。
对于这些invalid opcode错误我应该研究的事情有什么建议吗?
发布于 2020-12-27 19:38:37
在某些可靠版本中,未经处理的错误会导致操作码无效。例如,当您将流除以0时,流被引导到无效的操作码,因为EVM不知道该做什么。这在最新的Solidity中是固定的:https://docs.soliditylang.org/en/breaking/080-breaking-changes.html
失败的断言和其他内部检查(如除以零或算术溢出)不使用无效操作码,而是使用还原操作码。
因此,我的猜测是,代码中有一些未处理的异常。
另一个非常不可能的选项是,您使用的链不支持一些已使用的最新操作码。因此,它将使用块链(客户机节点)的旧版本。只需确保您使用的是最新的节点客户端版本(或任何与其相近的版本)。
https://ethereum.stackexchange.com/questions/91594
复制相似问题