Este laboratório foi desenvolvido com nosso parceiro, a Block.one. Suas informações pessoais podem ser compartilhadas com a Block.one, patrocinadora do laboratório, caso você tenha escolhido receber atualizações de produtos, anúncios e ofertas no seu perfil de conta.
GSP991
Visão geral
Neste laboratório, você vai transformar o blockchain EOSIO de nó único em um de vários nós. Você vai instalar vários componentes de software do EOSIO para configurar seu blockchain EOSIO de vários nós. Por fim, você vai realizar algumas tarefas de operador de nó no novo blockchain EOSIO.
Objetivos
Neste laboratório, você vai aprender a fazer o seguinte:
- Carregar uma máquina virtual do Compute Engine.
- Instalar e criar os contratos do sistema EOSIO.
- Implantar um blockchain de vários nós com quatro nós do EOSIO.
- Criar contas de usuário no blockchain EOSIO de vários nós.
- Chamar uma ação para transferir tokens entre contas de usuário.
Pré-requisitos
Antes de começar este laboratório, recomendamos que você conclua o laboratório Block.one: Introdução ao blockchain EOSIO.
Também é recomendável conhecer os seguintes conceitos:
Configuração e requisitos
Antes de clicar no botão Começar o Laboratório
Leia estas instruções. Os laboratórios são cronometrados e não podem ser pausados. O timer é ativado quando você clica em Iniciar laboratório e mostra por quanto tempo os recursos do Google Cloud vão ficar disponíveis.
Este laboratório prático permite que você realize as atividades em um ambiente real de nuvem, e não em uma simulação ou demonstração. Você vai receber novas credenciais temporárias para fazer login e acessar o Google Cloud durante o laboratório.
Confira os requisitos para concluir o laboratório:
- Acesso a um navegador de Internet padrão (recomendamos o Chrome).
Observação: para executar este laboratório, use o modo de navegação anônima (recomendado) ou uma janela anônima do navegador. Isso evita conflitos entre sua conta pessoal e de estudante, o que poderia causar cobranças extras na sua conta pessoal.
- Tempo para concluir o laboratório: não se esqueça que, depois de começar, não será possível pausar o laboratório.
Observação: use apenas a conta de estudante neste laboratório. Se usar outra conta do Google Cloud, você poderá receber cobranças nela.
Como iniciar seu laboratório e fazer login no console do Google Cloud
-
Clique no botão Começar laboratório. Se for preciso pagar por ele, uma caixa de diálogo vai aparecer para você selecionar a forma de pagamento.
À direita, você encontra o painel Configuração e acesso ao laboratório com as seguintes informações:
- O botão Abrir console do Google Cloud
- As credenciais temporárias (nome de usuário e senha) que você vai usar no laboratório
- Outros dados, se necessários
O timer do laboratório fica na parte de cima da página e mostra o tempo restante.
-
Se você estiver usando o navegador Chrome, clique em Abrir console do Google Cloud ou clique com o botão direito do mouse e selecione Abrir link em uma janela anônima.
O laboratório ativa os recursos e depois abre a página "Login" em outra guia.
Dica: coloque as guias em janelas separadas lado a lado.
Observação: se aparecer a caixa de diálogo Escolher uma conta, clique em Usar outra conta.
-
Se necessário, copie o Nome de usuário abaixo e cole na caixa de diálogo Login.
{{{user_0.username | "Username"}}}
Você também encontra o nome de usuário no painel Configuração e acesso ao laboratório.
-
Clique em Avançar.
-
Copie a Senha abaixo e cole na caixa de diálogo Olá!.
{{{user_0.password | "Password"}}}
Você também encontra a senha no painel Configuração e acesso ao laboratório.
-
Clique em Avançar.
Importante: você precisa usar as credenciais fornecidas no laboratório, e não as da sua conta do Google Cloud.
Observação: se você usar sua própria conta do Google Cloud neste laboratório, talvez receba cobranças adicionais.
-
Acesse as próximas páginas:
- Aceite os Termos e Condições.
- Não adicione opções de recuperação nem autenticação de dois fatores (porque essa é uma conta temporária).
- Não se inscreva em testes sem custo financeiro.
Depois de alguns instantes, o console do Google Cloud será aberto nesta guia.
Observação: para acessar os produtos e serviços do Google Cloud, clique no Menu de navegação ou digite o nome do serviço ou produto no campo Pesquisar.
Contexto
Esta seção oferece uma visão geral dos conceitos abordados neste laboratório.
Blockchain EOSIO
Um blockchain EOSIO é uma máquina de estado distribuída, determinística e altamente eficiente que pode operar de maneira descentralizada. Ele acompanha as transações em uma sequência de blocos trocados. Cada bloco faz um commit criptográfico dos blocos anteriores na mesma cadeia. Portanto, é impossível modificar uma transação registrada em um determinado bloco sem violar as verificações criptográficas de blocos sucessivos. Esse simples fato torna as transações de blockchain imutáveis e seguras. A produção e a validação de blocos são realizadas por nós especiais chamados de produtores de blocos.
Consenso do EOSIO
A validação de blocos é um desafio em qualquer grupo de nós distribuídos. Um modelo de consenso precisa estar em vigor para validar esses blocos de maneira tolerante a falhas no sistema descentralizado. O consenso é a maneira como esses nós e usuários distribuídos concordam com o estado atual do blockchain. Dois dos modelos de consenso mais comuns usados em blockchains são a prova de trabalho (PoW, na sigla em inglês) e a prova de participação (PoS, na sigla em inglês). Na prova de participação, os nós com a maior participação ou porcentagem de um ativo têm poder de decisão equivalente. Uma variante interessante é a prova de participação delegada (DPoS, na sigla em inglês), em que um grande número de participantes ou partes interessadas elege um número menor de delegados, que, por sua vez, tomam decisões por eles. O EOSIO usa a prova de participação delegada (DPoS, na sigla em inglês) para eleger os produtores ativos que serão autorizados a produzir, validar e assinar blocos para serem adicionados ao blockchain.
Contas, chaves e permissões do EOSIO
Uma conta identifica um participante em um blockchain EOSIO. O participante pode ser uma pessoa ou um grupo, dependendo das permissões atribuídas na conta. As contas também representam os atores de contratos inteligentes que enviam e recebem ações de e para outras contas no blockchain. As chaves no EOSIO são strings binárias representadas em Base58 usadas para assinatura e verificação de transações, blocos e outras mensagens. Elas são criadas em uma carteira digital associada a uma conta. Como a propriedade da conta é definida apenas pelo nome dela, as chaves associadas a ela podem ser atualizadas sem comprometer a segurança. Um novo esquema de permissões que envolve contas, permissões e tabelas de autoridade determina o que as contas podem fazer e como as ações que compõem uma transação são autorizadas. Para isso, cada conta recebe uma estrutura hierárquica de permissões, e cada permissão recebe um par de chaves pública e privada usado para assinatura e verificação.
Contratos inteligentes do EOSIO
Um contrato inteligente é uma biblioteca de software de baixo nível que contém a implementação das ações que fazem uma transação. Ele também define como os dados acessados e tratados pelas ações são armazenados. No EOSIO, um contrato inteligente é implementado em uma linguagem de alto nível, como C++, e compilado em um binário WebAssembly (WASM). Depois disso, os contratos inteligentes podem ser implantados e executados no sandbox de uma conta no blockchain.
Tarefa 1: Criar uma máquina virtual
-
No Menu de navegação (
), clique em Compute Engine > Instâncias de VM.
-
Para criar uma instância, clique em Criar instância.
-
Na Configuração da máquina.
Selecione os seguintes valores:
-
Nome:
instance-1
-
Região:
-
Zona:
-
Família de máquinas:
Uso geral (padrão)
-
Série:
E2
-
Tipo de máquina:
e2-standard-2 (2 vCPUs, 8 GB de memória)
-
Clique em SO e armazenamento.
Selecione Alterar para começar a configurar o disco de inicialização e selecione os seguintes valores:
-
Sistema operacional:
Ubuntu
-
Versão:
Ubuntu 22.04 LTS
-
Arquitetura:
x86/64
Clique em Selecionar.
-
Para criar e iniciar a VM, clique em Criar.
Observação: a VM pode demorar cerca de dois minutos para ser iniciada e ficar disponível para uso.
Clique em Verificar meu progresso para conferir o objetivo.
Criar uma máquina virtual
Tarefa 2: Instalar a plataforma EOSIO
- No Menu de navegação (
), clique em Compute Engine > Instâncias de VM.
A instância de VM que você criou vai aparecer.
-
Para abrir um prompt de comando na instância instance-1 da VM, clique em SSH na linha correspondente da lista Instâncias de VM. Uma janela de terminal do shell será aberta.
-
Primeiro, atualize a lista de pacotes de software na caixa da VM:
sudo apt update
- Instale a dependência
libssl1.1, que é obrigatória no EOSIO 2.1.0, mas não está incluída no Ubuntu 22.04+ por padrão:
wget http://nz2.archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2.24_amd64.deb
sudo apt install ./libssl1.1_1.1.1f-1ubuntu2.24_amd64.deb
- Receba os binários de software do EOSIO. Eles incluem o nodeos, o software p2p do nó, o cleos, o cliente da CLI, o keosd, o gerenciador de carteira e outras ferramentas:
curl -LO https://github.com/eosio/eos/releases/download/v2.1.0/eosio_2.1.0-1-ubuntu-20.04_amd64.deb
- Instale os binários de software do EOSIO. Pressione Enter se necessário para instalar as dependências de software obrigatórias:
sudo apt install ./eosio_2.1.0-1-ubuntu-20.04_amd64.deb
- Confirme se o nodeos está instalado:
nodeos --version
A resposta será a versão do nodeos:
v2.1.0
- Confirme se o cleos está instalado:
cleos version client
A resposta será a versão do cleos:
v2.1.0
- Confirme se o keosd está instalado:
keosd -v
A resposta será a versão do keosd:
v2.1.0
Clique em Verificar meu progresso para conferir o objetivo.
Instalar a plataforma EOSIO
Tarefa 3: Criar uma carteira padrão
As carteiras armazenam as chaves criptográficas usadas por contas e produtores para assinar transações e blocos, respectivamente. Elas também fornecem um enclave seguro para realizar a assinatura, para que as chaves privadas nunca saiam da carteira. Para mudar o estado no blockchain, você precisa de uma carteira para armazenar chaves criptográficas e realizar a assinatura digital.
- Primeiro, defina um tempo limite de desbloqueio longo para qualquer carteira gerenciada pelo keosd, o gerenciador de carteiras do EOSIO:
keosd --unlock-timeout 999999999 &
Assim, você não precisa desbloquear a carteira a cada 15 minutos, que é o tempo limite padrão. Essa ação também vai iniciar o serviço de daemon keosd. A resposta será semelhante a esta:
info thread-0 wallet_plugin.cpp:38 plugin_initialize ] initializing wallet plugin
info thread-0 wallet_api_plugin.cpp:84 plugin_startup ] starting wallet_api_plugin
info thread-0 http_plugin.cpp:983 add_handler ] add api url: /v1/wallet/create
...
info thread-0 http_plugin.cpp:983 add_handler ] add api url: /v1/wallet/unlock
info thread-0 http_plugin.cpp:983 add_handler ] add api url: /v1/node/get_supported_apis
Pressione Enter, se necessário, para voltar ao comando do shell.
- Crie uma carteira padrão e gere a senha dela em um arquivo chamado my_wallet_password:
cleos wallet create --file my_wallet_password
Essa ação vai criar uma carteira chamada default. A resposta deve ser:
Creating wallet: default
Save password to use in the future to unlock this wallet.
Without password imported keys will not be retrievable.
saving password to my_wallet_password
Depois que a carteira for criada, ela será aberta e desbloqueada pelo keosd por padrão.
- Para exibir todas as carteiras gerenciadas, execute este comando:
cleos wallet list
A resposta deve ser:
Wallets:
[
"default *"
]
O asterisco ao lado do nome indica que a carteira está desbloqueada.
Clique em Verificar meu progresso para conferir o objetivo.
Criar uma carteira padrão
Tarefa 4: Adicionar a chave privada da conta do sistema EOSIO à carteira
Cada novo blockchain EOSIO tem uma conta de sistema padrão chamada eosio, que é usada inicialmente para configurar o blockchain. Por padrão, ela está associada à seguinte chave privada: 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3.
Importe essa chave privada para sua carteira e assine transações em nome da conta eosio.
- Use o comando cleos wallet open para abrir a carteira default. Note que a carteira já está aberta e desbloqueada. No entanto, se a carteira for bloqueada de novo, você precisará executar o seguinte procedimento:
cleos wallet open
A resposta deve ser:
Opened: default
- Desbloqueie a carteira default usando o comando cleos wallet unlock e transmitindo a senha da carteira armazenada no arquivo my_wallet_password:
cleos wallet unlock <my_wallet_password
A resposta deve ser:
password: Unlocked: default
- Use o comando cleos wallet import para importar a chave privada do eosio,
5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3 para a carteira default:
cleos wallet import --private-key 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
A resposta deve ser:
imported private key for: EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
Essa é a chave pública correspondente à chave privada importada. Ignore os avisos sobre o uso de uma carteira padrão. Em implantações de produção, talvez seja melhor dar um nome diferente à sua carteira em vez de usar default.
Clique em Verificar meu progresso para conferir o objetivo.
Adicionar a chave privada da conta do sistema EOSIO à carteira
Tarefa 5: Instalar o EOSIO Contract Development Toolkit (CDT)
O kit de ferramentas EOSIO CDT inclui o compilador CDT C++, que pode ser usado para criar os contratos do sistema e, mais tarde, seus contratos inteligentes em C++. Os contratos do sistema são muito importantes porque permitem a funcionalidade do software da segunda camada, o que possibilita a adição e o suporte de outros recursos.
- Primeiro, instale o pacote build-essential. Esse pacote contém várias ferramentas necessárias para criar o software em C/C++ no seu computador com Linux.
sudo apt install build-essential
- Extraia os binários do EOSIO CDT:
curl -LO https://github.com/eosio/eosio.cdt/releases/download/v1.8.1/eosio.cdt_1.8.1-1-ubuntu-18.04_amd64.deb
- Instale os binários do EOSIO CDT:
sudo apt install ./eosio.cdt_1.8.1-1-ubuntu-18.04_amd64.deb
- Confirme se o compilador EOSIO CDT está instalado:
eosio-cpp --version
A resposta deve ser a versão do compilador EOSIO CDT:
eosio-cpp version 1.8.1
Clique em Verificar meu progresso para conferir o objetivo.
Instalar o EOSIO Contract Development Toolkit
Tarefa 6: Criar os contratos do sistema e o eosio.boot
Para ter um blockchain EOSIO funcional com vários nós, é necessário implantar os contratos do sistema EOSIO. Entre outras coisas, os contratos do sistema fornecem a funcionalidade da camada 2 necessária para o consenso do EOSIO, a capacidade de fazer staking de tokens, votar, criar os próprios tokens etc, e possibilitam o suporte a novos recursos.
- Instale o CMake, uma dependência de software usada pelo script de build eosio.contracts:
sudo apt install cmake
- Faça o download do sistema eosio.contracts mais recente:
git clone https://github.com/EOSIO/eosio.contracts.git \
--branch release/1.9.x --single-branch
- Crie o sistema eosio.contracts. Nesta etapa, também é necessário transmitir os diretórios de instalação de eosio e eosio.cdt.
cd eosio.contracts
./build.sh -e /usr/opt/eosio/2.1.0 -c /usr/opt/eosio.cdt/1.8.1
cd ~
Ignore os avisos sobre contratos ricardianos ausentes, se houver. A resposta será semelhante a esta (sem os avisos):
Using EOSIO.CDT installation at: /usr/opt/eosio.cdt/1.8.1
=========== Building eosio.contracts ===========
...
-- Building eosio.contracts v1.9.2
...
-- Unit tests will not be built. To build tests, set BUILD_TESTS to true.
-- Configuring done
-- Generating done
-- Build files have been written to: ./eosio.contracts/build
[ 11%] Performing build step for 'contracts_project'
[ 18%] Built target eosio.bios
[ 18%] Built target eosio.msig
[ 36%] Built target powup.results
[ 36%] Built target rex.results
[ 54%] Built target eosio.token
[ 90%] Built target eosio.system
[100%] Built target eosio.wrap
[ 22%] No install step for 'contracts_project'
[ 33%] No test step for 'contracts_project'
[ 44%] Completed 'contracts_project'
[100%] Built target contracts_project`
Anote o local em que os contratos do sistema EOSIO são criados. Você vai precisar dele mais tarde para implantar contratos específicos do sistema: ~/eosio.contracts/build/contracts.
- Crie o contrato do sistema eosio.boot:
git clone https://github.com/EOSIO/eos.git \
--branch release/2.1.x --single-branch
cd eos/contracts/contracts/eosio.boot
cmake .
make
cd ~
Ignore os avisos. A resposta será semelhante a esta:
-- Configuring done
-- Generating done
-- Build files have been written to: ~/eos/contracts/contracts/eosio.boot
- Anote o local em que o contrato eosio.boot foi criado. Você precisará implantá-lo mais tarde:
~/eos/contracts/contracts/eosio.boot.
Clique em Verificar meu progresso para conferir o objetivo.
Criar os contratos do sistema e o eosio.boot
Tarefa 7: Iniciar o nó de inicialização e criar contas do sistema
Nesta tarefa, você vai iniciar o nó de genesis de inicialização e criar as contas do sistema. Ao contrário do que acontece na criação de carteiras, é necessário enviar uma transação para o blockchain para criar uma conta.
Portanto, pelo menos o nó de inicialização precisa estar em execução. Para isso, primeiro crie o diretório de dados e o arquivo genesis que serão usados por todos os nós. Em um ambiente de produção, cada nó é hospedado em um servidor próprio e usa recursos próprios. Agora você vai implantar todos os nós na mesma máquina.
- Crie o diretório nodes, que vai armazenar o banco de dados do blockchain, o arquivo de registro e o arquivo de configuração de cada nó.
mkdir nodes
- Crie o arquivo genesis.json padrão no diretório nodes:
cat >nodes/genesis.json
- Copie e cole o seguinte conteúdo JSON no terminal, pressione Enter e depois Ctrl-D para salvar o arquivo genesis.json:
{
"initial_timestamp": "2018-06-01T12:00:00.000",
"initial_key": "EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV",
"initial_configuration": {
"max_block_net_usage": 1048576,
"target_block_net_usage_pct": 1000,
"max_transaction_net_usage": 524288,
"base_per_transaction_net_usage": 12,
"net_usage_leeway": 500,
"context_free_discount_net_usage_num": 20,
"context_free_discount_net_usage_den": 100,
"max_block_cpu_usage": 200000,
"target_block_cpu_usage_pct": 1000,
"max_transaction_cpu_usage": 150000,
"min_transaction_cpu_usage": 100,
"max_transaction_lifetime": 3600,
"deferred_trx_expiration_window": 600,
"max_transaction_delay": 3888000,
"max_inline_action_size": 524288,
"max_inline_action_depth": 4,
"max_authority_depth": 6
},
"initial_chain_id": "0000000000000000000000000000000000000000000000000000000000000000"
}
A "initial_key" indica a chave pública de desenvolvimento inicial usada pela conta eosio. Agora substitua a chave de desenvolvimento pela sua, se necessário, o que é recomendado para implantações de produção. Essa chave precisa estar na carteira usada pela conta eosio. Ela foi importada em uma seção anterior.
- Verifique se o arquivo genesis.json foi criado e preenchido:
cat nodes/genesis.json
O conteúdo será o mesmo da etapa anterior.
- Crie o diretório do nó de inicialização nodes/00-boot para armazenar todos os dados do blockchain relacionados ao nó de inicialização:
mkdir nodes/00-boot
- Inicie o nó de inicialização, ativando o daemon de serviço nodeos como uma tarefa em segundo plano e redirecionando stdout/stderr para o arquivo 00-boot/00.log:
nodeos \
--plugin eosio::http_plugin --plugin eosio::chain_api_plugin --plugin eosio::chain_plugin --plugin eosio::producer_api_plugin --plugin eosio::producer_plugin --plugin eosio::history_plugin --plugin eosio::history_api_plugin --plugin eosio::net_api_plugin \
--contracts-console \
--max-transaction-time=200 \
--chain-state-db-size-mb 1024 \
--enable-stale-production \
--producer-name eosio \
--genesis-json ~/nodes/genesis.json \
--blocks-dir ~/nodes/00-boot/blocks \
--config-dir ~/nodes/00-boot \
--data-dir ~/nodes/00-boot \
--http-server-address 127.0.0.1:8888 \
--p2p-listen-endpoint 127.0.0.1:9876 \
--signature-provider EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3 \
>>~/nodes/00-boot/00.log 2>&1 &
Essa ação vai iniciar o nó de inicialização com alguns plug-ins, o nome do produtor eosio, a detecção na porta HTTP 8888, a porta p2p 9876 e usando as chaves de desenvolvimento padrão EOS6MRy... e 5KQwrP... para assinatura de blocos. Se ele não for substituído por --signature-provider, as chaves de desenvolvimento eosio padrão serão usadas.
- Verifique se o nó de inicialização está em execução e produzindo blocos:
tail -f nodes/00-boot/00.log
A resposta será semelhante a esta.
Resposta:
...
info 2021-03-08T02:44:11.900 nodeos producer_plugin.cpp:2333 produce_block ] Produced block e0dc6324ce3c8f35... #588 @ 2021-03-08T02:44:12.000 signed by eosio [trxs: 0, lib: 587, confirmed: 0]
A última linha revela o último número de bloco produzido e o último bloco irreversível (lib) atual, que marca o bloco final e o fim do blockchain.
-
Pressione Ctrl+C para sair do programa tail.
-
Agora que o nó de inicialização está em execução, é possível receber informações sobre a conta eosio armazenada no banco de dados da cadeia:
cleos get account eosio
A resposta deve ser:
created: 2018-06-01T12:00:00.000
privileged: true
permissions:
owner 1: 1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
active 1: 1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
memory:
quota: unlimited used: 2.66 KiB
net bandwidth:
used: unlimited
available: unlimited
limit: unlimited
cpu bandwidth:
used: unlimited
available: unlimited
limit: unlimited
A conta eosio é uma conta privilegiada, e as chaves associadas às permissões owner e active são as mesmas chaves de desenvolvimento padrão importadas para a carteira. Assim, a conta eosio pode autorizar transações enquanto o blockchain de vários nós está sendo configurado.
- Crie outras contas de sistema. Elas também serão armazenadas no banco de dados do blockchain.
cleos create account eosio eosio.bpay EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
cleos create account eosio eosio.msig EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
cleos create account eosio eosio.names EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
cleos create account eosio eosio.ram EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
cleos create account eosio eosio.ramfee EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
cleos create account eosio eosio.saving EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
cleos create account eosio eosio.stake EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
cleos create account eosio eosio.token EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
cleos create account eosio eosio.vpay EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
cleos create account eosio eosio.rex EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
Atribua o mesmo par de chaves de desenvolvimento a todas as contas do sistema e às permissões owner e active. Em implantações de produção, é recomendável atribuir um par de chaves diferente a cada permissão para aumentar a segurança. Também é possível usar chaves diferentes para cada conta do sistema.
A resposta para os comandos acima será semelhante a esta:
executed transaction: 98f22027c6703e554042b1d4a93beb70b1dc30be0fe65267932155c9d70e6493 200 bytes 153 us
# eosio <= eosio::newaccount {"creator":"eosio","name":"eosio.bpay","owner":{"threshold":1,"keys":[{"key":"EOS6MRyAjQq8ud7hVNYcfn...
warning: transaction executed locally, but may not be confirmed by the network yet ]
...
executed transaction: 2f0cb00110374976f3cd9195bccac81fe0ee330c515b4a656d6d41f6181f636d 200 bytes 189 us
# eosio <= eosio::newaccount {"creator":"eosio","name":"eosio.rex","owner":{"threshold":1,"keys":[{"key":"EOS6MRyAjQq8ud7hVNYcfnV...
warning: transaction executed locally, but may not be confirmed by the network yet ]
Ignore os avisos. Você vai usar essas contas nas próximas tarefas.
Clique em Verificar meu progresso para conferir o objetivo.
Criar os contratos do sistema e o eosio.boot
Tarefa 8: Implantar os contratos eosio.token e eosio.msig e criar/emitir o token SYS
Nesta tarefa, você vai criar e emitir um token SYS fictício. Para isso, também é necessário implantar os contratos de sistema eosio.token e eosio.msig criados anteriormente.
- Implante o contrato eosio.token. Ele permite criar, emitir e transferir tokens novos ou atuais.
cleos set contract eosio.token ~/eosio.contracts/build/contracts/eosio.token/
A resposta será semelhante a esta:
Reading WASM from ~/eosio.contracts/build/contracts/eosio.token/eosio.token.wasm...
Publishing contract...
executed transaction: 11aca7fb68e0821cf8f74be0188741964787f830d0918abdfccae4a54c25e291 19360 bytes 4445 us
# eosio <= eosio::setcode {"account":"eosio.token","vmtype":0,"vmversion":0,"code":"0061736d010000000180022860000060037f7f7f01...
# eosio <= eosio::setabi {"account":"eosio.token","abi":"0e656f73696f3a3a6162692f312e320008076163636f756e7400010762616c616e63...
- Implante o contrato eosio.msig. Esse contrato permite realizar várias assinaturas entre contas e simplifica o gerenciamento de permissões.
cleos set contract eosio.msig ~/eosio.contracts/build/contracts/eosio.msig/
A resposta será semelhante a esta:
Reading WASM from ~/eosio.contracts/build/contracts/eosio.msig/eosio.msig.wasm...
Publishing contract...
executed transaction: c2260b7d05bb38d2df097799baedd890ce7560bedbd1b79e7d07e4f6a5b25238 23256 bytes 3684 us
# eosio <= eosio::setcode {"account":"eosio.msig","vmtype":0,"vmversion":0,"code":"0061736d0100000001b8022f60000060037f7f7f017...
# eosio <= eosio::setabi {"account":"eosio.msig","abi":"0e656f73696f3a3a6162692f312e32001006616374696f6e0004076163636f756e740...
- Crie o token SYS com uma distribuição total de 10 bilhões de tokens:
cleos push action eosio.token create '["eosio", "10000000000.0000 SYS"]' -p eosio.token
O comando acima envia uma transação com a ação create do contrato eosio.token, autorizada pela permissão ativa da conta eosio.token.
A resposta será semelhante a esta:
executed transaction: 6a4766a00c8fe26343d5eb6c1ad5e53b35064dc6f3a5f55908eff2edba30efca 120 bytes 603 us
# eosio.token <= eosio.token::create {"issuer":"eosio","maximum_supply":"10000000000.0000 SYS"}
- Transfira 1 bilhão de tokens SYS de reserva para circulação:
cleos push action eosio.token issue '["eosio", "1000000000.0000 SYS", "memo"]' -p eosio
O comando acima envia uma transação com a ação issue do contrato eosio.token, autorizada pela permissão ativa da conta eosio.
A resposta será semelhante a esta:
executed transaction: 4613fcff26bc6f96010273b475e839018f0afe2ef2af840d481070c9c54e36f1 128 bytes 405 us
# eosio.token <= eosio.token::issue {"to":"eosio","quantity":"1000000000.0000 SYS","memo":"memo"}
Clique em Verificar meu progresso para conferir o objetivo.
Criar e implantar os contratos eosio.token e eosio.msig e o token SYS
Tarefa 9: Ativar recursos de protocolo e implantar contratos eosio.boot e eosio.system
Os recursos do protocolo trazem outras funcionalidades opcionais para blockchains EOSIO. Nesta tarefa, você vai ativar alguns recursos de protocolo altamente recomendados para esse tipo de blockchain. Para isso, primeiro implante o contrato eosio.boot e depois ative esses recursos. Por fim, você vai implantar o contrato eosio.system para concluir a segunda camada do blockchain EOSIO.
Essa ação possibilita o uso de recursos do sistema (CPU, RAM, NET), fazer e encerrar o staking de tokens, comprar recursos, registrar e depois votar em potenciais produtores, resgatar recompensas dos produtores, definir privilégios e limites etc. Os recursos do protocolo precisam ser ativados pelo consenso do EOSIO pela maioria qualificada dos produtores. Nesse caso, você só precisa do nó de inicialização em execução.
- Primeiro, instale a ferramenta jq para analisar strings JSON de maneira mais legível:
sudo apt install jq
- Agora vamos verificar quais recursos do protocolo têm suporte:
curl -X POST http://127.0.0.1:8888/v1/producer/get_supported_protocol_features -d '{"exclude_disabled": false, "exclude_unactivatable": false}' | jq | more
O comando acima envia uma solicitação HTTP POST para o endpoint get_supported_protocol_features fornecido pelo plug-in da API Producer.
A resposta vai mostrar todos os recursos de protocolo com suporte na rede EOSIO atual (composta pelo nó de inicialização até o momento).
Verifique a resposta (pressione a barra de espaço várias vezes) até que o comando do shell apareça novamente.
Resposta:
[{"feature_digest": "0ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd", "subjective_restrictions": {"enabled": true, "preactivation_required": false, "earliest_allowed_activation_time": "1970-01-01T00:00:00.000"}, "description_digest": "64fe7df32e9b86be2b296b3f81dfd527f84e82b98e363bc97e40bc7a83733310", "dependencies": [], "protocol_feature_type": "builtin", "specification": [{"name": "builtin_feature_codename", "value": "PREACTIVATE_FEATURE"}]},
...
{"feature_digest": "ded2e25adcd78cbb94fa7f63a8f80a9af2b1a905e551a6e124e7d7829da1ea02", "subjective_restrictions": {"enabled": true, "preactivation_required": true, "earliest_allowed_activation_time": "1970-01-01T00:00:00.000"}, "description_digest": "72ec6337e369cbb33ef7716d3267db9d5678fe54555c25ca4c9f5b9dfb7739f3", "dependencies": [], "protocol_feature_type": "builtin", "specification": [{"name": "builtin_feature_codename", "value": "SECURITY_GROUP"}]},
...
{"feature_digest": "f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d", "subjective_restrictions": {"enabled": true, "preactivation_required": true, "earliest_allowed_activation_time": "1970-01-01T00:00:00.000"}, "description_digest": "1eab748b95a2e6f4d7cb42065bdee5566af8efddf01a55a0a8d831b823f8828a", "dependencies": [], "protocol_feature_type": "builtin", "specification": [{"name": "builtin_feature_codename", "value": "GET_SENDER"}]}]
- Ative o recurso PREACTIVATE_FEATURE. Essa ação permite que outros recursos sejam ativados, incluindo possíveis upgrades no contrato eosio.system que podem implementar novos recursos. Além disso, um recurso de protocolo precisa ser ativado. Para tal, transmita um resumo ou hashcode do recurso específico.
curl -X POST http://127.0.0.1:8888/v1/producer/schedule_protocol_feature_activations -d '{"protocol_features_to_activate": ["0ec7e080177b2c02b278d5088611686b49d739925a92d9bfcacd7fc6b74053bd"]}'
O hashcode do resumo do recurso 0ec7e... pode ser encontrado no campo feature_digest retornado pelo endpoint get_supported_protocol_features na etapa anterior. Se a ativação for bem-sucedida, a resposta deverá ser a seguinte.
Resposta:
{"result": "ok"}
Se o recurso já tiver sido ativado, você receberá a seguinte resposta, que pode ser ignorada com segurança.
Resposta:
{"code": 500, "message": "Internal Service Error", "error": {"code": 3250000, "name": "protocol_feature_exception", "what": "Protocol feature exception", "details": [{"message": "protocol feature with digest '<hex-value>' has already been activated", "file": "controller.cpp", "line_number": 1650, "method": "check_protocol_features"}]}}
- Implante o contrato eosio.boot:
cleos set contract eosio ~/eos/contracts/contracts/eosio.boot/
A resposta será semelhante a esta:
Reading WASM from ~/eos/contracts/contracts/eosio.boot/eosio.boot.wasm...
Publishing contract...
executed transaction: a029c644104da357a201f75058fc6772cf63f5fdfa9135be2c3b7c498d81d46d 2752 bytes 852 us
# eosio <= eosio::setcode {"account":"eosio","vmtype":0,"vmversion":0,"code":"0061736d01000000013e0c60000060027f7f0060017e0060...
# eosio <= eosio::setabi {"account":"eosio","abi":"0e656f73696f3a3a6162692f312e32001008616374697661746500010e666561747572655f...
- É possível ativar outros recursos do protocolo, como KV_DATABASE, ACTION_RETURN_VALUE etc., após implantar o contrato eosio.boot.
# KV_DATABASE
cleos push action eosio activate '["825ee6288fb1373eab1b5187ec2f04f6eacb39cb3a97f356a07c91622dd61d16"]' -p eosio
# ACTION_RETURN_VALUE
cleos push action eosio activate '["c3a6138c5061cf291310887c0b5c71fcaffeab90d5deb50d3b9e687cead45071"]' -p eosio
# CONFIGURABLE_WASM_LIMITS
cleos push action eosio activate '["bf61537fd21c61a60e542a5d66c3f6a78da0589336868307f94a82bccea84e88"]' -p eosio
# BLOCKCHAIN_PARAMETERS
cleos push action eosio activate '["5443fcf88330c586bc0e5f3dee10e7f63c76c00249c87fe4fbf7f38c082006b4"]' -p eosio
# GET_SENDER
cleos push action eosio activate '["f0af56d2c5a48d60a4a5b5c903edfb7db3a736a94ed589d0b797df33ff9d3e1d"]' -p eosio
# FORWARD_SETCODE
cleos push action eosio activate '["2652f5f96006294109b3dd0bbde63693f55324af452b799ee137a81a905eed25"]' -p eosio
# ONLY_BILL_FIRST_AUTHORIZER
cleos push action eosio activate '["8ba52fe7a3956c5cd3a656a3174b931d3bb2abb45578befc59f283ecd816a405"]' -p eosio
# RESTRICT_ACTION_TO_SELF
cleos push action eosio activate '["ad9e3d8f650687709fd68f4b90b41f7d825a365b02c23a636cef88ac2ac00c43"]' -p eosio
# DISALLOW_EMPTY_PRODUCER_SCHEDULE
cleos push action eosio activate '["68dcaa34c0517d19666e6b33add67351d8c5f69e999ca1e37931bc410a297428"]' -p eosio
# FIX_LINKAUTH_RESTRICTION
cleos push action eosio activate '["e0fb64b1085cc5538970158d05a009c24e276fb94e1a0bf6a528b48fbc4ff526"]' -p eosio
# REPLACE_DEFERRED
cleos push action eosio activate '["ef43112c6543b88db2283a2e077278c315ae2c84719a8b25f25cc88565fbea99"]' -p eosio
# NO_DUPLICATE_DEFERRED_ID
cleos push action eosio activate '["4a90c00d55454dc5b059055ca213579c6ea856967712a56017487886a4d4cc0f"]' -p eosio
# ONLY_LINK_TO_EXISTING_PERMISSION
cleos push action eosio activate '["1a99a59d87e06e09ec5b028a9cbb7749b4a5ad8819004365d02dc4379a8b7241"]' -p eosio
# RAM_RESTRICTIONS
cleos push action eosio activate '["4e7bf348da00a945489b2a681749eb56f5de00b900014e137ddae39f48f69d67"]' -p eosio
# WEBAUTHN_KEY
cleos push action eosio activate '["4fca8bd82bbd181e714e283f83e1b45d95ca5af40fb89ad3977b653c448f78c2"]' -p eosio
# WTMSIG_BLOCK_SIGNATURES
cleos push action eosio activate '["299dcb6af692324b899b39f16d5a530a33062804e41f09dc97e9f156b4476707"]' -p eosio
- Implante o contrato eosio.system. Essa ação vai ativar os recursos da segunda camada e permitir a transição de um blockchain de nó único para vários nós.
cleos set contract eosio ~/eosio.contracts/build/contracts/eosio.system/
Clique em Verificar meu progresso para conferir o objetivo.
Implantar os contratos eosio.boot e eosio.system
Tarefa 10: Criar as contas de produtor de blocos
Nesta tarefa, você vai criar as contas de produtor que vão assumir o blockchain EOSIO e produzir blocos. A primeira etapa é designar eosio.msig como uma conta privilegiada. Assim, ela pode autorizar em nome da conta eosio, que mais tarde vai renunciar à autoridade e permitir que a conta eosio.prods, que representa o grupo de produtores eleitos, assuma as responsabilidades de produção e validação de blocos.
- Defina eosio.msig como uma conta privilegiada:
cleos push action eosio setpriv '["eosio.msig", 1]' -p eosio
A resposta será semelhante a esta:
executed transaction: 385f0eb3c169898cc7faae46bb4371dbbfc46c5d482249c9933c4f8627fb271c 104 bytes 208 us
# eosio <= eosio::setpriv {"account":"eosio.msig","is_priv":1}
- Inicialize o token SYS para a versão 0 e atribua quatro casas decimais para aumentar a precisão:
cleos push action eosio init '["0", "4,SYS"]' -p eosio
A resposta será semelhante a esta:
executed transaction: c537fbd77983104d8dcb1c58b09b433f68a2dd12c876a27b7556d4a722d42939 104 bytes 3467 us
# eosio <= eosio::init {"version":0,"core":"4,SYS"}
# eosio.token <= eosio.token::open {"owner":"eosio.rex","symbol":"4,SYS","ram_payer":"eosio"}
- Importe chaves para serem usadas pelos produtores na assinatura de blocos. Em implantações de produção, primeiro é preciso criar as chaves e depois importá-las.
cleos wallet import --private-key 5KLGj1HGRWbk5xNmoKfrcrQHXvcVJBPdAckoiJgFftXSJjLPp7b
cleos wallet import --private-key 5K6qk1KaCYYWX86UhAfUsbMwhGPUqrqHrZEQDjs9ekP5j6LgHUu
cleos wallet import --private-key 5JCStvbRgUZ6hjyfUiUaxt5iU3HP6zC1kwx3W7SweaEGvs4EPfQ
cleos wallet import --private-key 5JJjaKnAb9KM2vkkJDgrYXoeUEdGgWtB5WK1a38wrmKnS3KtkS6
A importação dessas chaves simplifica o gerenciamento de recursos neste laboratório. No entanto, para implantações de produção, é necessário criar chaves.
A resposta para cada comando deve ser:
imported private key for: EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz
imported private key for: EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC
imported private key for: EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6
imported private key for: EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8qHjmRjFxTyhh2vxvF5d
Se os nós forem distribuídos, cada par de chaves será armazenado de forma independente na carteira de cada servidor. Neste laboratório, para simplificar, eles serão armazenados na mesma carteira.
- Crie as contas de produtor de blocos com recursos iniciais e chave pública:
cleos system newaccount --transfer eosio producer.one EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz --stake-net "50000000.0000 SYS" --stake-cpu "50000000.0000 SYS" --buy-ram-kbytes 8192
cleos system newaccount --transfer eosio producer.two EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC --stake-net "50000000.0000 SYS" --stake-cpu "50000000.0000 SYS" --buy-ram-kbytes 8192
cleos system newaccount --transfer eosio produc.three EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6 --stake-net "50000000.0000 SYS" --stake-cpu "50000000.0000 SYS" --buy-ram-kbytes 8192
cleos system newaccount --transfer eosio produce.four EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8qHjmRjFxTyhh2vxvF5d --stake-net "50000000.0000 SYS" --stake-cpu "50000000.0000 SYS" --buy-ram-kbytes 8192
O comando acima vai criar as contas producer.one, producer.two, produc.three e produce.four, e associar cada chave importada na etapa anterior a cada conta. Ele também vai atribuir e fazer stake de 50 milhões de SYS para NET e CPU e 8 mil para RAM.
A resposta será semelhante a esta (para cada conta nova):
executed transaction: 6164d2741433c68edf426d430cb0986b198a6f4c63e7f7a46bcf8343562eacc0 336 bytes 1029 us
# eosio <= eosio::newaccount {"creator":"eosio","name":"producer.one","owner":{"threshold":1,"keys":[{"key":"EOS8imf2TDq6FKtLZ8mv...
# eosio <= eosio::buyrambytes {"payer":"eosio","receiver":"producer.one","bytes":8388608}
# eosio <= eosio::delegatebw {"from":"eosio","receiver":"producer.one","stake_net_quantity":"50000000.0000 SYS","stake_cpu_quantity...
# eosio.token <= eosio.token::transfer {"from":"eosio","to":"eosio.ram","quantity":"122.0851 SYS","memo":"buy ram"}
# eosio.token <= eosio.token::transfer {"from":"eosio","to":"eosio.ramfee","quantity":"0.6135 SYS","memo":"ram fee"}
# eosio <= eosio.token::transfer {"from":"eosio","to":"eosio.ram","quantity":"122.0851 SYS","memo":"buy ram"}
# eosio.ram <= eosio.token::transfer {"from":"eosio","to":"eosio.ram","quantity":"122.0851 SYS","memo":"buy ram"}
# eosio <= eosio.token::transfer {"from":"eosio","to":"eosio.ramfee","quantity":"0.6135 SYS","memo":"ram fee"}
# eosio.ramfee <= eosio.token::transfer {"from":"eosio","to":"eosio.ramfee","quantity":"0.6135 SYS","memo":"ram fee"}
# eosio.token <= eosio.token::transfer {"from":"eosio","to":"eosio.stake","quantity":"100000000.0000 SYS","memo":"stake bandwidth"}
# eosio <= eosio.token::transfer {"from":"eosio","to":"eosio.stake","quantity":"100000000.0000 SYS","memo":"stake bandwidth"}
# eosio.stake <= eosio.token::transfer {"from":"eosio","to":"eosio.stake","quantity":"100000000.0000 SYS","memo":"stake bandwidth"}
- Registre as novas contas como produtores. Cada comando também espera o URL da web do produtor. URLs fictícios são usados para exemplificar.
cleos system regproducer producer.one EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz https://producer.one.com/EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz
cleos system regproducer producer.two EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC https://producer.two.com/EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC
cleos system regproducer produc.three EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6 https://produc.three.com/EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6
cleos system regproducer produce.four EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8qHjmRjFxTyhh2vxvF5d https://produce.four.com/EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8qHjmRjFxTyhh2vxvF5d
A resposta para os comandos acima será semelhante a esta:
executed transaction: 28ced4a34abd64fb2fc11fbb51d3e4e18d2933a9ab2560fc1c6fb80b0cfc336d 216 bytes 753 us
# eosio <= eosio::regproducer {"producer":"producer.one","producer_key":"EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz","u...
executed transaction: 06b8be4187c5fbabc3197064ae4c6d55ba553fdbcc8a560f060078e59d5dfc5e 216 bytes 306 us
# eosio <= eosio::regproducer {"producer":"producer.two","producer_key":"EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC","u...
executed transaction: c23a5164bf0cc1e35dfa3e55fed56e935ceb7d764dbe2e7a3bf4aee446e7d88d 216 bytes 270 us
# eosio <= eosio::regproducer {"producer":"produc.three","producer_key":"EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6","u...
executed transaction: 081aa8aca08b6d4e8e6bf576b2882f578faa7148e7c550196ff256ab0a9dcca3 216 bytes 224 us
# eosio <= eosio::regproducer {"producer":"produce.four","producer_key":"EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8qHjmRjFxTyhh2vxvF5d","u...
- Liste as contas de produtor atuais. No total, são quatro.
cleos system listproducers
A resposta deve ser:
Producer Producer key Url Scaled votes`
**`produc.three`** `EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6 https://produc.three.com/EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNj` **`0.0000`**
**`produce.four`** `EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8qHjmRjFxTyhh2vxvF5d https://produce.four.com/EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8` **`0.0000`**
**`producer.one`** `EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz https://producer.one.com/EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8` **`0.0000`**
**`producer.two`** `EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC https://producer.two.com/EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuE` **`0.0000`**
O número de votos para cada produtor ainda é zero, porque nenhum produtor foi votado ainda.
Clique em Verificar meu progresso para conferir o objetivo.
Criar as contas de produtor de blocos
Tarefa 11: Fazer a transição de um produtor de nó único para produtores de vários nós
Nesta tarefa, você vai fazer a transição de um blockchain de nó único para um de vários nós. No momento, apenas a conta eosio tem privilégios e pode assinar blocos. O objetivo é criar um blockchain EOSIO gerenciado por uma coleção de produtores eleitos, em que o consenso é alcançado depois que uma maioria qualificada de 2/3 + 1 dos produtores confirmar um bloco. Após esse procedimento, todas as transações dentro do bloco serão definitivas.
- Crie os diretórios de nós restantes nodes/01-node, nodes/02-node, nodes/03-node, nodes/04-node para armazenar todos os dados de blockchain relacionados aos novos nós de produção 1, 2, 3 e 4:
mkdir nodes/01-node nodes/02-node nodes/03-node nodes/04-node
- Inicie o nó 1, ativando o daemon de serviço nodeos como uma tarefa em segundo plano e redirecionando stdout/stderr para o arquivo 01-node/01.log:
nodeos \
--plugin eosio::http_plugin --plugin eosio::chain_api_plugin --plugin eosio::chain_plugin --plugin eosio::producer_api_plugin --plugin eosio::producer_plugin --plugin eosio::history_plugin --plugin eosio::history_api_plugin --plugin eosio::net_api_plugin \
--contracts-console \
--max-transaction-time=200 \
--chain-state-db-size-mb 1024 \
--enable-stale-production \
--producer-name producer.one \
--genesis-json ~/nodes/genesis.json \
--blocks-dir ~/nodes/01-node/blocks \
--config-dir ~/nodes/01-node \
--data-dir ~/nodes/01-node \
--http-server-address 127.0.0.1:8889 \
--p2p-listen-endpoint 127.0.0.1:9877 \
--signature-provider EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz=KEY:5KLGj1HGRWbk5xNmoKfrcrQHXvcVJBPdAckoiJgFftXSJjLPp7b \
--p2p-peer-address 127.0.0.1:9876 \
>>~/nodes/01-node/01.log 2>&1 &
Essa ação vai iniciar o nó 1 com alguns plug-ins, o nome do produtor producer.one, com detecção na porta HTTP 8889 e na porta p2p 9877. Ela substitui as chaves de desenvolvimento padrão pelas chaves EOS8imf..., 5KLGj1... e se conecta ao nó p2p 9876 (nó de inicialização).
- Para inspecionar o registro do nó 1 e verificar se há mensagens trocadas com o nó de inicialização (nó p2p 9876), execute o seguinte comando:
cat nodes/01-node/01.log | grep :9876 -C 3
A resposta será semelhante a:
Resposta:
info 2021-10-22T21:56:43.161 nodeos producer_plugin.cpp:421 on_incoming_block ] Received block e79c2cc7df2bd7bc... #3040 @ 2021-10-22T21:56:41.500 signed by eosio [trxs: 0, lib: 3039, conf: 0, latency: 1661 ms]
...
info 2021-10-22T21:56:43.162 net-1 net_plugin.cpp:1604 set_state ] old state lib catchup becoming in sync
info 2021-10-22T21:56:43.162 net-1 net_plugin.cpp:1132 operator() ] Sending handshake generation 2 to 127.0.0.1:9876- 446609d, lib 3040, head 3041, id 5d69f1fa874933cf
info 2021-10-22T21:56:43.163 net-0 net_plugin.cpp:1947 sync_recv_notice ] notice_message, pending 3043, blk_num 3043, id b8f3389c52ff416c...
info 2021-10-22T21:56:43.163 net-0 net_plugin.cpp:1908 verify_catchup ] catch_up while in in sync, fork head num = 3043 target LIB = 3041 next_expected = 3042, id b8f3389c52ff416c..., peer 127.0.0.1:9876 - 446609d
info 2021-10-22T21:56:43.163 net-0 net_plugin.cpp:1604 set_state ] old state in sync becoming head catchup
info 2021-10-22T21:56:43.164 nodeos producer_plugin.cpp:421 on_incoming_block ] Received block 917275dee8c12e57... #3042 @ 2021-10-22T21:56:42.500 signed by eosio [trxs: 0, lib: 3041, conf: 0, latency: 664 ms]
...
Por enquanto, o nó 1 ainda não está produzindo blocos, mas os recebe/sincroniza de outros nós, como o nó de inicialização.
- Inicie o nó 2, ativando o daemon de serviço nodeos como uma tarefa em segundo plano e redirecionando stdout/stderr para o arquivo 02-node/02.log:
nodeos \
--plugin eosio::http_plugin --plugin eosio::chain_api_plugin --plugin eosio::chain_plugin --plugin eosio::producer_api_plugin --plugin eosio::producer_plugin --plugin eosio::history_plugin --plugin eosio::history_api_plugin --plugin eosio::net_api_plugin \
--contracts-console \
--max-transaction-time=200 \
--chain-state-db-size-mb 1024 \
--enable-stale-production \
--producer-name producer.two \
--genesis-json ~/nodes/genesis.json \
--blocks-dir ~/nodes/02-node/blocks \
--config-dir ~/nodes/02-node \
--data-dir ~/nodes/02-node \
--http-server-address 127.0.0.1:8890 \
--p2p-listen-endpoint 127.0.0.1:9878 \
--signature-provider EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC=KEY:5K6qk1KaCYYWX86UhAfUsbMwhGPUqrqHrZEQDjs9ekP5j6LgHUu \
--p2p-peer-address 127.0.0.1:9876 \
--p2p-peer-address 127.0.0.1:9877 \
>>~/nodes/02-node/02.log 2>&1 &
Essa ação vai iniciar o nó 2 com alguns plug-ins, o nome do produtor producer.two, com detecção na porta HTTP 8890 e porta p2p 9878. Ela substitui as chaves de desenvolvimento padrão pelas chaves EOS8imf..., 5KLGj1... e se conecta ao nó p2p 9876 (nó de inicialização) e ao nó p2p 9877 (nó 1).
- Para inspecionar o registro do nó 2 e conferir as mensagens trocadas com o nó 1 (nó p2p 9877), execute o seguinte comando:
cat nodes/02-node/02.log | grep :9877 -C 3
A resposta será semelhante a:
Resposta:
info 2021-10-22T22:28:31.496 net-1 net_plugin.cpp:1771 start_sync ] Catching up with chain, our last req is 6852, theirs is 6859 peer 127.0.0.1:9877 - 1a245d2
info 2021-10-22T22:28:31.496 net-1 net_plugin.cpp:1717 operator() ] requesting range 6853 to 6859, from 127.0.0.1:9877- 1a245d2
info 2021-10-22T22:28:31.497 nodeos producer_plugin.cpp:421 on_incoming_block ] Received block 3073fa4230d8d232... #6853 @ 2021-10-22T22:28:28.000 signed by eosio [trxs: 0, lib: 6852, conf: 0, latency: 3497 ms]
...
info 2021-10-22T22:28:31.501 net-0 net_plugin.cpp:1604 set_state ] old state lib catchup becoming in sync
info 2021-10-22T22:28:31.501 net-0 net_plugin.cpp:1132 operator() ] Sending handshake generation 3 to 127.0.0.1:9877- 1a245d2, lib 6858, head 6859, id 9a791a880b9b875e
info 2021-10-22T22:28:31.501 net-1 net_plugin.cpp:1947 sync_recv_notice ] notice_message, pending 6860, blk_num 6860, id 4dd2c7c8ae5301ed...
info 2021-10-22T22:28:31.501 net-1 net_plugin.cpp:1908 verify_catchup ] catch_up while in in sync, fork head num = 6860 target LIB = 6859 next_expected = 6860, id 4dd2c7c8ae5301ed..., peer 127.0.0.1:9877 - 1a245d2
info 2021-10-22T22:28:31.501 net-1 net_plugin.cpp:1604 set_state ] old state in sync becoming head catchup
...
O nó 2 ainda não produz blocos, mas os recebe/sincroniza de outros nós, como o nó de inicialização e o nó 1, por enquanto.
- Inicie o nó 3, ativando o daemon de serviço nodeos como uma tarefa em segundo plano e redirecionando stdout/stderr para o arquivo 03-node/03.log:
nodeos \
--plugin eosio::http_plugin --plugin eosio::chain_api_plugin --plugin eosio::chain_plugin --plugin eosio::producer_api_plugin --plugin eosio::producer_plugin --plugin eosio::history_plugin --plugin eosio::history_api_plugin --plugin eosio::net_api_plugin \
--contracts-console \
--max-transaction-time=200 \
--chain-state-db-size-mb 1024 \
--enable-stale-production \
--producer-name produc.three \
--genesis-json ~/nodes/genesis.json \
--blocks-dir ~/nodes/03-node/blocks \
--config-dir ~/nodes/03-node \
--data-dir ~/nodes/03-node \
--http-server-address 127.0.0.1:8891 \
--p2p-listen-endpoint 127.0.0.1:9879 \
--signature-provider EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6=KEY:5JCStvbRgUZ6hjyfUiUaxt5iU3HP6zC1kwx3W7SweaEGvs4EPfQ \
--p2p-peer-address 127.0.0.1:9876 \
--p2p-peer-address 127.0.0.1:9877 \
--p2p-peer-address 127.0.0.1:9878 \
>>~/nodes/03-node/03.log 2>&1 &
Essa ação vai iniciar o nó 3 com alguns plug-ins, o nome do produtor produc.three, a detecção na porta HTTP 8891, porta p2p 9879. Ela substitui as chaves de desenvolvimento padrão pelas chaves EOS5n44..., 5JCStv... e se conecta ao nó p2p 9876 (nó de inicialização), 9877 (nó 1) e 9878 (nó 2).
- Para inspecionar o registro do nó 3 e verificar mensagens trocadas com o nó 2 (nó p2p 9878), execute o seguinte comando:
cat nodes/03-node/03.log | grep :9878 -C 3
A resposta será semelhante a:
Resposta:
info 2021-10-22T22:28:31.496 net-1 net_plugin.cpp:1771 start_sync ] Catching up with chain, our last req is 6852, theirs is 6859 peer 127.0.0.1:`**`9878`** `- 1a245d2`
info 2021-10-22T22:28:31.496 net-1 net_plugin.cpp:1717 operator() ] requesting range 6853 to 6859, from 127.0.0.1:`**`9878`** `- 1a245d2`
info 2021-10-22T22:28:31.497 nodeos producer_plugin.cpp:421 on_incoming_block ] Received block 3073fa4230d8d232... #6853 @ 2021-10-22T22:28:28.000 signed by eosio [trxs: 0, lib: 6852, conf: 0, latency: 3497 ms]
...
info 2021-10-22T22:28:31.501 net-0 net_plugin.cpp:1604 set_state ] old state lib catchup becoming in sync
info 2021-10-22T22:28:31.501 net-0 net_plugin.cpp:1132 operator() ] Sending handshake generation 3 to 127.0.0.1:`**`9878`** `- 1a245d2, lib 6858, head 6859, id 9a791a880b9b875e
info 2021-10-22T22:28:31.501 net-1 net_plugin.cpp:1947 sync_recv_notice ] notice_message, pending 6860, blk_num 6860, id 4dd2c7c8ae5301ed...
info 2021-10-22T22:28:31.501 net-1 net_plugin.cpp:1908 verify_catchup ] catch_up while in in sync, fork head num = 6860 target LIB = 6859 next_expected = 6860, id 4dd2c7c8ae5301ed..., peer 127.0.0.1:`**`9878`** `- 1a245d2
info 2021-10-22T22:28:31.501 net-1 net_plugin.cpp:1604 set_state ] old state in sync becoming head catchup
...
O nó 3 ainda não produz blocos, mas os recebe/sincroniza de outros nós, como o nó de inicialização e o nó 1 e 2, por enquanto.
- Inicie o nó 4, ativando o daemon de serviço nodeos como uma tarefa em segundo plano e redirecionando stdout/stderr para o arquivo 04-node/04.log:
nodeos \
--plugin eosio::http_plugin --plugin eosio::chain_api_plugin --plugin eosio::chain_plugin --plugin eosio::producer_api_plugin --plugin eosio::producer_plugin --plugin eosio::history_plugin --plugin eosio::history_api_plugin --plugin eosio::net_api_plugin \
--contracts-console \
--max-transaction-time=200 \
--chain-state-db-size-mb 1024 \
--enable-stale-production \
--producer-name produce.four \
--genesis-json ~/nodes/genesis.json \
--blocks-dir ~/nodes/04-node/blocks \
--config-dir ~/nodes/04-node \
--data-dir ~/nodes/04-node \
--http-server-address 127.0.0.1:8892 \
--p2p-listen-endpoint 127.0.0.1:9880 \
--signature-provider EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8qHjmRjFxTyhh2vxvF5d=KEY:5JJjaKnAb9KM2vkkJDgrYXoeUEdGgWtB5WK1a38wrmKnS3KtkS6 \
--p2p-peer-address 127.0.0.1:9876 \
--p2p-peer-address 127.0.0.1:9877 \
--p2p-peer-address 127.0.0.1:9878 \
--p2p-peer-address 127.0.0.1:9879 \
>>~/nodes/04-node/04.log 2>&1 &
Essa ação vai iniciar o nó 4 com alguns plug-ins, o nome do produtor produce.four, a detecção na porta HTTP 8892, porta p2p 9880. Ela substitui as chaves de desenvolvimento padrão pelas chaves EOS5y3T..., 5JJjaK... e se conecta ao nó p2p 9876 (nó de inicialização), 9877 (nó 1), 9878 (nó 2) e 9879 (nó 3).
- Para inspecionar o registro do nó 4 e verificar mensagens trocadas com o nó 3 (nó p2p 9879), execute o seguinte comando:
cat nodes/04-node/04.log | grep :9879 -C 3
A resposta será semelhante a esta:
info 2021-10-22T22:28:31.496 net-1 net_plugin.cpp:1771 start_sync ] Catching up with chain, our last req is 6852, theirs is 6859 peer 127.0.0.1:9879 - 1a245d2
info 2021-10-22T22:28:31.496 net-1 net_plugin.cpp:1717 operator() ] requesting range 6853 to 6859, from 127.0.0.1:9879 - 1a245d2
info 2021-10-22T22:28:31.497 nodeos producer_plugin.cpp:421 on_incoming_block ] Received block 3073fa4230d8d232... #6853 @ 2021-10-22T22:28:28.000 signed by eosio [trxs: 0, lib: 6852, conf: 0, latency: 3497 ms]
...
info 2021-10-22T22:28:31.501 net-0 net_plugin.cpp:1604 set_state ] old state lib catchup becoming in sync
info 2021-10-22T22:28:31.501 net-0 net_plugin.cpp:1132 operator() ] Sending handshake generation 3 to 127.0.0.1:9879 - 1a245d2, lib 6858, head 6859, id 9a791a880b9b875e
info 2021-10-22T22:28:31.501 net-1 net_plugin.cpp:1947 sync_recv_notice ] notice_message, pending 6860, blk_num 6860, id 4dd2c7c8ae5301ed...
info 2021-10-22T22:28:31.501 net-1 net_plugin.cpp:1908 verify_catchup ] catch_up while in in sync, fork head num = 6860 target LIB = 6859 next_expected = 6860, id 4dd2c7c8ae5301ed..., peer 127.0.0.1:9879 - 1a245d2
info 2021-10-22T22:28:31.501 net-1 net_plugin.cpp:1604 set_state ] old state in sync becoming head catchup
...
O nó 4 ainda não produz blocos, mas os recebe/sincroniza de outros nós, como o nó de inicialização e o nó 1, 2 e 3, por enquanto.
Agora todos os novos nós 1, 2, 3 e 4 são iniciados e conectados. Eles recebem e sincronizam blocos produzidos pelo nó de inicialização, mas ainda não produzem. Para isso, é preciso eleger novos produtores. Em uma implantação de produção, os usuários normalmente votariam em até 30 produtores de um grupo de possíveis produtores no comando de votação. Os 21 mais votados são eleitos como produtores de blocos.
Agora você vai usar as contas de produtores atuais para eleger os quatro únicos produtores disponíveis. Depois de fazer staking de 15% do fornecimento de tokens SYS, os principais produtores eleitos serão oferecidos para produção. Após esse bloco com a lista de produtores ser confirmado e se tornar definitivo, os novos produtores começarão a produzir blocos na próxima rodada programada.
- Use o comando cleos system voteproducer prods para votar em produtores específicos. A conta producer.one vota em si mesma e nos produtores 2, 3 e 4. A conta producer.two vota em si mesma e nos produtores 3 e 4, produc.three e produce.four. Depois produc.three vota em si mesma e em produce.four e produce.four vota em si mesma.
cleos system voteproducer prods producer.one producer.one producer.two produc.three produce.four
cleos system voteproducer prods producer.two producer.two produc.three produce.four
cleos system voteproducer prods produc.three produc.three produce.four
cleos system voteproducer prods produce.four produce.four
A resposta será semelhante a esta:
executed transaction: 833178bdc9d5b8c86778fa2b2c0f20e976f4c253cb6ebcaa6ade8eb8bf3d0a4f 144 bytes 861 us
# eosio <= eosio::voteproducer {"voter":"producer.one","proxy":"","producers":["produc.three","produce.four","producer.one","produc...
executed transaction: 9c4961678017bfc2a7fd1398a2e4b33e472a6cadc0340400ebe9207e188d7692 136 bytes 379 us
# eosio <= eosio::voteproducer {"voter":"producer.two","proxy":"","producers":["produc.three","produce.four","producer.two"]}
executed transaction: d3d23bae8730f18e82da53defaff7184c49b83181bb9b6fa32096684e61ed74d 128 bytes 371 us`
# eosio <= eosio::voteproducer {"voter":"produc.three","proxy":"","producers":["produc.three","produce.four"]}
executed transaction: 95f63d46554dd436388e36b017b8e350514ef5b407b1c33c5779dc29c862cdb6 120 bytes 304 us`
# eosio <= eosio::voteproducer {"voter":"produce.four","proxy":"","producers":["produce.four"]}
- Acesse a porcentagem de votos de cada produtor:
cleos system listproducers
A resposta para os comandos acima deve ser:
Producer Producer key Url Scaled votes
produce.four EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8qHjmRjFxTyhh2vxvF5d https://produce.four.com/EOS5y3Tm1czTCia3o3JidVKmC78J9gRQU8 0.4000
produc.three EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNjRxAfPhUvM8tWS5svid6 https://produc.three.com/EOS5n442Qz4yVc4LbdPCDnxNSseAiUCrNj 0.3000
producer.two EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuEz2RMWhXb8LXxEgcR7MC https://producer.two.com/EOS7Ef4kuyTbXbtSPP5Bgethvo6pbitpuE 0.2000
producer.one EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8zKdLNzsbU9EiMSt9Lwz https://producer.one.com/EOS8imf2TDq6FKtLZ8mvXPWcd6EF2rQwo8 0.1000
O produtor 1 recebeu 10% dos votos, o 2 recebeu 20%, o 3 recebeu 30% e o 4 recebeu 40%. Como o número total de tokens SYS com staking de todos os produtores é maior que 15% da oferta de tokens, os 21 principais produtores (por padrão) serão usados para a produção de blocos.
A produção vai começar depois que o bloco que contém a lista de produtores de blocos for confirmado como definitivo. Como há apenas quatro produtores, todos vão produzir, e uma maioria qualificada será alcançada com qualquer três deles.
- Verifique se os novos produtores estão realmente produzindo blocos:
tail -f nodes/01-node/01.log | grep Produced
O comando acima vai mostrar os últimos blocos feitos pelo produtor 1. Se você não receber nenhuma resposta, aguarde alguns segundos. Há quatro produtores, cada um produz 12 blocos a cada 6 segundos. Portanto, deve haver 18 segundos entre o último bloco produzido e o primeiro da próxima rodada.
A resposta será semelhante a esta:
info 2021-10-28T15:31:47.904 nodeos producer_plugin.cpp:2333 produce_block ] Produced block adeb43a9249e0ef8...` **`#7035`** `@ 2021-10-28T15:31:48.000 signed by` **`producer.one`** `[trxs: 0, lib: 6998, confirmed: 36]
info 2021-10-28T15:31:48.400 nodeos producer_plugin.cpp:2333 produce_block ] Produced block 991c7f7addb6006e...` **`#7036`** `@ 2021-10-28T15:31:48.500 signed by` **`producer.one`** `[trxs: 0, lib: 6998, confirmed: 0]
...
info 2021-10-28T15:31:52.901 nodeos producer_plugin.cpp:2333 produce_block ] Produced block c947dfab144600f7...` **`#7045`** `@ 2021-10-28T15:31:53.000 signed by` **`producer.one`** `[trxs: 0, lib: 6998, confirmed: 0]
info 2021-10-28T15:31:53.300 nodeos producer_plugin.cpp:2333 produce_block ] Produced block c871f71b3ebe9151...` **`#7046`** `@ 2021-10-28T15:31:53.500 signed by` **`producer.one`** `[trxs: 0, lib: 6998, confirmed: 0]`
Se você esperar mais 18 segundos, a próxima rodada de 12 blocos produzidos será exibida e assim por diante. Para verificar se os outros três nós estão de fato produzindo os blocos, substitua os 01s no comando acima por 02s, 03s e 04s.
-
Pressione Ctrl + C para sair do comando tail.
-
Verifique se o nó de inicialização não está mais produzindo blocos:
tail -f nodes/00-boot/00.log | grep Produced
O comando acima não deve produzir nenhuma resposta, o que demonstra que o nó de inicialização renunciou à produção de blocos para os novos produtores eleitos.
Agora que você tem um blockchain totalmente funcional com quatro produtores, remova os poderes de assinatura de transações e modificação de estado no blockchain das contas padrão eosio e eosio.* relacionadas. Para isso, redefina as chaves usadas pelas contas eosio e eosio.* para null.
- Acesse as informações da conta eosio. Analise as chaves associadas às permissões owner e active:
cleos get account eosio
A resposta será semelhante a esta:
created: 2018-06-01T12:00:00.000
privileged: true
permissions:
owner 1: 1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
active 1: 1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
memory:
quota: unlimited used: 2.989 MiB
net bandwidth:
used: unlimited
available: unlimited
limit: unlimited
cpu bandwidth:
used: unlimited
available: unlimited
limit: unlimited
SYS balances:
liquid: 599999509.0258 SYS
staked: 0.0000 SYS
unstaking: 0.0000 SYS
total: 599999509.0258 SYS
- Assine novamente as chaves usadas pela conta eosio e vincule as permissões à conta eosio.prods:
cleos push action eosio updateauth '{"account": "eosio", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio.prods", "permission": "active"}}]}}' -p eosio@owner
cleos push action eosio updateauth '{"account": "eosio", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio.prods", "permission": "active"}}]}}' -p eosio@active
cleos get account eosio
A resposta será semelhante a esta:
created: 2018-06-01T12:00:00.000
privileged: true
permissions:
owner 1: 1 eosio.prods@active
active 1: 1 eosio.prods@active
`memory:
quota: unlimited used: 2.989 MiB
net bandwidth:
used: unlimited
available: unlimited
limit: unlimited
cpu bandwidth:
used: unlimited
available: unlimited
limit: unlimited
SYS balances:
liquid: 599999509.0258 SYS
staked: 0.0000 SYS
unstaking: 0.0000 SYS
total: 599999509.0258 SYS
A conta eosio não tem mais as chaves de desenvolvimento padrão associadas às permissões owner e active. Em vez disso, elas agora são permissões filhas da permissão pai eosio.prods@active. Esse é o mesmo grupo de contas que representa todos os produtores de blocos ativos.
Portanto, agora a conta eosio é controlada pela conta eosio.prods.
- Assine de novo as chaves usadas pelas contas eosio.* e vincule as permissões à conta eosio:
cleos push action eosio updateauth '{"account": "eosio.bpay", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.bpay@owner
cleos push action eosio updateauth '{"account": "eosio.bpay", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.bpay@active
cleos push action eosio updateauth '{"account": "eosio.msig", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.msig@owner
cleos push action eosio updateauth '{"account": "eosio.msig", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.msig@active
cleos push action eosio updateauth '{"account": "eosio.names", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.names@owner
cleos push action eosio updateauth '{"account": "eosio.names", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.names@active
cleos push action eosio updateauth '{"account": "eosio.ram", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.ram@owner
cleos push action eosio updateauth '{"account": "eosio.ram", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.ram@active
cleos push action eosio updateauth '{"account": "eosio.ramfee", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.ramfee@owner
cleos push action eosio updateauth '{"account": "eosio.ramfee", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.ramfee@active
cleos push action eosio updateauth '{"account": "eosio.saving", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.saving@owner
cleos push action eosio updateauth '{"account": "eosio.saving", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.saving@active
cleos push action eosio updateauth '{"account": "eosio.stake", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.stake@owner
cleos push action eosio updateauth '{"account": "eosio.stake", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.stake@active
cleos push action eosio updateauth '{"account": "eosio.token", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.token@owner
cleos push action eosio updateauth '{"account": "eosio.token", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.token@active
cleos push action eosio updateauth '{"account": "eosio.vpay", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.vpay@owner
cleos push action eosio updateauth '{"account": "eosio.vpay", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.vpay@active
cleos push action eosio updateauth '{"account": "eosio.rex", "permission": "owner", "parent": "", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.rex@owner
cleos push action eosio updateauth '{"account": "eosio.rex", "permission": "active", "parent": "owner", "auth": {"threshold": 1, "keys": [], "waits": [], "accounts": [{"weight": 1, "permission": {"actor": "eosio", "permission": "active"}}]}}' -p eosio.rex@active
Agora as contas eosio.* não têm mais as chaves de desenvolvimento padrão associadas às permissões owner e active. Em vez disso, elas são permissões filhas da permissão pai eosio@active, que, por sua vez, é filha da conta eosio.prods@active.
Portanto, agora todas as contas do sistema, incluindo eosio, são controladas pela conta eosio.prods, que representa o grupo de contas de todos os produtores de blocos ativos. Por fim, você criou um blockchain EOSIO de vários nós totalmente operacional.
Clique em Verificar meu progresso para conferir o objetivo.
Fazer a transição de um produtor de nó único para produtores de vários nós
Parabéns!
Neste laboratório, você estendeu o blockchain EOSIO de nó único implantado anteriormente para uma rede de vários blockchains. Você também instalou vários componentes de software do EOSIO para configurar seu blockchain EOSIO de vários nós. Por fim, você realizou algumas tarefas de operador de nó no novo blockchain EOSIO.
Próximas etapas / Saiba mais
Treinamento e certificação do Google Cloud
Esses treinamentos ajudam você a aproveitar as tecnologias do Google Cloud ao máximo. Nossas aulas incluem habilidades técnicas e práticas recomendadas para ajudar você a alcançar rapidamente o nível esperado e continuar sua jornada de aprendizado. Oferecemos treinamentos que vão do nível básico ao avançado, com opções de aulas virtuais, sob demanda e por meio de transmissões ao vivo para que você possa encaixá-las na correria do seu dia a dia. As certificações validam sua experiência e comprovam suas habilidades com as tecnologias do Google Cloud.
Manual atualizado em 12 de dezembro de 2024
Laboratório testado em 22 de outubro de 2024
Copyright 2026 Google LLC. Todos os direitos reservados. Google e o logotipo do Google são marcas registradas da Google LLC. Todos os outros nomes de produtos e empresas podem ser marcas registradas das respectivas empresas a que estão associados.