深入浅出GRT的节点安装和配置(The Graph)

in HIVE CN 中文社区3 years ago (edited)

如果说起GRT,估计大多数币圈或链圈人都不知道,但是说起Chainlink,那估计混圈的没几个不知道的。Chainlink是把外部世界的数据引入区块链中,而GRT(全称:The Graph)做的则是相反的工作,是把区块链上的数据以Graph SQL API的形式,提供给外部的应用程序DAPP,因而,它也被业界称为区块链中的谷歌。

image.png

对于这个,开始我也没过分在意,后来通过黑客松认识一个哥们,他做这个Graph的节点,提供数据服务,我顿时起了兴趣,我也曾在现实世界想做market data,但是后来因为知识产权问题而终止,现在有机会在区块链世界里见识下market data。

先大致说说这个玩意是怎么回事吧。这个The Graph项目,有一整套工具,可以把链上某个产品,比如UniSwap,从它被deploy起那个区块,直到最近的区块信息全部爬下来,存到数据库里,然后对数据再加工,提供GraphQL API的形式提供给外部使用者,使用者用它发的代币GRT来付费。首先,会有人把链上产品以subgraph形式发布到网上,然后The Graph的生态中有Curator的用户会去点赞这个subgraph,号召Indexer去对这个subgraph进行数据索引,提供API给外部用户使用。这个Indexer和Curator都会对数据使用费进行瓜分,并且The Graph每年以大概3%速度通胀,这个通胀的GRT也会发给Indexer,还有给Indexer做抵押的delegator,这个经济模式是不是非常类似Steemit和Hive?我对做这个节点非常感兴趣,于是花了不少时间来研究,任何东西都有个Quick Start,这个也不例外,于是我先玩了玩Quick Start上本地部署节点和subgraph。

当然,先找到官方网站的指导:https://thegraph.com/docs/quick-start#local-development,这个指导还包含了一个样本的smart contract和对应的subgraph,先本地安装ganache-cli,把那个样本合约deploy到ganache上去,把节点运行文件下载下来,它有docker映像,这个操作起来很方便,这里有个重要文件叫做docker-compose.yml,需要把本地IP地址写进去,这样运行起来,它可以绑定本机地址,对于样本中的subgraph,需要把subgraph.yaml文件中的智能合约地址改成刚才deploy后的合约地址,这样,接下来用codegen自动生成代码时候,可以自动从这个合约地址区块开始到结束来下载数据。这个The Graph鼓励合约开发者多用event这样的消息,这样处理起来方便,当然它也可以对区块单独提前信息。这里我遇到的一个大问题就是运行如下命令后,系统总是说连不上ethereum区块链。

docker-compose up

我检查了很久也没找出毛病出来,后来我换了台机器,上面单独装了ubuntu,也是这么安装和配置,就一点问题都没有,差异就是原来用的是虚拟机上的ubuntu,我思前想后,这个就是唯一的差别。

接下来就可以用它提供的样本dapp来获取数据。这里数据格式用的是GraphQL,这个比我们传统的restful API可以好了许多,主要是灵活和方便,一次性数据请求就可以要自己需要的数据,没有冗余,感兴趣的朋友可以自行上网搜索。

刚才是把subgraph部署到本地的教程,The Graph所有官方(对于去中心化项目,用官方这个词,有点搞笑,我的意思就是这个项目的社区)的subgraph是放在这个地方:

https://thegraph.com/explorer/

当然,把所有subgraph都放一个地方,不就中心化了吗?就很容易被攻击了,所以目前,这个项目正在进行这个方面的升级,把subgraph存放和索引去中心化。

把自己做好的subgraph和对应的scheme上传到官方的服务器,然后可以GraphQL API 来引用这些数据,The Graph提供的服务叫做“Host Service"。为了能让自己做的subgraph呈现在上面说的公共站点,按照如下指导:https://thegraph.com/docs/quick-start#hosted-service

需要先用自己的github账号去注册下,然后加一个subgraph的名称,接着在本机上传自己制作的subgraph和scheme,我想起上次我做的去中心化支付宝的玩意还在ropsten上呢,于是就把这个合约地址拿过来,本来想自己手工做一些scheme和数据存储的脚本,但是好像不太成功,这个需要以后有时间进一步研究,现在先把这个部署到host service上再说,主要是验证下它这个流程是否好使。

在部署过程中还是遇到不少坑,于是一一记录下来,万一以后我想做它的节点,还需要到云服务器上去做。感觉这个项目还是早期,文档有些乱,不过它有自己的discord,这上面还是可以问些技术问题,它也有telegram,不过这上面的人都关心币价,你去乱问技术问题,有些唐突了。

注意啊,这个subgraph一旦部署到host service,就不能删除了,名字也不能改,对应的github账号也不能变了,但是你仍旧可以更改后再次上传。The Graph强烈建议大家写智能合约时候,多写event把数据导出来,这样是最快的方式,如果你实在懒得写,那么它有block handlers来解决这个问题。这个也是我开始想问的问题,就是合约有很多公共数据,但是没有出现在event的log里,那么The Graph如何获取这些数据呢?那就是答案。

