var在Go语言中比较常用,可以自动推导数据类型,然而,在以太坊的Solidity智能合约中确是坑很深,毕竟Solidity年龄较短,bug较多。
solidity语言中默认var创建的数值类型是uint8即范围在0-255之间。
for (var i = 0; i < 300; i++)
{
}
使用如上所述for循环时,create合约会显示一直pending,且逐渐卡死,因为i的值永远不可能达到300,在到255时,即二进制1111111,再循环又变成0,在0-255之间进行循环。这是一个很致命的坑,没有报错,一切OK,就是死循环无解。
下面进行一个测试:
pragma solidity ^0.4.24;
contract Test{
function f() view returns (uint, uint)
{
uint count = 0;
for (var i = 0; i < 300; i++)
{
count++;
if(count >= 1000)
{
break;
}
}
return (count, i);
}
}
结果:
显然,我们发现,for循环的上限为300,而count竟然累加至1000,说明i的值一直没有达到300。
网友评论