Requête RPC du solde d'un compte (account balance)

Je n’arrive pas à trouver la requête RPC de substrate pour obtenir la balance d’un compte.

Dans polkadot.js, je tente « Données de la chaîne » et

requête d'état sélectionné:
balances                                    account(AccountId32): PalletBalancesAccountData

Pour Alice qui possède 16,660.0000 ĞD , j’obtiens :

{
  free: 0
  reserved: 0
  miscFrozen: 0
  feeFrozen: 0
}

Mais Free est vide. Une idée ?

Es-tu sûr que que ton AccountId32 correspond à une address dont le solde est non null ?

Dans Gecko je fais ainsi:

https://git.duniter.org/clients/gecko/-/blob/substrate-sdk/lib/providers/substrate_sdk.dart#L139-140

C’est donc bien free qui correspond au solde courant (disponible). Cela fonctionne bien chez moi.
A savoir que le solde m’est retourné en hexadécimal, il faut donc le convertir en entier avant de la traiter.

Le binding dart envoi précisément cette méthode JS au webview:

A noter qu’il est aussi possible d’utiliser la méthode GetStorage de l’api RPC pour obtenir le solde entre autre chose, au milieux d’autres metadata, mais la methode getBalance plus haut niveau semble mieux adapté pour cibler le solde.

En espérant que ça t’aide.


D’ailleurs j’en profite pour reposer une question derrière: N’existe il pas une page wiki ou autre qui référence de manière brut toute les méthodes exposés par la lib polkadot JS ??

Parceque leur doc est bien sympa mais ne présente nullement de catalogue exhaustif de tout ce que fourni leur lib (enfin je n’en ai pas trouvé en tout cas).
Ca semble être la base pourtant…

Merci Poka !
Pour le solde vide, ce n’est pas moi qui rempli l’adresse, c’est polkadot.js !
On peut ajouter le hash du bloc dont on veut l’info, sans ou avec le dernier hash, j’ai un Free à 0.
Tout ça dans l’interface web !

Pour répondre à ta question, dans la lib python json-rpc, y a un methods_list et un method_help(method_name) pour avoir une doc de l’api.

Pour substrate, j’ai repéré pour lister les méthodes disponibles :

module : rpc
method : methods

qui donne :

: rpc.methods

{
  version: 1
  methods: [
    account_nextIndex
    author_hasKey
    author_hasSessionKeys
    author_insertKey
    author_pendingExtrinsics
    author_removeExtrinsic
    author_rotateKeys
    author_submitAndWatchExtrinsic
    author_submitExtrinsic
    author_unwatchExtrinsic
    chain_getBlock
    chain_getBlockHash
    chain_getFinalisedHead
    chain_getFinalizedHead
    chain_getHead
    chain_getHeader
    chain_getRuntimeVersion
    chain_subscribeAllHeads
    chain_subscribeFinalisedHeads
    chain_subscribeFinalizedHeads
    chain_subscribeNewHead
    chain_subscribeNewHeads
    chain_subscribeRuntimeVersion
    chain_unsubscribeAllHeads
    chain_unsubscribeFinalisedHeads
    chain_unsubscribeFinalizedHeads
    chain_unsubscribeNewHead
    chain_unsubscribeNewHeads
    chain_unsubscribeRuntimeVersion
    childstate_getKeys
    childstate_getKeysPaged
    childstate_getKeysPagedAt
    childstate_getStorage
    childstate_getStorageEntries
    childstate_getStorageHash
    childstate_getStorageSize
    offchain_localStorageGet
    offchain_localStorageSet
    payment_queryFeeDetails
    payment_queryInfo
    state_call
    state_callAt
    state_getChildReadProof
    state_getKeys
    state_getKeysPaged
    state_getKeysPagedAt
    state_getMetadata
    state_getPairs
    state_getReadProof
    state_getRuntimeVersion
    state_getStorage
    state_getStorageAt
    state_getStorageHash
    state_getStorageHashAt
    state_getStorageSize
    state_getStorageSizeAt
    state_queryStorage
    state_queryStorageAt
    state_subscribeRuntimeVersion
    state_subscribeStorage
    state_traceBlock
    state_unsubscribeRuntimeVersion
    state_unsubscribeStorage
    subscribe_newHead
    system_accountNextIndex
    system_addLogFilter
    system_addReservedPeer
    system_chain
    system_chainType
    system_dryRun
    system_dryRunAt
    system_health
    system_localListenAddresses
    system_localPeerId
    system_name
    system_nodeRoles
    system_peers
    system_properties
    system_removeReservedPeer
    system_reservedPeers
    system_resetLogFilter
    system_syncState
    system_unstable_networkState
    system_version
    unsubscribe_newHead
  ]
}

Mais rien sur les balances…
EDIT: on dirait que cette méthode n’affiche que les méthodes RPC du core, pas celles ajoutées par les pallets du « client » duniter v2.

Par contre je ne trouve pas la méthode pour avoir la documentation sur une méthode.
Pourtant l’interface y arrive en donnant la signature et la docstring de chaque méthode…

Euréka, j’ai trouvé ! :partying_face:

Voici le compte d’Alice brut dans Tikka :

Capture du 2022-03-16 18-29-59

Un guide très utile sur l’API RPC est disponible ici. Mais ce n’est pas lui qui m’a donné la réponse.

C’est l’exemple du README de la bibliothèque Python substrate-interface qui fonctionne :


result = substrate.query(
    module='System',
    storage_function='Account',
    params=['F4xQKRUagnSGjFqafyhajLs94e7Vvzvr8ebwYJceKpr8R7T']
)

print(result.value['nonce']) #  7695
print(result.value['data']['free']) # 635278638077956496

Par contre les exemples donnés dans la docstring de la method query ne fonctionne pas…

result = substrate.query(
    module='Balances',
    storage_function='FreeBalance',
    params=['F4xQKRUagnSGjFqafyhajLs94e7Vvzvr8ebwYJceKpr8R7T']
)

renvoie METHOD NOT FOUND Balances.FreeBalance

3 Likes