# deployment with 4 nodes **1. I deployed 2 nodes according to https://hackmd.io/9CWC23PjSMeP9mkFB62tfA?both and add another 2 nodes according to https://hackmd.io/9CWC23PjSMeP9mkFB62tfA?view#Add-the-Second-node** Of course, `2.1. Modify deployment/config/substrate-account-config.json:` should set 4 authorities_seeds. ``` { "secret_key_uri": [ "//Smith", "//Frank", "//Cindy//stash", "//Richard" ], "authorities_seeds": [ "Eve//stash", "Frank//stash", "James//stash", "Robert//stash" ], "pre_funded_seeds": [ "Smith", "Frank", "Cindy//stash", "Richard" ], "sudo_account_seed": "sudo" } ``` `Eve//stash` is authorities_seed for bootnode. `Frank//stash` is authorities_seed for the second node. `James//stash` is authorities_seed for the third node. `Robert//stash` is authorities_seed for the fourth node. **2. On bootnode host, regenerate new chain specification file** because there are 4 authorities_seeds now. Send `customSpec.json` to the other three hosts. **3. Recode the node identity of the bootnode** Here is the Dockerfile of bootnode: ``` FROM docker.io/paritytech/ci-linux:production as builder WORKDIR /delphinuslab COPY . /delphinuslab ENV CARGO_HOME /delphinuslab/.cargo-home RUN --mount=type=cache,target=/delphinuslab/.cargo-home \ --mount=type=cache,target=/delphinuslab/packages/substrate-node/target \ cargo build --manifest-path=/delphinuslab/packages/substrate-node/Cargo.toml --locked --release && install -Dt ./bin/ /delphinuslab/packages/substrate-node/target/release/node-swap # This is the 2nd stage: a very small image where we copy the delphinuslab node binary." FROM docker.io/library/ubuntu:20.04 LABEL description="Zhenxunge node" COPY --from=builder /delphinuslab/bin/ /usr/local/bin/ COPY --from=builder /delphinuslab/packages/substrate-node/customSpec.json . COPY --from=builder /delphinuslab/packages/substrate-node/pallets/ . RUN useradd -m -u 1000 -U -s /bin/sh -d /delphinuslab delphinuslab && \ mkdir -p /data /delphinuslab/.local/share && \ chown -R delphinuslab:delphinuslab /data /delphinuslab && \ ln -s /data /delphinuslab/.local/share/node-swap && \ # Sanity checks /usr/local/bin/node-swap --version USER delphinuslab # Insert session key RUN /usr/local/bin/node-swap key insert --chain customSpec.json --scheme Ed25519 --suri //Eve//stash --key-type gran && \ /usr/local/bin/node-swap key insert --chain customSpec.json --scheme Sr25519 --suri //Eve//stash --key-type aura EXPOSE 30333 9933 9944 9615 VOLUME ["/data"] ENTRYPOINT ["/usr/local/bin/node-swap"] CMD ["--chain", "customSpec.json", "--validator", "--unsafe-ws-external"] ``` Here is the node identity: ![](https://i.imgur.com/bHAtgE3.png) `12D3KooWT1CFtUCaRZ6foFaXfenpt2knhYrMfuhu6xeiiKdzPX6M` We will use it on other nodes' Dockerfile. **4. Get the ip address of docker 0**: Output of `ip addr show`: ![](https://i.imgur.com/WjrG5c0.png) `172.16.200.1` **5. Start the second node** Dockerfile of the second node ``` FROM docker.io/paritytech/ci-linux:production as builder WORKDIR /delphinuslab COPY . /delphinuslab ENV CARGO_HOME /delphinuslab/.cargo-home RUN --mount=type=cache,target=/delphinuslab/.cargo-home \ --mount=type=cache,target=/delphinuslab/packages/substrate-node/target \ cargo build --manifest-path=/delphinuslab/packages/substrate-node/Cargo.toml --locked --release && install -Dt ./bin/ /delphinuslab/packages/substrate-node/target/release/node-swap # This is the 2nd stage: a very small image where we copy the delphinuslab node binary." FROM docker.io/library/ubuntu:20.04 LABEL description="Zhenxunge node" COPY --from=builder /delphinuslab/bin/ /usr/local/bin/ COPY --from=builder /delphinuslab/packages/substrate-node/customSpec.json . RUN useradd -m -u 1000 -U -s /bin/sh -d /delphinuslab delphinuslab && \ mkdir -p /data /delphinuslab/.local/share && \ chown -R delphinuslab:delphinuslab /data /delphinuslab && \ ln -s /data /delphinuslab/.local/share/node-swap && \ # Sanity checks /usr/local/bin/node-swap --version USER delphinuslab # Insert session key RUN /usr/local/bin/node-swap key insert --chain customSpec.json --scheme Ed25519 --suri //Frank//stash --key-type gran && \ /usr/local/bin/node-swap key insert --chain customSpec.json --scheme Sr25519 --suri //Frank//stash --key-type aura EXPOSE 30333 9933 9944 9615 VOLUME ["/data"] ENTRYPOINT ["/usr/local/bin/node-swap"] CMD ["--chain", "customSpec.json", "--validator", "--unsafe-ws-external", "--bootnodes", "/ip4/172.16.200.1/tcp/30333/p2p/12D3KooWT1CFtUCaRZ6foFaXfenpt2knhYrMfuhu6xeiiKdzPX6M"] ``` The second node connect to the bootnode now(1 peers): ![](https://i.imgur.com/44zNq8F.png) **6. Start the third node** Dockerfile: ``` FROM docker.io/paritytech/ci-linux:production as builder WORKDIR /delphinuslab COPY . /delphinuslab ENV CARGO_HOME /delphinuslab/.cargo-home RUN --mount=type=cache,target=/delphinuslab/.cargo-home \ --mount=type=cache,target=/delphinuslab/packages/substrate-node/target \ cargo build --manifest-path=/delphinuslab/packages/substrate-node/Cargo.toml --locked --release && install -Dt ./bin/ /delphinuslab/packages/substrate-node/target/release/node-swap # This is the 2nd stage: a very small image where we copy the delphinuslab node binary." FROM docker.io/library/ubuntu:20.04 LABEL description="Zhenxunge node" COPY --from=builder /delphinuslab/bin/ /usr/local/bin/ COPY --from=builder /delphinuslab/packages/substrate-node/customSpec.json . RUN useradd -m -u 1000 -U -s /bin/sh -d /delphinuslab delphinuslab && \ mkdir -p /data /delphinuslab/.local/share && \ chown -R delphinuslab:delphinuslab /data /delphinuslab && \ ln -s /data /delphinuslab/.local/share/node-swap && \ # Sanity checks /usr/local/bin/node-swap --version USER delphinuslab # Insert session key RUN /usr/local/bin/node-swap key insert --chain customSpec.json --scheme Ed25519 --suri //James//stash --key-type gran && \ /usr/local/bin/node-swap key insert --chain customSpec.json --scheme Sr25519 --suri //James//stash --key-type aura EXPOSE 30333 9933 9944 9615 VOLUME ["/data"] ENTRYPOINT ["/usr/local/bin/node-swap"] CMD ["--chain", "customSpec.json", "--validator", "--unsafe-ws-external", "--bootnodes", "/ip4/172.16.200.1/tcp/30333/p2p/12D3KooWT1CFtUCaRZ6foFaXfenpt2knhYrMfuhu6xeiiKdzPX6M"] ``` The third node connect to the bootnode now(1 peers): ![](https://i.imgur.com/hUyIvuD.png) the boodnode show it has 2 peers now: ![](https://i.imgur.com/GQuN2S6.png) **7. Start the fourth node** Dockerfile: ``` FROM docker.io/paritytech/ci-linux:production as builder WORKDIR /delphinuslab COPY . /delphinuslab ENV CARGO_HOME /delphinuslab/.cargo-home RUN --mount=type=cache,target=/delphinuslab/.cargo-home \ --mount=type=cache,target=/delphinuslab/packages/substrate-node/target \ cargo build --manifest-path=/delphinuslab/packages/substrate-node/Cargo.toml --locked --release && install -Dt ./bin/ /delphinuslab/packages/substrate-node/target/release/node-swap # This is the 2nd stage: a very small image where we copy the delphinuslab node binary." FROM docker.io/library/ubuntu:20.04 LABEL description="Zhenxunge node" COPY --from=builder /delphinuslab/bin/ /usr/local/bin/ COPY --from=builder /delphinuslab/packages/substrate-node/customSpec.json . RUN useradd -m -u 1000 -U -s /bin/sh -d /delphinuslab delphinuslab && \ mkdir -p /data /delphinuslab/.local/share && \ chown -R delphinuslab:delphinuslab /data /delphinuslab && \ ln -s /data /delphinuslab/.local/share/node-swap && \ # Sanity checks /usr/local/bin/node-swap --version USER delphinuslab # Insert session key RUN /usr/local/bin/node-swap key insert --chain customSpec.json --scheme Ed25519 --suri //Robert//stash --key-type gran && \ /usr/local/bin/node-swap key insert --chain customSpec.json --scheme Sr25519 --suri //Robert//stash --key-type aura EXPOSE 30333 9933 9944 9615 VOLUME ["/data"] ENTRYPOINT ["/usr/local/bin/node-swap"] CMD ["--chain", "customSpec.json", "--validator", "--unsafe-ws-external", "--bootnodes", "/ip4/172.16.200.1/tcp/30333/p2p/12D3KooWT1CFtUCaRZ6foFaXfenpt2knhYrMfuhu6xeiiKdzPX6M"] ``` The fourth node connect to the bootnode now(1 peers): ![](https://i.imgur.com/Twa3agE.png) the boodnode show it has 3 peers now: ![](https://i.imgur.com/5GbCoaP.png) **8. Execute swap on ui** Output of l2 monitor: ![](https://i.imgur.com/b0j8z2L.png)