美文网首页
solidity合约开发常见错误

solidity合约开发常见错误

作者: Jisen | 来源:发表于2019-01-11 11:42 被阅读32次

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个局部变量将不起作用,所以需要注意控制变量的数量。

解决办法是:

  1. 去掉不必要的变量;
  2. 把大的功能进行拆分。

CompilerUtils.cpp

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

需要使用双引号中传递参数字符串。

相关文章

网友评论

      本文标题:solidity合约开发常见错误

      本文链接:https://www.haomeiwen.com/subject/mxtxdqtx.html