1

我正在尝试找到属于验证者的奖励积分。我从这个开始:

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))

他们都回来了undefined。验证者奖励积分的获取途径是什么?

4

1 回答 1

3

我遇到了同样的挑战,不幸的是我没有找到通过迭代的方法。

eraRewardPoints.individualaBTreeMap<AccountId, RewardPoint>,所以键应该是 a 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-payoutsee0a0488bf8100a42e713fc287f08d72394677b9/src/services/accounts/AccountsStakingPayoutsService.ts#L301

于 2020-10-20T16:46:53.760 回答