![cover](https://img-blog.csdnimg.cn/6d0119c966844835987658c9101f7da7.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZ2l0aHViXzM4NDAzODU2,size_20,color_FFFFFF,t_70,g_se,x_16)
ETH智能合约监听框架【开源库】
ETH智能合约监听框架 SDK
·
元宇宙的 “猴子.JPG”
最近什么都往元宇宙靠,什么“猴子.JPG”价值一套房,“虚拟土地.JPG”价值一套上海小别墅,大家还是要理性谨慎对待,最近很多交易所招人,面向监狱编程也是很火的一个概念,我们不推荐。
归根到底都是智能合约
智能合约我们可以从技术上先了解下,目前最六的是ETH,那么智能合约是如何运行的,我们该如何监听一些指定的智能合约,开源的方法有很多,但是都比较乱,一些开源的项目解构的也不太好,这边提供一个解构相对清晰的仓库供大家理解或使用GitHub - Rennbon/ethmonitor: eth contact monitor sdk(ETH智能合约扫链监听框架),觉得OK可要给star啊。
特性
- 支持自定义业务handle
- 支持多合约监听
概念图
- 其中①②③④为用户实现接口需要处理的点
- 对tx中的to地址是否需要监听做判断
- 针对符合条件的tx做业务处理,已将tx成交与否,gas消耗,合约参数等常规属性解析完毕,也暴露了msg和receipt供业务自行解析
- monitor启动时加载,保证服务启动续接块高
- 单个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 := ðmonitor.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())
}
![Logo](https://devpress.csdnimg.cn/79de2bf0b7994defa4242ef90d5513fa.jpg)
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)