Ir para o conteúdo

Execute um Nó Appchain Usando Systemd

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á a iniciar um nó appchain da Tanssi usando um binário executável e gerenciar o serviço com Systemd em sistemas Linux.

O artigo segue a boa prática de executar o serviço com uma conta não-root e conceder a essa conta acesso de gravação a um diretório específico. Você pode adaptar as etapas à sua configuração, preferências e políticas de segurança.

Nota

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

Verificando Pré-requisitos

Para começar, você precisará de acesso a um computador executando Ubuntu Linux com privilégios de root. Você também precisará de:

  • Arquivo binário do nó - as instruções executam a versão estável mais recente. Se quiser compilar e rodar o seu próprio arquivo, siga as instruções para construir seu nó appchain.
  • Arquivos de especificações de cadeia - o nó precisa de informações sobre duas blockchains diferentes para sincronizar e executar corretamente. A seção a seguir mostra como obtê-los.

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

Baixe a Versão Mais Recente

Cada nova versão inclui dois binários, um para redes compatíveis com EVM e outro para redes Substrate. Para começar, execute o comando que corresponde ao seu tipo de rede e torne-o executável:

wget https://github.com/moondance-labs/tanssi/releases/download/v0.15.0-para/container-chain-frontier-node && \
chmod +x ./container-chain-frontier-node
wget https://github.com/moondance-labs/tanssi/releases/download/v0.15.0-para/container-chain-simple-node && \
chmod +x ./container-chain-simple-node

Note

Recomenda-se usar as versões binárias otimizadas para as arquiteturas Skylake da Intel ou Zen3 da AMD para melhor desempenho.

Configurar o serviço Systemd

O Systemd é um sistema de gerenciamento para Linux que controla serviços (daemons), iniciando-os automaticamente quando o computador liga ou reinicia, ou reiniciando-os em caso de falhas inesperadas.

Os comandos a seguir configuram uma nova conta, o diretório e movem os arquivos baixados para o local correto.

Crie uma nova conta para executar o serviço:

adduser tanssi_service --system --no-create-home
adduser dancelight_service --system --no-create-home

Crie um diretório para armazenar os arquivos e dados necessários:

mkdir /var/lib/tanssi-data
mkdir /var/lib/dancelight-data

Defina a propriedade da pasta para a conta que executará o serviço, garantindo permissão de escrita:

sudo chown -R tanssi_service /var/lib/tanssi-data
sudo chown -R dancelight_service /var/lib/dancelight-data

Mova o arquivo de especificação da cadeia para a pasta:

mv ./starlight-raw-specs.json /var/lib/tanssi-data
mv ./dancelight-raw-specs.json /var/lib/dancelight-data

Mova também o binário do nó:

mv ./container-chain-frontier-node /var/lib/tanssi-data
mv ./container-chain-simple-node /var/lib/tanssi-data
mv ./container-chain-frontier-node /var/lib/dancelight-data
mv ./container-chain-simple-node /var/lib/dancelight-data

Por fim, mova o arquivo de especificações do seu appchain para a mesma pasta.

Crie o Arquivo de Configuração do Serviço Systemd

A próxima etapa é criar o arquivo de configuração do Systemd.

Você pode criar o arquivo executando:

sudo touch /etc/systemd/system/appchain.service

Em seguida, abra o arquivo no seu editor favorito e adicione a configuração do serviço.

Note que o comando ExecStart tem parâmetros que precisam ser ajustados para sua rede:

  • Arquivo de especificação - substitua INSERT_YOUR_APPCHAIN_SPECS_FILE_NAME pelo nome do arquivo do seu appchain. Para um appchain MainNet, o caminho será parecido com /var/lib/tanssi-data/SEU_ARQUIVO.json.

  • 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.

[Unit]
Description="Serviço systemd do Appchain"
After=network.target
StartLimitIntervalSec=0

[Service]
Type=simple
Restart=on-failure
RestartSec=10
User=tanssi_service
SyslogIdentifier=network
SyslogFacility=local7
KillSignal=SIGHUP
ExecStart=/var/lib/tanssi-data/container-chain-frontier-node \
--chain=/var/lib/tanssi-data/INSERT_YOUR_APPCHAIN_SPECS_FILE_NAME \
--rpc-port=9944 \
--name=para \
--base-path=/var/lib/tanssi-data \
--state-pruning=archive \
--blocks-pruning=archive \
--database=paritydb \
--unsafe-rpc-external \
--bootnodes=INSERT_YOUR_NETWORK_BOOTNODES \
-- \
--chain=/var/lib/tanssi-data/starlight-raw-specs.json \
--rpc-port=9945 \
--name=relay \
--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


[Install]
WantedBy=multi-user.target
[Unit]
Description="Serviço systemd do Appchain"
After=network.target
StartLimitIntervalSec=0

[Service]
Type=simple
Restart=on-failure
RestartSec=10
User=tanssi_service
SyslogIdentifier=network
SyslogFacility=local7
KillSignal=SIGHUP
ExecStart=/var/lib/tanssi-data/container-chain-simple-node \
--chain=/var/lib/tanssi-data/INSERT_YOUR_APPCHAIN_SPECS_FILE_NAME \
--rpc-port=9944 \
--name=para \
--base-path=/var/lib/tanssi-data \
--state-pruning=archive \
--blocks-pruning=archive \
--database=paritydb \
--unsafe-rpc-external \
--bootnodes=INSERT_YOUR_NETWORK_BOOTNODES \
-- \
--chain=/var/lib/tanssi-data/starlight-raw-specs.json \
--rpc-port=9945 \
--name=relay \
--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


