tovarishch.eth

Posted on May 19, 2022Read on Mirror.xyz

从Snapshot入门GraphQL数据获取

什么是Snapshot

2021年11月,DAO投票平台Snapshotlabs完成了400万美元的融资,1kx领投,Thelao,Metacartelventures,Gnosis,Starkwares,Coinbaseventures,Boostvc,Scalarcartelventures等跟投。作为区块链DAO治理工具之一,分散交易协议Balancer推出的完全开源的链下治理投票平台Snapshot,解决了以太坊链上Gas成本过高,严重影响用户参与治理的问题。虽然Snapshot存在中心化风险,但目前其上已有79条网络,7200多个项目进行投票活动。

Snapshot采用一层网络签名机制和分布式存储协议IPFS实现。对于以太坊的账户地址,它可以通过私钥签名,以确保信息是由地址发布的。以用户投票提案为例,前端钱包允许用户签署投票行动,用户确认后,签名信息将通过Snapshot上传到特定的IPFS地址。在上述过程中,无需触及以太坊主网,因此无需支付Gas费用。因此,在投票过程中或投票结束后,任何人都可以随时在页面上看到所有人的投票。简单快捷免费的操作,极大的增强了用户参与治理的积极性。

Snapshot提供了以下几种投票方式: 单选投票:只选择一个选项;加权投票:将投票分散到多个选项;二次投票:根据个人地址和投票权权衡结果;批准投票:批准一定数量的选项;排名选择投票:对不同的选择进行排名;基本投票:能够在仍参与法定人数的同时投弃权票。

https://docs.snapshot.org/proposals/voting-types

以ENS社区最新一次投票为例,其采取Basic voting模式,投票周期是Apr 21, 2022, 5:23 AM到Apr 26, 2022, 5:23 AM,其允许参与的投票人以14,624,326号区块为截止,只有在该区块之前持有对应代币的人员才有投票资格。在正文部分可以看到提案的具体内容。正文下方是参与者的情况,该提案一共827人参与了投票。对于结束的投票,可以在result中看到最终结果。

什么是GraphQL

因为最近需要对投票相关数据进行分析,研究了一下Snapshot的API接口,发现其使用的是GraphQL。GraphQL 是一种针对 Graph(图状数据)进行查询特别有优势的 Query Language(查询语言)。GraphQL 能够很好地解决数据层级关系复杂的数据读取问题。而且其可以基于Web的GraphQL Explorer调取数据,获得json文件,因此使用十分简便。另外GraphQL也是Github、Facebook等网站现在使用的数据API,因此使用范围广泛。

https://hub.snapshot.org/graphql

案例 Snapshot文档给出了如何获得一个单独项目(比如ENS,在snapshot上叫投票space)信息的Get a single space、获得多个项目space信息的Get multiple space、通过提案ID获得单一提案信息的Get a single proposal、获得某个space下前20个proposal信息的Get proposals、获得单一vote信息的Get a single vote和获得某个proposal下前1000个proposal的Get votes。另外,还可以获得某一个space的followers和在某一地址下用户信息的Get Users。对于Snapshot上的信息这几个案例基本上都有涵盖,建议逐一跑一遍进一步增强了解。

此文以如何获得ENS项目下所有proposal的信息为例进行讲解。 我们在explorer中输入以下代码,然后点击上方运行按钮,就可以得到ENS下所有proposal的各类信息。

query {  #这是GraphQL的请求数据格式,以两个{}中间为需要请求的内容
proposals (     #说明我们要查询的是提案信息
where: {
space_in: ["ens.eth"],    #对ens项目进行查询
},
orderBy: "created",      #按创建时间进行排序
orderDirection: desc     #desc为降序排序
) {                      #一下{}中为具体要查询的信息
id             #单个提案的id
title          #单个提案的名字
body           #提案的内容
choices        #投票的选项
start          #投票起止时间
end
snapshot       #快照区块
state          #目前该投票的状态,比如是否关闭了
scores         #每个投票选项的得分
scores_total   #总体得分,对应投的代币数量
author         #提案发起人
votes          #参投人数
}
}

如果需要查询其他更多信息,可以在explore右侧的快速查找文档中找寻对应参数。 在得到数据信息后,我们就可以对行为进行进一步分析了。