https://github.com/paritytech/substrate/wiki/External-Address-Format-(SS58)
SS58 is a simple address format designed for Substrate based chains. There's no problem with using other address formats for a chain, but this serves as a robust default. It is heavily based on Bitcoin's Base-58-check format with a few alterations.
The basic idea is a base-58 encoded value which can identify a specific account on the Substrate chain. Different chains have different means of identifying accounts. SS58 is designed to be extensible for this reason.
The basic format conforms to:
base58encode ( concat ( <address-type>, <address>, <checksum> ) )
That is, the concatenated byte series of address type, address and checksum then passed into a base-58 encoder. The base58encode
function is exactly as defined in Bitcoin and IPFS, using the same alphabet as both.
The <address-type>
is one or more bytes that describe the precise format of the following bytes.
Currently, there exist several valid values:
- 00000000b..=00111111b (0..=63 inclusive): Simple account/address/network identifier. The byte can be interpreted directly as such an identifier.
- 01000000b..=01111111b (64..=127 inclusive) Full address/address/network identifier. The low 6 bits of this byte should be treated as the upper 6 bits of a 14 bit identifier value, with the lower 8 bits defined by the following byte. This works for all identifiers up to 2**14 (16,383).
- 10000000b..=11111111b (128..=255 inclusive) Reserved for future address format extensions.
The latter (42) is a "wildcard" address that is meant to be equally valid on all Substrate networks that support fixed-length addresses. For production networks, however, a network-specific version may be desirable to help avoid the key-reuse between networks and some of the problems that it can cause. Substrate Node will default to printing keys in address type 42, though alternative Substrate-based node implementations (e.g. Polkadot) may elect to default to some other type.
There are 16 different address formats, identified by the length (in bytes) of the total payload (i.e. including the checksum).
- 3 bytes: 1 byte account index, 1 byte checksum
- 4 bytes: 2 byte account index, 1 byte checksum
- 5 bytes: 2 byte account index, 2 byte checksum
- 6 bytes: 4 byte account index, 1 byte checksum
- 7 bytes: 4 byte account index, 2 byte checksum
- 8 bytes: 4 byte account index, 3 byte checksum
- 9 bytes: 4 byte account index, 4 byte checksum
- 10 bytes: 8 byte account index, 1 byte checksum
- 11 bytes: 8 byte account index, 2 byte checksum
- 12 bytes: 8 byte account index, 3 byte checksum
- 13 bytes: 8 byte account index, 4 byte checksum
- 14 bytes: 8 byte account index, 5 byte checksum
- 15 bytes: 8 byte account index, 6 byte checksum
- 16 bytes: 8 byte account index, 7 byte checksum
- 17 bytes: 8 byte account index, 8 byte checksum
- 34 bytes: 32 byte account id, 2 byte checksum
Several potential checksum strategies exist within Substrate, giving different length and longevity guarantees. There are two types of checksum preimage (known as SS58 and AccountID) and many different checksum lengths (1 to 8 bytes).
In all cases for Substrate, the Blake2-256 hash function is used. The variants simply select the preimage used as the input to the hash function and the number of bytes taken from its output.
The bytes used are always the left most bytes. The input to be used is the non-checksum portion of the SS58 byte series used as input to the base-58 function, i.e. concat( <address-type>, <address> )
. A context prefix of 0x53533538505245
, (the string SS58PRE
) is prepended to the input to give the final hashing preimage.
The advantage of using more checksum bytes is simply that more bytes provide a greater degree of protection against input errors and index alteration at the cost of widening the textual address by an extra few characters. For the account ID form, this is insignificant and therefore no 1-byte alternative is provided. For the shorter account-index formats, the extra byte represents a far greater portion of the final address and so it is left for further up the stack (though not necessarily the user themself) to determine the best tradeoff for their purposes.
The table above and, more canonically, the codebase as well as the registry express the status of the account/address/network identifiers (identifiers).
Identifiers up to value 64 may be expressed in a simple format address, in which the LSB byte of the identifier value is expressed as the first byte of the encoded address.
For identifiers of between 64 and 16,383, the full format address must be used.
The encoding of this is slightly fiddly since we encode as LE, yet the first two bits (which should encode 64s and 128s) are already used up with the necessary 01
prefix. We treat the first two bytes as a 16 bit sequence, and we disregard the first two bits of that (since they're already fixed to be 01
. With the remaining 14 bits, we encode our identifier value as little endian, with the assumption that the two missing higher order bits are zero. This effectively spreads the low-order byte across the boundary between the two bytes.
Thus the 14-bit identifier 0b00HHHHHH_MMLLLLLL
is expressed in the two bytes as:
0b01LLLLLL
0bHHHHHHMM
Identifiers of 16384 and beyond are not currently supported.
https://github.com/paritytech/substrate/wiki/Feature-freeze-towards-launching-Polkadot
Towards launching Polkadot / releasing Substrate 2.0
Owners: Ben (@gnunicorn), Martin (@s3krit)
Alpha: Accepted blockers past freeze in #4961
During stabilization: only release-critical PRs may change the public API or add new features (check with your lead-tech whether your PR falls under that)
Conditions apply
While this previously was focusing on creating an API-stability release, the goal is now to stabilize towards a launch of Polkadot.
2.0 will not be
having any stability guarantees beyond our commitment to adhere to semver: an update from any minor within 2.x will not break your build. HOWEVER, it still might change internals and thus storage data without automatic migrations yet. A 2.x minor upgrade might still mean you have incompatible chains or networks between releases. Release notes will inform you whether that would be the case.
Goals
Path to the launch
Alpha -> Stabilization -> Release
.Alpha
We feature-freeze substrate
master
at noon Feb 21st 2020 (Berlin time). After that time only bug- and documentation-fixes, CI/Automatizing-Tooling-PRs and the already known blockers will be merged. Only PRs that fix security issues and PRs of extreme high severity may change the externally exposed API or rename crates from this point forward.There might be multiple alpha releases on a rolling bases until all known blockers are merged and the automatic tooling is in place and expected to work. Alpha releases have the proposed version number for each create and the suffix
-alpha.
with a steadily increasing number, starting withalpha.1
. All crates are released with the same suffix, even if there were no changes between releases for it.Stabilization
As of Friday, April 24th 2020 (23:59 Berlin Time), we will enter the stabilization-phase. After this point, only bug-, automation-, documentation-fixing- and launch-critical PRs are to be merged. The goal of this phase is to stabilize the system, run the network, report and fix last minute bugs.
draft
mode).Further alpha releases are expected to take place, once we are sure to have reached API stability, we might switch over to releasing them as
-beta.
and the release count, starting at1
. All crates are released with the same prefix, even if there are no changes in between. There might be multiple beta releases on a rolling bases.Launch & Release
Once we have all release critical features in, have that running smoothly and are confident it is stable enough, we might launch it as polkadot. We might also release the creates as
2.0
(or their respective release number, sometimes0.8.0
) to crates.io, however we might delay this further to include fixes that we recognize post-launch. The feature freeze ends.Process to get PRs merged during the freeze
If you have a polkadot-release-critical change (ask your team -lead if you are unsure yours is), cleanups (before stabilization, this includes not-too-involved refactors and API changes ), bug-, documentation-, CI- or hotfix, just raise the PR as usual and get it reviewed by at least two core devs–don't forget to put the appropriate
B-
andF-
labels on it!Once it is ready to merge please tag, has been reviewed by at at least two core developers and has a positive review on its polkadot companion, tag it with
A8-mergeoncegreen
(and remove theA0-review
) and assign your/the responsible team lead. We might also change the tags accordingly, just switch it back toA8-mergeoncegreen
whenever you fixed it and we'll get on it.