Professional Documents
Culture Documents
2
Definição Geral
Um consenso de rede distribuída é um método de nodes independentes atingirem uma
solução comum. O principal objetivo do consenso é uma operação estável da rede de nodes,
onde os círculos se reproduzem com certa frequência ou um algoritmo medindo ciclicamente
a vida contínua das interações ordenadas dos nodes, como um núcleo lógico do sistema
eletrônico. O consenso é capaz de realizar tarefas adicionais, como processar transações,
verificar a execução de contratos inteligentes, servir de base para a operação do sistema
distribuído para o lançamento de aplicativos ou qualquer outra carga útil que exija o consenso.
3
Sincronização de pacotes de transações
Um node coleta transações assinadas de carteiras e forma um pacote (Fig. 1).
4
Formação listas ordenadas de transações
Após a conclusão da sincronização dos pacotes de transações entre os Nodes
Confiáveis da rodada atual, cada TN possui todos os pacotes de transações e pode formar
uma lista completa de transações da rodada (Fig. 2). A lista de transações da rodada é
armazenada exclusivamente no buffer local de um nodes e não é compartilhada na rede. Por
isso, não é necessário usar medidas de segurança, como hashing e criptografia, para evitar
alterações.
A lista de pacotes de transações é classificada na tabela da rodada, as transações
são classificadas nos pacotes de transações e, conseqüentemente, uma lista final de
transações da rodada também é classificada devido à transitividade. Assim, para que o
consenso seja alcançado, cada TN deve ter a mesma lista ordenada de transações a serem
processadas na rodada com a lista correspondente à lista de hashes da tabela da rodada com
pacotes de transações.
5
Alcance de consenso
Depois que todos os nodes da rede liberaram pacotes de transações e os trocaram
entre si, os nodes responsáveis pela execução do consenso precisam ser selecionados e
esses nodes terão que validar transações e gerar um bloco. No início, o lançamento da rede
começa a partir da formação do bloco Genesis e se expande.
Posteriormente, a rede opera em ciclos devido à rotação de rodadas e seleção
constante de novos nodes confiáveis para execução do consenso.
Estágio I
6
Figura 3. Formação de um indicador (função característica)
7
Em seguida, um hash do pacote recebido é calculado usando o algoritmo Blake2s, o
número da rodada atual também é adicionado e tudo isso é assinado pela chave privada do
node usando o ED25519.
A assinatura é então adicionada à estrutura original e o pacote do estágio 1 é enviado
a todos os Nodes Confiáveis da rodada atual.
Deve-se observar que o hash em si e o número da rodada não são compartilhados.
Por isso, para validar a assinatura digital, os nodes que receberam esse pacote precisam
realizar preliminarmente as mesmas operações de forma independente.
A chave pública para validação é extraída da tabela de rodadas disponível no Trusted
Node por índice contido no primeiro campo do pacote do estágio 1.
Durante a validação do pacote recebido do Estágio 1, as seguintes verificações são
realizadas:
1) O remetente está na lista de nodes confiáveis da rodada atual. Em caso de validação
incorreta, o pacote é rejeitado.
2) Restauração do pacote (adição de hash e número da rodada) e validação de
assinatura digital. Em caso de validação incorreta, o pacote é rejeitado.
3) Se todas as verificações forem passadas, o hash do pacote do estágio 1 e assinatura
digital são colocados no Vetor de assinaturas com o número do node que formou e
enviou o pacote. Deve-se notar que os pacotes do Estágio 1 são enviados não através
de nodes intermediários, mas entregues diretamente.
8
Figure 5. Exchange of Indicators’ hashes
A Figura 5 ilustra o exemplo em que 5 TNs participam da rodada e 2 deles (Node1 e Node2)
enviaram seus pacotes formados do Estágio 1 para todos os seus vizinhos.
Figure 6
O hash do indicador é assinado por ED25519 e validado por outros nodes após o
recebimento.
Estágio II
9
Etapas de validação dos pacotes do Estágio 2 (vetores de assinaturas assinadas):
1) Validação da assinatura do pacote. A chave pública para a validação é extraída do
nível de transporte do campo "remetente".
2) Então, seqüências que diferem da maioria são detectadas no vetor. Caso o hash da
string corresponda à assinatura digital, o Trusted Node com o índice dessa string é
marcado como "incorreto".
3) Caso a assinatura digital seja diferente do restante dos Trusted Nodes e o hash não,
significa que o remetente substituiu a assinatura. Nesse caso, o "remetente" é
marcado como "incorreto".
4) Os mesmos hashes devem ser encontrados na maioria dos Nodes Confiáveis (>51%
do número total de Nodes Confiáveis), caso contrário, a rodada é concluída antes do
tempo.
Procedimento de consenso
Após o recebimento dos vetores de assinaturas de todos os colegas dos TNs, um TN
avalia as informações recebidas através do seguinte algoritmo:
● ● Etapa 1. O hash do indicador é verificado. Todos os hashes dos indicadores
recebidos do TN são verificados. O hash mais frequente (>51%) é considerado a
solução consensual. Todos os nodes que enviaram um hash diferente são marcados
como nodes confiáveis "incorretos". Caso não haja hash com a frequência >51%, o
consenso é cancelado e a rodada é finalizada.
● ● Etapa 2. É formada uma lista de hashes de pacotes de transações a serem
processados na próxima rodada. Apenas os hashes dos pacotes de transações
armazenados no TN da rodada atual, mas não incluídos no processamento atual, são
considerados. Verifica a exclusividade (o hash do pacote de transações da próxima
rodada dentro de um TN deve aparecer não mais de uma vez), o que permite excluir
a duplicação dos mesmos pacotes de transações. Se o TN não passou no cheque,
ele está marcado como "incorreto".
10
Formação da lista de pacotes de transações da próxima rodada
Depois que nodes "incorretos" são detectados, uma tabela de resumo dos hashes dos
pacotes de transações da próxima rodada especifica a frequência de cada hash do pacote de
transações na lista geral. Os hashes dos pacotes que estão presentes em mais de 50% de
todos os TNs estão incluídos na lista para serem processados na próxima rodada e são
gravados no vetor "Next_round_hashes". O uso do algoritmo único para formar a lista dos
hashes dos pacotes de transação da próxima rodada em todos os TNs operando sob o
mesmo protocolo deve resultar no mesmo conjunto de hashes. Todo os outros TNs estão
"incorretos".
O resultado desta execução do estágio é uma lista formada de transações a serem
processadas na próxima rodada que é salva em cada TN no vetor “next_round_hashes”.
Estágio III
De acordo com esta fórmula da lista de transações, os nodes “corretos” (da lista
“real_trusted”) formam a lista de transações válidas que estão incluídas no bloco.
Cada Node Confiável que formou um bloco inclui as seguintes informações no meta
block:
1. Indicador (Função característica)
2. Vetor «realTrusted»
3. Vetor «next_round_trusted»
4. Vetor «next_round_hashes»
5. Assinatura separada do node de gravação do bloco (sem o próprio bloco)
Cada node confiável deve gerar um bloco, gerar corretamente um meta block, assiná-
lo e enviá-lo para outros TNs na forma de confirmação de recebimento assinado da conclusão
correta de consenso. Cada TN que recebeu mais de 50% de confirmação de recebimento dos
TNs “corretos” da rodada (do vetor “real_trusted”) pode se tornar um Node de Gravação(WN),
caso WN seja selecionado pelo consenso geral de TNs “corretos” não possa gerar o meta
block por qualquer motivo. Um mecanismo TimeOut é usado para essa finalidade, bem como
um conjunto de pedidos no vetor “real_trusted”. Em outras palavras, inicialmente o WN é um
node “real_trusted [0], se ele não gerar um meta block assinado dentro de um determinado
período de tempo, o node “ real_trusted [1]” se tornará WN e assim por diante.
11
Formação do meta block
Cada node do vetor "real_trusted" gera um bloco com base na função característica
aprovada pelo consenso.
As transações que não estão marcadas no indicador com um sinal diferente de zero,
informações sobre o número do bloco, carimbo de hora do node de gravação, hash do bloco
anterior e vetor "real_trusted" são gravadas no bloco. O bloco é adicionado ao
armazenamento preliminar e seu hash é calculado.
12