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."); 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 } 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交互的地方,比较繁琐。因为只是一个简单实现,不考虑其他任何因素。
true
This is copyright.