Cover photo

时间戳操纵

时间戳操纵

漏洞合约:

游戏合约,每个区块有一个合约玩家,若time.timestamp 为13的倍数,则拿走所有的奖金。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;

contract TimeGame {
    uint public lastBlockTime;

    constructor() payable {}

    function play() external payable {
        require(msg.value >= 1 ether);
        require(block.timestamp != lastBlockTime);
        lastBlockTime = block.timestamp;

        if(block.timestamp % 13 == 0){
            payable (msg.sender).transfer(address(this).balance);
        }
    }

    receive() external payable { }
}

攻击原理:

当合约汇集大量资金,矿工有足够的时间操作时间戳,可以根据需要进行修改,向13的倍数进行调整,block.timestamp , 同时调用play方法完成攻击目标。

防范:

1、尽量不使用时间戳,可以使用Oracle获取相关信息

2、如果使用时间戳,就使用平均时间戳