Ir para o conteúdo

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:

sudo docker run hello-world

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:

docker pull moondancelabs/tanssi

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 ser archive (nó atua como completo mantendo todo o estado), archive-canonical (mantém apenas estados de blocos finalizados) ou um number (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 ser archive (nó completo mantendo todos os blocos), archive-canonical (mantém apenas blocos finalizados) ou um number (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.

docker run ....
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.

Última atualização: 23 de dezembro de 2025
| Criada: 23 de dezembro de 2025