solidity合约开发常见错误
2019-01-11 本文已影响32人
Jisen
Error: VM Exception while processing transaction: out of gas
在以太坊区块链上,交易无法设置为永久运行。
交易可以运行直到达到其气体限制。一旦发生这种情况,交易将抛出错误,并且将返回“out of gas
”错误。
产生这种错误一般是因为循环语句出错,产生无限循环造成的,比如下面的函数:
function set(uint x) public {
while(true) {
myVariable = x;
}
}
所以产生这种错误,首先就需要好好检查循环语句、条件语句。
Error: VM Exception while processing transaction: invalid opcode
智能合约可以使用诸如assert()
确保满足某些条件的陈述。这些可能会以不可调和的方式与合约的状态发生冲突。合约运行失败,就会出现invalid opcode
的错误。
如下代码:
function set(uint x) public {
assert(x == 0);
myVariable = x;
}
如果我们将该值设置为其他值就会出现错误,并返回“invalid opcode
”。
Error: VM Exception while processing transaction: revert
一般是出现在修饰符条件不满足的情况下,比如修饰符onlyOwner,只有所有者才能调用它。修饰符包含一个require (msg.sender == owner)
语句。例如从不是所有者的用户调用onlyOwner修饰的函数,则require语句将编译为0xfd
,这就是revert操作码。这就是得到revert exception
的原因。
同理其他require
语句,如果不满足条件的话,就会出现revert exception
。
CompilerError: Stack too deep, try removing local variables.
它取决于函数内部表达式的复杂程度,但超过16个局部变量将不起作用,所以需要注意控制变量的数量。
解决办法是:
- 去掉不必要的变量;
- 把大的功能进行拆分。
void CompilerUtils::copyToStackTop(unsigned _stackDepth, unsigned _itemSize)
{
solAssert(_stackDepth <= 16, "Stack too deep, try removing local variables.");
for (unsigned i = 0; i < _itemSize; ++i)
m_context << dupInstruction(_stackDepth);
}
SyntaxError: Unexpected token in JSON at position 0
json数据格式出现问题,说明编译.sol文件生成.json文件解析出现了问题。
而且这种问题可能是truffle不同版本进行编译产生的error。
Solidity error: Unexpected token h in JSON at position
需要使用双引号中传递参数字符串。