NXTP (一)

本篇主要是NXTP模块学习记录(小白记录的学习方式),比较零散、随意(txservice,sdk,subgraph)

说明:nxtp包含有不同模块,大部分采用ts语言编写,因为本人对ts语言并不太了解,只是大概看了看代码大致结构,主要功能(不太能完全读懂所有细节,可能有误,敬请谅解)

TxService 主要是发送交易到链,和链交互相关代码

dispatch.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 文件有很多直接查询区块链或者合约数据的函数

sdk 在用户端创建拍卖、监听事件和创建事务

sdk主要工作内容

连接到消息传递服务器

运行检查跨链转账交易,若检测到,则返回对应摘要的数据

拍卖 获得路由器提供的最佳报价

跨链转移

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

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

Subscribe to Walker
Receive the latest updates directly to your inbox.
Verification
This entry has been permanently stored onchain and signed by its creator.