Ir para o conteúdo

Executar um Nó Appchain usando Docker

Introdução

Executar um nó de appchain com Tanssi permite conectar e interagir com a appchain usando sua própria infraestrutura via HTTP ou WebSocket.

Os nós armazenam dados de blocos e estado da rede. Há diferentes tipos que os desenvolvedores podem operar:

  • Nó Arquivo Completo - armazena todos os dados de blocos e estados da rede em todas as alturas. Útil para consultar dados históricos, mas consome muito espaço
  • Nó Podado Completo - armazena dados de blocos e estado até um certo número de blocos antes da altura atual. Útil para consultar dados recentes ou enviar transações pela sua infraestrutura. Requer bem menos espaço que um nó arquival, mas não mantém todo o estado da rede

Neste guia, você aprenderá como iniciar rapidamente um nó appchain Tanssi usando Docker em um computador Linux. Ele pode ser adaptado para outros sistemas operacionais.

Nota

Não é possível executar um nó RPC para appchains de teste rápidas, pois elas rodam em uma rede privada e, portanto, não estão acessíveis para sincronização.

Verificação de 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/

Obtendo os arquivos de especificação

Um nó de appchain precisa de informações sobre duas blockchains para funcionar corretamente: a própria appchain e a cadeia de orquestração do Tanssi.

Essas informações ficam em um arquivo de especificações de cadeia, que inclui, entre outras coisas, o estado gênesis, permitindo que o nó verifique e sincronize corretamente os blocos e estados recebidos de outros nós.

Para obter o arquivo de especificação do Tanssi, execute:

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

Para obter o arquivo de especificação da appchain, baixe-o no dashboard do dApp clicando no link Network Data.

Getting the chain specs

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.

Extraindo a Imagem Docker

Duas imagens Docker são criadas e publicadas para cada versão: uma para appchains compatíveis com EVM e outra para appchains Substrate.

Essas imagens incluem todos os binários necessários para executar a versão estável mais recente do nó cliente.

Puxe a imagem correspondente ao tipo de appchain que você deseja executar.

Appchains compatíveis com EVM

Se a appchain foi registrada escolhendo o modelo EVM ou enviando uma especificação personalizada compatível com EVM, execute:

docker pull moondancelabs/container-chain-evm-template
docker pull moondancelabs/container-chain-evm-template

O comando fará download e extração da imagem e exibirá o status após a execução:

docker pull moondancelabs/container-chain-evm-template

Using default tag: latest
latest: Pulling from moondancelabs/container-chain-evm-template
31ad3619f756: Already exists
8f3d9759dcde: Pull complete
de5eaba9b289: Pull complete
Digest: sha256:4930d631a8ac7f7852754d4cf77bb3317229d768f44092a00295ba50641b2a33
Status: Downloaded newer image for moondancelabs/container-chain-evm-template
docker.io/moondancelabs/container-chain-evm-template:latest

Appchains Substrate Simples

Se a appchain foi registrada escolhendo o modelo Substrate básico ou enviando uma especificação personalizada Substrate, execute:

docker pull moondancelabs/container-chain-simple-template
docker pull moondancelabs/container-chain-simple-template

O comando fará download e extração da imagem e exibirá o status após a execução, semelhante ao exemplo anterior.

Comando de Inicialização

Para iniciar seu nó, execute a imagem Docker com docker run. Altere conforme necessário:

  • Arquivo de especificações da appchain - substitua INSERT_YOUR_APPCHAIN_SPECS_FILE pelo nome do arquivo de specs baixado na etapa de obtenção das especificações.
  • Bootnode - é um nó arquivo completo usado para sincronizar a rede do zero. Você precisará recuperar o bootnode da sua rede Tanssi e substituir INSERT_YOUR_NETWORK_BOOTNODES pela informação real de bootnode.