[Install]
WantedBy=multi-user.target
[Unit]
Description="Serviço systemd do Appchain"
After=network.target
StartLimitIntervalSec=0

[Service]
Type=simple
Restart=on-failure
RestartSec=10
User=dancelight_service
SyslogIdentifier=network
SyslogFacility=local7
KillSignal=SIGHUP
ExecStart=/var/lib/dancelight-data/container-chain-frontier-node \
--chain=/var/lib/dancelight-data/INSERT_YOUR_APPCHAIN_SPECS_FILE_NAME \
--rpc-port=9944 \
--name=para \
--base-path=/var/lib/dancelight-data \
--state-pruning=archive \
--blocks-pruning=archive \
--database=paritydb \
--unsafe-rpc-external \
--bootnodes=INSERT_YOUR_NETWORK_BOOTNODES \
-- \
--chain=/var/lib/dancelight-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

[Install]
WantedBy=multi-user.target
[Unit]
Description="Serviço systemd do Appchain"
After=network.target
StartLimitIntervalSec=0

[Service]
Type=simple
Restart=on-failure
RestartSec=10
User=dancelight_service
SyslogIdentifier=network
SyslogFacility=local7
KillSignal=SIGHUP
ExecStart=/var/lib/dancelight-data/container-chain-simple-node \
--chain=/var/lib/dancelight-data/INSERT_YOUR_APPCHAIN_SPECS_FILE_NAME \
--rpc-port=9944 \
--name=para \
--base-path=/var/lib/dancelight-data \
--state-pruning=archive \
--blocks-pruning=archive \
--database=paritydb \
--unsafe-rpc-external \
--bootnodes=INSERT_YOUR_NETWORK_BOOTNODES \
-- \
--chain=/var/lib/dancelight-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

[Install]
WantedBy=multi-user.target

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 Configuração Completa para a Rede EVM de Demonstração

O exemplo a seguir implanta um nó de arquivo completo e funcional para a rede EVM de demonstração implantada no Dancelight com ID 2001.

O arquivo de especificação de cadeia bruta é necessário para executar o nó e pode ser baixado deste repositório público no GitHub. Baixe o arquivo e coloque-o em /var/lib/dancelight-data/.

[Unit]
Description="Serviço systemd do Appchain"
After=network.target
StartLimitIntervalSec=0

[Service]
Type=simple
Restart=on-failure
RestartSec=10
User=dancelight_service
SyslogIdentifier=network
SyslogFacility=local7
KillSignal=SIGHUP
ExecStart=/var/lib/dancelight-data/container-chain-frontier-node \
--chain=/var/lib/dancelight-data/container-2001-raw-specs.json \
--rpc-port=9944 \
--name=para \
--state-pruning=archive \
--blocks-pruning=archive \
--base-path=/var/lib/dancelight-data \
--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=/var/lib/dancelight-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

[Install]
WantedBy=multi-user.target

Flags de Execução

As flags usadas no comando ExecStart podem ser ajustadas conforme suas preferências e configuração de hardware. Algumas das mais importantes:

  • --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:

/var/lib/dancelight-data/container-chain-frontier-node --help
/var/lib/dancelight-data/container-chain-simple-node --help

Execute o Serviço

Finalmente, habilite o serviço e inicie-o pela primeira vez:

systemctl enable appchain.service && \
systemctl start appchain.service

Verifique se o serviço está funcionando corretamente executando:

systemctl status appchain.service
systemctl status network.service
● network.service - "Network systemd service"
   Loaded: loaded (/etc/systemd/system/network.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2024-02-18 18:16:40 EST; 14min ago
  Main PID: 4045278 (container-chain)
    Tasks: 44 (limit: 9462)
   Memory: 6.5G
   CGroup: /system.slice/network.service
           └─4045278 4045278 /var/lib/network-data/container-chain- ...

E verifique os logs, se necessário:

journalctl -f -u appchain.service
journalctl -f -u network.service
Feb 19 20:05:53 tutorials network[4066765]: 2024-02-19 20:05:53 Parachain Collator Template
Feb 19 20:05:53 tutorials network[4066765]: 2024-02-19 20:05:53 ✌️ version 0.1.0-3b1fbbfdfe7
Feb 19 20:05:53 tutorials network[4066765]: 2024-02-19 20:05:53 ❤️ by Moondance Labs,
2020-2024
Feb 19 20:05:53 tutorials network[4066765]: 2024-02-19 20:05:53 📋 Chain specification: Frontier Container 2001
Feb 19 20:05:53 tutorials network[4066765]: 2024-02-19 20:05:53 🏷 Node name: para
Feb 19 20:05:53 tutorials network[4066765]: 2024-02-19 20:05:53 👤 Role: FULL
Feb 19 20:05:53 tutorials network[4066765]: 2024-02-19 20:05:53 💾 Database: RocksDb at /var/lib/network-data/chains/frontier_container_2001/db/full
Feb 19 20:05:57 tutorials network[4066765]: 2024-02-19 20:05:57 Parachain id: Id(2001)
Feb 19 20:05:57 tutorials network[4066765]: 2024-02-19 20:05:57 Parachain Account: 5Ec4AhPQLGvfWywVhJZwufTDvknLT3BVPQcbV977JmBDUsHP
Feb 19 20:05:57 tutorials network[4066765]: 2024-02-19 20:05:57 Parachain genesis state V0: 0x000000000000000000000000000000000000000000000000000000000000000000e1324cc53e66
Feb 19 20:05:57 tutorials network[4066765]: 2024-02-19 20:05:57 Parachain genesis state V1: 0x000000000000000000000000000000000000000000000000000000000000000000327cfde8482b
Última atualização: 9 de dezembro de 2025
| Criada: 9 de dezembro de 2025