Many newcomers to the Polkadot ecosystem (and even some experienced users) find the varying address formats on different chains to be confusing. I’d like to propose that all parachains within a network use the same address format such that your address looks the same within the Polkadot network (including all parachains).
This would require no state migrations, but would require:
- Parachains to update their chainspecs to change their SS58 prefix; and
- Wallets/UIs (+exchanges etc.) to change their display formats and probably do some user FAQ.
Format Refresher
There are many resources on the SS58 format (see e.g. Substrate docs, Polkadot Wiki), but as a reminder, the address you see in most wallets (i.e. the one that starts with a 1
for Polkadot or a letter for Kusama) actually contains three pieces of information:
- A prefix, telling the UI how to format the address;
- An account ID (usually* a public key, usually* 32 bytes); and
- A checksum.
Part (2), the account ID, is the only thing that is actually stored on-chain. That means that UIs could all decide to start displaying your address as identical across whatever chains it wanted to (e.g., all parachains that share a parent Relay).
Try it out for yourself: Go to Subscan’s Account Format Transform tool and enter an address. You will get a very long list of addresses in different formats. These addresses that appear different are all the same exact address, but are formatted differently depending on to which chain they correspond. What I am suggesting here is that UIs format these in a single way.
Network Boundaries and Outliers
The original intent of different SS58 prefixes (and thus formats) was to make obvious to a user that they were operating in a different network context. This is not obvious when looking at a plain 20- or 32-byte hex value. But there was never strong consensus on what “different network” meant. I would propose here that a network includes all subprotocols (chains, smart contracts, etc.) that share the same definition of finality. That is, all parachains within Polkadot would use the same address format in UIs (SS58 prefix 0
) and all parachains within Kusama would use the same address format in UIs (SS58 prefix 2
).
There may be some outliers here. For example, some chains like Moonbeam support Ethereum wallets, and I do not think that these could be cast into the same format based solely on the H160 address and without access to the actual secp256k1 public key.
Some Endnotes
- I’ve discussed this a few times in conversation but don’t think I’ve seen it written down anywhere. If there is an existing thread, happy to migrate there.
- I don’t know the best way to enact this change. Fellowship RFC is not appropriate because there isn’t a change to the Polkadot protocol. It’s simply a UX recommendation that I hope people decide to adopt and makes life better.
* Major asterisk here, the AccountId
can take many variants, and for example a multisig account ID is the Blake2 hash of the threshold/account IDs that compose it, a secp256k1 account ID is the Blake2 hash of the 33-byte public key, an sr25519/ed25519 keypair has a 32-byte public key that actually is the account ID, and so on. Plus parachains can (and some do) define their own concrete AccountId
type that is different from the Relay Chain’s. Let’s just say that I was trying to keep this to a one-liner bullet point but it’s not quite so simple.