NXTP (一)
July 15th, 2022

本篇主要是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.
More from Walker

Skeleton

Skeleton

Skeleton