Skip to content

Commit

Permalink
Add scripts to generate people chain base chainspecs (#4910)
Browse files Browse the repository at this point in the history
These can be used as an input to the script defined
[here](https://github.com/paritytech/polkadot-sdk/blob/0887f9ace688005ed78b21044b1b23bdab748c6d/cumulus/scripts/migrate_storage_to_genesis/README.md)
to give the genesis chainspec for `people-(kusama|polkadot)`.

---

The following was used in the creation of the script.

The Aura SS58 key required for the chainspecs can be generated using
subkey:
```
subkey inspect -n <(polkadot|kusama)> --public <aura key>
```

## Kusama

This chainspec has already been generated and the chain launch, but is
included here for completeness.

### Bootnodes
```json
"bootNodes": [
    "/dns/kusama-people-connect-0.polkadot.io/tcp/30334/p2p/12D3KooWQaqG5TNmDfRWrtH7tMsN7YeqwVkSfoZT4GkemSzezNi1",
    "/dns/kusama-people-connect-1.polkadot.io/tcp/30334/p2p/12D3KooWKhYoQH9LdSyvY3SVZY9gFf6ZV1bFh6317TRehUP3r5fm",
    "/dns/kusama-people-connect-0.polkadot.io/tcp/443/wss/p2p/12D3KooWQaqG5TNmDfRWrtH7tMsN7YeqwVkSfoZT4GkemSzezNi1",
    "/dns/kusama-people-connect-1.polkadot.io/tcp/443/wss/p2p/12D3KooWKhYoQH9LdSyvY3SVZY9gFf6ZV1bFh6317TRehUP3r5fm"
  ],
```

### Invulnerables
#### Parity
kusama-people-collator-a-0
On-Chain Address: `HNrgbuMxf7VLwsMd6YjnNQM6fc7VVsaoNVaMYTCCfK3TRWJ`
Aura Key:
`0x7603788559c072033026f1c18995c984c29dfa089dff61cbc77fe44173992557`

kusama-people-collator-a-1
On-Chain Address: `CuLgnS17KwfweeoN9y59YrhDG4pekfiY8qxieDaVTcVCjuP`
Aura Key:
`0xce5e4aeac2a01ef207296337980617eb138104d003f0d6af1343422741c4d108`

### Non-Parity
On-Chain Address: `J11Rp4mjz3vRb2DL51HqRGRjhuEQRyXgtuFskebXb8zMZ9s`
Aura Key:
`0xc6b64d13a6c5a08d66db11eae72e65034b7d05b980b0b1b5f91168bb68dae76f`

On-Chain Address: `H1tAQMm3eizGcmpAhL9aA9gR844kZpQfkU7pkmMiLx9jSzE`
Aura Key:
`0x5efcb324554ab7707a37d994bdcbb038592c0e08e91b93b24508c1a601069d3e`

On-Chain Address: `CbLd7BdUr8DqD4TciR1kH6w12bbHBCW9n2MHGCtbxq4U5ty`
Aura Key:
`0x4408941da4daa50e86160889864e6446252ed4723f577aa0f81ed69de5e3bf77`

On-Chain Address: `CdW8izFcLeicL3zZUQaC3a39AGeNSTgc9Jb5E5sjREPryA2`
Aura Key:
`0x083ead3d8118dbbeca37e674f5d9a896280aed62b8bafaf07da69db69f8a6c66`

On-Chain Address: `HmatizNhXrZtXwQK2LfntvjCy3x1EuKs1WnRQ6CP3KkNfmA`
Aura Key:
`0xaa89c637915970e9a83c19c2c76dee75aecc916a9b79cf319b27aecfaddf7318`

Onchain Address: `DtuntvQBh9vajFTnd42aTTCiuCyY3ep6EVwhhPji2ejyyhW`
Aura Key:
`0xe052d1e8bfff7ae85c5431dfdced574445ecd510e6af5f407d340464ac9b3757`

On-chain Address: `HPUEzi4v3YJmhBfSbcGEFFiNKPAGVnGkfDiUzBNTR7j1CxT`
Aura Key:
`0xe83c370b0200bfd0c723516b2541396a404a9669ec5310b839a4c87ddba9e217`

---
## Polkadot

### Bootnodes
```json
"bootNodes": [
     "/dns/polkadot-people-connect-0.polkadot.io/tcp/30334/p2p/12D3KooWP7BoJ7nAF9QnsreN8Eft1yHNUhvhxFiQyKFEUePi9mu3",
     "/dns/polkadot-people-connect-1.polkadot.io/tcp/30334/p2p/12D3KooWSSfWY3fTGJvGkuNUNBSNVCdLLNJnwkZSNQt7GCRYXu4o",
     "/dns/polkadot-people-connect-0.polkadot.io/tcp/443/wss/p2p/12D3KooWP7BoJ7nAF9QnsreN8Eft1yHNUhvhxFiQyKFEUePi9mu3",
     "/dns/polkadot-people-connect-1.polkadot.io/tcp/443/wss/p2p/12D3KooWSSfWY3fTGJvGkuNUNBSNVCdLLNJnwkZSNQt7GCRYXu4o"
],
```

### Invulnerables
#### Parity
polkadot-people-collator-a-0:
On-Chain Address: `1CVdL7sb6AQGMQYZb8NfQhcBQMhmTLN3e7NDEby8rZkjyJo`
Aura Key:
`0x16dbd3631a6f0aa8831db582ef298fed529d4233253948c4660b47956c4dc01f`

polkadot-people-collator-a-1
On-Chain Address: `14QhqUX7kux5PggbBwUFFZNuLvfX2CjzUQ9V56m4d4S67Pgn`
Aura Key:
`0xdac2170cc094d7a47fa2b1b8844d40f1a5c9b82358997809f4fa08b1c7e92d7b`

#### Non-Parity
On-Chain Address: `112FKz5UNxjXqe3Wowe73a8FHnR5B4R9qi2pbMaXJczGNJsx`
Aura Key:
`0x6cd3a8447dd3cbde9a566f35589b7cf25e924bf194b8fca62f3f6797170afe08`

On-Chain Address: `16FyxKfMF3LnX4CmDsv1PUDPNwqDYiR7rKurwuJxSGgnTsH2`
Aura Key:
`0xa483fa77b505877527c4a44ee2ddd246ad66ac6c33e4349d4e83742d779b3a41`

On-Chain Address: `14EQvBy9h8xGbh2R3ustnkfkF514E7wpmHtg27gDaTLM2str`
Aura Key:
`0x5282d2eafa50e9f77c6089baf9bd1a042d623b28151999ee24ed838e33ca6b64`

On-Chain Address: `14sD2iYm1HsFPoHaT2GJNUMD2KJzvJNfVe9PBrG1KGyDBeHn`
Aura Key:
`0x54461b86f1d81ae23ee86265efac1db524bded8f3eb443d059ab0dee2804f951`

On-Chain Address: `1bLdd7zvNvjGpseQ8BGbGJekCppb1X5Gb228c9MQfHfmmBr`
Aura Key:
`0x9686fc719cfdcb5fd9ca74f36f149730171b5f307144ae40db51c3aeb506fa28`
  • Loading branch information
seadanda authored Jul 3, 2024
1 parent d9c8753 commit 12f690e
Show file tree
Hide file tree
Showing 5 changed files with 398 additions and 2 deletions.
90 changes: 90 additions & 0 deletions cumulus/parachains/chain-specs/people-polkadot.json

Large diffs are not rendered by default.

5 changes: 3 additions & 2 deletions cumulus/polkadot-parachain/src/chain_spec/people.rs
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,9 @@ impl PeopleRuntimeType {
match self {
PeopleRuntimeType::Kusama =>
todo!("Update chain-spec: ../../chain-specs/people-kusama.json - https://github.com/paritytech/polkadot-sdk/pull/3961#issuecomment-2037438431"),
PeopleRuntimeType::Polkadot =>
todo!("Generate chain-spec: ../../chain-specs/people-polkadot.json"),
PeopleRuntimeType::Polkadot => Ok(Box::new(GenericChainSpec::from_json_bytes(
&include_bytes!("../../chain-specs/people-polkadot.json")[..],
)?)),
PeopleRuntimeType::Rococo => Ok(Box::new(GenericChainSpec::from_json_bytes(
&include_bytes!("../../chain-specs/people-rococo.json")[..],
)?)),
Expand Down
160 changes: 160 additions & 0 deletions cumulus/scripts/create_people_kusama_spec.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
#!/usr/bin/env bash
set -euo pipefail

# This script generates the people-kusama base chainspec at genesis. This is then modified by the
# script in polkadot-sdk on the nacho/people-chain-spec-with-migation branch, which also generates
# the genesis wasm and head data.
# The genesis spec for Kusama was generated with the script at commit 0887f9ace688005ed78b21044b1b23bdab748c6d.

## Configure
para_id=1004
version="v1.2.0"
release_wasm="people-kusama_runtime-v1002000.compact.compressed.wasm"
build_level="release" # Change to debug for faster builds

## Download
if [ ! -f $release_wasm ]; then
curl -OL "https://github.com/polkadot-fellows/runtimes/releases/download/$version/$release_wasm"
fi

if [ -d runtimes ]; then
cd runtimes
git fetch --tags
cd -
else
git clone https://github.com/polkadot-fellows/runtimes
fi

if [ -d polkadot-sdk ]; then
cd polkadot-sdk
git checkout master && git pull
cd -
else
git clone --branch master --single-branch https://github.com/paritytech/polkadot-sdk
fi

## Prepare
cd runtimes
git checkout tags/$version --force
cargo build -p chain-spec-generator --$build_level
cd -
chain_spec_generator="./runtimes/target/$build_level/chain-spec-generator"

cd polkadot-sdk
# After people-kusama was supported, but before the breaking change which expects additional runtime api.
git checkout 68cdb12 --force
cargo build -p polkadot-parachain-bin --$build_level
cd -
polkadot_parachain="./polkadot-sdk/target/$build_level/polkadot-parachain"

# Dump the runtime to hex.
cat $release_wasm | od -A n -v -t x1 | tr -d ' \n' >rt-hex.txt

# Generate the local chainspec to manipulate.
$chain_spec_generator people-kusama-local >chain-spec-plain.json

## Patch
# Related issue for Parity bootNodes, invulnerables, and session keys: https://github.com/paritytech/devops/issues/2725
cat chain-spec-plain.json | jq --rawfile code rt-hex.txt '.genesis.runtimeGenesis.code = ("0x" + $code)' |
jq '.name = "Kusama People"' |
jq '.id = "people-kusama"' |
jq '.chainType = "Live"' |
jq '.bootNodes = [
"/dns/kusama-people-connect-0.polkadot.io/tcp/30334/p2p/12D3KooWQaqG5TNmDfRWrtH7tMsN7YeqwVkSfoZT4GkemSzezNi1",
"/dns/kusama-people-connect-1.polkadot.io/tcp/30334/p2p/12D3KooWKhYoQH9LdSyvY3SVZY9gFf6ZV1bFh6317TRehUP3r5fm",
"/dns/kusama-people-connect-0.polkadot.io/tcp/443/wss/p2p/12D3KooWQaqG5TNmDfRWrtH7tMsN7YeqwVkSfoZT4GkemSzezNi1",
"/dns/kusama-people-connect-1.polkadot.io/tcp/443/wss/p2p/12D3KooWKhYoQH9LdSyvY3SVZY9gFf6ZV1bFh6317TRehUP3r5fm"
]' |
jq '.relay_chain = "kusama"' |
jq --argjson para_id $para_id '.para_id = $para_id' |
jq --argjson para_id $para_id '.genesis.runtimeGenesis.patch.parachainInfo.parachainId = $para_id' |
jq '.genesis.runtimeGenesis.patch.balances.balances = []' |
jq '.genesis.runtimeGenesis.patch.collatorSelection.invulnerables = [
"HNrgbuMxf7VLwsMd6YjnNQM6fc7VVsaoNVaMYTCCfK3TRWJ",
"CuLgnS17KwfweeoN9y59YrhDG4pekfiY8qxieDaVTcVCjuP",
"J11Rp4mjz3vRb2DL51HqRGRjhuEQRyXgtuFskebXb8zMZ9s",
"H1tAQMm3eizGcmpAhL9aA9gR844kZpQfkU7pkmMiLx9jSzE",
"CbLd7BdUr8DqD4TciR1kH6w12bbHBCW9n2MHGCtbxq4U5ty",
"CdW8izFcLeicL3zZUQaC3a39AGeNSTgc9Jb5E5sjREPryA2",
"HmatizNhXrZtXwQK2LfntvjCy3x1EuKs1WnRQ6CP3KkNfmA",
"DtuntvQBh9vajFTnd42aTTCiuCyY3ep6EVwhhPji2ejyyhW",
"HPUEzi4v3YJmhBfSbcGEFFiNKPAGVnGkfDiUzBNTR7j1CxT"
]' |
jq '.genesis.runtimeGenesis.patch.session.keys = [
[
"HNrgbuMxf7VLwsMd6YjnNQM6fc7VVsaoNVaMYTCCfK3TRWJ",
"HNrgbuMxf7VLwsMd6YjnNQM6fc7VVsaoNVaMYTCCfK3TRWJ",
{
"aura": "FF4CWRg8eGk8zEmGxswx4ppBQN96HdZhkV35YJU6rfXabpV"
}
],
[
"CuLgnS17KwfweeoN9y59YrhDG4pekfiY8qxieDaVTcVCjuP",
"CuLgnS17KwfweeoN9y59YrhDG4pekfiY8qxieDaVTcVCjuP",
{
"aura": "HEuPjdpQ3yv45zwk6h6985PNK8wszRyeAjDd4GJW5dZEpNp"
}
],
[
"J11Rp4mjz3vRb2DL51HqRGRjhuEQRyXgtuFskebXb8zMZ9s",
"J11Rp4mjz3vRb2DL51HqRGRjhuEQRyXgtuFskebXb8zMZ9s",
{
"aura": "H4s9sGNMvzdjFMKi8qMBqnxhGJR6T7Ytx6foFz9CVhGVyQn"
}
],
[
"H1tAQMm3eizGcmpAhL9aA9gR844kZpQfkU7pkmMiLx9jSzE",
"H1tAQMm3eizGcmpAhL9aA9gR844kZpQfkU7pkmMiLx9jSzE",
{
"aura": "Eis5y75gUQtH712YCyF5q6PjE8UsZzFJ4q3tSYQv2QifZKT"
}
],
[
"CbLd7BdUr8DqD4TciR1kH6w12bbHBCW9n2MHGCtbxq4U5ty",
"CbLd7BdUr8DqD4TciR1kH6w12bbHBCW9n2MHGCtbxq4U5ty",
{
"aura": "E7XKeXCdv3PF1UMmBMU8qH536LKvpwHcgFCVSUbYwK8QrqY"
}
],
[
"CdW8izFcLeicL3zZUQaC3a39AGeNSTgc9Jb5E5sjREPryA2",
"CdW8izFcLeicL3zZUQaC3a39AGeNSTgc9Jb5E5sjREPryA2",
{
"aura": "Cm8X6ekpTVidkFPUmDF7dHFLeWQyrdGW1RhEeuijeR2Pntd"
}
],
[
"HmatizNhXrZtXwQK2LfntvjCy3x1EuKs1WnRQ6CP3KkNfmA",
"HmatizNhXrZtXwQK2LfntvjCy3x1EuKs1WnRQ6CP3KkNfmA",
{
"aura": "GRvavY8h77mnRHbEQsFvUzWpw3kvH8164aVUgKqoyMW8rpV"
}
],
[
"DtuntvQBh9vajFTnd42aTTCiuCyY3ep6EVwhhPji2ejyyhW",
"DtuntvQBh9vajFTnd42aTTCiuCyY3ep6EVwhhPji2ejyyhW",
{
"aura": "HeSr4JUpXgrfKNwZGcJYU5FSn3znDoZaXnYxWB168bw5WUM"
}
],
[
"HPUEzi4v3YJmhBfSbcGEFFiNKPAGVnGkfDiUzBNTR7j1CxT",
"HPUEzi4v3YJmhBfSbcGEFFiNKPAGVnGkfDiUzBNTR7j1CxT",
{
"aura": "HppWoUUWibaZn3zgmcaWZY3BLbZzRktLiNK5e6DUBxHuniE"
}
]
]' |
jq '.genesis.runtimeGenesis.patch.polkadotXcm.safeXcmVersion = 3' \
> people-kusama-genesis.json


## Convert to raw
$polkadot_parachain build-spec --raw --chain ./people-kusama-genesis.json > people-kusama.json

## Cleanup
rm -f rt-hex.txt
rm -f chain-spec-plain.json

echo "The genesis wasm and head data can now be generated using the script in polkadot-sdk on the nacho/people-chain-spec-with-migation branch. This will also modify the chainspec"
echo "See https://github.com/paritytech/polkadot-sdk/blob/0887f9ace688005ed78b21044b1b23bdab748c6d/cumulus/scripts/migrate_storage_to_genesis/README.md"
144 changes: 144 additions & 0 deletions cumulus/scripts/create_people_polkadot_spec.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
#!/usr/bin/env bash
set -euo pipefail

# This script generates the people-polkadot base chainspec at genesis. This is then modified by the
# script in polkadot-sdk on the nacho/people-chain-spec-with-migation branch, which also generates
# the genesis wasm and head data.

## Configure
para_id=1004
version="v1.2.6"
release_wasm="people-polkadot_runtime-v1002006.compact.compressed.wasm"
build_level="release"

## Download
if [ ! -f $release_wasm ]; then
curl -OL "https://github.com/polkadot-fellows/runtimes/releases/download/$version/$release_wasm"
fi

if [ -d runtimes ]; then
cd runtimes
git fetch --tags
cd -
else
git clone https://github.com/polkadot-fellows/runtimes
fi

if [ -d polkadot-sdk ]; then
cd polkadot-sdk
git checkout master && git pull
cd -
else
git clone --branch master --single-branch https://github.com/paritytech/polkadot-sdk
fi

## Prepare
cd runtimes
git checkout tags/$version --force
cargo build -p chain-spec-generator --$build_level
cd -
chain_spec_generator="./runtimes/target/$build_level/chain-spec-generator"


cd polkadot-sdk
# After people-polkadot was supported, but before the breaking change which expects additional runtime api.
git checkout 68cdb12 --force
cargo build -p polkadot-parachain-bin --$build_level
cd -
polkadot_parachain="./polkadot-sdk/target/$build_level/polkadot-parachain"

# Dump the runtime to hex.
cat $release_wasm | od -A n -v -t x1 | tr -d ' \n' >rt-hex.txt

# Generate the local chainspec to manipulate.
$chain_spec_generator people-polkadot-local >chain-spec-plain.json

## Patch
# Related issue for Parity bootNodes, invulnerables, and session keys: https://github.com/paritytech/infrastructure/issues/6
cat chain-spec-plain.json | jq --rawfile code rt-hex.txt '.genesis.runtimeGenesis.code = ("0x" + $code)' |
jq '.name = "Polkadot People"' |
jq '.id = "people-polkadot"' |
jq '.chainType = "Live"' |
jq '.bootNodes = [
"/dns/polkadot-people-connect-0.polkadot.io/tcp/30334/p2p/12D3KooWP7BoJ7nAF9QnsreN8Eft1yHNUhvhxFiQyKFEUePi9mu3",
"/dns/polkadot-people-connect-1.polkadot.io/tcp/30334/p2p/12D3KooWSSfWY3fTGJvGkuNUNBSNVCdLLNJnwkZSNQt7GCRYXu4o",
"/dns/polkadot-people-connect-0.polkadot.io/tcp/443/wss/p2p/12D3KooWP7BoJ7nAF9QnsreN8Eft1yHNUhvhxFiQyKFEUePi9mu3",
"/dns/polkadot-people-connect-1.polkadot.io/tcp/443/wss/p2p/12D3KooWSSfWY3fTGJvGkuNUNBSNVCdLLNJnwkZSNQt7GCRYXu4o"
]' |
jq '.relay_chain = "polkadot"' |
jq --argjson para_id $para_id '.para_id = $para_id' |
jq --argjson para_id $para_id '.genesis.runtimeGenesis.patch.parachainInfo.parachainId = $para_id' |
jq '.genesis.runtimeGenesis.patch.balances.balances = []' |
jq '.genesis.runtimeGenesis.patch.collatorSelection.invulnerables = [
"1CVdL7sb6AQGMQYZb8NfQhcBQMhmTLN3e7NDEby8rZkjyJo",
"14QhqUX7kux5PggbBwUFFZNuLvfX2CjzUQ9V56m4d4S67Pgn",
"112FKz5UNxjXqe3Wowe73a8FHnR5B4R9qi2pbMaXJczGNJsx",
"16FyxKfMF3LnX4CmDsv1PUDPNwqDYiR7rKurwuJxSGgnTsH2",
"14EQvBy9h8xGbh2R3ustnkfkF514E7wpmHtg27gDaTLM2str",
"14sD2iYm1HsFPoHaT2GJNUMD2KJzvJNfVe9PBrG1KGyDBeHn",
"1bLdd7zvNvjGpseQ8BGbGJekCppb1X5Gb228c9MQfHfmmBr"
]' |
jq '.genesis.runtimeGenesis.patch.session.keys = [
[
"1CVdL7sb6AQGMQYZb8NfQhcBQMhmTLN3e7NDEby8rZkjyJo",
"1CVdL7sb6AQGMQYZb8NfQhcBQMhmTLN3e7NDEby8rZkjyJo",
{
"aura": "1WyMcPD9qNrweNu6SKR1TTE2MybFiG8QsZSYxTMsFomuL1o"
}
],
[
"14QhqUX7kux5PggbBwUFFZNuLvfX2CjzUQ9V56m4d4S67Pgn",
"14QhqUX7kux5PggbBwUFFZNuLvfX2CjzUQ9V56m4d4S67Pgn",
{
"aura": "15wq6YmW6panxKmFaLEmrKpsypM2eT4VDY3JvrATnA6eMqvk"
}
],
[
"112FKz5UNxjXqe3Wowe73a8FHnR5B4R9qi2pbMaXJczGNJsx",
"112FKz5UNxjXqe3Wowe73a8FHnR5B4R9qi2pbMaXJczGNJsx",
{
"aura": "13Th3imMymWAXD54sMyTYAVyuWsz2GSix5SMAyHKszdFtSxc"
}
],
[
"16FyxKfMF3LnX4CmDsv1PUDPNwqDYiR7rKurwuJxSGgnTsH2",
"16FyxKfMF3LnX4CmDsv1PUDPNwqDYiR7rKurwuJxSGgnTsH2",
{
"aura": "14ii4R1kDMf4X1nLVHN2nGEu85ptTiFbAAaFzMGu2wcrCAJ5"
}
],
[
"14EQvBy9h8xGbh2R3ustnkfkF514E7wpmHtg27gDaTLM2str",
"14EQvBy9h8xGbh2R3ustnkfkF514E7wpmHtg27gDaTLM2str",
{
"aura": "12sBnnQpA3pV98pakjbc23cVSmpYdYxCEEs83FSybwWpS4Ub"
}
],
[
"14sD2iYm1HsFPoHaT2GJNUMD2KJzvJNfVe9PBrG1KGyDBeHn",
"14sD2iYm1HsFPoHaT2GJNUMD2KJzvJNfVe9PBrG1KGyDBeHn",
{
"aura": "12uVrDhFxe6Lx8U1eZtmfjsyohjB5TwLszij2pu4uiH4NGbF"
}
],
[
"1bLdd7zvNvjGpseQ8BGbGJekCppb1X5Gb228c9MQfHfmmBr",
"1bLdd7zvNvjGpseQ8BGbGJekCppb1X5Gb228c9MQfHfmmBr",
{
"aura": "14QNHMVxTUFs4HfPZoZtLpZXR9cvPhEDGvUyNPusznKVpCzC"
}
]
]' |
jq '.genesis.runtimeGenesis.patch.polkadotXcm.safeXcmVersion = 3' \
> people-polkadot-genesis.json


## Convert to raw
$polkadot_parachain build-spec --raw --chain ./people-polkadot-genesis.json > people-polkadot.json

## Cleanup
rm -f rt-hex.txt
rm -f chain-spec-plain.json

echo "The genesis wasm and head data can now be generated using the script in polkadot-sdk on the nacho/people-chain-spec-with-migation branch. This will also modify the chainspec"
echo "See https://github.com/paritytech/polkadot-sdk/blob/0887f9ace688005ed78b21044b1b23bdab748c6d/cumulus/scripts/migrate_storage_to_genesis/README.md"

0 comments on commit 12f690e

Please sign in to comment.