本篇主要是NXTP模块学习记录(小白记录的学习方式),比较零散、随意(txservice,sdk,subgraph)
说明:nxtp包含有不同模块,大部分采用ts语言编写,因为本人对ts语言并不太了解,只是大概看了看代码大致结构,主要功能(不太能完全读懂所有细节,可能有误,敬请谅解)
inflightBuffer变量 主要存储已发送到链上交易,默认最多一次64个,可配置
minedBuffer变量 获得至少一个确认的交易,然后检查是否有足够的确认,如果超过设置时间就不继续检查确认情况了
send函数(内部调用了submit) 发送交易到链上后,记录交易生命周期,将交易加入inflightBuffer缓冲区
submit函数 直接发送交易到链上,不加入inflightBuffer,因为可能有发送可能有遗漏或者错误,算重发交易
mine函数 等候链上交易(至少)一个确认
后台启动循环,获取确认交易放入minedBuffer
mineLoop函数 不断获取至少一个确认的交易,放入minedBuffer
confirmLoop函数 取 minedBuffer的最后一个交易,在规定的时间内,不断的循环获取交易是否有足够的确认(规定时间和确认数在配置里)
public startLoops() {
if (!this.loopsRunning) {
this.loopsRunning = true;
// Use interval promise to make sure loop iterations don't overlap.
interval(async () => await this.mineLoop(), 2_000);
interval(async () => await this.confirmLoop(), 2_000);
// Starts an interval loop that synchronizes the provider every configured interval.
interval(async () => await this.syncProviders(), this.config.syncProvidersInterval);
}
}
transactionservice.ts中 sendTx 直接调用上面的send函数发送交易
rpcProviderAggregator.ts 文件有很多直接查询区块链或者合约数据的函数
连接到消息传递服务器
运行检查跨链转账交易,若检测到,则返回对应摘要的数据
拍卖 获得路由器提供的最佳报价
跨链转移
Bob初始化拍卖订单,拍卖获取最合适路由报价,发送prepare交易到chainA(包含路由器签名)
Bob发送prepare交易到chainA,包含路由器签名
路由器通过subgraph检测Bob的prepare事件
路由器在链chainB上发送prepare交易,锁定资金
Bob通过路由器接收并验证准备事件,广播签名
路由器完成在chainB上的交易(把资金发送给目的地址,如果其他调用也直接执行)
路由器完成在chainA上的交易(获取发送链上锁定的资金,这样不会造成过多的资金锁定,不至于造成资金短缺问题,其实可以加快资金周转速度)
SDK很多具体操作都是通过调用NxtpSdk完成的, NxtpSdk主要功能是方便与按照配置链上的TransactionManager合约交互
NATS是一个开源、轻量级、高性能的分布式消息中间件,,实现了高可伸缩性和优雅的Publish/Subscribe模型,Messageing就是使用的NATS中间,下图可以看出 NATS具有较高的性能
connectMessaging函数:连接messageing 订阅消息,可以看到订阅了
subscribeToAuctionResponse和subscribeToStatusResponse 两类消息,同时代码里也
可以看到publishStatusRequest,publishAuctionRequest,publishMetaTxRequest()在这三处发布订阅消息
getActiveTransactions函数: (从Subgraph)获取那些发送到链上待处理(未完成)的交易,可能是接收链未完成或者发送链还未取消的交易(获取后这些交易后怎么处理代码暂未看懂)
skd.ts 文件中两个比较重要函数prepareTransfer和fulfillTransfer会分别发送prepaer和fulfill交易到TransactionManager合约
getTransferQuote函数 主要执行跨链交易拍卖后(通过publishAuctionRequest发布订阅),选择最合适的路由(中间有一些校验路由器的签名、路由器的资金是否足够等,同时也计算出了totalFee, metaTxRelayerFee, routerFee费用)
NXTP 中使用了Subgrap去查询connext相关的链上交易数据(Connext部署了自己的索引)
Subgraph 是由开发者创建并部署到 The Graph 的开放索引服务。Subgraph 是由 The Graph 所提供的一种技术。The Graph 是一种去中心化的索引协议,用于查询类似以太坊和 IPFS 的区块链网络数据,目前支持了 Ethereum 主网和几个测试网,以及 BSC、Matic、Fantom 等多种区块链。任何人都可以基于其创建和部署开放 API,即 subgraph,使得区块链数据更容易访问。
基于 The Graph 和 subgraph,数据流大致如下:
一个 DApp 通过合约执行一个 transaction,合约 emit 了一个或多个 event;
The Graph 的节点持续扫描区块数据,而你定义的 subgraph 设置了所需要监听的事件;
Graph 节点监听到你的 subgraph 所关心的事件,会根据你的 subgraph 所定义的处理方法创建或更新实体对象的数据,这些数据会保存在 Graph 节点中;
前端框架连接到 Graph 节点,通过编写 GraphQL 查询相应的实体对象数据并展示到页面上。
简单地说,通过 subgraph 可以对链上数据进行再封装,形成更便于查询的数据。因为有些数据,是难以在链上直接查询得到的。
这里有篇网友写的介绍Subgraph文章(以上subgraph都是摘取自该文章),感兴趣的朋友可以按照文章说明操作试试 https://learnblockchain.cn/article/2632