出块时间戳操作

块时间戳历来被用于各种应用,例如随机数的熵(有关更多详细信息,请参见Entropy Illusion),锁定资金的时间段以及各种与时间相关的状态变化条件语句。矿工能够稍微调整时间戳,如果在智能合约中错误地使用块时间戳,这可能会很危险。

漏洞

Block.timestamp及其别名现在可以由矿工操纵,如果他们有动机这样做的话。让我们构建一个简单的游戏,如roulette.sol所示,它很容易被矿工利用。

roulette.sol 说明
合约轮盘{
uint public pastBlockTime; //强制每个区块下注一次
constructor()public payable {} //最初的基金合约//

用于下注的后退功能
function()公共支付{

require(msg.value == 10 ether); //必须发送10以太玩
需要(现= pastBlockTime); //每个块只有1个事务
pastBlockTime = now;
if(now%15 == 0){// winner msg.sender.transfer(this.balance);
}
}
}

这份合约就像一个简单的彩票。每个区块一次交易可以下注10以太有机会赢得合约余额。这里的假设是`block.timestamp的最后两位数是均匀分布的。如果是这样的话,将有15%的机会赢得这个彩票。

但是,正如我们所知,矿工可以根据需要调整时间戳。在这种特殊情况下,如果合约中有足够的以太矿池,则激励解决块的矿工选择时间戳,使得block.timestamp或现在模15为0.这样做可以赢得锁定在此合约中的以太与块奖励。由于每个区块只允许一个人下注,这也容易受到前线攻击。

预防技术

块时间戳不应该用于熵或生成随机数 – 即,它们不应该是决定因素(直接或通过某种推导)来赢得游戏或改变重要状态。

有时需要时间敏感的逻辑;例如,用于解锁合约(时间锁定),在几周后完成ICO,或执行到期日期。有时建议使用块。估计时间的数量和平均块时间; 10秒的阻滞时间,1周相当于大约60480块。因此,指定用于改变收缩状态的块编号可以更安全,因为矿工不能容易地操纵块编号。 BAT ICO合约采用了这一策略。

如果合约不是特别关注块时间戳的微小操作,那么这可能是不必要的,但是在开发合约时要注意这一点。

现实世界的例子:GovernMental

上面提到的旧庞氏骗局政府也很容易受到基于时间戳的攻击。合约支付给最后一名加入(至少一分钟)球员的球员。因此,作为玩家的矿工可以调整时间戳(到将来的时间,使其看起来像一分钟已经过去),使其看起来是最后一个加入超过一分钟的玩家(即使这不是真实的)

资讯来源:由0x资讯编译自NVESTLABS。版权归作者Mahendar B所有,未经许可,不得转载
提示:投资有风险,入市需谨慎,本资讯不作为投资理财建议。请理性投资,切实提高风险防范意识;如有发现的违法犯罪线索,可积极向有关部门举报反映。
你可能还喜欢