本文介绍了如何使用SHYFT API在Solana区块链上追踪治理提案的投票情况。通过SHYFT API,开发者可以方便地获取提案相关的所有交易记录,筛选出投票交易,并解析这些交易以获取投票类型、投票人等信息,从而计算出提案的赞成票和反对票数量,判断提案是否通过。此外,还可以从解析后的交易中获取提案名称、治理地址等更多有用信息。
Solana 区块链上的治理程序是其去中心化生态系统的一个基本组成部分,能够对关键网络方面进行集体决策和管理。这些程序依赖于治理 Token,用户持有这些 Token 以在网络的治理过程中行使投票权。 Solana 的治理框架以透明、参与和适应性为特征。在本文中,我们将探讨跟踪 Solana 上特定治理提案中所有投票的最简单方法之一。 简而言之,我们的目标是创建一个类似于下面媒体的跟踪器。
一个由 SHYFT API 驱动的仪表板,用于跟踪治理提案中的投票
要开始,我们需要一些东西。
身份验证:获取你的 Shyft API 密钥
x-api-key
是一个身份验证参数,可让你访问 SHYFT API。 你可以从 SHYFT 网站 获取你自己的 API 密钥。 只需在此处使用你的电子邮件 ID 注册,你就可以免费获得它。
支持 API 调用的 NextJs 或任何开发环境/堆栈
我们在这个项目中使用的是 Next JS,但这可以在任何应用程序开发环境中完成。
整个过程可以分为三个简单的步骤。假设我们有特定提案的提案地址,
CAST_VOTE
的交易。每个 CAST_VOTE
交易, 一旦解析,应包含与特定投票相关的所有信息。此信息可能包括 治理地址、治理 Token、领域地址,最重要的是 所投投票的类型。假设我们有一个治理提案,比如地址 xtb….pos
,我们想要跟踪所有投票,并了解该提案是否已获得批准。第一步也是最重要的一步是获取彩票的所有交易并解析它们,我们将探讨在 Solana 上获取交易的最便捷方法之一,即使用 SHYFT API。
在此处阅读 SHYFT API 文档 here .
我们很高兴推出 SHYFT 专为 Solana 区块链生态系统设计的全面独家 API 集合。我们的 API 套件包含广泛的功能,包括适用于非同质化 Token (NFT)、同质化 Token(加密货币)、加密钱包管理和高效交易处理的功能。对于此特定案例,我们将利用 SHYFT 的 高效交易 API 来获取与该特定提案相关的所有交易。API 端点:
GET https://api.shyft.to/sol/v1/transaction/history
此 API 请求所需的参数
所有 SHYFT API 在标头中都需要 x-api-key
参数,SHYFT 使用该参数作为授权参数。你可以在 此处 免费获取你自己的 API 密钥。此 API 支持分页,其他参数如下:
network
:可以是 devnet、testnet 或 mainnet-beta。account
:我们尝试获取其交易的帐户地址,在我们的例子中,这是提案地址。tx_num(可选)
:指示一次要获取的交易数量。before_tx_signature(可选)
:交易按最近交易的顺序获取。此字段接受交易签名,并将获取此交易之前的所有交易(按时间顺序)。enable_raw
:从此端点返回的所有交易都是来自 Solana 的 “人类可读”的已解析交易。如果将其设置为 true,则原始交易也会与已解析的交易一起返回。要了解有关此 API 及其参数的更多信息,请访问 SHYFT 交易文档。
成功执行后,我们应该以分页方式从此端点接收到交易数组(最新交易在前)。下一步是解析交易。感谢 SHYFT,我们可以跳过此步骤,因为 通过此端点接收到的所有交易都已由 SHYFT 预先解析。收到的响应看起来有点像下面的示例。请注意,由于我们 以分页方式获取交易,因此重要的是 我们重复此操作,直到未收到任何交易,即 从端点收到的交易数量为 0。
[{\
"timestamp": "2023-08-28T13:30:00.000Z",\
"fee": 0.0000066,\
"fee_payer": "sjiQ7dDVKgCM2gTWQQbVkFEeeJRGd37NKjKvZebrGs7",\
"signers": [\
"sjiQ7dDVKgCM2gTWQQbVkFEeeJRGd37NKjKvZebrGs7"\
],\
"signatures": [\
"45KAyQtwbDzzKfpPGAynRpcq4gVjweV75FFybMqvobxDbUbzCemrjHS4ZpN2xDenCJaDiSAzt8wk5d5qGskfEE9U"\
],\
"protocol": {\
"address": "GovER5Lthms3bLBqWub97yVrMmEogzX7xNjdXpPPCVZw",\
"name": "SPL_GOVERNANCE"\
},\
"type": "CAST_VOTE",\
"status": "Success",\
"actions": [\
{\
"info": {\
"realm_address": "GBXLYo4ycRNfzuzYeudu6y2ng4afNeW14WcpM2E4JJSL",\
"governance": "7M6TSEkRiXiYmpRCcCDSdJGTGxAPem2HBqjW4gLQ2KoE",\
"proposal": "8EcSzJeg8S4pvzMUt7JrMPsyCyQ2s1nycwaptGgiKAWE",\
"proposal_owner_record": "2TMp4yvH5QWUhpwFgKq27J2vxCrscwBjiRKg1TT3BwLR",\
"voter_token_owner_record": "2TMp4yvH5Q2UhpwFgKq26J2vxCrscwBjiRKg1TT3BwLR",\
"governance_authority": "sjiQ7dDVKgCM2gTWQQbVkFEeeJRGd37NKjKvZebrGs7",\
"vote_record_address": "G8R3oKyUDLFjuPoyFcxXy1MwVv1679BrhBk5jaEU67rJ",\
"vote_governing_token": "39qcqpaiLivyFLBLh4wvPmLrs336BBpXkKYb88i8dSiJ",\
"payer": "sjiQ7dDVKgCM3gTWQQbVkFEeeJRGd37NKjKvZebrGs7",\
"vote_type": "Approve",\
"rank": 0,\
"weight_percentage": 100\
},\
"source_protocol": {\
"address": "GovER5Lthms3bLBqWub97yVrMmEogzX7xNjdXpPPCVZw",\
"name": "SPL_GOVERNANCE"\
},\
"type": "CAST_VOTE"\
}\
]\
},\
{\
"timestamp": "2023-08-28T13:30:00.000Z",\
"fee": 0.0000066,\
"fee_payer": "pxsiQ7dDVKgCM2gTWQQbVkFEeeJRGd37NKjKvahdajh",\
"signers": [\
"dkwiQ7dDVKgCM2gTWQQbVkFEeeJRGd37NKjKvZahb6ba"\
],\
.......//response shortened\
}\
]
下一步是过滤所有交易,以便我们可以选择与我们的用例相关的交易。由于 所有收到的交易都已由 SHYFT 预先解析,因此我们可以直接 CAST_VOTE
检查 type
field 是否为。这些交易表明已针对该提案进行了投票,并包含与之相关的所有信息,例如 realm_address
、governance
、governing_token
以及 最重要的是已投的投票类型,是“批准”还是“不批准”该提案。我们可以根据 type
字段过滤交易。现在可以将这些过滤后的交易存储在数组或数据库中以进行进一步处理。
for (let index = 0; index < transactions.length; index++) {
const eachTransaction = transactions[index];
if(eachTransaction.type === "CAST_VOTE") {
//checking for cast vote transaction
castVoteTransactions.push(eachTransaction);
}
}
{
//.....response shortened
"type": "CAST_VOTE", //indicates the type of transaction
"status": "Success",
"actions": [\
{\
"info": {\
"realm_address": "GBXLYo4ycRNfzuzYeudu6y2ng4afNeW14WcpM2E4JJSL",\
//....response shortened\
"payer": "sjiQ7dDVKgCM3gTWQQbVkFEeeJRGd37NKjKvZebrGs7",\
"vote_type": "Approve",\
"rank": 0,\
"weight_percentage": 100\
},\
"type": "CAST_VOTE" //indicates the type of action\
}\
]
//.....response shortened
}
一旦我们有了所有的 CAST_VOTE
交易,我们就可以轻松地计算已投的投票总数,即 投票交易的数量。每个 CAST_VOTE
交易都有一个 vote_type
字段,指示已投的投票类型,即 批准提案的投票或拒绝提案的投票。
for (let index = 0; index < transactions.length; index++) {
const eachTransaction = transactions[index];
const voteAction = eachTransaction.actions.filter((action) => action.type === "CAST_VOTE");
//alternatively, you can also view the first action in the actions array
// const voteAction = eachTransaction.actions[0];
if(voteAction[0].info?.vote_type === "Approve") //checking for approved transactions
approved++;
else
disapproved++;
totalVotes++;
}
我们可以在前端计算批准的投票并生成饼图
如果类型为“批准”的投票数多于类型为“不批准/拒绝”的投票数,则表明该提案已获得批准。
除了计算投票数量外,我们还可以从 SHYFT 的已解析交易中获得大量更有用的信息。我们可以在第一步中获取提案的名称,即 获取所有交易的地方。应该有一个 CREATE_PROPOSAL
交易,其中包含有关该提案的大部分信息,包括提案的名称。
此外,各种其他详细信息,例如治理地址、领域地址、治理 Token 等,也可以在收到的已解析交易中找到。此外,我们还可以对治理 Token 地址发出 tokens/get_info
请求以获取 Token 详细信息。在此处查找有关此 API 的更多信息 here。
SHYFT 在解析的交易中提供的信息
在 Solana 上获取交易的方式有很多种,但其中大多数方式都需要大量的编码和对 Solana 区块链的理解,并且浪费了大量时间重新发明轮子。SHYFT 旨在通过提供基于 API 的低代码解决方案来减少这些工作,以在 Solana 区块链上执行多项操作。通过利用 SHYFT 的 API,你可以无缝地与 Solana 区块链交互,利用其功能来增强你的区块链交互。
如果你喜欢这篇文章,请随时浏览有关跟踪 cNFT 市场活动 或 在 Solana 上构建 cNFT 的 Discord 机器人 的其他文章。 以上项目也可在 我们的 GitHub 上找到 。 非常感谢你的阅读时间,我们真的希望你喜欢使用 SHYFT 进行构建。
- 原文链接: blogs.shyft.to/how-to-tr...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!