文章前言
以太坊节点汇集交易并将其形成块,一旦矿工解决了共识机制那么这些交易就被认为是有效的,解决该区块的矿工也会选择来自该矿池的哪些交易将包含在该区块中,至于优先选取那些交易打包通常是由gasPrice交易决定的,在这里有一个潜在的攻击媒介就是攻击者可以观察事务池中是否存在可能包含问题解决方案的事务,如果存在那么可以通过修改或撤销攻击者的权限或更改合约中的对攻击者不利的状态,从这个事务中获取数据并创建一个更高级别的事务gasPrice并在原始之前将其交易包含在一个区块中,从而获利
条件竞争
下面给出一个示例合约:
contract FindThisHash {
bytes32 constant public hash = 0xb5b5b97fafd9855eec9b41f74dfb6c38f5951141f9a3ecd7f44d5479b630ee0a;
constructor() public payable {} // load with ether
function solve(string solution) public {
// If you can find the pre image of the hash, receive 1000 ether
require(hash == sha3(solution));
msg.sender.transfer(1000 ether);
}
}
这个合约包含1000个ether,找到并提交正确答案的用户将得到这笔奖励,当一个用户找出答案并调用solve函数把答案作为参数发起函数调用,然而不幸的是攻击者可以观察交易池中任何人提交的答案,他们看到这个解决方案后检查它的有效性,然后提交一个远高于原始交易的gasPrice的新交易,解决该问题的矿工可能