原文链接:https://github.com/onflow/flow/blob/master/specs/access-node-architecture/index.md
翻译:Maris ,Flow中文社区技术大使。转载请备注来源。
概要
Flow 接入节点(Access node)自上线后没有发生大的变化,其作为 Flow 通用网关的目标已经达成。即便如此,有明显迹象表明 Flow 的这一部分的设计扔需要持续的改进,以更好地支持可扩展性,并提高服务和代码的模块化设计水平。此外,这也是flow愿景的一部分,即设置无权限和无抵押的节点类型,让构建者可以更加便捷、低门槛的访问Flow。
在本文档中,我们建议重新构建访问节点以启用无权限操作。我们利用 DPS(流数据供应服务)进行状态索引和本地脚本执行,大大减少了执行节点的负载。提议的更改还可以显着改进 Flow 操作的水平可扩展性。
这种新架构将现有的访问节点模块拆分为以下组件:
-
Flow 区块链数据服务(Flow Blockchain Data Service),封装了与 Flow 网络的所有直接交互和参与状态同步协议,并提供 API 允许辅助组件查询区块链状态并订阅更新。
-
Flow数据供给服务(Flow Data Provisioning Service ,DPS) ,使用来自 Flow Flow 区块链数据服务的执行状态更新来构建完整的执行状态索引,从而能够在任意块高度上快速执行本地脚本。
-
Flow API 服务,提供一种用户友好的方式来查询区块链状态,并将交易发送到网络。
Flow API 服务和 DPS 设计为可选的辅助组件,在部署基础架构时,为它们的配置使用提供多样和灵活的选择。
总体目标
-
将现有的 Access Node 代码完全分离为 un-stake Observer Service和 staked Access Node。
-
将Access API从Access Node中分拆成独立模块,设计为独立的进程/服务,它将能处理任何Blockchain Data Service. 我们将其称为Flow API Service。
-
封装了通过共识追随者和执行状态同步提供的Blockchain Data Service实时同步系统。通过Protocol API和State Streamer接口,可以对对这些状态进行访问。
-
该State Streamer接口是一个通用组件,它可以允许任何消费者,例如DPS访问由Blockchain Data Service.
不考虑的目标点
-
不涉及长期历史访问(请参阅其他问题)
-
不解决公共节点的运营问题(速率限制、访问控制等)
目标要点
-
Blockchain Data Service处理从对等网络接收的原始协议和执行状态数据。 这些状态数据,通过Protocol API以及流式接口,发送给调用者。
-
使用State Streamer Registration API和State Streamer客户端访问Blockchain Data Service状态。
-
DPS索引执行状态,实时的通过State Streamer进行传递。这些索引状态通过DPS API来响应脚本调用请求.
构架设计
详细设计
到目前为止,接入节点已经提供了以下内容:
-
作为 Flow 网络中的质押节点
-
基于协议状态参与质押gossip网络
-
处理来自公共调用者的实时访问 API 请求
-
执行基本请求验证
-
将脚本执行委托给上游执行节点
-
将交易委托给收集节点以进行网络处理
-
脚本委派EN执行是一个明显相对简单的成果,它限制了访问节点的可扩展性并影响了事务吞吐能力。此外,Access API 请求处理的扩展受到 Access Node 内代码紧密耦合的限制。DPS 的引入向可查询的本地持有状态迈出了第一步,该状态可用于扩展 Access Node。随后,执行状态同步提供了一种去中心化的方式来在网络上共享执行状态。
■ 权责修改
区块链链的同步管理,主要依赖于Blockchain Data Service提供的一套统一的功能,这些功能是Access Node基于Observer Service构建的,并且可以用作可信链状态的独立模块。
区块链数据服务
-
遵循协议共识,执行状态同步
-
服务于State Streamer API
-
服务于Protocol API
新Access Node版本基于上述原始节点功能设计:
接入节点
-
作为 Flow 网络中的质押节点参与
-
随时跟踪协议状态和执行数据
-
接受新交易,验证它们,并将它们转发到收集节点
-
连接公共质押 libp2p 网络
-
通过公开状态同步和执行数据同步协议的公共 libp2p 网络,提供对 Flow 区块链协议和执行状态的访问
-
将来自质押网络的消息子集,中继到公共网络
-
Observer Service的命名也体现了其网络非参与的角色。
观察节点服务
-
作为公共数据的消费者参与 Flow 网络,无需质押或许可
-
随时跟踪协议状态和执行数据
-
接受新交易,并进行验证,并将交易转发给Access Nodes
FLOW API 服务
-
部署为独立服务
-
提供外部 Flow Access API(gRPC/REST)
-
如果DPS已部署,则查询DPS API执行状态查询,否则返回错误
-
查询运行协议状态Protocol API的节点上的下游Blockchain Data Service
-
代理发送交易请求
-
Access Nodes代理事务到下游Protocol API
-
Observer Services代理事务到下游Access Node
-
DPS提出了两个有限的更改:将共识追随者提取到Blockchain Data Service. 然后弃用基于 GCP 的执行状态同步,并将所有链同步逻辑切换到State Streamer.
数据供应服务 (DPS)
-
部署为一组独立的服务
-
通过State Streamer API连接到Access Node或Observer Service
-
基于State Streamer API订阅协议和执行状态更新
状态流和流注册 API
-
提供用于订阅协议和执行状态更新的 API
-
提供 1:1 的数据服务(可能是 gRPC over web sockets)
-
许可范围(不打算向公众公开)
-
提供抽象层,因此客户端无需直接与 Flow 网络交互
-
API 通过Execution Data Module和的数据Protocol State Module进行数据对接
重构详细构架图
初始点
重构步骤 1
非结构性考虑:
-
形式化 State Client 和 State API 规范
-
根据配置声明,在引导程序中建立正确的 libp2p 网络Access Node初始化Observer Service
区块链核心服务构建
构建Flow API服务
附属问题
-
历史数据访问问题:
-
虽然此新架构不支持在此初始修订版架构中直接访问历史状态,但我们正在与社区合作伙伴协作来实现这一目标。
-