这个攻击主要出于矿工作恶。
contract FindThisHash {
bytes32 constant public hash =
0x0000 0000 0000 0000 0000 0000 dede dede dede dede dede dede dede dede dede dede;
constructor() public payable {}// 允许接受转账的构造函数
function solve(string solution) public { // 如果用户能找到给定哈希值的原始输入数据,将获得 1000 Ether
require(hash == sha3(solution));
msg.sender.transfer(1000 ether);
}
}
合约逻辑:如果用户能找到给定哈希值的原始输入数据,将获得 1000 Ether。
以太坊矿工节点都是有"交易池(transcation pool)"的,矿工会先把其他节点广播的交易先暂存到一个"池",然后根据当前的打包情况和具体交易的“经济性(主要是gas费影响)”来决定挑选哪些交易到当前区块。
如果矿工发现这个合约,他就可以有个特殊处理:当有一个交易调用 solve 函数,预先检查这个结果是否获得奖金;如果能,则不打包这个交易,而是自己构造一个交易,使用现成答案调用 solve 函数,并设定更高的gas费,以获得优先打包权,同时自己把这个交易打包。