# 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 | | getSignatureStatuses | Part. | Update geyser add process commitment notification. | | getTransaction | geyser + Faithfull | None | | getRecentPrioritizationFees | geyser + local algo | None | | 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 - notify slot, Block Meta and BLock at *processes* commitment. Can send part of the data for the block.