|
1. Access节点和观察者节点
对区块链有一定了解的同学应该知道,区块链的优点之一便是数据的公开透明以及可追溯性,但真要访问区块链上任意我们感兴趣的数据往往并不是一件容易事儿。对于区块链最基础的数据访问需求,一般我们可以通过相应的区块链浏览器来进行查;对于比特币、以太坊等网络,也可以通过同步一个区块链全节点,并结合相应的客户端暴露出来的API来帮助你访问链上数据。但对于flow链来说,一方面同步一个区块链共识节点是要进行抵押的,这样一来成本可就高了;另一方面,暂时来说flow的区块链浏览器(如flowscan.org)功能相对有限,更是无法满足诸如Dapp开发或数据分析等更高层次的数据访问需求。因此flow提供了access接口来解决这一问题。
Flow官方提供了基于GRPC和HTTP的两套access接口来应对数据访问需求。而这两种接口实际都基于Access节点来提供服务。Access节点是Flow网络和用户的中间人。一方面用户可以通过它来发起交易(它会将你发起的交易转交给正确的Collection节点);另一方面用户可以通过Access节点来访问链上的数据(或者说历史状态)。
根据官方文档中的定义,观察者节点(Observer Node)和Access节点没有本质不同。据我个人的理解,搭建一个Access节点需要向官方进行申请,将你的服务地址添加到白名单中,它才能正式生效;而观察者节点,顾名思义,并不与链上数据产生实际的交互,因此不需要进行认证,也因此无法进行发送交易等操作。
2. 编译flow-dps
flow-dps是目前flow官方推荐的搭建观察者节点的工具,其代码仓地址为:
- https://github.com/optakt/flow-dps/
我们也基于这一项目来搭建观察者节点,我使用的平台是CentOS 8。请确保你的主机内存至少为16GB,磁盘剩余空间大于100GB。首先创建一个总的目录,我们所有的工作都在该目录下进行:
mkdir flow_ob && cd flow_ob flow-dps需要go的版本至少为v1.16,我们先来确认一下go的版本:
[root@XXX flow-dps]# go version
go version go1.13.5 linux/amd64好吧,看来得先升级一下Go:
mkdir go && cd go && wget https://go.dev/dl/go1.18.2.linux-amd64.tar.gz 卸载之前版本的Go并安装新的版本:
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.18.2.linux-amd64.tar.gz
cd ..如果你的电脑上之前没有安装,那还需要配置一下环境变量,把下面这行黏贴到~/.bashrc或者/.profile的最后:
export PATH=$PATH:/usr/local/go/bin 记得用go version命令确认一下Go是否已经成功升级并满足需求了。
克隆flow-dps并编译官方ow-go项目中的crypto组件:
git clone https://github.com/optakt/flow-dps/ && cd flow-dps
git clone git@github.com:onflow/flow-go.git
cd flow-go/crypto
git checkout c0afa789365eb7a22713ed76b8de1e3efaf3a70a
go generate
cd ../..在我实际测试中,直接编译master分支得到的执行程序往往不能正常运行,建议先切换到打了版本tag的某个具体commit上,我们先查看一下有哪些tags:
[root@XXX flow-dps]# git tag -l
v0.0.1
v0.0.2
v0.0.3
v1.0.0
v1.1.0
v1.2.0
v1.3.0
v1.3.1
v1.3.2
v1.3.3
v1.3.4
v1.4.0
v1.4.1
v1.4.2
v1.4.3
v1.4.4
v1.4.5
v1.4.6
v1.4.7
v1.4.8选择切换到最新的tag上:
git checkout v1.4.8 最后在flow-dps项目的根目录下执行以下命令来进行编译:
mkdir ../bin
go build -tags=relic -o ../bin ./...
cd ..现在你的bin目录下应该至少有 flow-dps-client flow-dps-indexer flow-dps-live flow-dps-server等几个可执行程序了。
值得一提的是,官方仓库里提供了预编译的二进制文件,帮你跳过编译过程,你可以在下面这个地址找到发布的最新版本的预编译文件:
- http://github.com/optakt/flow-dps/releases
3. 搭建观察者节点
OK,我们现在可以开始搭建一个观察者节点了,考虑到我的主机上没有太多的存储空间,我们简单来搭建一个mainnet3的节点。Hold on,可能有的同学还不知道什么是mainnet3,我们在下一段简单解释一下这一点,有所了解的同学可以跳过下面这个段落。
首先,Flow有测试网络(testnet)和主网络(mainnet)两个相互独立的网络(甚至其他很多支持智能合约的链也是如此),testnet存在的一个很重要的意义在于你设计了一个智能合约之后可以先布置到测试网络上来测试一下是否能按你的想法正常工作、是否有bug,确认没有问题后再布置到正式的主网络上;另一方面,Flow网络存在一个Spork的概念,Flow将网络分成一个个Spork,每个Spork结束的时候,Flow会对客户端程序进行更新,这使得Flow能对自身进行快速迭代改进。mainnet3则代表主网洛中的第三个Spork(大约包含了30w不到个区块,是数据量比较小的一个Spork,适合用来测试搭建观察节点)。
要运行一个全节点,我们当然要有这个Spork的区块链数据。与其他链通过P2P同步区块数据的方式不同,Flow直接将数据打包放在了谷歌云上提供给大家下载。你可以通过下面这个链接找到下载这些数据的链接,官方会对其持续更新:
https://github.com/onflow/flow/blob/master/sporks.json 我们先下载相应的区块存档数据:
mkdir archive && cd archive
mkdir mainnet_3 && cd mainnet_3
wget https://storage.googleapis.com/flow-genesis-bootstrap/mainnet-3-execution/public-root-information/root.checkpoint
wget https://storage.googleapis.com/flow-execution-archive/mainnet3/protocol-db.tar.gz
wget https://storage.googleapis.com/flow-execution-archive/mainnet3/execution-state.tar.gz并解压缩:
mkdir protocol execution index
tar xzvf protocol-db.tar.gz -C protocol
tar xzvf execution-state.tar.gz -C execution
cd ../..接下来我们需要调用之前编译出来的flow-dps-index来索引所有数据:
./bin/flow-dps-indexer -l info -d ./archive/mainnet_3/protocol -t ./archive/mainnet_3/execution -c ./archive/mainnet_3/root.checkpoint -i ./archive/mainnet_3/index 等待一段时间,如果能看到如下输出,那便是程序在正确运行了:

