ethmonitor

package module
v0.0.0-...-35f311a Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 6, 2022 License: MIT Imports: 11 Imported by: 0

README

eth monitor [一闪一闪亮晶晶,star一下好心情]

Go Report Card Go GitHub version release

  • ETH 多智能合约监控框架,针对智能合约监听做了统一封装,提供handle支持业务实现个性化操作。

eth 私链部署相关

  • 注意私链暴露到公网后容易被攻击,可以做一些IP限制等措施保证开发环境稳定

特性

  • 支持自定义业务handle
  • 支持多合约监听

概念图

  • 其中①②③④为用户实现接口需要处理的点
  1. 对tx中的to地址是否需要监听做判断
  2. 针对符合条件的tx做业务处理,已将tx成交与否,gas消耗,合约参数等常规属性解析完毕,也暴露了msg和receipt供业务自行解析
  3. monitor启动时加载,保证服务启动续接块高
  4. 单个block分析完毕后触发,用户可自行实现数据持久化

使用介绍

// 实现TxHandler
var _ ethmonitor.TxHandler = &Mock{}

type Mock struct {
}

// 持久化块高
func (m *Mock) SaveHeight(ctx context.Context, height *ethmonitor.BlockHeight) error {
	// 保存扫过的块高到自己喜欢的中间件
	return nil
}

// 启动monitor时始化监听块高
func (m *Mock) LoadLastHeight(ctx context.Context) (*ethmonitor.BlockHeight, error) {
	// 从自己喜欢的中间件获取块高
	return big.NewInt(1), nil
}

// 具体业务处理
func (m *Mock) Do(ctx context.Context, info *ethmonitor.TxInfo) {
	
}

// 是否包含需要监控的合约地址
// NOTE: 如果是多智能合约监听,可以使用map维护多个
// 配套的,需要把这些合约的abi合并后再初始化monitor时赋值给AbiStr,注意去重
func (m *Mock) ContainContact(ctx context.Context, address ethmonitor.ContractAddress) bool {
	return true
}

func main() {
	opt := &ethmonitor.Options{
		RpcUrl: "http://localhost:8545",
		AbiStr: `
[
    { "type" : "function", "name" : "send", "inputs" : [ { "name" : "amount", "type" : "uint256" } ] }
]`,
		Handler: &Mock{},
	}
	monitor, err := ethmonitor.New(opt)
	if err != nil {
		panic(err)
	}
	monitor.Run()
}

合约相关操作

// Action 智能合约的方法
type Action struct {
	Method string                 // 合约方法
	Inputs map[string]interface{} // 合约入参及对应的value
}

// 如何解析智能合约对应参数的value
// 对应abi方法为: { "type" : "function", "name" : "send", "inputs" : [ { "name" : "amount", "type" : "uint256" } ] }
// 我们监控所得实体如下,可以通过反射获得
var act = &Action{
	Method : "send"
	Inputs : map[string]interface{}{"amount": big.NewInt(250)}
}

amount,ok := act.Inputs["amount"].(*big.Int)

if ok {
    fmt.Println(amount.String())
}

维护及联系

  • 微信号:WB343688972 或者 扫码,请标注ETH 按引导加群

  • 欢迎 star 及加群交流

Documentation

Index

Constants

This section is empty.

Variables

View Source
var FieldTag = "monitor"

Functions

This section is empty.

Types

type Action

type Action struct {
	Method string                 // 合约方法
	Inputs map[string]interface{} // 合约入参及对应的value
}

Action 智能合约方法

type Address

type Address = common.Address

type Amount

type Amount = big.Int

type BlockHeight

type BlockHeight = big.Int // 块高

type ContractAddress

type ContractAddress = string // 合约地址

type HeightScanner

type HeightScanner interface {
	// SaveHeight 持久化最新块高
	SaveHeight(ctx context.Context, height *BlockHeight) error
	// LoadLastHeight 加载上一次块高
	LoadLastHeight(ctx context.Context) (*BlockHeight, error)
}

HeightScanner 高度扫描器

type Message

type Message = types.Message // 消息体

type Monitor

type Monitor interface {
	Run()
	Cancel()
}

func New

func New(opt *Options) (Monitor, error)

New 初始化eth 监控器

type Options

type Options struct {
	RpcUrl  string    // eth节点url
	AbiStr  string    // 组合abi,可以监控多个智能合约
	Handler TxHandler // 业务处理handler
	Logger  logrus.FieldLogger
}

type Receipt

type Receipt = types.Receipt // 消息回执,验证有效性等

type Singer

type Singer types.Signer

type TxHandler

type TxHandler interface {
	HeightScanner
	// Do 处理命中的tx
	Do(ctx context.Context, info *TxInfo)
	// ContainContact 是否包含指定合约地址
	// NOTE: 如果不满足也放行会在decode中抛出error "illegal tx"
	// 如果是多智能合约监听,可以使用map维护多个
	// 配套的,需要把这些合约的abi合并后在monitor初始化时赋值给AbiStr,注意去重
	ContainContact(ctx context.Context, address ContractAddress) bool
}

TxHandler 业务tx句柄

type TxInfo

type TxInfo struct {
	Message *Message     // 消息体
	Receipt *Receipt     // 回执
	Action  *Action      // 合约方法及参数
	TxHash  string       // 消息hash
	Height  *BlockHeight // 块高
	Fee     *Amount      // gas消耗
	Status  bool         // tx是否有效
}

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL