本文转载于原网站https://learnblockchain.cn/article/3263
一、以太坊内存池是什么我们知道以太坊是目前最大的公链。 它是一个中心化的数据库,与传统数据库的主要区别在于没有主动写入以太网数据的过程。 数据链是指用户发起交易并携带相关信息。 这些信息可以调用智能合约的一些函数和相关参数。 然后,该交易被广播到所有网络节点,其他节点接收后保存在自己的内存池中(mempool,实际上翻译成交易池更合适)。 如果节点打开了开采功能,则将其称为矿工节点。 矿工节点根据内存池中所有事务的gasPrice按从大到小的顺序打包成块。 当然一笔交易只能打包给一个矿工。 这是由协议决定的。 如果发现事务已连接到链,请将其从内存池中删除。 二、科学家和在飞行机器人上做过DeFi的伙伴可能遇到过这种情况。 当陶醉的魔镜准备买一件商品时,有人在你面前先成交了。 其实这些都是机器人发起的交易。 我们把这样的机器人称为飞行机器人,开发这些机器人的人称为“科学家”。 抢机的基本原理是截获内存池中的交易,分析交易内容,启动更高的gasPrice交易,从而强制中断。 矿工说根据gasPrice的大小决定了先打包哪些交易。
三、如何拦截内存池? 监听池必须有自己部署或使用第三方节点的完整节点。 例如,这里使用infura.io,先去上面申请key,获取接口地址。 以太网官方代码已经实现了go的客户端,直接使用就可以了。 代码如下所示
包主
输入(
“上下文”
" github.com/ether eum/go-ether eum/common "
" github.com/ether eum/go-ether eum/eth client "
" github.com/ether eum/go-ether eum/eth client/geth client "
" github.com/ether eum/go-ether eum/RPC "
“日志”
“操作系统”
“os/signal”
“系统”
)
const (
URL=“3359 main net.in fura.io/v3/b4c 05366 e 4c 14 E8 a 8304 f 0690 AEA E0 e 8”
WSS=“WSS ://main net.in fura.io/ws/v3/b4c 05366 e 4c 14 E8 a 8304 f 0690 AEA E0 e 8”
)
func watch () }
backend,err:=ethclient.dial(URL ) ) ) ) ) ) ) ) ) ) )。
if err!=nil {
log.printf (“failedtodial : % v”,err ) )。
返回
}
rpcCli,err:=RPC.dial(WSS ) if err!=nil { log.printf (failedtodial : % v (,err ) return } gcli :=geth client.new ) RPCcli ) txch3360=make ) cake err=gcli.subscribependingtransactions (context.background ),txch ) if err!=nil { log.printf } failedtosubscribependingtransactions 3360 % v ',err ) return } for { select } casetxhash 3360=-tash 330=nil {continue}data,_ :=tx.marshal JSON (log.printf ),string ) data
func main () }
go watch () )
signal chan :=make (chanos.signal,1 ) ) ) ) ) ) ) ) ) ) ) ) )。
signal.notify(signalChan,syscall.SIGINT,syscall.SIGTERM )。
-signalChan
}
包主
输入(
“上下文”
" github.com/ether eum/go-ether eum/common "
" github.com/ether eum/go-ether eum/eth client "
" github.com/ether eum/go-ether eum/eth client/geth client "
" github.com/ether eum/go-ether eum/RPC "
“日志”
“操作系统”