尝试了这些初步的测试之后,还是不能令我满意,我决定尝试装一个测试节点,然后尝试下curator,delegator,indexer,consumer这些角色到底做什么,这样感觉才完美。The Graph的测试节点,目前只支持在Rinky测试网上玩,先要做一些基本配置,就是获取Rinky网上的测试代币GRT,然后要approve和stake这些代币到测试网上的合约里,对了,想做The Graph的节点,需要至少抵押100K个GRT代币到合约里,这个有些像POS协议,之所以需要这么多抵押,就是防止节点使坏,这样可以把节点的GRT给slash掉,想想就可怕,按照目前GRT的0.65刀的价格,需要资金65000美刀,不过我估计,经过此轮熊市,也许6500美刀就够了。

这篇谷歌文档里有所有配置安装的链接,先找到这篇文档告诉你怎么要测试代币,然后抵押到测试合约里去。这里头真正实施起来还是有些小坑,毕竟人家是初创企业嘛,这个需要理解。我摸索了一周,终于把整个节点和各种服务给安装好了,但是调试起来还是遇到不少坑,最主要的调试手段就是看log。

先查看docker里装载的进程有那些:

docker container list

再看具体进程打印出来的log:

docker logs --follow --tail 100 indexer-agent

它的这些脚本还是很完善的,主要毛病就是自己的配置有问题,比如以太坊主网的URL的格式啊,比如GeoLocation的地址格式不对啊,反正最后运行它的命令没有问题了,就算安装成功。

通过安装和调试命令过程,可以进一步对系统了解。比如,刚才说的hosted service,是把自己开发的subgraph部署到服务器上去(这个服务器正在被去中心化),你可以把自己开发的合约的subgraph部署上去,这样别人能索引你的数据,了解你的合约,你也可以开发已经存在的他人的合约,比如你如果觉得UniSwap的现有的subgraph不好,你可以去改善下,然后发布出来。

不是所有subgraph都值得去索引的,这个要curator去发掘,或者有很多GRT抵押在上面,说明有人愿意去冒险索引它了,作为一个节点,你要抵押GRT在一些subgraph上,这套系统才会去索引上面的数据,这些抵押的GRT,可以来自自己的GRT,也可以来自别人,这里“别人”,被称为“Delegator",当然别人不不白给,要分享”Query Fee“的。 作为节点,风险还是有的,你得去好好检查人家开发的subgraph靠不靠谱,如果不靠谱,你给用户错误的数据,被发现了,你抵押的GRT就要被slash,但是作为Delegator,就不会受到连带责任,所以大多数人愿意做Delegator,谁叫你收的好处费多呢?一旦你allocate grt到那些subgraph,你的节点就去索引(index)上面的数据,所谓”Index",就是节点从subgraph的文件中找到合约的地址,还有就是合约被部署到哪个网上,然后从合约起始块开始一直把相关的数据下载到本地的postgres数据库中,然后提供给外部用户去query。

通过docker方式安装后,这里头也包括了性能查看接口,可以从外部以web方式查看,但是我从自己的机器上看不到,我咨询了项目组里人,先是问我有没有配置三个subdomain,我都配置了,那么我有两个选择:第一是:“you need nat reflection then, if you want that subdomain to work within your LAN”,第二个选择是:expose that port to the docker host。

所谓NAT,就是"Network Access Translation",指你从自己家的网络里能通过外部地址的方式,访问你从自家主机上发布的外部服务程序,如同用户在外面访问你的服务一样。这个玩意我上网查了下,需要我主机上做一些配置,我考虑反正以后我要把节点放到外面云上面去,所以觉得没必要在这多费时间。所以我选择了第二种解决方案,就是在docker host里暴露我要访问的端口。但是看起来也没啥用,询问了下,说要从外网来访问。这个问题我至今没有解决,还有很多的问题都没有解决,比如:如何设置query fee cut,max delegation GRT,抵押进去的GRT,如何能解放出来,由于这个项目还出于早期,感觉版本也不够稳定,我只能玩到这个程度了,就是能设置allocation了,就是把自己和别人抵押的GRT,分配到我想index的subgraph上。

后来我还不死心,找了个免费一年的aws 的EC2,安装这个节点软件,但是有个问题,aws的免费版本配置太低了,硬盘10G应该够了,但是内存1G感觉就不行了,在编译阶段就卡住了,看来我只能玩到这个程度了。等过一阵子,它们的节点软件能优化下,我再来玩吧,不过我觉得这个东西未来是充满希望的,就等价格了。目前绝大多数数字货币的价格,在未来一年,都有很大可能打骨折出售。

image.png

谁有兴趣,可以自行安装玩玩,这里是比较靠谱的一个指导:

https://thegraph.academy/indexers/setting-up-a-testnet-indexer/

Sort:  

GRT是个好项目啊,我去年买了他们public sale的币还参加了他们的curator program获得了3万左右GRT,但都抛得太早了。

这个项目public sale的价格是0.03刀呢,牛市里抛晚抛早都是个问题。
有机会一起讨论下这个项目。

好的呀,technical方面的东西我不是了解很多,我更多关注的是investment方面的信息。