lite-rpc/docs/solana_updates.md

80 lines
4.5 KiB
Markdown
Raw Normal View History

# RPCV2 Solana updates
## Summary table
Bootstrap not studied.
| Call | Sources | Extern dev |
| -------- | -------- | -------- |
| getBlock | geyser + Faithfull | None |
| getBlocks | geyser + Faithfull | Decide where the block indexes are. |
| getSignaturesForAddress | geyser + Faithfull | None (see evolutions) |
| getclusternodes | None | update geyser or use gossip |
| getepochinfo | None | Update geyser Epoch subscription |
| getLeaderSchedule | None | update geyser see getVoteAccounts |
| getVoteAccounts | None | update geyser to add epoch notification |
| getRecentPerformanceSamples | None | Update geyser plugin, add the call. |
| sendtransaction | Some is missing | need getclusternodes and getLeaderSchedule call |
2023-07-29 08:08:33 -07:00
| getSignatureStatuses | Part. | Update geyser add Processed commitment notification. |
| getTransaction | geyser + Faithfull | None |
| getRecentPrioritizationFees | geyser + local algo | None |
2023-07-29 08:08:33 -07:00
| getslot | geyser | Need Processed commitment. |
| getBlockHeight | geyser | None || getBlockHeight | geyser | None |
| getBlockTime | local algo | None |
| getFirstAvailableBlock | faithful plugin + local algo | None |
| getLatestBlockhash | geyser | None |
| isBlockhashValid | geyser | None |
| getBlockCommitment | geyser + local algo | None |
## Evolutions
### getclusternodes
1) Geyser: :
* a) propose the same get_cluster_nodes impl to get the cluster a any time
* b) notify at the beginning of the epoch. Change the call name, enough for us but perhaps not for every user: change notifier to add a ClusterInfo notifier like BlockMetadataNotifier for block metadata.
Need to change the plugin interface, add notify_cluster_at_epoch. We can notify every time the cluster info is changed but not sure Solana will accept (too much data).
2) Use gossip and use the GossipService impl like the bootstrap::start_gossip_node() function. Need to use ClusterInfo struct that use BankForks to get staked_nodes.
For node info it seems that the stake is not needed. The gossip process is:
* For shred data: crds_gossip::new_push_messages() -> crds::insert() that update peers with CrdsData::LegacyContactInfo(node). So by getting gossip message with LegacyContactInfo we can update the cluster node info.
### getepochinfo
Add a geyser subscription for epoch that contains static epoch data: epoch, start slot, slotsInEpoch
Use full block and slot subscription for the epoch changing data: absoluteSlot, blockHeight, slotIndex, transactionCount
### getLeaderSchedule
In solana, Leader schedule is computed by the method leader_schedule_utils::leader_schedule(epoch, bank); . It need the leaders stake activated at the beginning of the epoch
1) get them using Vote account for the managed epoch in the storage see: getVoteAccounts return only the vote account of the current epoch.
2) Add geyser plugin call. Use the Validator bank. Use bank.epoch_staked_nodes(epoch) to get the stake. Can return the stake and schedule for all epoch in the validator.
### getVoteAccounts
Vote account can only be retrieve from the validator. Need to update the geyser plugin. Only need epoch stake.
Add a subscription method to geyser plugin the notify the current vote accounts when connecting and at each new epoch.
### getRecentPerformanceSamples
Add the same call to geyser plugin. The data can only be retrieve from the validator.
### sendtransaction
- leader schedule to send the Tx to the current and next leader: see getLeaderSchedule
- leader ip to send the tx: see getclusternodes
### getSignatureStatuses
geyser plugin subscribe full block with Tx. The plugin must be changed to get *processed* status block notification.
Discussion to avoid to send several time the same data, the processed block notification can only contains the signature hash and not the content for example.
### getslot
The geyser plugin slot subscription. In the current impl the processed commitment is not notified. Need the plugin in update.
## Solana Geyser modifications
Several possibilities exist to generate the needed data. This is the actual choice of modification that seems the best to implements the RPC calls.
- Add a geyser subscription for epoch:
- Cluster Info
- leader schedule: can be calculate but it's better to have one algo reference
- epoch, start slot, slotsInEpoch
- total staking: can be calculate but it's better to have one algo reference
- Votes accounts
Notified when connecting and at each epoch beginning.
- add geyser plugin call: getRecentPerformanceSamples
2023-07-29 08:08:33 -07:00
- notify slot, Block Meta and BLock at *Processed* commitment. Can send part of the data for the block.