docker run --network="host" -v "/var/lib/tanssi-data:/data" \
-u $(id -u ${USER}):$(id -g ${USER}) \
moondancelabs/container-chain-evm-template \
--chain=INSERT_YOUR_APPCHAIN_SPECS_FILE \
--rpc-port=9944 \
--name=appchain \
--state-pruning=archive \
--blocks-pruning=archive \
--database=paritydb \
--unsafe-rpc-external \
--bootnodes=INSERT_YOUR_NETWORK_BOOTNODES \
-- \
--name=relay \
--chain=/data/starlight-raw-specs.json \
--rpc-port=9945 \
--sync=fast \
--database=paritydb \
--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 --network="host" -v "/var/lib/tanssi-data:/data" \
-u $(id -u ${USER}):$(id -g ${USER}) \
moondancelabs/container-chain-simple-template \
--chain=INSERT_YOUR_APPCHAIN_SPECS_FILE \
--rpc-port=9944 \
--name=appchain \
--state-pruning=archive \
--blocks-pruning=archive \
--database=paritydb \
--unsafe-rpc-external \
--bootnodes=INSERT_YOUR_NETWORK_BOOTNODES \
-- \
--name=relay \
--chain=/data/starlight-raw-specs.json \
--rpc-port=9945 \
--sync=fast \
--database=paritydb \
--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 --network="host" -v "/var/lib/dancelight-data:/data" \
-u $(id -u ${USER}):$(id -g ${USER}) \
moondancelabs/container-chain-evm-template \
--chain=INSERT_YOUR_APPCHAIN_SPECS_FILE \
--rpc-port=9944 \
--name=appchain \
--state-pruning=archive \
--blocks-pruning=archive \
--database=paritydb \
--unsafe-rpc-external \
--bootnodes=INSERT_YOUR_NETWORK_BOOTNODES \
-- \
--name=relay \
--chain=/data/dancelight-raw-specs.json \
--rpc-port=9945 \
--sync=fast \
--database=paritydb \
--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 --network="host" -v "/var/lib/dancelight-data:/data" \
-u $(id -u ${USER}):$(id -g ${USER}) \
moondancelabs/container-chain-simple-template \
--chain=INSERT_YOUR_APPCHAIN_SPECS_FILE \
--rpc-port=9944 \
--name=appchain \
--state-pruning=archive \
--blocks-pruning=archive \
--database=paritydb \
--unsafe-rpc-external \
--bootnodes=INSERT_YOUR_NETWORK_BOOTNODES \
-- \
--name=relay \
--chain=/data/dancelight-raw-specs.json \
--rpc-port=9945 \
--sync=fast \
--database=paritydb \
--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

Nota

Por padrão, apenas o estado histórico dos últimos 256 blocos finalizados é mantido. Para executar um nó de arquivo completo, defina a flag --state-pruning archive. Mais informações na seção de sinalizadores.

Obtendo informações de bootnode

As informações de bootnode podem ser lidas diretamente no Tanssi. Por exemplo, você pode usar o portal do desenvolvedor para obter os bootnodes de uma rede específica no Dancelight.

Para isso, siga estas etapas:

  1. Selecione dataPreservers como o módulo a consultar
  2. Defina a consulta de armazenamento como bootNodes
  3. Informe o ID da sua rede Tanssi
  4. Clique no sinal de +

Obtendo o bootnode

Exemplo de Nó Completo para Demo EVM Appchain

O exemplo abaixo inicia um nó RPC de arquivo completo para a rede demo EVM implantada no Dancelight (ID 2001). Assume que os arquivos de specs estão na pasta de dados.

docker run --network="host" -v "/var/lib/dancelight-data:/data" \
-u $(id -u ${USER}):$(id -g ${USER}) \
moondancelabs/container-chain-evm-template \
--chain=/data/container-2001-raw-specs.json \
--rpc-port=9944 \
--name=demoAppchain \
--state-pruning=archive \
--blocks-pruning=archive \
--database=paritydb \
--unsafe-rpc-external \
--bootnodes=/dns4/ukl-dancelight-2001-rpc-1.rv.dancelight.tanssi.network/tcp/30333/p2p/12D3KooWKDotMgTRpURvoZHsLWP4K9ymhkBByi1EJjMQAnCmqg8E \
--bootnodes=/dns4/qco-dancelight-2001-rpc-1.rv.dancelight.tanssi.network/tcp/30333/p2p/12D3KooWB3kqqNhYgGtGbsdtgD18wUoFVeuXVXgWLXTFs91RNgAx \
-- \
--chain=/data/dancelight-raw-specs.json \
--rpc-port=9945 \
--name=relay \
--sync=fast \
--database=paritydb \
--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

Executar Sinalizadores

As flags usadas no docker run podem ser ajustadas conforme suas preferências e hardware. Algumas das principais:

  • --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 -ti moondancelabs/container-chain-evm-template --help
docker run -ti moondancelabs/container-chain-simple-template --help

Sincronizando seu nó

Após iniciar, o processo de sincronização exibirá muitos logs do nó e da appchain Tanssi. Alguns erros iniciais são esperados e desaparecem quando a cadeia alcança 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 ⬆

Nota

A duração da sincronização é proporcional ao tamanho da cadeia que está sendo sincronizada.

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