我正试图找到属于验证器的奖励积分。我从这个开始:
const activeEra = await api.query.staking.activeEra()
const rewardPoints = await api.query.staking.erasRewardPoints(activeEra.unwrap().index)
const individualRewardPoints = activeEraRewardPoints.individual
现在,看起来individualRewardPoints
是某种由验证器帐户键入的映射,但我找不到如何获取特定项(我不想迭代映射(。有了一个字符串,我尝试了这些:
const alice = '5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY'
individualRewardPoints.get(alice)
individualRewardPoints.get(Buffer.from(alice))
这看起来很有希望,但仍然不起作用:
{ decodeAddress } = require ('@polkadot/keyring')
individualRewardPoints.get(decodeAddress(alice))
它们都返回CCD_ 2。如何获得验证器的奖励积分?
我遇到了同样的挑战,不幸的是,我没有找到迭代的方法。
eraRewardPoints.individual
是BTreeMap<AccountId, RewardPoint>
,所以密钥应该是AccountId
。在后台,这个BTreeMap由JS Map表示,在TS中,我们看到它的密钥类型是AccountId
。要创建该类型,我们可以执行api.createType('AccountId', alice)
。然而,对我来说,创建类型并使用它来键入是不起作用的。我的猜测是,它创建了一个JS无法识别为与映射中相同的AccountId
对象的新对象。
所以我的解决方案是:
for (const [id, points] of eraRewardPoints.individual.entries()) {
if (id.toString() === validatorId) {
return points;
}
}
你可以在substrate api sidecar中找到确切的代码,它有一个端点(accounts/{accountId}/staking-payouts
(,可以使用Rust中的算法为地址支付费用:https://github.com/paritytech/substrate-api-sidecar/blob/ee0a0488bf8100a42e713fc287f08d72394677b9/src/services/accounts/AccountsStakingPayoutsService.ts#L301