13

如何监听以太坊内存池(附源码)

 2 years ago
source link: https://learnblockchain.cn/article/3263
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

如何监听以太坊内存池(附源码)

我们知道以太坊是目前最大的公链,它是一个去中心化的数据库,与传统数据库有一个很大的区别是,以太坊的数据并没有一个主动写入的过程。

以太坊内存池是什么?

我们知道以太坊是目前最大的公链,它是一个去中心化的数据库,与传统数据库有一个很大的区别是,以太坊的数据并没有一个主动写入的过程。所谓数据上链,其实是用户发起一笔交易,并携带相关信息。这些相关信息可以是调用智能合约某些函数和相关参数。然后这笔交易会广播到全网节点,其他节点收到之后会将他保存到自己的内存池中(mempool,其实翻译成交易池更合适)。如果节点开启了挖矿功能,我们把它叫做矿工节点。矿工节点会根据内存池中所有交易的gasPrice从大到小排序,打包进区块。当然每一笔交易只能被一个矿工打包,这个通过共识决定。一旦发现某一笔交易已经上链,就将其从内存池中删除。

科学家和抢跑机器人

玩过DeFi的小伙伴可能遇到过这样的情况,当你要买入一个商品的时候,有人在你之前抢先成交了。其实这些都是机器人发起的交易。我们把这类机器人叫抢跑机器人,开发这些机器人的人叫 “科学家”。抢跑机器的基本原理就是通过监听内存池中的交易,分析交易内容,然后发起一笔gasPrice更高的交易,强行插队。上面我们说过矿工是根据gasPrice的大小来决定哪笔交易先打包的。

如何监听内存池?

监听内存池需要一个全节点,可以自己部署,也可以使用第三方的节点。比如我们这里用 infura.io, 先去上面申请一个key,拿到接口地址。以太坊官方代码已经实现了go的客户端,直接使用即可。代码如下

package main

import (
	"context"
	"github.com/ethereum/go-ethereum/common"
	"github.com/ethereum/go-ethereum/ethclient"
	"github.com/ethereum/go-ethereum/ethclient/gethclient"
	"github.com/ethereum/go-ethereum/rpc"
	"log"
	"os"
	"os/signal"
	"syscall"
)

const (
	url = "https://mainnet.infura.io/v3/b4c05366e4c14e8a8304f0690aeae0e8"
	wss = "wss://mainnet.infura.io/ws/v3/b4c05366e4c14e8a8304f0690aeae0e8"
)

func watch() {
	backend, err := ethclient.Dial(url)
	if err != nil {
		log.Printf("failed to dial: %v", err)
		return
	}

	rpcCli, err := rpc.Dial(wss)
	if err != nil {
		log.Printf("failed to dial: %v", err)
		return
	}
	gcli := gethclient.New(rpcCli)

	txch := make(chan common.Hash, 100)
	_, err = gcli.SubscribePendingTransactions(context.Background(), txch)
	if err != nil {
		log.Printf("failed to SubscribePendingTransactions: %v", err)
		return
	}
	for {
		select {
		case txhash := <-txch:
			tx, _, err := backend.TransactionByHash(context.Background(), txhash)
			if err != nil {
				continue
			}
			data, _ := tx.MarshalJSON()
			log.Printf("tx: %v", string(data))
		}
	}
}

func main() {
	go watch()
	signalChan := make(chan os.Signal, 1)
	signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM)
	<-signalChan
}

本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

  • 发表于 3天前
  • 阅读 ( 176 )
  • 学分 ( 19 )
  • 分类:以太坊

Recommend

  • 25

    作者:咕咚移动技术团队-乔瑟琳 一.监听安卓手机通知栏推送信息 最近在需求中需要实现监听安卓手机通知栏信息的功能,比如实时获取qq、微信、短信消息。一开始评估是件挺简单的事儿,实现 NotificationListenerService,直接上代码。实现步骤

  • 42

    React 中 本地调试React代码的方法 yarn build 场景 假设有这样一个场景,父组件传递子组件一个A参数,子组件需要监听A参数的变化转换为state。 16之前 在React以前...

  • 45

    2019年06月04日 阅读 4582

  • 17

    Web 服务需要配置监听的 IP 和端口才可以对外提供真正的服务。本文介绍如何设置 ASP.NET Core 程序监听的 IP 和端口。 ASP.NET Core 程序默认集成了 Kestrel 服务器,可以直接对外提供 Web 服务。虽然可以直接提供服务,但通常建...

  • 10
    • 微信 mp.weixin.qq.com 4 years ago
    • Cache

    Glide 源码解析之监听生命周期

    code小生 一个专注大前端领域的技术平台 公众号回复 Android 加入安卓技术群 作者:断了谁的弦 链接:https://...

  • 1

    自从入手了 iPad mini 之后,我剁手入了很多游戏。有些游戏太贵,希望等降价或者限免才入。于是我开始找一些提供降价限免资讯的网站。 找到比较靠谱的是 少数派 和 Appshopper...

  • 9

    .NET 单个异步任务如何同时监听多个取消请求(CancellationToken) 2021-06-11 01:13 异步编程中,并不是所有时候 await 等的都是新的异步任务...

  • 20

    web3.js 或者web3.py 如何监听大单买入? web3.js 或者web3.py 如何监听大单买入?

  • 4

            asp.net core发布至今已经将近6年了,很多人对于这一块还是有些陌生,或者说没接触过;接触过的,对于asp.net core整个启动过程,监听过程,以及请求过程,响应过程也是一知半解,可能有的同学在面试中有被问过整个的启动过程;对此,有个想法就是针对...

  • 2
    • xie.infoq.cn 2 years ago
    • Cache

    源码级别的广播与监听实现

    源码级别的广播与监听实现近期疫情形势严峻,情形不容乐观,周末也不敢出去浪了,躲在家里“葛优...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK