官方文档地址
FLashbots Auction
Flashbots Auction对比原本的竞价机制
Flash Auction提供一个私有的交易池以及一个密封的竞价区块空间,使得各方能够将找寻最优区块构造方式的工作外包出去
传统的基于gas price以及贪婪算法的机制存在以下问题:
- 开放的交易池导致了恶性的竞价,给P2P网络带来不必要的负担并且导致了gas price的波动,并且损害了非复杂交易的参与者
- all-pay导致了链上竞价失败的回退,因此非必要地消耗了区块空间且执行交易的风险性导致竞价者低估了他们的竞价。最终也导致了区块空间的缺乏以及更低的矿工利润
- 对于gas price的依赖使得竞价者难以细致地表达订单偏好,因为大家都投标竞争区块顶部地位置。这也导致了另类地策略,如群发赢得竞价地可能性提高,进一步加重了损失
Flashbots Auction使用了一次竞价密封竞拍地方式,允许用户私下出价,且无需为失败地竞拍付费。这样地机制最大化了矿工的受益,同时为给定MEV机会提供了一个有效的价格发现场所。最重要的是,该方法剔除了Front-running的风险
Flashbots Auction的目标
Flashbots Auction最终希望实现如下的效果:
- Pre-trade privacy:交易只有在被包含入区块后才公开
- Failed trade privacy:失败的交易不会入块,意味着不会被公开
- Efficiency:MEV的提取不会导致不必要的网络或链上堵塞
- Bundle merging:允许合并多个传入的包且不导致冲突
- Finality protection:一旦Flashbots的包传递到网络后将是不可更改的,这意味着杜绝了Time-bandit Attack
- Complete privacy:中介人如矿工以及转发者不能观察到交易直至该交易在链上被公开
- Permissionless:无需任何被信任的中间机构来监管交易
Searcher
Searcher包括三类:机器人、用户以及Dapps
通过将包直接发送给relayers可以避免通过P2P网络进行传播,保证了交易的隐私性。同时,交易的费用既可以用gas price也可以直接发送eth至某个交易所地址,这样的直接交易保证用户只会为成功的交易付费
Relayer
relayer负责校验和路由Flashbots的包。由于用户不再为失败的交易付费,使得他们能够向网络发送无效的包以导致DoS。因此realyer充当了缓冲以应对DoS,且relayer也提供如包合并的功能。
Flashbots Auction的两个重大挑战是如何应对DoS以及保证Relayer的隐私性。
Relayer引入了一定的风险,因其能够接触完整的包,这也意味着他们可以重排序、监控以及窃取Searcher发送的交易。
Miner
Flashbots中的Miner使用特质的mev-geth节点,基于一次竞价密封竞拍的方式挑选出最高利润的交易,并将其包含于区块的前列
Flashbots Auction中的一些概念
Bundle
Searcher将包提交给矿工,一个包内可以包含多个交易并按提供的顺序分组执行,包中可能还包含来自mempool中其他用户的待处理交易,且一个包可以被包含于某个目标区块中
const blockNumber = await provider.getBlockNumber()
const minTimestamp = (await provider.getBlock(blockNumber)).timestamp
const maxTimestamp = minTimestamp + 120
const signedBundle = flashbotsProvider.signBundle(
[
{
signedTransaction: SIGNED_ORACLE_UPDATE_FROM_PENDING_POOL // serialized signed transaction hex
},
{
signer: wallet, // ethers signer
transaction: transaction // ethers populated transaction object
}
])
const bundleReceipt = await flashbotsProvider.sendRawBundle(
signedBundle, // bundle we signed above
targetBlockNumber, // block number at which this bundle is valid
{
minTimestamp, // optional minimum timestamp at which this bundle is valid (inclusive)
maxTimestamp, // optional maximum timestamp at which this bundle is valid (inclusive)
revertingTxHashes: [tx1, tx2] // optional list of transaction hashes allowed to revert. Without specifying here, any revert invalidates the entire bundle.
}
)
)
coinbase.transfer()
Flashbots中允许通过智能合约向矿工支付交易费用,矿工对待通过转账得到的费用与对待正常交易费用一样。这为用户提供了如下好处:
- 可以根据满足的条件向矿工付款
- 只为成功的交易付款,而不为失败的交易付款
- 可以用其他账户的ETH为本账户的交易付款
如下为简单的套利机器人源码
function uniswapWeth(uint256 _wethAmountToFirstMarket, uint256 _ethAmountToCoinbase, address[] memory _targets, bytes[] memory _payloads) external onlyExecutor payable {
require (_targets.length == _payloads.length);
uint256 _wethBalanceBefore = WETH.balanceOf(address(this));
WETH.transfer(_targets[0], _wethAmountToFirstMarket);
for (uint256 i = 0; i < _targets.length; i++) {
(bool _success, bytes memory _response) = _targets[i].call(_payloads[i]);
require(_success); _response;
}
uint256 _wethBalanceAfter = WETH.balanceOf(address(this));
require(_wethBalanceAfter > _wethBalanceBefore + _ethAmountToCoinbase);
if (_ethAmountToCoinbase == 0) return;
uint256 _ethBalance = address(this).balance;
if (_ethBalance < _ethAmountToCoinbase) {
WETH.withdraw(_ethAmountToCoinbase - _ethBalance);
}
block.coinbase.transfer(_ethAmountToCoinbase);
}
当矿工将智能合约地址作为收款地址时,费用会比发送给外部地址(EOA)时稍多,这可能导致这个包执行失败,用户可以通过如下方式进行支付
block.coinbase.call{value: _ethAmountToCoinbase}(new bytes(0));
但这样一来会将执行权基于第三方,导致重入的风险
Bundle顺序衡量权重计算
以下公式计算了包中所有有效的gas price以及支付给coinbase的费用,并减去了mempool中观察到的交易gas price。之所以减去这些mempool的交易是为了防止mempool中的gasprice过高,阻塞了flashbots中的部分bundle
同时,bundle低于42000 gas的将被relayer拒绝,因其很可能是垃圾交易用于阻塞区块链
Searcher Reputation
信誉机制是一种防御措施,使得relayer能够防御Layer 7 attacks。通过提交那些大概率会被上链的交易可以提升一个searcher的信誉
|