Flow Access node 概述与交易生命周期

Tags
Flow
Published
Feb 21, 2022 01:19 PM
Language
ZH
notion image
 
本文翻译自 flow-go 仓库中关于 Access node 的 ReadMe 文档。

Access Node

Access Node 提供了一个与 Flow 网络交互的接入点,它实现了 Access API
它是一个 GRPC 服务器,也通过 GRPC 连接到收集节点(collection node)和执行节点(execution node)
总体来说,它主要负责以下任务:
  1. 通过SendTransaction将从客户端接收的交易转发到收集节点。
  1. 将所有与脚本相关的调用(ExecuteScriptAtLatestBlockExecuteScriptAtBlockIDExecuteScriptAtBlockHeight)转发到某个执行节点
  1. 跟踪区块链的更新,并在本地缓存交易、集合与确认后的区块。
  1. 响应客户端诸如 GetBlockByID, GetCollectionByID, GetTransaction 等接口请求的信息。
注意:Access node 并不参与 Flow 协议的共识部分
[[TOC]]

术语

  • 交易(Transaction)代表提交到 Flow 网络的计算单位。
  • 集合(Collection)是由收集节点集群提出的一组交易组。
  • Header 还有 blockheader 是一种包含区块元数据的数据结构,包括有 payload 的 Merkle 根哈希,以及相关的共识节点的签名。
  • 区块(Block) - 块头与块内容的组合,包含构造和验证整个块所需的所有数据。

过程(Processes)

交易的生命周期(Transaction lifecycle)

  1. Access node 由过SendTransaction API call接口调用,接收交易。
  1. 访问节点将交易转发给该交易所属的收集节点群集中的一个节点,并将其存储在本地。
  1. 如果GetTransaction请求被节点接收,节点从本地存储器读取交易,如果找到则返回。
  1. 如果GetTransactionResult请求被接受,执行节点会处理交易产生的事件,交易状态变化如下:
    1. 如果在本地找到包含该交易的集合和包含该集合的块,但该交易已过期,则其状态返回为expired
    2. 如果在本地找不到集合或块,但交易尚未过期,则其状态返回为pending
    3. 如果交易既没有过期(expired)也没有挂起(pending),但执行节点不再执行该交易,则交易的状态返回为finalized
    4. 如果执行节点已执行该交易,同时如果包含该交易的块的高度大于最高确认的块,则该交易的状态返回为executed,否则返回为sealed
    5. 如果集合、区块或链状态查找失败,则状态返回为unknown

引擎(Engines)

引擎是应用程序逻辑的单元,通常更大系统中负责一部分的隔离的流程。他们通过选定的频道接收来自网络的消息,并通过相同的频道向网络提交消息。

跟踪引擎(Follower Engine)

跟踪引擎跟踪共识进度,并将任何新的最终态的区块块通知给摄取(ingestion)引擎。

摄取引擎(Ingestion Engine)

摄取引擎从跟踪引擎接收最终确定的区块,并通过请求引擎(requester)请求该区块的所有集合。当集合到达时,它会将集合和集合内的交易持久化到本地存储中。

请求引擎(Requester Engine)

请求引擎代表摄取引擎从收集节点请求集合。

RPC 引擎

RPC 引擎是响应来自客户端Access API 的 GRPC 服务器。它也支持 GRPCWebproxy 请求。

Ping 引擎

The ping engine pings all the other nodes specified in the identity list via a libp2p ping and reports via metrics if the node is reachable or not. This helps identify nodes in the system which are unreachable.
Ping 引擎与所有在 Ping 列表中指定的其他的节点联通,通过 libp2p 用 Ping 和指标报告确定节点是否可访问。这有助于识别系统中无法访问的节点。

Access node(交易执行序列图) sequence diagram

notion image