本文翻译自 flow-go 仓库中关于 Access node 的 ReadMe 文档。
Access Node
Access Node 提供了一个与 Flow 网络交互的接入点,它实现了 Access API
它是一个 GRPC 服务器,也通过 GRPC 连接到收集节点(collection node)和执行节点(execution node)
总体来说,它主要负责以下任务:
- 通过
SendTransaction
将从客户端接收的交易转发到收集节点。
- 将所有与脚本相关的调用(
ExecuteScriptAtLatestBlock
、ExecuteScriptAtBlockID
和ExecuteScriptAtBlockHeight
)转发到某个执行节点
- 跟踪区块链的更新,并在本地缓存交易、集合与确认后的区块。
- 响应客户端诸如
GetBlockByID
,GetCollectionByID
,GetTransaction
等接口请求的信息。
注意:Access node 并不参与 Flow 协议的共识部分
[[TOC]]
术语
- 交易(Transaction)代表提交到 Flow 网络的计算单位。
- 集合(Collection)是由收集节点集群提出的一组交易组。
- Header 还有 blockheader 是一种包含区块元数据的数据结构,包括有 payload 的 Merkle 根哈希,以及相关的共识节点的签名。
- 区块(Block) - 块头与块内容的组合,包含构造和验证整个块所需的所有数据。
过程(Processes)
交易的生命周期(Transaction lifecycle)
- Access node 由过SendTransaction API call接口调用,接收交易。
- 访问节点将交易转发给该交易所属的收集节点群集中的一个节点,并将其存储在本地。
- 如果GetTransaction请求被节点接收,节点从本地存储器读取交易,如果找到则返回。
- 如果GetTransactionResult请求被接受,执行节点会处理交易产生的事件,交易状态变化如下:
- 如果在本地找到包含该交易的集合和包含该集合的块,但该交易已过期,则其状态返回为
expired
。 - 如果在本地找不到集合或块,但交易尚未过期,则其状态返回为
pending
- 如果交易既没有过期(expired)也没有挂起(pending),但执行节点不再执行该交易,则交易的状态返回为
finalized
。 - 如果执行节点已执行该交易,同时如果包含该交易的块的高度大于最高确认的块,则该交易的状态返回为
executed
,否则返回为sealed
。 - 如果集合、区块或链状态查找失败,则状态返回为
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 和指标报告确定节点是否可访问。这有助于识别系统中无法访问的节点。