@LadyChristina following up on the clustering you mentioned for Solana after my PR is merged. Here's the approach I'd like to confirm with you before building it.
Goal:
- A
clusters/solana.json plus a map_from_known_clusters override in SolanaMapping, so validators run by the same entity (e.g. Kraken 1 + Kraken 2) count as one.
Three decisions:
-
Keyed by vote account (not the reward address Cardano uses), since in Solana the identity account can rotate but the vote account is permanent, as we previously discussed.
-
Homepage-driven grouping. The Solana Config program only gives us name and homepage, so a shared homepage domain groups validators while name only corroborates and never groups alone. Since homepage comes from the on-chain Config program, it is publicly verifiable. Chains of matches are merged transitively (via union-find), so A-B and B-C become one cluster (A, B, C) rather than two. Every validator gets an entry, including the ones that group with no one (singletons), so the lookup always resolves.
-
Generated in this repo: a solana_preprocessing/ script mirroring cardano_preprocessing/, which consumes identifiers/solana.json and emits clusters/solana.json, with tests alongside.
Example:
Input (identifiers/solana.json, keyed by vote account):
{
"VoteAcc_A": { "name": "Kraken 1", "homepage": "https://kraken.com/" },
"VoteAcc_B": { "name": "Kraken 2", "homepage": "https://kraken.com/" },
"VoteAcc_C": { "name": "Solo Node", "homepage": "https://solonode.io" }
}
Output (clusters/solana.json):
{
"VoteAcc_A": { "cluster": "Kraken", "validator": "Kraken 1", "source": ["homepage"] },
"VoteAcc_B": { "cluster": "Kraken", "validator": "Kraken 2", "source": ["homepage"] },
"VoteAcc_C": { "cluster": "Solo Node", "validator": "Solo Node", "source": ["singleton"] }
}
Same cluster/source shape as Cardano, with validator in place of pool and source limited to the signals we have (homepage, name, singleton).
I'd deliver as one follow-up PR:
- the preprocessing script
- the generated
clusters/solana.json file
- mapping override and tests.
Does this look right to you? Glad to adjust anything before I start.
@LadyChristina following up on the clustering you mentioned for Solana after my PR is merged. Here's the approach I'd like to confirm with you before building it.
Goal:
clusters/solana.jsonplus amap_from_known_clustersoverride inSolanaMapping, so validators run by the same entity (e.g. Kraken 1 + Kraken 2) count as one.Three decisions:
Keyed by vote account (not the reward address Cardano uses), since in Solana the identity account can rotate but the vote account is permanent, as we previously discussed.
Homepage-driven grouping. The Solana Config program only gives us name and homepage, so a shared homepage domain groups validators while name only corroborates and never groups alone. Since homepage comes from the on-chain Config program, it is publicly verifiable. Chains of matches are merged transitively (via union-find), so A-B and B-C become one cluster (A, B, C) rather than two. Every validator gets an entry, including the ones that group with no one (singletons), so the lookup always resolves.
Generated in this repo: a
solana_preprocessing/script mirroringcardano_preprocessing/, which consumesidentifiers/solana.jsonand emitsclusters/solana.json, with tests alongside.Example:
Input (
identifiers/solana.json, keyed by vote account):{ "VoteAcc_A": { "name": "Kraken 1", "homepage": "https://kraken.com/" }, "VoteAcc_B": { "name": "Kraken 2", "homepage": "https://kraken.com/" }, "VoteAcc_C": { "name": "Solo Node", "homepage": "https://solonode.io" } }Output (
clusters/solana.json):{ "VoteAcc_A": { "cluster": "Kraken", "validator": "Kraken 1", "source": ["homepage"] }, "VoteAcc_B": { "cluster": "Kraken", "validator": "Kraken 2", "source": ["homepage"] }, "VoteAcc_C": { "cluster": "Solo Node", "validator": "Solo Node", "source": ["singleton"] } }Same
cluster/sourceshape as Cardano, withvalidatorin place ofpoolandsourcelimited to the signals we have (homepage, name, singleton).I'd deliver as one follow-up PR:
clusters/solana.jsonfileDoes this look right to you? Glad to adjust anything before I start.