待索引过程完成之后,我们启动flow-dps-server来向外提供状态查询服务:
[root@XXX1Z flow_ob]# ./bin/flow-dps-server -l info -i ./archive/mainnet_3/index/ -a 127.0.0.1:5005
{"level":"info","time":"2022-05-30T04:35:17Z","message":"Flow DPS Server starting"}至少有三种途径向dps-server请求数据,一种是借助./bin/flow-dps-client,它可以在该spork下的任意区块高度执行Cadence的脚本(Script)程序, Script是一种不会改变链上状态的Cadence代码;一种是通过Rosetta API;最后一种是通过我们前面提供的Access API,我们在这里使用最后一种方法。
首先克隆flow-dps-access仓库:
git clone https://github.com/optakt/flow-dps-access
cd flow-dps-accessflow-dps-access的编译同样依赖flow-go/crypto,我们直接从flow-dps中拷过来:
cp -r ../flow-dps/flow-go/ . 最后进行编译:
go build -tags=relic -o ../bin ./...
cd ..OK,现在你应该可以在./bin目录下找到执行文件dps-access-api,我们可以启动我们的Access服务了:
[root@XXX flow_ob]# ./bin/dps-access-api -l info -a 127.0.0.1:5006 -d 127.0.0.1:5005
{"level":"info","time":"2022-05-30T05:13:31Z","message":"Flow Access API Server starting"}总算到这一步啦!到目前为止,我们已经成功搭建了我们自己的观察者节点,现在让我们尝试查询高度9800000到9800009的区块的区块id。我在这里使用python3.9和flow_py_sdk来调用access api:
pip3 install flow_py_sdk
import asyncio
import flow_py_sdk
from flow_py_sdk import flow_client
async def test():
async with flow_client(
host="127.0.0.1", port=5006
) as client:
for i in range(9800000, 9800010):
block = await client.get_block_by_height(height=i)
print(f"block height: {i}, id: {block.id.hex()}")
asyncio.run(test())运行python代码,你应当看见如下输出:
[root@XXX flow_ob]# python3 test.py
block height: 9800000, id: 7463f4467c5ad4ed0571aa4d7f56e100f94cf51bb438b3bc581e719b425bc942
block height: 9800001, id: 2626cac144e7e6bc9298cc85235fc72d32e301bc1f71a03cba95077821af8249
block height: 9800002, id: a4d10c5b53c886d930f82fc2391a272b29553257aafd9beea0dc56fc55d5ff22
block height: 9800003, id: 53dec971b721ea9dd750f1d011b9d5bccde9fea2bd424ed2ac12e1e81fb7bb61
block height: 9800004, id: 81cee2ef5a7fea62a70a1eb84e62578c02527678b8348d2f51de39fdfda8d130
block height: 9800005, id: 4bd4c60869fe979f942eb25082bf6af855ac7a5d1d52161f1ecf75596d8a2ca0
block height: 9800006, id: bfd0ffbda8d1463b87b311f129e7006a00a32240fbbf56e71f8e721f41c86c27
block height: 9800007, id: cc05ec596f95f8981ff309ef383d20fc17eadb6222e76581a6c02989059b68ba
block height: 9800008, id: 6cef00f351c4102a83b4f6276e8470abbbdb34c9f0ea1150b11c1158def92ffa
block height: 9800009, id: e26ddef6600d832f5f21deeb52f3134c416d6ce7014512573580979450104cfa同时运行着的dps-server与dps-access也会打印出相应的日志。到这里我们搭建观察者节点的教程就全部结束了,更多细节大家可以查看官方仓库的README。 |
|