抢跑机器人实现

Posted by Thomas_Xu on 2022-12-23

author:Thomas_Xu

抢跑机器人实现

在阅读本文前,请确保你了解区块链抢跑交易的原理和链上监听相关知识。

Front-Running - Thomas_Xu (thomasxu-blockchain.github.io)

合约事件的监听 - Thomas_Xu (thomasxu-blockchain.github.io)

源码:

ThomasXu-blockchain/FrontrunningBot (github.com)

申明:此代码不做任何商业用途,不作为攻击手段,只作为个人练手使用。

实现原理:

main()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
async function main() {
// 获得交易以前的代币余额
let tokenBalanceBefore = await getTokenBalance(TUSD_TOKEN_ADDRESS);
// 监控待处理交易
const web3Ws = new Web3(new Web3.providers.WebsocketProvider(`wss://${NETWORK}.g.alchemy.com/v2/${PROJECT_ID}`));
subscription = web3Ws.eth.subscribe('pendingTransactions', function (error, result) {
}).on("data", async function (transactionHash) {
let transaction = await web3.eth.getTransaction(transactionHash);
// 过滤和进行抢跑
await handleTransaction(transaction);

if (succeed) {
console.log('\n' + "Front-running attack succeed.");
// 出售 token
let tokenBalanceAfter = await getTokenBalance(TUSD_TOKEN_ADDRESS);
let srcAmount = (tokenBalanceAfter - tokenBalanceBefore) / (10 ** TUSD_DECIMALS);
console.log("Get " + srcAmount + " Tokens." + '\n');
console.log("Begin selling the tokens.");
await performTrade(TUSD_TOKEN_ADDRESS, ETH_TOKEN_ADDRESS, srcAmount);
console.log("End.")
process.exit();
}
})
}

其实这里最主要的就是web3Ws.eth.subscribe这个订阅事件的方法,这可以帮助我们获取到链上所有正在等待打包的交易信息,在得到交易哈希后使用getTransaction即可获得交易元数据。

之后进入handleTransaction函数进行交易过滤和抢跑,抢跑完成后出售token即可。

handleTransaction()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
async function handleTransaction(transaction) {
// 选出对应的交易
if (transaction.to == UNISWAP_ROUTER_ADDRESS && await isPending(transaction.hash)) {
console.log("Found pending uniswap network transaction", transaction);
} else {
return
}
// 计算gas
let gasPrice = parseInt(transaction['gasPrice']);
let newGasPrice = gasPrice + ONE_GWEI;
if (newGasPrice > MAX_GAS_PRICE) {
newGasPrice = MAX_GAS_PRICE;
}

// 判断符合触发抢跑交易的条件后,再进行抢跑
if (triggersFrontRun(transaction)) {
//取消注册
subscription.unsubscribe();
console.log('Perform front running attack...');
//执行抢跑交易
await performTrade(ETH_TOKEN_ADDRESS, TUSD_TOKEN_ADDRESS, ETH_QTY, newGasPrice);
// 等待抢跑交易成功,并更改状态
console.log("wait until the honest transaction is done...");
while (await isPending(transaction.hash)) { }
succeed = true;
}
}

在这里主要是筛选出router的交易,然后得到该交易的gas,并提高gas以备抢跑。

triggersFrontRun里会检查是否是swapExactETHForTokens函数交易,之后就进入抢跑交易。

如何进行交易参考uniswap的sdk文档Trading | Uniswap

总结

在交易市场中,套利机器人是随时存在的,这对于维币对稳定有好处。

在实现中,最大的难点其实是和uniswap的sdk交互的地方,比较繁琐。因为只是一个简单实现,不考虑其他任何因素。


notice

true

This is copyright.

...

...

00:00
00:00