# NXTP (一)

By [Walker](https://paragraph.com/@walker-4) · 2022-07-15

---

本篇主要是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是一个开源、轻量级、高性能的[分布式](https://so.csdn.net/so/search?q=%E5%88%86%E5%B8%83%E5%BC%8F&spm=1001.2101.3001.7020)消息中间件,，实现了高可伸缩性和优雅的Publish/Subscribe模型，Messageing就是使用的NATS中间,下图可以看出 NATS具有较高的性能

![](https://storage.googleapis.com/papyrus_images/2f31d42a71e973894ac742df4480ee9d0816e7d27c1d474f29a7221f156b89ff.png)

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](https://thegraph.com/) 所提供的一种技术。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 可以对链上数据进行再封装，形成更便于查询的数据。因为有些数据，是难以在链上直接查询得到的。

![](https://storage.googleapis.com/papyrus_images/ec79ec2753e94e42f481e283a0b47ebdd92cc391a0e76ffc3691dbf5f0dcf843.png)

这里有篇网友写的介绍Subgraph文章(以上subgraph都是摘取自该文章),感兴趣的朋友可以按照文章说明操作试试 [https://learnblockchain.cn/article/2632](https://learnblockchain.cn/article/2632)

---

*Originally published on [Walker](https://paragraph.com/@walker-4/nxtp)*
