Executar um Sequencer em Tanssi Usando Docker¶
Introdução¶
Uma das principais propostas do Tanssi é oferecer produção de blocos descentralizada e sem confiança para suas redes. O runtime do Tanssi gerencia a atribuição de sequenciadores para todas as redes ativas no ecossistema.
O algoritmo de atribuição distribui o conjunto disponível de sequenciadores a cada sessão, designando-os para uma cadeia aleatória. Assim, eles produzem blocos para a mesma rede por um período relativamente curto, aumentando a segurança geral do ecossistema.
Para isso, o binário do Tanssi (software usado para rodar nós) já possui um mecanismo embutido que alterna automaticamente a produção de blocos para a cadeia designada sem exigir alterações do operador. O binário inclui a lógica para sincronizar a nova cadeia e produzir blocos quando a sessão muda. Portanto, os sequenciadores precisam executar o binário do Tanssi, e não o das redes individuais (como fazem os nós completos).
Neste guia, você aprenderá como iniciar um Sequencer Tanssi para fazer parte do pool compartilhado de Sequencers usando Docker em um computador Linux. No entanto, ele pode ser adaptado a outros sistemas operacionais.
Verificando os Pré-requisitos¶
Instalando o Docker¶
Para começar, você precisará de um computador com Linux e instalar o Docker.
Execute o comando a seguir para instalar o Docker em um Ubuntu:
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
E o comando abaixo para verificar a instalação:
sudo docker run hello-world
Uma execução bem-sucedida no terminal se parece com isto:
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
Puxando a Imagem Docker¶
Uma imagem Docker é construída e publicada em cada lançamento, contendo todas as dependências necessárias que um Sequencer Tanssi precisa e o próprio arquivo binário.
Uma imagem Docker combina o binário correspondente à versão estável mais recente do nó cliente, junto com o arquivo de especificação do orquestrador Tanssi.
O seguinte comando para puxar a imagem Docker:
docker pull moondancelabs/tanssi
docker pull moondancelabs/tanssi
O comando fará o download e extrairá a imagem e mostrará o status após a execução:
Using default tag: latest
latest: Pulling from moondancelabs/tanssi
e1caac4eb9d2: Pull complete
1d4409959e6d: Pull complete
b8beed19c122: Pull complete
c0fab1f18601: Pull complete
d9dcf3cddfc5: Pull complete
Digest: sha256:0f717d6cf247bbb1b082f5f9e5761b23c44a0be8b704492a57fdbf8c63c0a91c
Status: Downloaded newer image for moondancelabs/tanssi
docker.io/moondancelabs/tanssi
Baixar o arquivo de especificação da cadeia Tanssi¶
O binário do nó também inclui o código necessário para executar um nó da cadeia de orquestração do Tanssi. Ao iniciar um sequenciador, é necessário fornecer o arquivo de especificação dessa cadeia como parâmetro.
Baixe o arquivo de especificação da cadeia de orquestração Tanssi executando:
wget https://raw.githubusercontent.com/moondance-labs/tanssi/75e576add204abd321c48cded556c8de14d65618/chains/orchestrator-relays/node/tanssi-relay-service/chain-specs/starlight-raw-specs.json
wget https://raw.githubusercontent.com/moondance-labs/tanssi/75e576add204abd321c48cded556c8de14d65618/chains/orchestrator-relays/node/tanssi-relay-service/chain-specs/dancelight-raw-specs.json
Configurar o diretório de dados¶
Executar um sequenciador ou um nó de appchain exige sincronizar duas cadeias: a cadeia de orquestração do Tanssi e a appchain para a qual ele trabalha.
Crie o diretório onde o nó armazenará os bancos de dados contendo blocos e estados de cadeia:
mkdir /var/lib/tanssi-data
mkdir /var/lib/dancelight-data
Set the folder's ownership to the account that will run the Docker image to ensure writing permission:
chown INSERT_DOCKER_USER /var/lib/tanssi-data
chown INSERT_DOCKER_USER /var/lib/dancelight-data
Ou execute o comando abaixo se quiser rodar o sequenciador com o usuário logado:
sudo chown -R $(id -u):$(id -g) /var/lib/tanssi-data
sudo chown -R $(id -u):$(id -g) /var/lib/dancelight-data
Move the chain specification file to the folder:
mv ./starlight-raw-specs.json /var/lib/tanssi-data
mv ./dancelight-raw-specs.json /var/lib/dancelight-data
Note
O diretório é um parâmetro no comando de inicialização do Docker. Se optar por criar o diretório em outro lugar, ajuste o comando.
Gerar a Chave do Nó¶
A partir da versão runtime 700, os nós sequenciadores do Tanssi não geram as chaves de sessão automaticamente na inicialização. Para gerar e armazenar em disco as chaves de sessão que serão referenciadas no comando de start, execute:
docker run --network="host" -v "/var/lib/tanssi-data:/data" \
-u $(id -u ${USER}):$(id -g ${USER}) \
moondancelabs/tanssi key generate-node-key --file /data/node-key
docker run --network="host" -v "/var/lib/dancelight-data:/data" \
-u $(id -u ${USER}):$(id -g ${USER}) \
moondancelabs/tanssi key generate-node-key --file /data/node-key
Note
Esta etapa poderia ser evitada usando o parâmetro --unsafe-force-node-key-generation no comando de inicialização, embora essa não seja a prática recomendada.
Comando de Inicialização¶
Para iniciar seu nó, você deve executar a imagem Docker com o comando docker run.
Observe que o comando contém duas seções, divididas por -- \:
- Seção do protocolo Tanssi - contém os flags para executar o nó Tanssi
- Seção do Sequencer - contém os flags para executar o nó Sequencer. É abstrato o suficiente para ser adaptado dinamicamente em Runtime à cadeia específica que o nó servirá
Dê um nome legível a cada seção, substituindo as tags INSERT_YOUR_TANSSI_NODE_NAME e INSERT_YOUR_SEQUENCER_NODE_NAME nos flags --name. Esses nomes serão úteis para conectar as entradas de registro e as métricas com o nó que as gera.
Note
Recomenda-se usar as versões binárias otimizadas para as arquiteturas Skylake da Intel ou Zen3 da AMD para melhor desempenho.
docker run --entrypoint bash --network="host" -v "/var/lib/tanssi-data:/data" \
-u $(id -u ${USER}):$(id -g ${USER}) \
moondancelabs/tanssi -c "/tanssi/tanssi-node solo-chain \
--name=INSERT_YOUR_SEQUENCER_NODE_NAME \
--base-path=/data/container \
--node-key-file=/data/node-key \
--telemetry-url='wss://telemetry.polkadot.io/submit/ 0' \
--pool-type=fork-aware \
--database=paritydb \
--rpc-port=9944 \
--prometheus-port=9615 \
--prometheus-external \
--listen-addr=/ip4/0.0.0.0/tcp/30333 \
--state-pruning=2000 \
--blocks-pruning=2000 \
--db-cache=1024 \
--trie-cache-size=1073741824 \
--collator \
--in-peers=100 \
--detailed-log-output \
-- \
--chain=/data/starlight-raw-specs.json \
--name=INSERT_YOUR_TANSSI_NODE_NAME \
--sync=fast \
--base-path=/data/relay \
--node-key-file=/data/node-key \
--keystore-path=/data/keys/session \
--database=paritydb \
--rpc-port=9945 \
--prometheus-port=9616 \
--prometheus-external \
--listen-addr=/ip4/0.0.0.0/tcp/30334 \
--pool-limit=0 \
--db-cache=128 \
--out-peers=15 \
--state-pruning=2000 \
--blocks-pruning=2000 \
--telemetry-url='wss://telemetry.polkadot.io/submit/ 0' \
--bootnodes=/dns4/deo-tanssi-boot-1.rv.tanssi.network/tcp/30334/p2p/12D3KooWNQ1cddxwvnZZUBG2gtByn9hirVGEn2yR37ztnGSi1VHu \
--bootnodes=/dns4/fro-tanssi-boot-1.rv.tanssi.network/tcp/30334/p2p/12D3KooWS3kv4PyNTxKS8CBxZsVrhMcNcXgxqVUHLrXixuz4DaSR \
--bootnodes=/dns4/qcl-tanssi-boot-1.rv.tanssi.network/tcp/30334/p2p/12D3KooWFDUJ1QZn18tmeJJZU4e6JbyQrLiAp4Xz7ongKzoSjadg \
--bootnodes=/dns4/qco-tanssi-boot-1.rv.tanssi.network/tcp/30334/p2p/12D3KooWBzJzAdAKNVXcsvfL3nHH8BSocNvxz7A8PkRAAJhTuQNm \
--bootnodes=/dns4/uko-tanssi-boot-1.rv.tanssi.network/tcp/30334/p2p/12D3KooWAexWR4uyhVPyxqPBNhhepJ5jRqUa885mu5dKPPVHSfpC"
docker run --entrypoint bash --network="host" -v "/var/lib/tanssi-data:/data" \
-u $(id -u ${USER}):$(id -g ${USER}) \
moondancelabs/tanssi -c "/tanssi/tanssi-node-skylake solo-chain \
--name=INSERT_YOUR_SEQUENCER_NODE_NAME \
--base-path=/data/container \
--node-key-file=/data/node-key \
--telemetry-url='wss://telemetry.polkadot.io/submit/ 0' \
--pool-type=fork-aware \
--database=paritydb \
--rpc-port=9944 \
--prometheus-port=9615 \
--prometheus-external \
--listen-addr=/ip4/0.0.0.0/tcp/30333 \
--state-pruning=2000 \
--blocks-pruning=2000 \
--db-cache=1024 \
--trie-cache-size=1073741824 \
--collator \
--in-peers=100 \
--detailed-log-output \
-- \
--chain=/data/starlight-raw-specs.json \
--name=INSERT_YOUR_TANSSI_NODE_NAME \
--sync=fast \
--base-path=/data/relay \
--node-key-file=/data/node-key \
--keystore-path=/data/keys/session \
--database=paritydb \
--rpc-port=9945 \
--prometheus-port=9616 \
--prometheus-external \
--listen-addr=/ip4/0.0.0.0/tcp/30334 \
--pool-limit=0 \
--db-cache=128 \
--out-peers=15 \
--state-pruning=2000 \
--blocks-pruning=2000 \
--telemetry-url='wss://telemetry.polkadot.io/submit/ 0' \
--bootnodes=/dns4/deo-tanssi-boot-1.rv.tanssi.network/tcp/30334/p2p/12D3KooWNQ1cddxwvnZZUBG2gtByn9hirVGEn2yR37ztnGSi1VHu \
--bootnodes=/dns4/fro-tanssi-boot-1.rv.tanssi.network/tcp/30334/p2p/12D3KooWS3kv4PyNTxKS8CBxZsVrhMcNcXgxqVUHLrXixuz4DaSR \
--bootnodes=/dns4/qcl-tanssi-boot-1.rv.tanssi.network/tcp/30334/p2p/12D3KooWFDUJ1QZn18tmeJJZU4e6JbyQrLiAp4Xz7ongKzoSjadg \
--bootnodes=/dns4/qco-tanssi-boot-1.rv.tanssi.network/tcp/30334/p2p/12D3KooWBzJzAdAKNVXcsvfL3nHH8BSocNvxz7A8PkRAAJhTuQNm \
--bootnodes=/dns4/uko-tanssi-boot-1.rv.tanssi.network/tcp/30334/p2p/12D3KooWAexWR4uyhVPyxqPBNhhepJ5jRqUa885mu5dKPPVHSfpC"
docker run --entrypoint bash --network="host" -v "/var/lib/tanssi-data:/data" \
-u $(id -u ${USER}):$(id -g ${USER}) \
moondancelabs/tanssi -c "/tanssi/tanssi-node-znver3 solo-chain \
--name=INSERT_YOUR_SEQUENCER_NODE_NAME \
--base-path=/data/container \
--node-key-file=/data/node-key \
--telemetry-url='wss://telemetry.polkadot.io/submit/ 0' \
--pool-type=fork-aware \
--database=paritydb \
--rpc-port=9944 \
--prometheus-port=9615 \
--prometheus-external \
--listen-addr=/ip4/0.0.0.0/tcp/30333 \
--state-pruning=2000 \
--blocks-pruning=2000 \
--db-cache=1024 \
--trie-cache-size=1073741824 \
--collator \
--in-peers=100 \
--detailed-log-output \
-- \
--chain=/data/starlight-raw-specs.json \
--name=INSERT_YOUR_TANSSI_NODE_NAME \
--sync=fast \
--base-path=/data/relay \
--node-key-file=/data/node-key \
--keystore-path=/data/keys/session \
--database=paritydb \
--rpc-port=9945 \
--prometheus-port=9616 \
--prometheus-external \
--listen-addr=/ip4/0.0.0.0/tcp/30334 \
--pool-limit=0 \
--db-cache=128 \
--out-peers=15 \
--state-pruning=2000 \
--blocks-pruning=2000 \
--telemetry-url='wss://telemetry.polkadot.io/submit/ 0' \
--bootnodes=/dns4/deo-tanssi-boot-1.rv.tanssi.network/tcp/30334/p2p/12D3KooWNQ1cddxwvnZZUBG2gtByn9hirVGEn2yR37ztnGSi1VHu \
--bootnodes=/dns4/fro-tanssi-boot-1.rv.tanssi.network/tcp/30334/p2p/12D3KooWS3kv4PyNTxKS8CBxZsVrhMcNcXgxqVUHLrXixuz4DaSR \
--bootnodes=/dns4/qcl-tanssi-boot-1.rv.tanssi.network/tcp/30334/p2p/12D3KooWFDUJ1QZn18tmeJJZU4e6JbyQrLiAp4Xz7ongKzoSjadg \
--bootnodes=/dns4/qco-tanssi-boot-1.rv.tanssi.network/tcp/30334/p2p/12D3KooWBzJzAdAKNVXcsvfL3nHH8BSocNvxz7A8PkRAAJhTuQNm \
--bootnodes=/dns4/uko-tanssi-boot-1.rv.tanssi.network/tcp/30334/p2p/12D3KooWAexWR4uyhVPyxqPBNhhepJ5jRqUa885mu5dKPPVHSfpC"
docker run --entrypoint bash --network="host" -v "/var/lib/dancelight-data:/data" \
-u $(id -u ${USER}):$(id -g ${USER}) \
moondancelabs/tanssi -c "/tanssi/tanssi-node solo-chain \
--name=INSERT_YOUR_SEQUENCER_NODE_NAME \
--base-path=/data/container \
--node-key-file=/data/node-key \
--telemetry-url='wss://telemetry.polkadot.io/submit/ 0' \
--pool-type=fork-aware \
--database=paritydb \
--rpc-port=9944 \
--prometheus-port=9615 \
--prometheus-external \
--listen-addr=/ip4/0.0.0.0/tcp/30333 \
--state-pruning=2000 \
--blocks-pruning=2000 \
--db-cache=1024 \
--trie-cache-size=1073741824 \
--collator \
--in-peers=100 \
--detailed-log-output \
-- \
--chain=/data/dancelight-raw-specs.json \
--name=INSERT_YOUR_TANSSI_NODE_NAME \
--sync=fast \
--base-path=/data/relay \
--node-key-file=/data/node-key \
--keystore-path=/data/keys/session \
--database=paritydb \
--rpc-port=9945 \
--prometheus-port=9616 \
--prometheus-external \
--listen-addr=/ip4/0.0.0.0/tcp/30334 \
--pool-limit=0 \
--db-cache=128 \
--out-peers=15 \
--state-pruning=2000 \
--blocks-pruning=2000 \
--telemetry-url='wss://telemetry.polkadot.io/submit/ 0' \
--bootnodes=/dns4/qco-dancelight-boot-1.rv.dancelight.tanssi.network/tcp/30334/p2p/12D3KooWCekAqk5hv2fZprhqVz8povpUKdJEiHSd3MALVDWNPFzY \
--bootnodes=/dns4/qco-dancelight-rpc-1.rv.dancelight.tanssi.network/tcp/30334/p2p/12D3KooWEwhUb3tVR5VhRBEqyH7S5hMpFoGJ9Anf31hGw7gpqoQY \
--bootnodes=/dns4/ukl-dancelight-rpc-1.rv.dancelight.tanssi.network/tcp/30334/p2p/12D3KooWPbVtdaGhcuDTTQ8giTUtGTEcUVWRg8SDWGdJEeYeyZcT"
docker run --entrypoint bash --network="host" -v "/var/lib/dancelight-data:/data" \
-u $(id -u ${USER}):$(id -g ${USER}) \
moondancelabs/tanssi -c "/tanssi/tanssi-node-skylake solo-chain \
--name=INSERT_YOUR_SEQUENCER_NODE_NAME \
--base-path=/data/container \
--node-key-file=/data/node-key \
--telemetry-url='wss://telemetry.polkadot.io/submit/ 0' \
--pool-type=fork-aware \
--database=paritydb \
--rpc-port=9944 \
--prometheus-port=9615 \
--prometheus-external \
--listen-addr=/ip4/0.0.0.0/tcp/30333 \
--state-pruning=2000 \
--blocks-pruning=2000 \
--db-cache=1024 \
--trie-cache-size=1073741824 \
--collator \
--in-peers=100 \
--detailed-log-output \
-- \
--chain=/data/dancelight-raw-specs.json \
--name=INSERT_YOUR_TANSSI_NODE_NAME \
--sync=fast \
--base-path=/data/relay \
--node-key-file=/data/node-key \
--keystore-path=/data/keys/session \
--database=paritydb \
--rpc-port=9945 \
--prometheus-port=9616 \
--prometheus-external \
--listen-addr=/ip4/0.0.0.0/tcp/30334 \
--pool-limit=0 \
--db-cache=128 \
--out-peers=15 \
--state-pruning=2000 \
--blocks-pruning=2000 \
--telemetry-url='wss://telemetry.polkadot.io/submit/ 0' \
--bootnodes=/dns4/qco-dancelight-boot-1.rv.dancelight.tanssi.network/tcp/30334/p2p/12D3KooWCekAqk5hv2fZprhqVz8povpUKdJEiHSd3MALVDWNPFzY \
--bootnodes=/dns4/qco-dancelight-rpc-1.rv.dancelight.tanssi.network/tcp/30334/p2p/12D3KooWEwhUb3tVR5VhRBEqyH7S5hMpFoGJ9Anf31hGw7gpqoQY \
--bootnodes=/dns4/ukl-dancelight-rpc-1.rv.dancelight.tanssi.network/tcp/30334/p2p/12D3KooWPbVtdaGhcuDTTQ8giTUtGTEcUVWRg8SDWGdJEeYeyZcT"
docker run --entrypoint bash --network="host" -v "/var/lib/dancelight-data:/data" \
-u $(id -u ${USER}):$(id -g ${USER}) \
moondancelabs/tanssi -c "/tanssi/tanssi-node-znver3 solo-chain \
--name=INSERT_YOUR_SEQUENCER_NODE_NAME \
--base-path=/data/container \
--node-key-file=/data/node-key \
--telemetry-url='wss://telemetry.polkadot.io/submit/ 0' \
--pool-type=fork-aware \
--database=paritydb \
--rpc-port=9944 \
--prometheus-port=9615 \
--prometheus-external \
--listen-addr=/ip4/0.0.0.0/tcp/30333 \
--state-pruning=2000 \
--blocks-pruning=2000 \
--db-cache=1024 \
--trie-cache-size=1073741824 \
--collator \
--in-peers=100 \
--detailed-log-output \
-- \
--chain=/data/dancelight-raw-specs.json \
--name=INSERT_YOUR_TANSSI_NODE_NAME \
--sync=fast \
--base-path=/data/relay \
--node-key-file=/data/node-key \
--keystore-path=/data/keys/session \
--database=paritydb \
--rpc-port=9945 \
--prometheus-port=9616 \
--prometheus-external \
--listen-addr=/ip4/0.0.0.0/tcp/30334 \
--pool-limit=0 \
--db-cache=128 \
--out-peers=15 \
--state-pruning=2000 \
--blocks-pruning=2000 \
--telemetry-url='wss://telemetry.polkadot.io/submit/ 0' \
--bootnodes=/dns4/qco-dancelight-boot-1.rv.dancelight.tanssi.network/tcp/30334/p2p/12D3KooWCekAqk5hv2fZprhqVz8povpUKdJEiHSd3MALVDWNPFzY \
--bootnodes=/dns4/qco-dancelight-rpc-1.rv.dancelight.tanssi.network/tcp/30334/p2p/12D3KooWEwhUb3tVR5VhRBEqyH7S5hMpFoGJ9Anf31hGw7gpqoQY \
--bootnodes=/dns4/ukl-dancelight-rpc-1.rv.dancelight.tanssi.network/tcp/30334/p2p/12D3KooWPbVtdaGhcuDTTQ8giTUtGTEcUVWRg8SDWGdJEeYeyZcT"
Flags de Execução¶
Os flags usados no comando docker run podem ser ajustados de acordo com suas preferências e configuração de hardware. Os seguintes são alguns dos mais notáveis:
--name INSERT_NAME- nome legível para este nó--rpc-port INSERT_PORT- define a porta TCP do JSON-RPC na qual o nó ouve--unsafe-rpc-external- expõe o serviço RPC em todas as interfaces--state-pruning INSERT_STATE_PRUNING_TYPE- define quando o estado da rede alimentada pelo Tanssi deve ser removido do banco de dados. Pode serarchive(nó atua como completo mantendo todo o estado),archive-canonical(mantém apenas estados de blocos finalizados) ou umnumber(quantidade de blocos cujos estados serão mantidos)--blocks-pruning INSERT_BLOCKS_PRUNING_TYPE- define quantos blocos devem ser mantidos no banco de dados. Pode serarchive(nó completo mantendo todos os blocos),archive-canonical(mantém apenas blocos finalizados) ou umnumber(quantidade de blocos finalizados a manter)--detailed-log-output- habilita saída detalhada de logs
Warning
O parâmetro --unsafe-rpc-external permite acesso externo à interface RPC do seu nó, tornando-a acessível de qualquer endereço IP. Certifique-se de que controles de segurança adequados estejam configurados.
Para ver a lista completa de flags disponíveis, descrição e valores possíveis, execute:
docker run moondancelabs/tanssi --help
docker run moondancelabs/tanssi --help
Sincronizando Seu Nó¶
A primeira vez que seu nó é iniciado, o processo de sincronização exibe muitas informações de registro da configuração do nó e do próprio nó. Alguns erros devem ser exibidos no início do processo, desaparecendo assim que a cadeia é sincronizada com o último bloco.
2024-02-08 18:30:04.093 INFO tokio-runtime-worker substrate: [Parachain] 💤 Idle (0 peers), best: #0 (0x4a2b…7de3), finalized #0 (0x4a2b…7de3), ⬇ 0 ⬆ 0
2024-02-08 18:30:06.368 INFO tokio-runtime-worker substrate: [Relaychain] ✨ Imported #14139635 (0x8c41…8df6)
2024-02-08 18:30:08.809 INFO tokio-runtime-worker substrate: [Relaychain] 💤 Idle (8 peers), best: #14139635 (0x8c41…8df6), finalized #14139632 (0xa9a8…cab9), ⬇ 32.7kiB/s ⬆
Quando a sincronização com o orquestrador Tanssi for concluída, o nó ainda precisará ser sincronizado com a rede a que foi designado. A sincronização com a cadeia servida pelo nó Sequencer acontecerá toda vez que o Sequencer for rotacionado.
| Criada: 23 de dezembro de 2025