本文由 Flow 大使 Jing 翻译。原文链接:https://flow.com/post/flow-blockchain-node-operation-archive-node
我们很高兴地宣布 Flow 社区发布公测版本的存档节点。存档节点提供了一种高效且可扩展的方式来访问当前 spork 下的 Flow 协议执行状态的历史记录。它可用于查询帐户信息,并使用 gRPC Access API 在从当前 Spork 开始到最新 sealed 区块的任何块上执行查询脚本。
什么是存档节点?
Flow 的多节点架构通过将共识节点与执行节点拆分以提供将来的可扩展性。这些执行节点旨在将执行状态数据(Flow 账户的状态、智能合约、资源等)保存在内存中,以便能够更快地访问。然而,鉴于区块状态将无限增长,执行节点被设计为只在内存中保留最近的状态,它可以追溯到过去大约 100 个区块。因此,如果有应用程序想要查询超过 100 个区块的旧数据或者在旧状态下执行脚本,存档节点就是为此而提出的解决方案。
存档节点跟随记录链的存储,并可同时索引协议和执行状态。它允许只读查询,还可查询在过去区块上的数据状态,例如“在第前 1000 个块上,此 Flow 账户的余额是多少“。
存档节点如何工作?
与观察者节点一样,存档节点也是一个非质押节点,并与上游 access node 通信。观察者节点仅接收协议状态(块、集合、交易等),而存档节点不仅接收协议状态还有执行状态数据。
谁应该使用存档节点?
需要访问历史数据的 dApp,例如 CAST,它会考虑过去区块上的用户账户余额
需要访问历史数据的链分析和审计工具
三种数据查询节点的区别:存档节点、访问节点与观察者节点
在讨论存档节点、访问节点和观察节点的区别之前,我们先来看一下 Flow 中的两种状态数据。由于 Flow 具有不同类型的节点而不是单个验证器节点,因此并非所有节点类型都具有所有数据。流状态数据分为协议状态数据和执行状态数据。
协议状态是 Flow 网络协议运行的状态,包括 Flow 网络中节点产生的身份表和资源:区块、Collection、receipts、approvals、seals 等。
执行状态是 Flow 账户、智能合约、资源等的状态。该状态仅完整存储在 Execution 节点上。
访问节点是一个质押节点,它接收和索引所有协议状态数据并为 Access API 提供服务。它可以通过查询其本地数据库来回复所有与协议状态相关的 Access API 调用,如 GetBlock、GetAccount、GetCollection 等。但是,对于与执行状态相关的所有调用,例如 GetAccount 、 ExecuteScriptAtXXX,它需要调用上游执行节点以获取执行状态数据。
今年早些时候,观察者节点作为访问节点的非质押替代品推出,任何人都可以运行而无需加入质押列表。与访问节点一样,观察者节点也服务于访问 API。它只接收和索引最新的块数据,并将所有访问 API 调用委托给上游访问节点。
我们可以很容易地查询访问节点或观察者节点以获取最新区块的账户余额,或者在最新区块执行脚本,但是您不能在过去任意区块上执行查询脚本,否则你会得到如下错误,因为执行节点不会保留过去超过 100 个块的执行状态数据,
rpc error: code = Internal desc = failed to get account: failed to get account at block (xxx): state commitment not found (yyy). this error usually happens if the reference block for this script is not set to a recent block.
这便是存档节点的用武之地。
与访问节点和观察者节点不同,存档节点除了存储协议状态数据外,还存储和索引执行状态。然后它可以通过其本地数据库执行状态来回复访问 API 调用,例如 GetAccount。
如果您想访问最新的区块、交易等,但不想运行节点,请使用 Flow 社区访问节点。
如果您想要单租户或者不想受到访问 API 速率限制,请考虑运行您自己的访问节点。
如果你想要一个提供最新区块数据的本地运行节点,运行一个观察者节点。
如果要访问历史执行状态数据,请使用存档节点。
应用程序接口
存档节点提供了一个简洁版的 gRPC Access API,包括以下三个调用,
ExecuteScriptAtBlockID
ExecuteScriptAtBlockHeight
GetAccountAtBlockHeight
对于其他访问请求,它会返回 HTTP 错误 501。
gRPC API 端点是:archive.mainnet.nodes.onflow.org:9000
举例
1. 获取当前 spork 开始时的账户余额,可以在存档节点上调用 GetAccountAtBlockHeight。
示例代码:
package main
import (
"context"
"fmt"
"github.com/onflow/flow-go-sdk/access/grpc"
"github.com/onflow/flow-go-sdk"
)
func main() {
// Flow 存档 API 端点
archiveNodeAddress := "archive.mainnet.nodes.onflow.org:9000"
// 为存档节点创建一个 gRPC 客户端
archiveNodeClient, err := grpc.NewClient(archiveNodeAddress)
if err != nil {
fmt.Println ("err:", err.Error())
panic(err)
}
ctx := context.Background()
addr := flow.HexToAddress("e467b9dd11fa00df") // 任意 Flow 账户地址
// 在 spork 开始时的块高度上获取账户余额
// <https://developers.flow.com/nodes/node-operation/past-sporks#mainnet-20>
account, err := archiveNodeClient.GetAccountAtBlockHeight(ctx, addr, 40171634)
if err != nil {
fmt. Println("err:", err.Error())
panic(err)
}
fmt.Println(account.Balance)
}
2. 在过去的某个区块上执行脚本,可以在存档节点上调用 ExecuteScriptAtBlockHeight 或 ExecuteScriptAtBlockID 。
示例代码:
package main
import (
"context"
"fmt"
"github.com/onflow/cadence"
"github.com/onflow/flow-go-sdk/access/grpc"
)
func main() {
// Flow 主网接入节点 API 端点
accessNodeAddress := "access.mainnet.nodes.onflow.org:9000"
// Flow 存档 API 端点
archiveNodeAddress := "archive.mainnet.nodes.onflow.org:9000"
// 创建一个 gRPC 客户端访问节点
accessNodeClient, err := grpc.NewClient(accessNodeAddress)
if err != nil {
fmt.Println("err:", err.Error())
panic(err)
}
ctx := context.Background()
// 从 Flow 主网接入节点获取最新封存块的高度
latestBlockHeader, err := accessNodeClient.GetLatestBlockHeader(ctx, true)
if err != nil {
fmt.Println("err:", err.Error() )
panic(err)
}
// 将高度设置为过去的 500 个区块
height := latestBlockHeader.Height - 500
// 为存档节点创建一个 gRPC 客户端
archiveNodeClient, err := grpc.NewClient(archiveNodeAddress)
if err != nil {
fmt.Println("err:", err.Error())
panic(err)
}
script := []byte(`
pub fun main(a: Int): Int {
return a + 10
}
`)
args := []cadence.Value{cadence.NewInt(5)}
// 在存档节点上执行脚本,区块高度为过去 500 个区块,
value, err := archiveNodeClient.ExecuteScriptAtBlockHeight(ctx, height, script, args)
if err != nil {
fmt.Println("err:" , err.Error())
panic(err)
}
fmt.Printf("\\nValue: %s", value)
}
限制
gRPC API 速率限制
目前不支持访问 REST API 和 gRPC-web 端点。
存档节点当前无法自托管。
存档节点只能返回到当前 spork 的开始。
节点状态
存档节点的状态可以在“Flow 主网存档节点组件”下的 Flow 状态页面进行监控
接下来是什么🚀
这是一个公测版,以为明年初的 release 发布做准备。
存档节点将始终可用。明年初,将有一个自托管版本的存档节点,任何人都可以将其作为无许可节点操作路线图路径的一部分运行。此次 Beta 发布是实现该目标的垫脚石。
反馈❤️
我们非常重视您的反馈。请在此处报告您在使用存档节点时发现的任何问题:https://github.com/onflow/flow-archive/issues
关注 Flow
什么是 Flow 福洛链?
Flow 福洛链是一个快速,去中心化,且对开发者友好的区块链,旨在为新一代游戏、娱乐应用程序提供动力的数字资产的基础。Flow 是唯一一个由始至终为消费者提供出色体验的 Layer-1 区块链团队。其团队创造的 dApp 包括:CryptoKitties、Dapper Wallets、NBA Top shot。
CrytoKitties 于 2017 年推出时便快速成为加密市场最受欢迎的 dApp,因其成功而导致以太坊堵塞。在 Flow 上运营的 NBA Top shot 也已成为增长最快的 dApp,在公开发布后的 6 个月创造了 7 亿美金销量。正因为 Flow 公链的可扩展性和消费者友好的体验,让这一切成为可能。目前有 1000 多个项目正在 Flow 链上筹备中,我们期待看到一个伟大的生态系统蓬勃发展。
关于 Dapper Labs
Dapper Labs 是一家位于加拿大的全球顶尖区块链服务商,在 2017 年年底通过 CryptoKitties 收藏游戏成功进入⽤户视野,并且因为加密猫的爆⽕导致以太坊拥堵,从而推出 Flow 公链以及全新的开发语言—— Cadence,旨在吸引更多的开发者在 Flow 上开发应⽤。
Flow 的合作伙伴们:
我们欢迎越来越多的小伙伴加入 Flow 星球,为星球增添色彩!
Flow 官网:https://zh.onflow.org/
Flow 论坛: https://forum.onflow.org/
Flow Discord:
https://discord.com/invite/flow
Flow CN Telegram: https://t.me/flow_zh
Flow B 站:https://space.bilibili.com/1002168058
Flow 微博:
https://weibo.com/7610419699
Flow CSDN:
https://blog.csdn.net/weixin_57551966?spm=1010.2135.3001.5343
扫码添加 Flow 官方账号微信号,加入 Flow 生态群
微信号 : FlowChainOfficial
【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。