{"content":{"title":"venus-messager 代码解析 笔记","body":"messager管理了message，node，address，share-params,actor-config等主要的功能。\r\n\r\n1. models包是对数据库的抽象实现，所以对数据库的操作都是通过这个包。其中内部的repo package 包含了以上5个（message，node，address，share-params,actor-config）数据库表的对外接口。mysql和sqlite包具体实现了对5个数据库表的业务逻辑。\r\n2. api/messager_impl.go是对外的rpc接口实现，其逻辑调用service包下面的实现，service包再调用repo数据库相关的操作。\r\n4. api/messager_impl.go包的方法会通过auth的client来调用auth服务，进行权限验证。\r\n5. service/message_service.go等service会通过venus节点的client来调用链服务的mpool信息，然后再调用repo（数据库）的方法，读取数据库的内容，然后和节点mpool中得到的消息信息进行对比，再给出结果。\r\n6. IMessager接口有两个：1. 对venus-messager repo数据库的接口。2. 对venus-mpool的接口\r\n7. type NodeConfig struct {\r\n\tUrl   string `toml:\"url\"`\r\n\tToken string `toml:\"token\"` // 这个好像没有什么用处？\r\n}\r\n8. cli包实现了cmd接口，接口的实现其实是通过调用venus-messager rpc来实现其逻辑的。\r\n9. filestore/fsRepo的命名非常具有迷惑性，其实就是一个存储配置文件和数据文件的地方。\r\n10. messager连接gateway主要做的事情就是通过gateway找到wallet进行签名。但是为什么不直接调用venusa-wallet的接口进行签名呐？是因为希望wallet完全在内网，进行安全性考虑吗？\r\n11. unfill/filled状态分表表示messager接收到消息但是还没有预估签名/ messager已经预估并把消息发送到网络当中。\r\n12. 调用messager的send接口，或者pushmessage接口都只是把消息存储在数据库中，而不会主动触发p2p向别的messager节点进行消息的广播，也不会主动触发publisher调用node的rpc接口把消息放到链上的mpool。而是通过对node节点事件（newhead的新区块事件）的监听，来触发对本地消息的处理。具体逻辑是：messager服务启动时，就开始监听node节点服务，当收到节点消息的事件时，根据获取的消息，去更新本地数据库中消息的state状态，然后select选择从数据库中获取两类的msg。1. fill消息，是已经推送给node节点的消息，但是还没有上链，根据监听到的newhead，获取最新nonce，然后从数据库中按照大于nonce的条件，搜索出fill的消息。2. unfill消息，即没有给node节点推送过的消息。\r\n13. messager内部的p2ppublisher是利用p2p协议（pubsub协议）给别人的node节点进行消息的广播，而对于自己的node节点直接使用rpc接口进行消息的上链。\r\n14."},"author":{"user":"https://learnblockchain.cn/people/808","address":null},"history":"QmNXeEpuL26CeGpxFgB1cwBRCTjgCmA6V4VWcuP3pVDMuY","timestamp":1681952144,"version":1}