{"id":30047,"date":"2019-10-31T21:33:25","date_gmt":"2019-10-31T18:33:25","guid":{"rendered":"https:\/\/prohoster.info\/blog\/razbiraemsya-v-protokole-konsensusa-stellar\/"},"modified":"2019-10-31T21:33:25","modified_gmt":"2019-10-31T18:33:25","slug":"razbiraemsya-v-protokole-konsensusa-stellar","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/razbiraemsya-v-protokole-konsensusa-stellar","title":{"rendered":"Entendendo o protocolo de consenso Stellar","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Entendendo o protocolo de consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/09b61160286ae40c21269e1590fc2b92.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nO protocolo de consenso Stellar foi descrito pela primeira vez em <noindex><a rel=\"nofollow\" href=\"https:\/\/www.stellar.org\/papers\/stellar-consensus-protocol.pdf\">um artigo cient\u00edfico<\/a><\/noindex> de David Mazi\u00e8res em 2015. Trata-se de um \"sistema federal de consenso bizantino\" que permite que redes computacionais descentralizadas, sem l\u00edderes, alcancem efetivamente um consenso sobre qualquer decis\u00e3o. A rede de pagamentos Stellar utiliza o Stellar Consensus Protocol (SCP) para manter um hist\u00f3rico consistente de transa\u00e7\u00f5es, vis\u00edvel a todos os participantes.<\/p>\n<p>Acredita-se que os protocolos de consenso sejam dif\u00edceis de entender. O SCP \u00e9 mais simples que a maioria deles, mas ainda assim carrega essa reputa\u00e7\u00e3o \u2014 em parte devido \u00e0 ideia equivocada de que a \"vota\u00e7\u00e3o federativa\", discutida na primeira metade do artigo cient\u00edfico, \u00e9 o SCP. Mas n\u00e3o \u00e9! \u00c9 apenas um bloco de constru\u00e7\u00e3o importante que, na segunda metade do artigo, \u00e9 utilizado para formar <i>o real<\/i> protocolo de consenso Stellar.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nNeste artigo, apresentaremos brevemente o que \u00e9 um \"sistema de acordos\", o que pode torn\u00e1-lo \"bizantino\" e por que tornar um sistema bizantino \"federal\". Em seguida, explicaremos o processo de vota\u00e7\u00e3o federativa, descrito no artigo sobre o SCP, e, finalmente, explicaremos o pr\u00f3prio protocolo SCP.<\/p>\n<h1>Sistemas de acordos<\/h1>\n<p>\nUm sistema de acordos permite que um grupo de participantes chegue a um consenso sobre algum t\u00f3pico, como o que pedir para o almo\u00e7o.<\/p>\n<p>Na empresa Interstellar, implementamos nosso pr\u00f3prio sistema de acordos para o almo\u00e7o: pedimos o que nosso gerente operacional, John, diz. \u00c9 um sistema simples e eficaz. Todos confiamos em John e acreditamos que ele encontrar\u00e1 algo interessante e nutritivo todos os dias.<\/p>\n<p>Mas e se John abusar de nossa confian\u00e7a? Ele pode decidir unilateralmente que todos devemos nos tornar veganos. Em uma ou duas semanas, provavelmente o deporemos e passaremos o poder para Elizabeth. Mas, de repente, ela adora abacate com anchovas e acha que todos devem ser assim. O poder corrompe. Por isso, \u00e9 melhor encontrar um m\u00e9todo um pouco mais democr\u00e1tico: uma maneira de garantir que diferentes prefer\u00eancias sejam consideradas, ao mesmo tempo em que se assegura um resultado claro e atempado, para que n\u00e3o aconte\u00e7a que ningu\u00e9m pe\u00e7a almo\u00e7o ou que cinco pessoas fa\u00e7am pedidos diferentes, ou que a discuss\u00e3o se arraste at\u00e9 a noite.<\/p>\n<p>\u00c0 primeira vista, a solu\u00e7\u00e3o parece simples: realizar uma vota\u00e7\u00e3o! Mas essa \u00e9 uma impress\u00e3o enganadora. Quem ir\u00e1 coletar os votos e informar os resultados? E por que os outros deveriam acreditar no que ele diz? Talvez possamos <i>primeiro<\/i> votar em um l\u00edder que confiamos para conduzir a vota\u00e7\u00e3o \u2014 mas quem ir\u00e1 liderar este <i>primeiro<\/i> vota\u00e7\u00e3o? E se n\u00e3o conseguirmos concordar com um l\u00edder? Ou se chegarmos a um acordo, mas esse l\u00edder ficar preso em uma reuni\u00e3o ou sair doente?<\/p>\n<p>Problemas semelhantes ocorrem em redes computacionais distribu\u00eddas. Todos os participantes ou n\u00f3s devem concordar com alguma decis\u00e3o, como quem deve atualizar um arquivo compartilhado ou retirar uma tarefa da fila de processamento. Em uma rede de criptomoedas, os n\u00f3s frequentemente precisam escolher como se parece a hist\u00f3ria completa, a partir de v\u00e1rias vers\u00f5es poss\u00edveis que podem entrar em conflito. Esse consenso de rede garante ao destinat\u00e1rio que a moeda \u00e9 (a) v\u00e1lida (n\u00e3o falsificada) e (b) ainda n\u00e3o foi gasta em outro lugar. Tamb\u00e9m garante que ele poder\u00e1 gastar as moedas no futuro, porque o novo destinat\u00e1rio ter\u00e1 as mesmas garantias pelos mesmos motivos.<\/p>\n<p>Qualquer sistema de consenso em uma rede computacional distribu\u00edda deve ser tolerante a falhas: ele deve fornecer resultados consistentes, apesar de erros, como linhas de comunica\u00e7\u00e3o lentas, n\u00f3s n\u00e3o responsivos e ordem incorreta de mensagens. <i>O<\/i> sistema de consenso bizantino \u00e9 adicionalmente resistente a erros 'bizantinos': n\u00f3s que fornecem informa\u00e7\u00f5es falsas, seja por erro ou em uma tentativa deliberada de sabotar o sistema ou obter alguma vantagem. A resist\u00eancia 'bizantina' \u2014 a capacidade de confiar na decis\u00e3o de um grupo, mesmo quando alguns membros do grupo podem mentir ou de outra forma n\u00e3o seguir as regras de tomada de decis\u00e3o \u2014 recebeu esse nome da <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%B2%D0%B8%D0%B7%D0%B0%D0%BD%D1%82%D0%B8%D0%B9%D1%81%D0%BA%D0%B8%D1%85_%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D0%BB%D0%BE%D0%B2\">f\u00e1bula dos generais do Imp\u00e9rio Bizantino<\/a><\/noindex>, que tentavam coordenar um ataque. <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/coinmonks\/a-note-from-anthony-if-you-havent-already-please-read-the-article-gaining-clarity-on-key-787989107969\">Uma boa descri\u00e7\u00e3o<\/a><\/noindex> pode ser encontrada em Anthony Stevens.<\/p>\n<p>Vamos considerar a propriet\u00e1ria da criptomoeda, Alice, que deve escolher entre comprar um delicioso sorvete com Bob e pagar a d\u00edvida com Carol. \u00c9 poss\u00edvel que Alice queira pagar ambos ao mesmo tempo, gastando fraudulentamente a mesma moeda. Para isso, ela deve convencer o computador de Bob de que a moeda nunca foi paga a Carol e convencer o computador de Carol de que a moeda nunca foi paga a Bob. Um sistema de acordos bizantino torna isso praticamente imposs\u00edvel, utilizando uma forma de regra da maioria, chamada <i>qu\u00f3rum<\/i>. Um n\u00f3 em tal rede recusa mudar para uma determinada vers\u00e3o da hist\u00f3ria at\u00e9 ver que um n\u00famero suficiente de n\u00f3s homog\u00eaneos \u2014 o qu\u00f3rum \u2014 concorda com essa mudan\u00e7a. Assim que isso acontecer, eles formar\u00e3o um bloco eleitoral suficiente para for\u00e7ar os n\u00f3s restantes da rede a concordar com sua decis\u00e3o. Alice pode fazer alguns n\u00f3s mentirem em seu nome, mas se a rede for grande o suficiente, sua tentativa ser\u00e1 dominada pelas vozes dos n\u00f3s honestos.<\/p>\n<p>Quantos n\u00f3s s\u00e3o necess\u00e1rios para um qu\u00f3rum? No m\u00ednimo, a maioria, ou mais precisamente, a maioria qualificada para combater erros e fraudes. Mas para contar a maioria, \u00e9 necess\u00e1rio saber o n\u00famero total de participantes. Em um escrit\u00f3rio da Interstellar ou em elei\u00e7\u00f5es de distrito, esses n\u00fameros s\u00e3o f\u00e1ceis de obter. Mas se seu grupo \u00e9 uma rede vagamente definida, onde os n\u00f3s podem entrar e sair \u00e0 vontade sem coordena\u00e7\u00e3o com um centro, ent\u00e3o \u00e9 necess\u00e1rio um <i>sistema federativo<\/i> de acordo bizantino, capaz de determinar qu\u00f3runs n\u00e3o a partir de uma lista previamente definida de n\u00f3s, mas dinamicamente, de uma imagem constantemente mut\u00e1vel e inevitavelmente incompleta dos n\u00f3s em um determinado momento.<\/p>\n<p>Pode parecer imposs\u00edvel criar um qu\u00f3rum do ponto de vista de um \u00fanico n\u00f3 em uma vasta rede, mas isso \u00e9 poss\u00edvel. Esse qu\u00f3rum pode at\u00e9 garantir resultados em vota\u00e7\u00f5es descentralizadas. O documento t\u00e9cnico SCP mostra como fazer isso atrav\u00e9s de um procedimento chamado <i>vota\u00e7\u00e3o federativa<\/i>.<\/p>\n<h1>Para os impacientes<\/h1>\n<p>\nO restante do artigo descreve em mais detalhes a vota\u00e7\u00e3o federativa e o protocolo de consenso Stellar. Se voc\u00ea n\u00e3o est\u00e1 interessado nos detalhes, aqui est\u00e1 uma vis\u00e3o geral do processo.<\/p>\n<ol>\n<li>Os n\u00f3s realizam rodadas de vota\u00e7\u00e3o federal sobre \"nomea\u00e7\u00f5es\". Uma rodada de vota\u00e7\u00e3o federativa significa:\n<ul>\n<li>O n\u00f3 vota em alguma proposta, como \"Eu sugiro o valor V\";\n<\/li>\n<li>O n\u00f3 ouve os votos dos pares at\u00e9 encontrar um que possa \"aceitar\";\n<\/li>\n<li>O n\u00f3 busca um \"quorum\" para essa proposta. O quorum \"confirma\" o nomeado.<\/li>\n<\/ul>\n<\/li>\n<li>Assim que o n\u00f3 pode confirmar um ou mais nomeados, ele tenta \"preparar\" o \"boleto\" atrav\u00e9s de v\u00e1rias rodadas de vota\u00e7\u00e3o federativa.\n<\/li>\n<li>Assim que o n\u00f3 \u00e9 capaz de verificar a prontid\u00e3o do boleto, ele tenta confirm\u00e1-lo com ainda mais rodadas de vota\u00e7\u00e3o federativa.\n<\/li>\n<li>Assim que o n\u00f3 pode confirmar o compromisso do boleto, ele pode \"externalizar\" o valor desse boleto, usando-o como resultado de consenso.<\/li>\n<\/ol>\n<p>\nEssas etapas incluem v\u00e1rias rodadas de vota\u00e7\u00e3o federativa que em conjunto formam uma rodada SCP. Vamos analisar mais detalhadamente o que acontece em cada etapa.<\/p>\n<h1>Vota\u00e7\u00e3o federativa<\/h1>\n<p>\nA vota\u00e7\u00e3o federativa \u00e9 um procedimento para determinar se a rede pode concordar com uma proposta. Na rodada de vota\u00e7\u00e3o, cada n\u00f3 deve escolher um entre muitos valores potenciais. Ele n\u00e3o pode fazer isso at\u00e9 ter certeza de que outros n\u00f3s na rede n\u00e3o escolher\u00e3o um resultado diferente. Para garantir isso, os n\u00f3s trocam uma enxurrada de mensagens de ida e volta para que cada <i>confirmou<\/i>, mesmo sem otimiza\u00e7\u00e3o para essas tarefas, tem sucesso em outra \u00e1rea: <i>.<\/i> n\u00f3 <i>aceita<\/i> o mesmo <i>uma solu\u00e7\u00e3o<\/i>. O restante desta se\u00e7\u00e3o explica os termos nesta proposta e como o processo inteiro ocorre.<\/p>\n<h1>Quorums e cortes de quorum<\/h1>\n<p>\nVamos come\u00e7ar definindo quorum. Como discutimos acima, em uma rede descentralizada com ades\u00e3o din\u00e2mica, \u00e9 imposs\u00edvel saber de antem\u00e3o quantos n\u00f3s existem e, consequentemente, quantos s\u00e3o necess\u00e1rios para a maioria. A vota\u00e7\u00e3o federativa resolve esse problema apresentando uma nova ideia <i>de corte de quorum<\/i> quorum slice: um pequeno conjunto de n\u00f3s iguais que o n\u00f3 confia para transmitir informa\u00e7\u00f5es sobre o estado da vota\u00e7\u00e3o ao restante da rede. Cada n\u00f3 define seu pr\u00f3prio corte de quorum (do qual se torna membro por fato).<\/p>\n<p>A forma\u00e7\u00e3o do quorum come\u00e7a com o corte de quorum. Para cada n\u00f3, os n\u00f3s de seu corte s\u00e3o adicionados. Em seguida, s\u00e3o adicionados os membros dos cortes <i>desses n\u00f3s<\/i> E assim por diante. \u00c0 medida que avan\u00e7amos, encontramos cada vez mais n\u00f3s que n\u00e3o podemos adicionar, pois j\u00e1 est\u00e3o inclu\u00eddos no corte. Quando n\u00e3o houver mais n\u00f3s novos para adicionar, o processo termina: formamos um qu\u00f3rum por meio do \"fechamento transitivo\" do corte do n\u00f3 inicial.<\/p>\n<p><img decoding=\"async\" alt=\"Entendendo o protocolo de consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/6991e3f9a22d920e4a5e9c161f32dee1.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Para encontrar um qu\u00f3rum a partir de um dado n\u00f3...<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Entendendo o protocolo de consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/52b3d435a8f4a67b56deb43c83fee828.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>\u2026 adicionamos membros do seu corte...<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Entendendo o protocolo de consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/0820e9ca560caf9ebfa92db8e7a1da85.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>\u2026 em seguida, adicionamos membros dos cortes desses n\u00f3s.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Entendendo o protocolo de consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/539933eb3c279fa7da68fc9049516fc8.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Continuamos at\u00e9 que n\u00e3o haja mais n\u00f3s para adicionar.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Entendendo o protocolo de consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/48058639262412514641063a10503a01.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Entendendo o protocolo de consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/d068fb06f35337ae68c35b4606f329ae.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>N\u00e3o restam mais n\u00f3s para adicionar. Este \u00e9 o qu\u00f3rum.<\/i><\/p>\n<p>Na verdade, cada n\u00f3 pode fazer parte de mais de um corte. Para formar um qu\u00f3rum, escolha apenas um dos cortes e adicione os membros; em seguida, escolha qualquer corte para cada um dos membros e adicione os membros <i>disso<\/i> do corte e assim por diante. Isso significa que cada n\u00f3 \u00e9 membro de um conjunto de poss\u00edveis qu\u00f3runs.<\/p>\n<p><img decoding=\"async\" alt=\"Entendendo o protocolo de consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/3427406c132cfd1cd174b856a1239908.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Escolha apenas um corte de qu\u00f3rum a cada passo.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Entendendo o protocolo de consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/79a8728890ecb36b2e127b1b76c44fc8.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Entendendo o protocolo de consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/22fe0422c73cdf5fb5416e389934c5c3.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Entendendo o protocolo de consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/60379efdde3b88fb9c86de6c5b4a0b62.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Um poss\u00edvel qu\u00f3rum. Ou uma alternativa...<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Entendendo o protocolo de consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/341f1e897be1474ee2d67324da2134b1.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>\u2026 escolhemos outros cortes...<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Entendendo o protocolo de consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/8a6d605050b075bf935e6151bd1cbe2c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Entendendo o protocolo de consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/865567aa370605b7cf10da3457c3d158.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>(quando poss\u00edvel)\u2026<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Entendendo o protocolo de consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/6343f774104454d62e7c8681bf25dbcb.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>\u2026 cria um outro qu\u00f3rum.<\/i><\/p>\n<p>Como um n\u00f3 descobre em quais cortes outros n\u00f3s est\u00e3o? Exatamente como outras informa\u00e7\u00f5es sobre outros n\u00f3s: das transmiss\u00f5es que cada n\u00f3 transmite pela rede quando seu estado de vota\u00e7\u00e3o muda. Cada transmiss\u00e3o inclui informa\u00e7\u00f5es sobre os cortes do n\u00f3 que est\u00e1 enviando. O documento t\u00e9cnico SCP n\u00e3o especifica o mecanismo de comunica\u00e7\u00e3o. Implementa\u00e7\u00f5es geralmente usam <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Gossip_protocol\">o protocolo gossip<\/a><\/noindex> para garantir a transmiss\u00e3o de mensagens por toda a rede.<\/p>\n<p>Lembre-se de que, no sistema de acordos bizantinos n\u00e3o federativos, o qu\u00f3rum \u00e9 definido como a maioria de todos os n\u00f3s. O sistema de acordos bizantinos foi desenvolvido sob a perspectiva da quest\u00e3o: quantos n\u00f3s desonestos o sistema pode suportar? Em um sistema de N n\u00f3s projetado para sobreviver a f falhas (trapa\u00e7as), um n\u00f3 deve ser capaz de progredir ao receber respostas de N\u2212f pares, uma vez que f deles podem n\u00e3o estar funcionando. Contudo, ao receber respostas de N\u2212f pares, pode-se supor que todos os f pares (dos quais o n\u00f3 n\u00e3o recebeu resposta) s\u00e3o, na verdade, honestos. Assim, os f de N\u2212f pares (dos quais foi recebida resposta) s\u00e3o os maliciosos. Para que os n\u00f3s cheguem a um consenso, a maioria dos demais n\u00f3s deve ser honesta, ou seja, precisamos que N\u2212f seja maior que 2f ou N &gt; 3f. Portanto, geralmente um sistema projetado para sobreviver a f falhas ter\u00e1 um total de N=3f+1 n\u00f3s e um tamanho de qu\u00f3rum de 2f+1. Assim que a proposta ultrapassa o limite do qu\u00f3rum, os demais membros da rede est\u00e3o convencidos de que quaisquer propostas concorrentes falhar\u00e3o. Assim, a rede converge para um resultado.<\/p>\n<p>Mas, no sistema de acordos bizantinos federativos, n\u00e3o pode haver uma maioria (uma vez que ningu\u00e9m conhece o tamanho total da rede), e o conceito de maioria \u00e9, de fato, in\u00fatil! Se a ades\u00e3o ao sistema for aberta, algu\u00e9m pode obter a maioria simplesmente realizando o que \u00e9 chamado de ataque de Sybil: unindo-se repetidamente \u00e0 rede atrav\u00e9s de v\u00e1rios n\u00f3s. Ent\u00e3o, por que o fechamento transitivo do corte pode ser chamado <i>qu\u00f3rum<\/i>, e como ele \u00e9 capaz de suprimir propostas concorrentes?<\/p>\n<p>Tecnicamente, n\u00e3o! Imagine uma rede de seis n\u00f3s, onde dois grupos de tr\u00eas est\u00e3o isolados dentro dos seus pr\u00f3prios cortes de qu\u00f3rum. O primeiro subgrupo pode tomar uma decis\u00e3o da qual o segundo nunca ouvir\u00e1, e vice-versa. Para essa rede, n\u00e3o h\u00e1 como alcan\u00e7ar um consenso (exceto por acaso).<\/p>\n<p>Por isso, o SCP requer que, para a vota\u00e7\u00e3o federativa (e para a aplica\u00e7\u00e3o de teoremas importantes do artigo), a rede deve possuir uma propriedade chamada <i>interse\u00e7\u00e3o de qu\u00f3runs<\/i>. Na rede com essa propriedade, quaisquer dois qu\u00f3runs que possam ser formados sempre se sobrep\u00f5em em pelo menos um n\u00f3. Para determinar os sentimentos predominantes da rede, isso \u00e9 quase t\u00e3o bom quanto ter a maioria. Intuitivamente, isso significa que se algum qu\u00f3rum concorda com a afirma\u00e7\u00e3o X, nenhum outro qu\u00f3rum poder\u00e1 concordar com algo diferente, pois necessariamente incluir\u00e1 algum n\u00f3 do primeiro qu\u00f3rum que j\u00e1 votou em X.<\/p>\n<p><img decoding=\"async\" alt=\"Entendendo o protocolo de consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/5b0aeec99e285b4bbeb92ec5b8dfe69d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Se houver interse\u00e7\u00f5es de qu\u00f3runs na rede\u2026<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Entendendo o protocolo de consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/bdb3866cb02fb5991446f0cb0fa5a4fd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>\u2026 ent\u00e3o quaisquer dois qu\u00f3runs que voc\u00ea puder formar\u2026<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Entendendo o protocolo de consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/29ee8d1ce9fba6c5c24386ce1c1c639b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>\u2026 sempre se sobrepor\u00e3o.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Entendendo o protocolo de consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/6f1ef2b9896669c10fd19f1acd52db70.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Entendendo o protocolo de consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/6849569e849ac3b5487d31e0bf22a596.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n(Claro, os n\u00f3s sobrepostos podem ser bizantinos, enganadores ou ruins de outras maneiras. Nesse caso, a interse\u00e7\u00e3o dos qu\u00f3runs n\u00e3o ajuda a rede a concordar de forma alguma. Por essa raz\u00e3o, muitos resultados no documento t\u00e9cnico SCP se baseiam em suposi\u00e7\u00f5es claramente expressas, como a de que a rede ainda possui interse\u00e7\u00f5es de qu\u00f3runs <i>mesmo ap\u00f3s a remo\u00e7\u00e3o de n\u00f3s problem\u00e1ticos<\/i>. Para simplificar, deixaremos essas suposi\u00e7\u00f5es <i>n\u00e3o expl\u00edcitas<\/i> no restante do artigo).<\/p>\n<p>Pode parecer irrazo\u00e1vel esperar que uma rede de n\u00f3s independentes possa ter uma interse\u00e7\u00e3o de qu\u00f3runs confi\u00e1vel. Mas h\u00e1 duas raz\u00f5es pelas quais isso acontece.<\/p>\n<p>A primeira raz\u00e3o \u00e9 a exist\u00eancia da pr\u00f3pria internet. A internet \u00e9 um exemplo ideal de uma rede de n\u00f3s independentes com interse\u00e7\u00f5es de qu\u00f3runs. A maioria dos n\u00f3s na internet se conecta apenas a alguns outros n\u00f3s locais, mas esses pequenos conjuntos se sobrep\u00f5em o suficiente para que cada n\u00f3 seja acess\u00edvel a partir de qualquer outro n\u00f3 de uma forma ou de outra.<\/p>\n<p>A segunda raz\u00e3o \u00e9 espec\u00edfica para a rede de pagamento Stellar (a aplica\u00e7\u00e3o mais comum do SCP). Cada ativo na rede Stellar tem um emissor, e as recomenda\u00e7\u00f5es do Stellar exigem que cada emissor nomeie um ou mais n\u00f3s na rede para processar os pedidos de resgate. \u00c9 do seu interesse incluir esses n\u00f3s diretamente ou indiretamente nos cortes de qu\u00f3rum para cada ativo que lhe interessar. Assim, os qu\u00f3runs para todos os n\u00f3s interessados neste ativo se sobrepor\u00e3o pelo menos nesses n\u00f3s de resgate. N\u00f3s interessados em v\u00e1rios ativos incluir\u00e3o em seus cortes de qu\u00f3rum todos os n\u00f3s de resgate dos respectivos emissores, e eles buscar\u00e3o unir todos os ativos juntos. Al\u00e9m disso, quaisquer ativos que n\u00e3o estejam assim relacionados a outros na rede e <i>n\u00e3o devem estar relacionados<\/i> \u2014 foram projetados para que n\u00e3o haja sobreposi\u00e7\u00e3o de qu\u00f3runs nesta rede (por exemplo, bancos na \u00e1rea do d\u00f3lar \u00e0s vezes querem negociar com bancos da \u00e1rea do euro e bancos da \u00e1rea do peso, portanto est\u00e3o na mesma rede, mas nenhum deles se importa com uma rede separada de crian\u00e7as negociando cart\u00f5es de beisebol).<\/p>\n<p>Claro, <i>a expectativa<\/i> de sobreposi\u00e7\u00e3o de qu\u00f3runs n\u00e3o \u00e9 <i>uma garantia<\/i>. Outras \u0441\u0438\u0441\u0442\u0435\u043c\u044b de acordo bizantino, com sua complexidade, devem muito \u00e0 garantia de qu\u00f3runs. Uma inova\u00e7\u00e3o importante do SCP \u00e9 que ele remove a responsabilidade pela cria\u00e7\u00e3o de qu\u00f3runs do pr\u00f3prio algoritmo de consenso e o passa para o n\u00edvel de aplica\u00e7\u00e3o. Assim, embora a vota\u00e7\u00e3o federativa seja bastante geral para a vota\u00e7\u00e3o sobre quaisquer quest\u00f5es, na verdade sua confiabilidade depende criticamente do significado mais amplo desses valores. Alguns tipos de uso hipot\u00e9ticos podem n\u00e3o ser t\u00e3o convenientes para a cria\u00e7\u00e3o de redes bem conectadas quanto outros.<\/p>\n<h1>Vota\u00e7\u00e3o, aceita\u00e7\u00e3o e confirma\u00e7\u00e3o<\/h1>\n<p>\nNa rodada de vota\u00e7\u00e3o federativa, um n\u00f3 opcionalmente come\u00e7a a votar em algum valor V. Isso significa transmitir na rede a mensagem: 'Eu sou o n\u00f3 N, meus cortes de qu\u00f3rum Q, e eu voto em V'. Quando um n\u00f3 vota dessa forma, ele promete que nunca votou contra V e nunca o far\u00e1.<\/p>\n<p>Nas transmiss\u00f5es a partir de n\u00f3s pareados, cada n\u00f3 v\u00ea como os outros votam. Assim que um n\u00f3 coleta um n\u00famero suficiente de mensagens desse tipo, ele pode rastrear os cortes de qu\u00f3runs e tentar encontrar qu\u00f3runs. Se ele v\u00ea um qu\u00f3rum de pares que tamb\u00e9m votam em V, ele pode passar para <i>a aceita\u00e7\u00e3o<\/i> de V e transmitir essa nova mensagem pela rede: \"Eu sou o n\u00f3 N, meus cortes de qu\u00f3rum Q, e eu aceito V\". A aceita\u00e7\u00e3o fornece uma garantia mais forte do que uma simples vota\u00e7\u00e3o. Quando um n\u00f3 vota em V, ele nunca pode votar em outras op\u00e7\u00f5es. Mas se um n\u00f3 aceita V, nenhum n\u00f3 na Rede nunca aceitar\u00e1 outra op\u00e7\u00e3o (teorema 8 no documento t\u00e9cnico SCP prova isso).<\/p>\n<p>Claro, h\u00e1 uma alta probabilidade de que um qu\u00f3rum de n\u00f3s que concordem com V n\u00e3o seja encontrado imediatamente. Outros n\u00f3s podem votar em outros valores. Mas para o n\u00f3, h\u00e1 outra maneira de passar da simples vota\u00e7\u00e3o para a aceita\u00e7\u00e3o. N pode aceitar outro valor W, mesmo que n\u00e3o tenha votado nele e mesmo que n\u00e3o veja um qu\u00f3rum para ele. Para decidir mudar seu voto, basta ver <i>um conjunto bloqueador<\/i> de n\u00f3s que aceitaram W. Um conjunto bloqueador \u00e9 composto por um n\u00f3 de cada um dos cortes de qu\u00f3rum de N. Como o nome sugere, ele \u00e9 capaz de <i>bloquear<\/i> qualquer outro valor. Se todos os n\u00f3s nesse conjunto aceitarem W, ent\u00e3o (de acordo com o teorema 8) nunca ser\u00e1 poss\u00edvel formar um qu\u00f3rum que aceite um valor diferente, e portanto, para N tamb\u00e9m \u00e9 seguro aceitar W.<\/p>\n<p><img decoding=\"async\" alt=\"Entendendo o protocolo de consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/6dd4ec5595ab863daf684fec670d83a6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>O n\u00f3 N com tr\u00eas cortes de qu\u00f3rum.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Entendendo o protocolo de consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/b65e32160570af2883eef9990a74e3bd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>B-D-F \u00e9 um conjunto bloqueador para N: inclui um n\u00f3 de cada um dos cortes de N.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Entendendo o protocolo de consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/7e17b4a9ee83aac7fa2b68b2f9fae066.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>B-E tamb\u00e9m \u00e9 um conjunto bloqueador para N, porque E aparece em dois cortes de N.<\/i><\/p>\n<p>Mas um conjunto bloqueador n\u00e3o \u00e9 um qu\u00f3rum. Seria muito f\u00e1cil enganar o n\u00f3 N para aceitar o valor desejado, se bastasse comprometer apenas um n\u00f3 em cada um dos cortes de N. Portanto, aceitar um valor n\u00e3o \u00e9 o fim da vota\u00e7\u00e3o. Em vez disso, N deve confirmar o valor, ou seja, ver um qu\u00f3rum de n\u00f3s que o aceitam. Se ele chegar t\u00e3o longe, ent\u00e3o, como o documento t\u00e9cnico SCP prova (no teorema 11), o restante da rede tamb\u00e9m acabar\u00e1 confirmando o mesmo valor, assim N encerrar\u00e1 a vota\u00e7\u00e3o federativa com um valor espec\u00edfico como resultado.<\/p>\n<p><img decoding=\"async\" alt=\"Entendendo o protocolo de consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/bd68dc5172460c17fa2de54fcc0d9017.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Vota\u00e7\u00e3o federativa.<\/i><\/p>\n<p>O processo de vota\u00e7\u00e3o, aceita\u00e7\u00e3o e confirma\u00e7\u00e3o consiste em uma rodada completa de vota\u00e7\u00e3o federativa. O protocolo de consenso Stellar combina muitas dessas rodadas para criar um sistema de consenso completo.<\/p>\n<h1>Protocolo de Consenso Stellar<\/h1>\n<p>\nAs duas propriedades mais importantes de um sistema de consenso s\u00e3o <i>seguran\u00e7a<\/i> e <i>resili\u00eancia<\/i>. Um algoritmo de consenso \u00e9 considerado \"seguro\" se nunca pode fornecer resultados diferentes para participantes diferentes (a c\u00f3pia da hist\u00f3ria de Bob nunca contradir\u00e1 a de Carol). \"Resili\u00eancia\" significa que o algoritmo sempre produzir\u00e1 um resultado, ou seja, n\u00e3o ficar\u00e1 preso.<\/p>\n<p>O procedimento descrito de vota\u00e7\u00e3o federativa <i>\u00e9 seguro<\/i> no sentido de que se um n\u00f3 confirma o valor V, nenhum outro n\u00f3 confirmar\u00e1 um valor diferente. Mas \"n\u00e3o confirmar um valor diferente\" n\u00e3o significa que ele necessariamente confirmar\u00e1 algo. Os participantes podem votar em uma quantidade t\u00e3o grande de valores diferentes que nenhum alcance o limiar de aceita\u00e7\u00e3o. Isso significa que na vota\u00e7\u00e3o federativa n\u00e3o existe <i>resili\u00eancia<\/i>.<\/p>\n<p>O protocolo de consenso Stellar utiliza a vota\u00e7\u00e3o federativa de tal forma que garante tanto a seguran\u00e7a quanto a resili\u00eancia. (As garantias de seguran\u00e7a e resili\u00eancia do SCP t\u00eam um limite te\u00f3rico. O desenho opta por uma garantia de seguran\u00e7a muito forte, sacrificando uma leve redu\u00e7\u00e3o da resili\u00eancia, mas dado um tempo suficiente, o consenso ser\u00e1 alcan\u00e7ado com alta probabilidade). Em suma, a ideia \u00e9 realizar v\u00e1rias vota\u00e7\u00f5es federativas sobre v\u00e1rios valores at\u00e9 que um deles passe completamente por todas as fases de vota\u00e7\u00e3o do SCP, descritas abaixo.<\/p>\n<p>Os valores pelos quais o SCP busca consenso podem ser o hist\u00f3rico de transa\u00e7\u00f5es ou um pedido de almo\u00e7o, ou qualquer outra coisa, mas \u00e9 importante notar que esses n\u00e3o s\u00e3o os valores que s\u00e3o aceitos ou confirmados. Em vez disso, a vota\u00e7\u00e3o federativa ocorre sobre <i>declara\u00e7\u00f5es sobre esses valores<\/i>.<\/p>\n<p>As primeiras rodadas da vota\u00e7\u00e3o federativa ocorrem na <i>fase de nomea\u00e7\u00e3o<\/i> (nomination phase), em um conjunto de declara\u00e7\u00f5es do tipo \"Eu nomeio V\", possivelmente para muitos valores diferentes de V. O objetivo da nomea\u00e7\u00e3o \u00e9 encontrar uma ou mais declara\u00e7\u00f5es que possam passar pela aceita\u00e7\u00e3o e confirma\u00e7\u00e3o.<\/p>\n<p>Ap\u00f3s encontrar candidatos confirmados, o SCP avan\u00e7a para a etapa de vota\u00e7\u00e3o, onde o objetivo \u00e9 encontrar um <i>boletim<\/i> (ou seja, um cont\u00eainer para o valor proposto) e um qu\u00f3rum que pode declarar <i>o commit<\/i> para ele (commit). Se o qu\u00f3rum fizer o commit do boletim, seu valor \u00e9 aceito como consenso. Mas antes que um n\u00f3 possa votar para o commit do boletim, ele deve primeiro confirmar <i>o cancelamento<\/i> de todos os boletins com um valor menor de contador. Esses passos \u2014 o cancelamento de boletins para encontrar aquele para o qual pode ser confirmado o commit \u2014 envolvem v\u00e1rias rodadas de vota\u00e7\u00e3o federativa sobre v\u00e1rias declara\u00e7\u00f5es de boletins.<\/p>\n<p>As pr\u00f3ximas se\u00e7\u00f5es detalham mais sobre a indica\u00e7\u00e3o e vota\u00e7\u00e3o.<\/p>\n<h1>Indica\u00e7\u00e3o<\/h1>\n<p>\nNo in\u00edcio da etapa de indica\u00e7\u00e3o, cada n\u00f3 pode escolher espontaneamente um valor V e votar para a afirma\u00e7\u00e3o \"Eu indico V\". O objetivo nesta etapa \u00e9 confirmar a indica\u00e7\u00e3o de algum valor por meio de vota\u00e7\u00e3o federativa.<\/p>\n<p>\u00c9 poss\u00edvel que um n\u00famero suficiente de n\u00f3s vote por declara\u00e7\u00f5es suficientemente diferentes, e nenhuma indica\u00e7\u00e3o possa alcan\u00e7ar o limite de aceita\u00e7\u00e3o. Portanto, al\u00e9m de transmitir seus pr\u00f3prios votos de nomea\u00e7\u00e3o, os n\u00f3s \"refletem\" as indica\u00e7\u00f5es de seus pares. Refletir (echo) significa que, se um n\u00f3 votar por uma indica\u00e7\u00e3o V, mas v\u00ea uma mensagem de um vizinho votando por uma indica\u00e7\u00e3o W, agora votar\u00e1 tanto por V quanto por W. (Nem todos os votos dos pares s\u00e3o refletidos durante a indica\u00e7\u00e3o, pois isso pode levar a uma explos\u00e3o de diferentes nomeados. O SCP inclui um mecanismo para regular esses votos. Em resumo, existe uma f\u00f3rmula para determinar a \"prioridade\" de um par do ponto de vista do n\u00f3, e apenas os votos de n\u00f3s de alta prioridade s\u00e3o refletidos. Quanto mais longa a indica\u00e7\u00e3o, mais baixo o limite, portanto, o n\u00f3 amplia o conjunto de pares cujos votos refletir\u00e1. A f\u00f3rmula de prioridade, como uma das vari\u00e1veis de entrada, inclui o n\u00famero do slot, portanto um n\u00f3 de par de alta prioridade para um slot pode ser de baixa prioridade para outro, e vice-versa).<\/p>\n<p>O conceito de apresentar tanto V quanto W paralelamente s\u00e3o vozes federativas distintas, cada uma capaz de alcan\u00e7ar aprova\u00e7\u00e3o ou confirma\u00e7\u00e3o separadamente. Na pr\u00e1tica, as mensagens do protocolo SCP empacotam essas vozes separadas juntas.<\/p>\n<p>Embora votar para apresentar V seja uma promessa de nunca votar contra a apresenta\u00e7\u00e3o de V, no n\u00edvel da aplica\u00e7\u00e3o \u2014 neste caso, SCP \u2014 \u00e9 definido o que significa \"contra\". O SCP n\u00e3o reconhece uma afirma\u00e7\u00e3o que contradiga o voto \"Eu apresento X\", ou seja, n\u00e3o h\u00e1 mensagem \"Eu sou contra a apresenta\u00e7\u00e3o de X\", portanto, o n\u00f3 pode votar na apresenta\u00e7\u00e3o de quaisquer valores. Muitas dessas nomea\u00e7\u00f5es n\u00e3o levar\u00e3o a nada, mas, em \u00faltima an\u00e1lise, o n\u00f3 poder\u00e1 aceitar ou confirmar um ou mais valores. Assim que o indicado for confirmado, ele se torna <i>um candidato<\/i>.<\/p>\n<p><img decoding=\"async\" alt=\"Entendendo o protocolo de consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/794f55d076ec3e1773c49d32e29c084d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>A apresenta\u00e7\u00e3o SCP usando vota\u00e7\u00e3o federativa. Pode haver muitos valores \"B\" apresentados por n\u00f3s de igual n\u00edvel e \"refletidos\" por um n\u00f3.<\/i> <\/p>\n<p>A apresenta\u00e7\u00e3o de candidatos pode resultar em v\u00e1rios candidatos confirm\u00e1veis. Portanto, o SCP requer que o n\u00edvel de aplica\u00e7\u00e3o forne\u00e7a algum m\u00e9todo para combinar candidatos em um \u00fanico <i>composto<\/i> (composite). O m\u00e9todo de combina\u00e7\u00e3o pode ser qualquer um. A principal quest\u00e3o \u00e9 que se esse m\u00e9todo for determinado, ent\u00e3o cada n\u00f3 combinar\u00e1 os mesmos candidatos. Em um sistema de vota\u00e7\u00e3o para o almo\u00e7o, \u201ccombinar\u201d pode simplesmente significar descartar um dos dois candidatos. (Mas de forma determinada: cada n\u00f3 deve escolher o mesmo valor para descartar. Por exemplo, uma escolha anterior em ordem alfab\u00e9tica). Na rede de pagamento Stellar, onde ocorrem vota\u00e7\u00f5es sobre o hist\u00f3rico de transa\u00e7\u00f5es, combinar dois candidatos propostos implica unir as transa\u00e7\u00f5es que eles cont\u00eam, e os \u00faltimos de seus dois timestamps.<\/p>\n<p>A descri\u00e7\u00e3o t\u00e9cnica do SCP prova (teorema 12) que ao final da fase de apresenta\u00e7\u00e3o a rede, em \u00faltima an\u00e1lise, converge para um \u00fanico composto. Mas h\u00e1 um problema: a vota\u00e7\u00e3o federativa \u00e9 um protocolo ass\u00edncrono (assim como o SCP). Em outras palavras, os n\u00f3s n\u00e3o s\u00e3o coordenados no tempo, mas apenas nas mensagens que enviam. Do ponto de vista de um n\u00f3, n\u00e3o est\u00e1 claro quando <i>terminou<\/i> fase de proposi\u00e7\u00e3o. E embora todos os n\u00f3s acabem chegando ao mesmo composto, eles podem escolher diferentes rotas nesse caminho, criando ao longo do percurso diferentes candidatos compostos, e nunca podem dizer qual deles \u00e9 o final.<\/p>\n<p>Mas isso \u00e9 normal. A proposi\u00e7\u00e3o \u00e9 apenas uma prepara\u00e7\u00e3o. O principal \u00e9 limitar o n\u00famero de candidatos para alcan\u00e7ar o consenso, que ocorre no processo <i>de vota\u00e7\u00e3o<\/i> (balloting).<\/p>\n<h1>Vota\u00e7\u00e3o<\/h1>\n<p>\nUm boletim \u00e9 um par , onde counter \u00e9 um n\u00famero inteiro que come\u00e7a em 1, e value \u00e9 um candidato da fase de proposi\u00e7\u00e3o. Isso pode ser um pr\u00f3prio candidato do n\u00f3 ou um candidato de um n\u00f3 vizinho, aceito por esse n\u00f3. Simplificando, ao votar, s\u00e3o feitas tentativas repetidas para fazer a rede alcan\u00e7ar um consenso sobre algum candidato em algum boletim, por meio da realiza\u00e7\u00e3o de m\u00faltivas vota\u00e7\u00f5es federativas sobre declara\u00e7\u00f5es de boletins. Os contadores nos boletins rastreiam as tentativas feitas, e boletins com contadores mais altos t\u00eam prioridade sobre boletins com contadores mais baixos. Se o boletim  travar, uma nova vota\u00e7\u00e3o come\u00e7a, agora sobre o boletim .<\/p>\n<p>\u00c9 importante diferenciar <i>valores<\/i> (por exemplo, o que deve ser o pedido do almo\u00e7o: pizza ou saladas), <i>boletins<\/i> (par counter-value) e <i>declara\u00e7\u00f5es<\/i> sobre boletins. A rodada SCP inclui v\u00e1rias rodadas de vota\u00e7\u00e3o federativa, em particular, sobre declara\u00e7\u00f5es como:<\/p>\n<ul>\n<li>\"Estou pronto para o commit do boletim B\" e\n<\/li>\n<li>\"Eu declaro o commit do boletim B\"<\/li>\n<\/ul>\n<p>\nDo ponto de vista desse n\u00f3, o consenso \u00e9 alcan\u00e7ado quando ele encontra o boletim B, para o qual pode confirmar (ou seja, encontrar qu\u00f3rum que aceite) a declara\u00e7\u00e3o \"Eu declaro o commit do boletim B\". A partir desse momento, \u00e9 seguro agir com base no valor indicado em B \u2014 por exemplo, fazer esse pedido de almo\u00e7o. Isso \u00e9 chamado de <i>externaliza\u00e7\u00e3o<\/i> do valor. Uma vez confirmado o aceita\u00e7\u00e3o do boletim, o n\u00f3 pode ter certeza de que qualquer outro n\u00f3 ter\u00e1 externado esse mesmo valor ou certamente o far\u00e1 no futuro.<\/p>\n<p>Embora conceitualmente muitos votos federativos sejam realizados com base em declara\u00e7\u00f5es sobre muitos diferentes boletins, eles trocam n\u00e3o tantas mensagens, pois cada mensagem encapsula uma s\u00e9rie de boletins. Assim, uma mensagem promove o estado de muitos votos federativos simultaneamente, por exemplo: \"Aceito o commit dos boletins no intervalo de  at\u00e9 .\"<\/p>\n<p>O que significam os termos \"preparado\" (prepared) e \"commit\" (commit)?<\/p>\n<p>Um n\u00f3 vota pelo commit do boletim quando est\u00e1 convencido de que outros n\u00f3s n\u00e3o far\u00e3o commit de boletins com outros valores. Convencer-se disso \u00e9 o objetivo da prepara\u00e7\u00e3o da declara\u00e7\u00e3o. Um voto que diz: \"Estou pronto para o commit do boletim B\" \u00e9 uma promessa de nunca fazer commit de um boletim menor que B, ou seja, com um contador menor (o SCP requer que os valores nos boletins tenham uma ordem espec\u00edfica. Assim, o boletim  \u00e9 menor que , se N1&lt;N2, e tamb\u00e9m se N1=N2 e V1&lt;V2). Esses boletins menores s\u00e3o &quot;abandonados&quot; (aborted) durante a vota\u00e7\u00e3o preparat\u00f3ria, enquanto B \u00e9 considerado &quot;preparado&quot;.<\/p>\n<p>Por que \"Estou pronto para o commit do boletim B\" significa \"Prometo nunca permitir commit de boletins menores que B\"? Porque o SCP define abort como oposto de commit. O voto sobre a prepara\u00e7\u00e3o do boletim implica tamb\u00e9m a vota\u00e7\u00e3o para cancelar alguns outros boletins, e, como discutimos anteriormente, votar por algo \u00e9 uma promessa de nunca votar contra isso.<\/p>\n<p>Antes de transmitir o commit, o n\u00f3 deve primeiro encontrar um boletim que possa confirmar como preparado. Em outras palavras, ele realiza uma vota\u00e7\u00e3o federativa sobre a quest\u00e3o \"Estou pronto para o commit do boletim B\", possivelmente para muitos boletins diferentes, at\u00e9 encontrar aquele que aceita o qu\u00f3rum.<\/p>\n<p>De onde v\u00eam os boletins para a prepara\u00e7\u00e3o da vota\u00e7\u00e3o? Primeiro, o n\u00f3 transmite a prepara\u00e7\u00e3o para a vota\u00e7\u00e3o por &lt;1,C&gt;, onde C \u00e9 o candidato composto gerado na fase de nomea\u00e7\u00e3o. No entanto, mesmo ap\u00f3s o in\u00edcio da prepara\u00e7\u00e3o para a vota\u00e7\u00e3o, a nomea\u00e7\u00e3o pode resultar em novos candidatos que se tornar\u00e3o novos boletins. Enquanto isso, os pares podem ter diferentes candidatos e podem formar um conjunto bloqueador que aceita \"Estou pronto para o commit do boletim B2\", o que convencer\u00e1 o n\u00f3 a aceit\u00e1-lo tamb\u00e9m. Por fim, h\u00e1 um mecanismo de timeout que gera novas rodadas de vota\u00e7\u00e3o federativa em novos boletins com contadores mais altos se os boletins atuais ficarem parados.<\/p>\n<p>Assim que o n\u00f3 encontra o boletim B, que pode confirmar como preparado, ele transmite uma nova mensagem \"Commit do boletim B\". Essa vota\u00e7\u00e3o informa aos pares que o n\u00f3 nunca desistir\u00e1 de B. Na verdade, se B for um boletim &lt;N,C&gt;, ent\u00e3o \"Commit do boletim &lt;N,C&gt;\" significa um consentimento incondicional para votar pela prontid\u00e3o de cada boletim de &lt;N,C&gt; at\u00e9 &lt;\u221e,s&gt;. Esse valor adicional ajuda outros n\u00f3s a alcan\u00e7ar o par com o commit, caso ainda estejam em etapas mais iniciais do protocolo.<\/p>\n<p>Neste ponto, vale a pena ressaltar mais uma vez que esses s\u00e3o protocolos ass\u00edncronos. Apenas porque um n\u00f3 envia votos para o commit, n\u00e3o significa que seus pares tamb\u00e9m o fa\u00e7am. Alguns ainda podem estar votando em declara\u00e7\u00f5es para a prepara\u00e7\u00e3o da vota\u00e7\u00e3o, enquanto outros talvez j\u00e1 tenham externalizado o valor. O SCP explica como um n\u00f3 deve processar cada tipo de mensagem par-a-par independentemente de sua fase.<\/p>\n<p>Se a mensagem \"Eu declaro o commit \" n\u00e3o pode ser aceita ou confirmada, h\u00e1 uma probabilidade de aceita\u00e7\u00e3o ou confirma\u00e7\u00e3o da mensagem  ou  \u2014 ou, de qualquer forma, de qualquer boletim com o valor C, e n\u00e3o qualquer outro, uma vez que o n\u00f3 j\u00e1 prometeu nunca reverter . Quando o n\u00f3 transmite os votos para o commit, isso ser\u00e1 C ou nada, dependendo de qu\u00e3o longe o consenso ir\u00e1. No entanto, isso ainda n\u00e3o \u00e9 suficiente para o n\u00f3 externalizar C. Alguns bytes bizantinos (compostos por menos do que o qu\u00f3rum, com base em nossas suposi\u00e7\u00f5es sobre seguran\u00e7a) podem mentir para o n\u00f3. Aceitar e, em seguida, confirmar algum boletim (ou intervalo de boletins) \u00e9 o que d\u00e1 ao n\u00f3 a certeza de finalmente externalizar C.<\/p>\n<p><img decoding=\"async\" alt=\"Entendendo o protocolo de consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/c59f036bb8aa189bb3d4540f54121391.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Vota\u00e7\u00e3o SCP por meio de vota\u00e7\u00e3o federativa. N\u00e3o mostrado: a qualquer momento, um cron\u00f4metro pode ser ativado, aumentando o contador no boletim (e, possivelmente, gerando um novo composto a partir de candidatos adicionais propostos).<\/i> <\/p>\n<p>E \u00e9 isso! Assim que a rede chega a um consenso, ela est\u00e1 pronta para fazer isso novamente e novamente. Na rede de pagamentos Stellar, isso acontece a cada 5 segundos: um feito que exige tanto seguran\u00e7a quanto resili\u00eancia, garantidas pelo SCP.<\/p>\n<p>O SCP pode alcan\u00e7ar isso confiando em v\u00e1rias rodadas de vota\u00e7\u00e3o federativa. A vota\u00e7\u00e3o federativa \u00e9 possibilitada pelo conceito de cortes de qu\u00f3rum: conjuntos de n\u00f3s pares nos quais cada n\u00f3 decidiu confiar como parte de seu qu\u00f3rum (subjetivo). Essa configura\u00e7\u00e3o significa que \u00e9 poss\u00edvel chegar a um consenso mesmo em uma rede de ades\u00e3o aberta e com fraudes bizantinas.<\/p>\n<h1>Leitura adicional<\/h1>\n<p><\/p>\n<ul>\n<li>O documento t\u00e9cnico original do SCP pode ser encontrado <noindex><a rel=\"nofollow\" href=\"https:\/\/www.stellar.org\/papers\/stellar-consensus-protocol.pdf\">aqui<\/a><\/noindex>, e <noindex><a rel=\"nofollow\" href=\"https:\/\/datatracker.ietf.org\/doc\/draft-mazieres-dinrg-scp\/\">aqui<\/a><\/noindex> projeto de especifica\u00e7\u00f5es para sua implementa\u00e7\u00e3o.\n<\/li>\n<li>O autor original do protocolo SCP, David Mazieres, explica de forma simplificada (mas ainda t\u00e9cnica) como ele funciona <noindex><a rel=\"nofollow\" href=\"http:\/\/www.scs.stanford.edu\/~dm\/blog\/simplified-scp.html\">aqui<\/a><\/noindex>.\n<\/li>\n<li>Voc\u00ea pode ter se surpreendido ao n\u00e3o encontrar nesta mat\u00e9ria os termos \"minera\u00e7\u00e3o\" ou \"prova de trabalho\". O SCP n\u00e3o utiliza esses m\u00e9todos, mas alguns outros algoritmos de consenso o fazem. Zane Weiszspun escreveu uma acess\u00edvel <noindex><a rel=\"nofollow\" href=\"https:\/\/hackernoon.com\/a-hitchhikers-guide-to-consensus-algorithms-d81aae3eb0e3\">vis\u00e3o geral dos algoritmos de consenso<\/a><\/noindex>.\n<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/bobg\/scp\/blob\/master\/Lunch.md\">Uma descri\u00e7\u00e3o passo a passo<\/a><\/noindex> de uma rede simples alcan\u00e7ando consenso em uma \u00fanica rodada completa do SCP.\n<\/li>\n<li>Para leitores interessados nas implementa\u00e7\u00f5es do SCP: veja <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/stellar\/stellar-core\/tree\/master\/src\/scp\">codigo C++<\/a><\/noindex>, utilizado pela rede de pagamento Stellar, ou <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/bobg\/scp\">c\u00f3digo Go<\/a><\/noindex>, que escrevi para uma melhor compreens\u00e3o do SCP.<\/li>\n<\/ul>\n<p>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/444710\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043a\u043e\u043d\u0441\u0435\u043d\u0441\u0443\u0441\u0430 Stellar \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u043e\u043f\u0438\u0441\u0430\u043d \u0432 \u043d\u0430\u0443\u0447\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0414\u044d\u0432\u0438\u0434\u0430 \u041c\u0430\u0437\u044c\u0435\u0440\u0430 \u0432 2015 \u0433\u043e\u0434\u0443. \u042d\u0442\u043e \u00ab\u0444\u0435\u0434\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0432\u0438\u0437\u0430\u043d\u0442\u0438\u0439\u0441\u043a\u043e\u0433\u043e \u0441\u043e\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u044f\u00bb, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u0435\u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0441\u0435\u0442\u044f\u043c \u0431\u0435\u0437 \u043b\u0438\u0434\u0435\u0440\u043e\u0432 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u0435\u043d\u0441\u0443\u0441\u0430 \u043f\u043e \u043a\u0430\u043a\u043e\u043c\u0443-\u043b\u0438\u0431\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044e. \u041f\u043b\u0430\u0442\u0451\u0436\u043d\u0430\u044f \u0441\u0435\u0442\u044c Stellar \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Stellar Consensus Protocol (SCP) \u0434\u043b\u044f \u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u0438\u0434\u044f\u0442 \u0432\u0441\u0435 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438. \u0421\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b \u043a\u043e\u043d\u0441\u0435\u043d\u0441\u0443\u0441\u0430 \u0442\u0440\u0443\u0434\u043d\u044b \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-30047","post","type-post","status-publish","format-standard","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043a\u043e\u043d\u0441\u0435\u043d\u0441\u0443\u0441\u0430 Stellar \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u043e\u043f\u0438\u0441\u0430\u043d \u0432.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pt\/blog\/razbiraemsya-v-protokole-konsensusa-stellar\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435 \u043a\u043e\u043d\u0441\u0435\u043d\u0441\u0443\u0441\u0430 Stellar | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043a\u043e\u043d\u0441\u0435\u043d\u0441\u0443\u0441\u0430 Stellar \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u043e\u043f\u0438\u0441\u0430\u043d \u0432.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/razbiraemsya-v-protokole-konsensusa-stellar\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:33:25+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:33:25+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Entendendo o protocolo de consenso Stellar | ProHoster","description":"O protocolo de consenso Stellar foi descrito pela primeira vez em.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/razbiraemsya-v-protokole-konsensusa-stellar","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0435 \u043a\u043e\u043d\u0441\u0435\u043d\u0441\u0443\u0441\u0430 Stellar | ProHoster","og:description":"\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043a\u043e\u043d\u0441\u0435\u043d\u0441\u0443\u0441\u0430 Stellar \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u043e\u043f\u0438\u0441\u0430\u043d \u0432.","og:url":"https:\/\/prohoster.info\/pt\/blog\/razbiraemsya-v-protokole-konsensusa-stellar","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:33:25+00:00","article:modified_time":"2019-10-31T18:33:25+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"30047","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"Article","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-20 23:34:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:43:15","updated":"2026-01-20 23:34:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/30047","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=30047"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/30047\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=30047"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=30047"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=30047"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}