{"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\/it\/blog\/razbiraemsya-v-protokole-konsensusa-stellar","title":{"rendered":"Esploriamo il protocollo di consenso Stellar","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Esploriamo il protocollo di consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/09b61160286ae40c21269e1590fc2b92.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIl protocollo di consenso Stellar \u00e8 stato descritto per la prima volta in <noindex><a rel=\"nofollow\" href=\"https:\/\/www.stellar.org\/papers\/stellar-consensus-protocol.pdf\">un articolo scientifico<\/a><\/noindex> di David Mazieres nel 2015. Si tratta di un \"sistema federativo di consenso bizantino\", che permette a reti di calcolo decentralizzate senza leader di raggiungere efficientemente un consenso su una qualsiasi decisione. La rete di pagamento Stellar utilizza il Stellar Consensus Protocol (SCP) per mantenere una storia delle transazioni coerente, visibile a tutti i partecipanti.<\/p>\n<p>Si considera che i protocolli di consenso siano difficili da comprendere. L'SCP \u00e8 pi\u00f9 semplice della maggior parte di essi, ma condivide comunque questa reputazione, in parte a causa dell'idea errata che il \"voto federativo\", di cui si parla nella prima met\u00e0 dell'articolo scientifico, sia l'SCP. Ma non \u00e8 cos\u00ec! \u00c8 solo un importante mattoncino che nella seconda met\u00e0 dell'articolo viene utilizzato per costruire <i>il vero<\/i> protocollo di consenso Stellar.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nIn questo articolo spiegheremo brevemente cosa sia un \"sistema di accordo\", cosa possa renderlo \"bizantino\" e perch\u00e9 rendere un sistema bizantino \"federativo\". Poi spiegheremo la procedura di voto federativa descritta nell'articolo sul SCP, e infine spiegheremo il protocollo SCP stesso.<\/p>\n<h1>Sistemi di accordo<\/h1>\n<p>\nUn sistema di accordo consente a un gruppo di partecipanti di raggiungere un consenso su una qualche questione, ad esempio cosa ordinare per pranzo.<\/p>\n<p>Noi di Interstellar abbiamo implementato il nostro sistema di accordo per il pranzo: ordiniamo ci\u00f2 che dice il nostro manager operativo, John. \u00c8 un sistema semplice ed efficace. Ci fidiamo tutti di John e crediamo che ogni giorno trover\u00e0 qualcosa di interessante e nutriente.<\/p>\n<p>Ma cosa succede se John abusa della nostra fiducia? Potrebbe decidere unilateralmente che tutti noi dobbiamo diventare vegani. Tra una settimana o due, probabilmente lo deporremo e daremo il potere a Elizabeth. Ma improvvisamente, potrebbe amare l'avocado con le acciughe e pensare che tutti debbano essere come lei. Il potere corrompe. Quindi \u00e8 meglio trovare un metodo pi\u00f9 democratico: un modo per assicurarsi che diverse preferenze siano considerate, mentre si garantisce un risultato chiaro e tempestivo, per evitare che nessuno ordini pranzo o che cinque persone facciano ordini diversi, o che la discussione si protragga fino alla sera.<\/p>\n<p>A prima vista, la soluzione sembra semplice: fare una votazione! Ma \u00e8 un'impressione ingannevole. Chi si occuper\u00e0 di raccogliere le schede e comunicare i risultati? E perch\u00e9 gli altri dovrebbero credere a ci\u00f2 che dir\u00e0? Forse possiamo <i>prima di tutto<\/i> votare per un leader di cui ci fidiamo per guidare la votazione \u2014 ma chi guider\u00e0 questa <i>prima<\/i> votazione? E se non riusciamo a trovare un accordo su un leader? O se troviamo un accordo, ma quel leader \u00e8 bloccato in un incontro o va in malattia?<\/p>\n<p>Problemi simili si presentano nelle reti di computer distribuite. Tutti i partecipanti o nodi devono concordare su una certa decisione, come chi \u00e8 il turno di aggiornare un file condiviso o prendere un compito dalla coda di elaborazione. Nella rete di criptovalute, i nodi devono spesso scegliere quale sia la storia completa, tra diverse versioni possibili, che talvolta sono in conflitto. Questo accordo di rete garantisce al destinatario che la moneta \u00e8 (a) valida (non contraffatta) e (b) non \u00e8 stata ancora spesa altrove. Garantisce anche che potr\u00e0 spendere le monete in futuro, poich\u00e9 il nuovo destinatario avr\u00e0 le stesse garanzie per le stesse ragioni.<\/p>\n<p>Qualsiasi sistema di consenso in una rete di calcolo distribuito deve essere resilienti agli errori: deve fornire risultati coerenti nonostante errori quali linee di comunicazione lente, nodi non reattivi e ordine sbagliato dei messaggi. <i>Il sistema<\/i> di consenso bizantino \u00e8 ulteriormente resistente agli errori \"bizantini\": nodi che forniscono informazioni false, che siano a causa di un errore o di un tentativo intenzionale di minare il sistema o ottenere un certo vantaggio. La resilienza \"bizantina\" \u2014 la capacit\u00e0 di fidarsi di una decisione di gruppo, anche quando alcuni membri del gruppo possono mentire o in altro modo non seguire le regole della decisione \u2014 prende il suo nome dalla <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\">favola dei generali dell'Impero Bizantino<\/a><\/noindex>, che cercavano di coordinare un attacco. <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\">Una buona descrizione<\/a><\/noindex> \u00e8 quella di Anthony Stevens.<\/p>\n<p>Consideriamo il proprietario della criptovaluta Alice, che deve scegliere tra comprare un delizioso gelato da Bob e pagare il debito a Carol. \u00c8 possibile che Alice voglia pagare entrambi contemporaneamente, spendendo la stessa moneta in modo fraudolento. Per farlo, deve convincere il computer di Bob che la moneta non \u00e8 mai stata pagata a Carol e convincere il computer di Carol che la moneta non \u00e8 mai stata pagata a Bob. Un sistema di accordo bizantino rende praticamente impossibile questo utilizzando una forma della regola della maggioranza, chiamata <i>quorum<\/i>. Un nodo in una tale rete rifiuta di passare a una certa versione della storia finch\u00e9 non vede che un numero sufficiente di nodi peer-to-peer \u2014 il quorum \u2014 \u00e8 d'accordo su tale passaggio. Una volta che ci\u00f2 avviene, formano un blocco elettorale sufficientemente grande da costringere i nodi rimanenti della rete ad accettare la loro decisione. Alice pu\u00f2 convincere alcuni nodi a mentire a suo nome, ma se la rete \u00e8 abbastanza grande, il suo tentativo sar\u00e0 soffocato dai voti dei nodi onesti.<\/p>\n<p>Quanti nodi sono necessari per un quorum? Al minimo, la maggioranza, e pi\u00f9 precisamente, una maggioranza qualificata per affrontare errori e frodi. Ma per contare la maggioranza, \u00e8 necessario conoscere il numero totale di partecipanti. Nell'ufficio Interstellar o nelle elezioni circondariali, questi numeri sono facili da ottenere. Ma se il tuo gruppo \u00e8 una rete scarsamente definita, dove i nodi possono entrare ed uscire a piacimento senza coordinarsi con un centro, allora \u00e8 necessario un <i>sistema federativo<\/i> di accordo bizantino, capace di determinare i quorum non da un elenco di nodi predefiniti, ma in modo dinamico, da uno snapshot in continua evoluzione e inevitabilmente incompleto dei nodi in un dato momento.<\/p>\n<p>Pu\u00f2 sembrare impossibile creare un quorum dal punto di vista di un singolo nodo in una vasta rete, ma \u00e8 possibile. Tale quorum pu\u00f2 anche garantire i risultati di un voto decentralizzato. Un documento tecnico SCP dimostra come farlo attraverso una procedura chiamata <i>votazione federativa<\/i>.<\/p>\n<h1>Per gli impazienti<\/h1>\n<p>\nIl resto dell'articolo descrive pi\u00f9 in dettaglio la votazione federativa e il protocollo di consenso Stellar. Se non ti interessano i dettagli, ecco una panoramica generale del processo.<\/p>\n<ol>\n<li>I nodi conducono round di voto federale sui \"nominati\". Un round di voto federale significa:\n<ul>\n<li>Il nodo vota per quanto riguarda un'affermazione, ad esempio, \"Propongo il valore V\";\n<\/li>\n<li>Il nodo ascolta le voci dei partecipanti finch\u00e9 non trova quella che pu\u00f2 \"accettare\";\n<\/li>\n<li>Il nodo cerca il \"quorum\" per questa affermazione. Il quorum \"conferma\" il nominato.<\/li>\n<\/ul>\n<\/li>\n<li>Non appena il nodo pu\u00f2 confermare uno o pi\u00f9 nominati, cerca di \"preparare\" una \"scheda\" attraverso diversi round di voto federale.\n<\/li>\n<li>Quando il nodo \u00e8 in grado di verificare la prontezza della scheda, tenta di impegnarla con ulteriori round di voto federale.\n<\/li>\n<li>Una volta che il nodo pu\u00f2 confermare l'impegno della scheda, pu\u00f2 \"esternaizzare\" il valore di questa scheda, utilizzandola come risultato del consenso.<\/li>\n<\/ol>\n<p>\nQuesti passaggi comprendono diversi round di voto federale, i quali insieme formano un solo round SCP. Approfondiamo cosa succede in ogni fase.<\/p>\n<h1>Voto federale<\/h1>\n<p>\nIl voto federale \u00e8 la procedura per determinare se la rete pu\u00f2 concordare su una proposta. In un round di voto, ogni nodo deve scegliere uno dei potenzialmente molti valori. Non pu\u00f2 farlo finch\u00e9 non \u00e8 certo che altri nodi nella rete non sceglieranno un altro risultato. Per essere certi di ci\u00f2, i nodi si scambiano un'infinit\u00e0 di messaggi avanti e indietro, in modo che ognuno <i>confermi<\/i>, che <i>quorum<\/i> nodi <i>accettano<\/i> lo stesso <i>risultato<\/i>. Il resto di questa sezione spiega i termini in questa affermazione e come si svolge l'intera procedura.<\/p>\n<h1>Quorum e fette di quorum<\/h1>\n<p>\nIniziamo definendo il quorum. Come abbiamo discusso sopra, in una rete decentralizzata con membri dinamici, non \u00e8 possibile sapere in anticipo il numero di nodi e dunque quanti servano per la maggioranza. Il voto federale risolve questo problema introducendo una nuova idea <i>fetta di quorum<\/i> (quorum slice): un piccolo insieme di nodi equivalenti ai quali un nodo si fida per trasmettere informazioni sullo stato del voto al resto della rete. Ogni nodo definisce la propria fetta di quorum (di cui diventa membro di fatto).<\/p>\n<p>La formazione del quorum inizia con il taglio del quorum. Per ogni nodo vengono aggiunti i nodi del suo taglio. Poi vengono aggiunti i membri dei tagli <i>di questi nodi<\/i> e cos\u00ec via. Man mano che si procede, si trovano sempre pi\u00f9 nodi che non si possono aggiungere perch\u00e9 sono gi\u00e0 inclusi nel taglio. Quando non ci sono pi\u00f9 nuovi nodi da aggiungere, il processo si ferma: abbiamo formato un quorum tramite la \"chiusura transitiva\" del taglio del nodo iniziale.<\/p>\n<p><img decoding=\"async\" alt=\"Esploriamo il protocollo di consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/6991e3f9a22d920e4a5e9c161f32dee1.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Per trovare un quorum da un dato nodo\u2026<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Esploriamo il protocollo di consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/52b3d435a8f4a67b56deb43c83fee828.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>\u2026 aggiungiamo i membri del suo taglio\u2026<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Esploriamo il protocollo di consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/0820e9ca560caf9ebfa92db8e7a1da85.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>\u2026 poi aggiungiamo i membri dei tagli di questi nodi.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Esploriamo il protocollo di consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/539933eb3c279fa7da68fc9049516fc8.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Continuiamo finch\u00e9 non ci sono pi\u00f9 nodi da aggiungere.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Esploriamo il protocollo di consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/48058639262412514641063a10503a01.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Esploriamo il protocollo di consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/d068fb06f35337ae68c35b4606f329ae.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Non ci sono pi\u00f9 nodi da aggiungere. Questo \u00e8 il quorum.<\/i><\/p>\n<p>In effetti, ogni nodo pu\u00f2 appartenere a pi\u00f9 di un taglio. Per formare un quorum, scegli solo uno dei tagli e aggiungi i membri; poi seleziona qualsiasi taglio per ciascuno dei membri e aggiungi membri <i>di questo<\/i> taglio e cos\u00ec via. Ci\u00f2 significa che ogni nodo \u00e8 membro di un insieme di possibili quorums.<\/p>\n<p><img decoding=\"async\" alt=\"Esploriamo il protocollo di consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/3427406c132cfd1cd174b856a1239908.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Scegli solo un taglio di quorum ad ogni passo.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Esploriamo il protocollo di consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/79a8728890ecb36b2e127b1b76c44fc8.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Esploriamo il protocollo di consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/22fe0422c73cdf5fb5416e389934c5c3.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Esploriamo il protocollo di consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/60379efdde3b88fb9c86de6c5b4a0b62.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Un possibile quorum. O un'alternativa\u2026<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Esploriamo il protocollo di consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/341f1e897be1474ee2d67324da2134b1.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>\u2026 scegliamo altri tagli\u2026<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Esploriamo il protocollo di consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/8a6d605050b075bf935e6151bd1cbe2c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Esploriamo il protocollo di consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/865567aa370605b7cf10da3457c3d158.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>\u2026(quando possibile)\u2026<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Esploriamo il protocollo di consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/6343f774104454d62e7c8681bf25dbcb.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>\u2026 crea un altro quorum.<\/i><\/p>\n<p>Come fa un nodo a sapere in quali tagli si trovano gli altri nodi? Proprio come altre informazioni sugli altri nodi: dalle trasmissioni che ogni nodo invia nella rete quando cambia il suo stato di voto. Ogni trasmissione include informazioni sui tagli del nodo mittente. Nel documento tecnico SCP non \u00e8 specificato il meccanismo di comunicazione. Le implementazioni solitamente usano <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Gossip_protocol\">il protocollo gossip<\/a><\/noindex> per garantire la trasmissione dei messaggi su tutta la rete.<\/p>\n<p>Ricordiamo che nel sistema di accordi bizantini non federativi il quorum \u00e8 definito come la maggioranza di tutti i nodi. Il sistema di accordi bizantini \u00e8 stato progettato considerando la seguente domanda: quanto possono tollerare il sistema nodi disonesti? In un sistema con N nodi, progettato per resistere a f guasti (inganni), un nodo deve essere in grado di progredire ricevendo risposte da N\u2212f peer, poich\u00e9 f di essi potrebbero non funzionare. Tuttavia, ricevendo risposte da N\u2212f peer, si pu\u00f2 presumere che tutti i f peer (da cui il nodo non ha ricevuto risposta) siano effettivamente onesti. Pertanto, i peer disonesti sono f di N\u2212f peer (da cui si \u00e8 ricevuta risposta). Affinch\u00e9 i nodi raggiungano un consenso, deve esserci una maggioranza di nodi onesti tra gli altri, ovvero \u00e8 necessario che N\u2212f sia maggiore di 2f oppure N &gt; 3f. Quindi, di solito un sistema progettato per sopravvivere a f guasti avr\u00e0 in totale N=3f+1 nodi e una dimensione del quorum di 2f+1. Non appena la proposta supera la soglia del quorum, gli altri membri della rete sono convinti che eventuali proposte concorrenti falliranno. Cos\u00ec la rete converge verso il risultato.<\/p>\n<p>Ma nel sistema di accordi bizantini federativi non pu\u00f2 esserci solo una maggioranza (perch\u00e9 nessuno conosce la dimensione complessiva della rete), e il concetto di maggioranza \u00e8 completamente inutile! Se l'appartenenza al sistema \u00e8 aperta, qualcuno pu\u00f2 ottenere la maggioranza semplicemente effettuando quella che viene chiamata l'attacco di Sybil: unendosi alla rete pi\u00f9 volte tramite diversi nodi. Quindi, come si pu\u00f2 chiamare <i>quorum<\/i>, e come \u00e8 in grado di sopprimere proposte concorrenti?<\/p>\n<p>Tecnicamente, non c'\u00e8 modo! Immagina una rete di sei nodi, dove due gruppi di tre sono isolati nei quorum degli altri. Il primo sottogruppo pu\u00f2 prendere decisioni di cui il secondo non sentir\u00e0 mai parlare, e viceversa. Per questa rete non esiste un modo per raggiungere un consenso (se non per caso).<\/p>\n<p>Pertanto, SCP richiede che per il voto federativo (e per l'applicazione di teoremi importanti dell'articolo) la rete debba possedere una propriet\u00e0 chiamata <i>intersezione dei quorum<\/i>. Nella rete con questa propriet\u00e0, qualsiasi due quorum che possono essere costruiti si sovrappongono sempre in almeno un nodo. Per definire i sentimenti prevalenti nella rete, \u00e8 altrettanto utile che avere una maggioranza. Intuitivamente, questo significa che se un qualche quorum \u00e8 d'accordo con l'affermazione X, nessun altro quorum sar\u00e0 mai in grado di concordare su qualcos'altro, perch\u00e9 dovr\u00e0 includere qualche nodo del primo quorum che ha gi\u00e0 votato per X.<\/p>\n<p><img decoding=\"async\" alt=\"Esploriamo il protocollo di consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/5b0aeec99e285b4bbeb92ec5b8dfe69d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Se nella rete ci sono sovrapposizioni tra i quorum\u2026<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Esploriamo il protocollo di consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/bdb3866cb02fb5991446f0cb0fa5a4fd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>\u2026allora qualsiasi due quorum che puoi costruire\u2026<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Esploriamo il protocollo di consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/29ee8d1ce9fba6c5c24386ce1c1c639b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>\u2026si sovrapporranno sempre.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Esploriamo il protocollo di consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/6f1ef2b9896669c10fd19f1acd52db70.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Esploriamo il protocollo di consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/6849569e849ac3b5487d31e0bf22a596.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n(Naturalmente, i nodi sovrapposti possono rivelarsi beati bizantini o difettosi in altri aspetti. In tal caso, la sovrapposizione dei quorum non aiuta affatto la rete a raggiungere un consenso. Per questa ragione, molti risultati nel documento tecnico SCP si basano su assunzioni esplicitamente dichiarate, come quella che ci sia ancora sovrapposizione di quorum nella rete <i>anche dopo la rimozione dei nodi difettosi<\/i>. Per semplicit\u00e0, lasceremo queste assunzioni <i>implicite<\/i> per il resto dell'articolo).<\/p>\n<p>Pu\u00f2 sembrare irragionevole aspettarsi una sovrapposizione affidabile dei quorum in una rete di nodi indipendenti. Ma ci sono due motivi per cui ci\u00f2 accade.<\/p>\n<p>Il primo motivo \u00e8 l'esistenza stessa di Internet. Internet \u00e8 un esempio ideale di una rete di nodi indipendenti con sovrapposizione dei quorum. La maggior parte dei nodi in Internet \u00e8 collegata solo a pochi altri nodi locali, ma questi piccoli insiemi si sovrappongono a sufficienza affinch\u00e9 ogni nodo sia accessibile da ogni altro nodo attraverso un percorso o un altro.<\/p>\n<p>La seconda ragione \u00e8 specifica per la rete di pagamento Stellar (il pi\u00f9 comune utilizzo di SCP). Ogni asset nella rete Stellar ha un emittente, e le linee guida di Stellar richiedono che ogni emittente designi uno o pi\u00f9 nodi nella rete per gestire le richieste di rimborso. \u00c8 nel tuo interesse includere direttamente o indirettamente questi nodi nei gruppi di quorum per ogni asset di tuo interesse. I quorum per tutti i nodi interessati da un dato asset si sovrapporranno almeno in questi nodi di rimborso. I nodi interessati a pi\u00f9 asset includeranno nei loro gruppi di quorum tutti i nodi di rimborso degli emittenti corrispondenti e cercheranno di unire tutti gli asset insieme. Inoltre, qualsiasi asset che non \u00e8 collegato in questo modo ad altri nella rete, e <i>non deve essere collegato<\/i> \u2014 \u00e8 progettato affinch\u00e9 non ci siano sovrapposizioni di quorum in questa rete (per esempio, le banche della zona dollaro a volte vogliono commerciare con banche della zona euro e banche della zona peso, quindi si trovano nella stessa rete, ma nessuno di loro \u00e8 interessato a una rete separata di bambini che commerciano figurine di baseball).<\/p>\n<p>Certo, <i>l'aspettativa<\/i> di sovrapposizioni di quorum non \u00e8 <i>una garanzia<\/i>. Altri sistemi di accordo bizantino sono complessi in gran parte a causa della garanzia dei quorum. Una novit\u00e0 importante di SCP \u00e8 che solleva la responsabilit\u00e0 della creazione dei quorum dall'algoritmo di consenso e la porta a livello di applicazione. Pertanto, sebbene il voto federativo sia abbastanza comune per il voto su qualsiasi questione, in realt\u00e0 la sua affidabilit\u00e0 dipende criticamente dal significato pi\u00f9 ampio di questi valori. Alcuni tipi ipotetici di utilizzo potrebbero risultare meno convenienti per creare reti ben collegate rispetto ad altri.<\/p>\n<h1>Voto, approvazione e conferma<\/h1>\n<p>\nNel round di voto federativo, un nodo inizia opzionalmente a votare per un valore V. Questo significa trasmettere alla rete un messaggio: 'Io sono il nodo N, i miei gruppi di quorum sono Q e voto per V'. Quando un nodo vota in questo modo, promette che non ha mai votato contro V e non lo far\u00e0 mai.<\/p>\n<p>Nelle trasmissioni dai nodi peer-to-peer, ogni nodo vede come votano gli altri. Una volta che un nodo raccoglie un numero sufficiente di questi messaggi, pu\u00f2 monitorare i campioni di quorum e cercare di trovare i quorum. Se vede un quorum di peer che votano per V, pu\u00f2 passare a <i>l'accettazione<\/i> di V e trasmettere questo nuovo messaggio nella rete: \u00abIo sono il nodo N, i miei campioni di quorum Q e accetto V\u00bb. L'accettazione fornisce una garanzia pi\u00f9 forte rispetto al semplice voto. Quando un nodo vota per V, non pu\u00f2 mai votare per altre opzioni. Ma se un nodo accetta V, nessun nodo nella rete accetter\u00e0 mai un'altra opzione (teorema 8 nel documento tecnico SCP lo dimostra).<\/p>\n<p>Certamente, c'\u00e8 alta probabilit\u00e0 che non si trovi subito un quorum di nodi che concordano su V. Altri nodi potrebbero votare per altri valori. Ma per un nodo c'\u00e8 un altro modo per passare dal semplice voto all'accettazione. N pu\u00f2 accettare un altro valore W, anche se non ha votato per esso, e anche se non vede un quorum per esso. Per decidere di cambiare il proprio voto, \u00e8 sufficiente vedere <i>un insieme bloccante<\/i> di nodi che hanno accettato W. Un insieme bloccante \u00e8 composto da un nodo per ciascuno dei campioni di quorum di N. Come suggerisce il nome, \u00e8 in grado di <i>bloccare<\/i> qualsiasi altro valore. Se tutti i nodi in un tale insieme accettano W, allora (secondo il teorema 8) non si potr\u00e0 mai formare un quorum che accetti un valore diverso, e quindi per N \u00e8 sicuro accettare W.<\/p>\n<p><img decoding=\"async\" alt=\"Esploriamo il protocollo di consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/6dd4ec5595ab863daf684fec670d83a6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Il nodo N con tre campioni di quorum.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Esploriamo il protocollo di consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/b65e32160570af2883eef9990a74e3bd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>B-D-F \u00e8 un insieme bloccante per N: include un nodo per ciascuno dei campioni di N.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Esploriamo il protocollo di consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/7e17b4a9ee83aac7fa2b68b2f9fae066.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>B-E \u00e8 anch'esso un insieme bloccante per N, perch\u00e9 E appare in due campioni di N.<\/i><\/p>\n<p>Ma un insieme bloccante non \u00e8 un quorum. Sarebbe troppo facile ingannare il nodo N affinch\u00e9 accetti il valore desiderato, se fosse sufficiente violare solo un nodo in ciascuno dei campioni di N. Pertanto, l'accettazione di un valore non segna la fine del voto. Invece, N deve confermare il valore, cio\u00e8 vedere un quorum di nodi che lo accettano. Se N arriva cos\u00ec lontano, allora, come dimostra il documento tecnico SCP (nel teorema 11), anche il resto della rete alla fine confermer\u00e0 lo stesso valore, quindi N completer\u00e0 il voto federativo con un determinato valore come risultato.<\/p>\n<p><img decoding=\"async\" alt=\"Esploriamo il protocollo di consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/bd68dc5172460c17fa2de54fcc0d9017.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Voto federativo.<\/i><\/p>\n<p>Il processo di voto, approvazione e conferma costituisce un intero ciclo di voto federativo. Il protocollo di consenso Stellar riunisce molti di questi cicli per creare un sistema di consenso completo.<\/p>\n<h1>Protocollo di consenso Stellar<\/h1>\n<p>\nLe due caratteristiche pi\u00f9 importanti di un sistema di consenso sono <i>sicurezza<\/i> e <i>robustezza<\/i>. Un algoritmo di consenso \u00e8 \"sicuro\" se non pu\u00f2 mai fornire risultati diversi a partecipanti diversi (la copia della storia di Bob non contraddir\u00e0 mai quella di Carol). La \"robustezza\" significa che l'algoritmo fornisce sempre un risultato, cio\u00e8 non si blocca mai.<\/p>\n<p>La procedura di voto federativo descritta <i>\u00e8 sicura<\/i> nel senso che se un nodo conferma un valore V, nessun altro nodo confermer\u00e0 un altro valore. Ma \"non confermare un altro valore\" non significa necessariamente che debba confermare qualcosa. I partecipanti possono votare per un numero cos\u00ec elevato di valori diversi che nulla raggiunger\u00e0 la soglia di accettazione. Questo significa che nel voto federativo non c'\u00e8 <i>robustezza<\/i>.<\/p>\n<p>Il protocollo di consenso Stellar utilizza il voto federativo in modo da garantire sia la sicurezza che la robustezza. (Le garanzie di sicurezza e robustezza dell'SCP hanno un limite teorico. La costruzione sceglie una garanzia di sicurezza molto forte, sacrificando un lieve indebolimento della robustezza, ma considerando un tempo sufficiente, \u00e8 molto probabile che si raggiunga un consenso). In breve, l'idea \u00e8 quella di condurre pi\u00f9 voti federativi su diversi valori finch\u00e9 uno di essi non supera tutte le fasi di voto SCP descritte di seguito.<\/p>\n<p>I valori per i quali l'SCP cerca consenso possono essere la storia delle transazioni, un ordine per il pranzo o qualcos'altro, ma \u00e8 importante notare che non sono i valori che vengono accettati o confermati. Invece, il voto federativo si svolge su <i>affermazioni su questi valori<\/i>.<\/p>\n<p>I primi round di voto federativo avvengono in <i>fase di nomina<\/i> (nomination phase), su un insieme di affermazioni del tipo \"Nomino V\", potenzialmente per molti valori diversi V. L'obiettivo della nomina \u00e8 trovare una o pi\u00f9 affermazioni che superino il processo di accettazione e conferma.<\/p>\n<p>Dopo aver identificato i candidati verificabili, SCP passa alla fase di voto, dove l'obiettivo \u00e8 trovare un certo <i>ballottaggio<\/i> (cio\u00e8 un contenitore per il valore proposto) e il quorum che pu\u00f2 dichiarare <i>commit<\/i> per esso (commit). Se il quorum effettua il commit del ballottaggio, il suo valore viene accettato come consenso. Ma prima che un nodo possa votare per il commit del ballottaggio, deve prima confermare <i>l'annullamento<\/i> di tutti i ballottaggi con un valore di contatore inferiore. Questi passaggi - l'annullamento dei ballottaggi per trovare quello per il quale si pu\u00f2 confermare il commit - includono diversi turni di voto federato su diverse proposte di ballottaggio.<\/p>\n<p>Nei prossimi paragrafi si descrivono pi\u00f9 dettagliatamente le candidature e il voto.<\/p>\n<h1>Candidatura<\/h1>\n<p>\nAll'inizio della fase di candidatura, ogni nodo pu\u00f2 spontaneamente scegliere un valore V e votare per affermare \"Candidatura di V\". L'obiettivo in questa fase \u00e8 confermare la candidatura di un certo valore tramite il voto federato.<\/p>\n<p>\u00c8 possibile che un numero sufficiente di nodi voti per affermazioni abbastanza diverse e nessuna candidatura riesca a raggiungere la soglia di accettazione. Pertanto, oltre a trasmettere i propri voti di candidatura, i nodi \"rispecchiano\" le candidature dei propri pari. Rispecchiare (echo) significa che se un nodo vota per la candidatura di V, ma vede un messaggio da un vicino che vota per la candidatura di W, ora voter\u00e0 per candidare sia V che W. (Non tutti i voti dei pari vengono rispecchiati durante la candidatura, poich\u00e9 ci\u00f2 potrebbe portare a un'esplosione di diversi candidati. SCP include un meccanismo di regolazione di questi voti. In breve, esiste una formula per determinare la \"priorit\u00e0\" di un pari dal punto di vista di un nodo e vengono rispecchiati solo i voti dei nodi ad alta priorit\u00e0. Pi\u00f9 a lungo dura la candidatura, pi\u00f9 bassa \u00e8 la soglia, quindi un nodo amplia l'insieme dei pari i cui voti rispecchier\u00e0. La formula di priorit\u00e0 come uno degli input include il numero di slot, quindi un nodo peer ad alta priorit\u00e0 per uno slot pu\u00f2 essere a bassa priorit\u00e0 per un altro, e viceversa.<\/p>\n<p>Concettualmente, la proposizione simultanea di V e W \u00e8 una voce federativa separata, ognuna in grado di raggiungere l'adozione o la conferma in modo autonomo. Nella pratica, i messaggi del protocollo SCP raggruppano queste voci separate insieme.<\/p>\n<p>Sebbene la votazione per la proposta di V rappresenti una promessa di non votare mai contro la proposta di V, a livello applicativo - in questo caso SCP - viene definito cosa significhi \"contro\". SCP non considera una dichiarazione che contraddica il voto \"Propongo X\", cio\u00e8 non esiste un messaggio \"Sono contro la proposta di X\", pertanto il nodo pu\u00f2 votare per la proposta di qualsiasi valore. Molte di queste nomination non porteranno a nulla, ma alla fine il nodo potr\u00e0 adottare o confermare uno o pi\u00f9 valori. Una volta che il nominato \u00e8 confermato, diventa <i>candidato<\/i>.<\/p>\n<p><img decoding=\"async\" alt=\"Esploriamo il protocollo di consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/794f55d076ec3e1773c49d32e29c084d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Proposta di SCP utilizzando il voto federativo. Possono esserci molti valori \"B\" proposti da nodi alla pari e \"riflessi\" da un nodo.<\/i> <\/p>\n<p>La proposta di candidati pu\u00f2 portare alla creazione di pi\u00f9 candidati confermabili. Pertanto, SCP richiede che il livello applicativo fornisca un qualche metodo per unire i candidati in un <i>composito<\/i> (composite). Il metodo di unione pu\u00f2 essere qualsiasi. L'importante \u00e8 che, se questo metodo \u00e8 deterministico, ogni nodo unir\u00e0 gli stessi candidati. Nel sistema di voto per il pranzo, \"unione\" pu\u00f2 semplicemente significare rinunciare a uno dei due candidati. (Ma in modo deterministico: ogni nodo deve scegliere lo stesso valore per il reset. Ad esempio, una scelta precedente in ordine alfabetico). Nella rete di pagamento Stellar, dove si vota sulla storia delle transazioni, l'unione di due candidati proposti implica l'unione delle transazioni che contengono e delle ultime delle loro due timeline.<\/p>\n<p>La descrizione tecnica di SCP dimostra (teorema 12) che alla fine della fase di proposta la rete converge a un unico composito. Ma c'\u00e8 un problema: il voto federativo \u00e8 un protocollo asincrono (cos\u00ec come SCP). In altre parole, i nodi non sono coordinati nel tempo, ma solo nei messaggi che inviano. Dal punto di vista di un nodo, non \u00e8 chiaro quando <i>\u00e8 concluso<\/i> fase di proposta. Anche se tutti i nodi arriveranno infine allo stesso composto, possono scegliere percorsi diversi lungo il cammino, creando di volta in volta diversi candidati compositi, e non possono mai sapere quale di essi sar\u00e0 quello finale.<\/p>\n<p>Ma va bene. La proposta \u00e8 solo una preparazione. \u00c8 importante limitare il numero di candidati per raggiungere un consenso che si verifica nel processo <i>di voto<\/i> (voto).<\/p>\n<h1>Il voto<\/h1>\n<p>\nUn bollettino \u00e8 una coppia , dove counter \u00e8 un intero che inizia da 1 e value \u00e8 il candidato della fase di proposta. Questo pu\u00f2 essere un candidato proprio del nodo o un candidato di un nodo adiacente, accettato da questo nodo. In termini semplici, durante il voto si fanno pi\u00f9 tentativi per far s\u00ec che la rete raggiunga un consenso su un candidato in un certo bollettino attraverso potenzialmente molte votazioni federative sulle dichiarazioni di bollettini. I contatori nei bollettini tengono traccia dei tentativi effettuati e i bollettini con contatori pi\u00f9 alti hanno la priorit\u00e0 su quelli con contatori pi\u00f9 bassi. Se il bollettino  si impantana, inizia una nuova votazione, ora sul bollettino .<\/p>\n<p>\u00c8 importante distinguere <i>i valori<\/i> (per esempio, quale dovrebbe essere l'ordine del pranzo: pizza o insalate), <i>i bollettini<\/i> (coppia counter-value) e <i>le dichiarazioni<\/i> sui bollettini. Un round SCP comprende diversi round di votazione federativa, in particolare su tali dichiarazioni:<\/p>\n<ul>\n<li>\"Sono pronto a impegnare il bollettino B\" e\n<\/li>\n<li>\"Dichiaro di impegnare il bollettino B\"<\/li>\n<\/ul>\n<p>\nDal punto di vista di questo nodo, il consenso si raggiunge quando trova il bollettino B, per il quale pu\u00f2 convalidare (cio\u00e8 trovare un quorum accettante) la dichiarazione \"Dichiaro di impegnare il bollettino B\". Da quel momento, si pu\u00f2 agire in modo sicuro sul valore indicato in B - ad esempio, effettuare questo ordine per il pranzo. Questo si chiama <i>esternalizzazione<\/i> del valore. Una volta confermato l'impegno del bollettino, il nodo pu\u00f2 essere certo che qualsiasi altro nodo abbia esternalizzato lo stesso valore o lo far\u00e0 necessariamente in futuro.<\/p>\n<p>Sebbene concettualmente molte votazioni federative vengano svolte su dichiarazioni riguardanti molte schede diverse, esse scambiano non un gran numero di messaggi, perch\u00e9 ogni messaggio incapsula una serie di schede. Un messaggio, quindi, promuove lo stato di molte votazioni federative contemporaneamente, ad esempio: \u00abAccetto il commit delle schede nell'intervallo da  a \u00bb.<\/p>\n<p>Cosa significano i termini \u00abpreparato\u00bb (prepared) e \u00abcommit\u00bb (commit)?<\/p>\n<p>Un nodo vota per il commit della scheda quando \u00e8 convinto che altri nodi non eseguiranno il commit di schede con valori diversi. Essere convinti di ci\u00f2 \u00e8 l'obiettivo della preparazione della dichiarazione. Il voto, che dice: \u00abSono pronto a commit della scheda B\u00bb, \u00e8 una promessa di non mai eseguire il commit di schede con un valore inferiore a B, cio\u00e8 con un contatore pi\u00f9 basso (SCP richiede che i valori delle schede abbiano un certo ordine. Pertanto, la scheda  \u00e8 inferiore a  se N1&lt;N2, e anche se N1=N2 e V1&lt;V2). Queste schede minori vengono \u00abannullate\u00bb (aborted) durante il voto di preparazione, mentre B \u00e8 considerato \u00abpreparato\u00bb.<\/p>\n<p>Perch\u00e9 \u00abSono pronto a commit della scheda B\u00bb significa \u00abPrometto di non mai eseguire il commit di schede con valore inferiore a B\u00bb? Perch\u00e9 SCP definisce abort come l'opposto di commit. Il voto per la preparazione della scheda implica anche un voto per annullare alcune altre schede, e, come discusso in precedenza, votare per qualcosa implica anche una promessa di non votare mai contro di esso.<\/p>\n<p>Prima di trasmettere un commit, un nodo deve prima trovare una scheda che pu\u00f2 confermare come preparata. In altre parole, svolge una votazione federativa sulla questione \u00abSono pronto a commit della scheda B\u00bb, possibilmente per molte schede diverse, fino a trovare quella che accetta il quorumi.<\/p>\n<p>Da dove provengono le schede per la preparazione del voto? Inizialmente, il nodo trasmette la preparazione al voto per , dove C \u00e8 il candidato composito, prodotto nella fase di candidatura. Tuttavia, anche dopo l'inizio della preparazione al voto, la candidatura pu\u00f2 portare alla comparsa di candidati aggiuntivi che diventeranno nuove schede. Nel frattempo, i peer possono avere candidati diversi e possono formare un insieme bloccante che accetta \"Sono pronto a compromettere la scheda B2\", il che convincer\u00e0 il nodo ad accettarlo anch'esso. Infine, esiste un meccanismo di timeout che genera nuovi turni di votazione federativa su nuove schede con conteggi pi\u00f9 elevati, se le schede attuali sono bloccate.<\/p>\n<p>Non appena il nodo trova la scheda B, che pu\u00f2 confermare come preparata, trasmette un nuovo messaggio \"Impegno sulla scheda B\". Questa votazione informa i peer che il nodo non rinuncer\u00e0 mai a B. In effetti, se B rappresenta una scheda , allora \"Impegno sulla scheda \" implica un consenso incondizionato a votare per la disponibilit\u00e0 di ogni scheda da  a . Questo valore aggiuntivo aiuta altri nodi a raggiungere un peer con l'impegno, se sono ancora in fasi precedenti del protocollo.<\/p>\n<p>A questo punto vale la pena sottolineare ancora una volta che si tratta di protocolli asincroni. Solo perch\u00e9 un nodo invia voti per l'impegno, non significa che anche i suoi pari lo facciano. Alcuni di essi possono ancora votare su dichiarazioni per la preparazione al voto, altri potrebbero aver gi\u00e0 esternalizzato il valore. SCP spiega come un nodo deve gestire ogni tipo di messaggio peer-to-peer indipendentemente dalla sua fase.<\/p>\n<p>Se il messaggio \u00abDichiaro il commit \u00bb non pu\u00f2 essere accettato o confermato, c'\u00e8 la possibilit\u00e0 di accettare o confermare il messaggio  o  \u2014 o, in ogni caso, qualsiasi bollettino con valore C, e non con nessun altro, poich\u00e9 il nodo ha gi\u00e0 promessa di non annullare mai . Entro il momento in cui il nodo trasmette i voti per il commit, sar\u00e0 C o nulla, a seconda di quanto lontano arriver\u00e0 il consenso. Tuttavia, questo non \u00e8 ancora sufficiente per il nodo per esternalizzare C. Alcuni festini bizantini (composti da meno di un quorum, basandosi sulle nostre assunzioni di sicurezza) possono mentire al nodo. L'accettazione e poi la conferma di un certo bollettino (o intervallo di bollettini) \u00e8 ci\u00f2 che d\u00e0 al nodo la certezza di poter finalmente esternalizzare C.<\/p>\n<p><img decoding=\"async\" alt=\"Esploriamo il protocollo di consenso Stellar\" src=\"\/wp-content\/uploads\/2019\/03\/c59f036bb8aa189bb3d4540f54121391.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Votazione SCP tramite voto federato. Non mostrato: a qualsiasi momento pu\u00f2 attivarsi un timer, aumentando il conteggio nel bollettino (e, possibilmente, generando un nuovo composito da candidati supplementari proposti).<\/i> <\/p>\n<p>E questo \u00e8 tutto! Una volta che la rete raggiunge il consenso, \u00e8 pronta a farlo di nuovo e di nuovo. Nella rete di pagamento Stellar, questo avviene circa ogni 5 secondi: un'impresa che richiede sia sicurezza sia resilienza, garantite dal SCP.<\/p>\n<p>SCP pu\u00f2 raggiungere questo obiettivo affidandosi a diversi round di voto federato. Il voto federato \u00e8 possibile grazie al concetto di slice di quorum: set di nodi peer-to-peer a cui ogni nodo ha deciso di fidarsi come parte del proprio (soggettivo) quorum. Questa configurazione significa che \u00e8 possibile raggiungere un consenso anche in una rete con adesione aperta e inganni bizantini.<\/p>\n<h1>Ulteriori letture<\/h1>\n<p><\/p>\n<ul>\n<li>Il documento tecnico originale del SCP pu\u00f2 essere trovato <noindex><a rel=\"nofollow\" href=\"https:\/\/www.stellar.org\/papers\/stellar-consensus-protocol.pdf\">qui<\/a><\/noindex>, ma <noindex><a rel=\"nofollow\" href=\"https:\/\/datatracker.ietf.org\/doc\/draft-mazieres-dinrg-scp\/\">qui<\/a><\/noindex> progetto di specifiche per la sua implementazione.\n<\/li>\n<li>L'autore originale del protocollo SCP, David Mazieres, spiega semplificato (ma comunque tecnicamente) come funziona <noindex><a rel=\"nofollow\" href=\"http:\/\/www.scs.stanford.edu\/~dm\/blog\/simplified-scp.html\">qui<\/a><\/noindex>.\n<\/li>\n<li>Potresti essere sorpreso di non trovare in questo articolo i termini \u00abmining\u00bb o \u00abproof of work\u00bb. SCP non utilizza questi metodi, ma alcuni altri algoritmi di consenso s\u00ec. Zain Wierszspin ha scritto un disponibile <noindex><a rel=\"nofollow\" href=\"https:\/\/hackernoon.com\/a-hitchhikers-guide-to-consensus-algorithms-d81aae3eb0e3\">panoramica degli algoritmi di consenso<\/a><\/noindex>.\n<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/bobg\/scp\/blob\/master\/Lunch.md\">Descrizione passo-passo<\/a><\/noindex> di una semplice rete che raggiunge consenso in un solo round completo di SCP.\n<\/li>\n<li>Per i lettori interessati alle implementazioni di SCP: vedi. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/stellar\/stellar-core\/tree\/master\/src\/scp\">codice C++<\/a><\/noindex>, utilizzato dalla rete di pagamento Stellar, o <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/bobg\/scp\">codice Go<\/a><\/noindex>, che ho scritto per una migliore comprensione dello 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.1.1 - 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\/it\/blog\/razbiraemsya-v-protokole-konsensusa-stellar\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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\/it\/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\udd47Approfondiamo il protocollo di consenso di Stellar | ProHoster","description":"Il protocollo di consenso di Stellar \u00e8 stato descritto per la prima volta in.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/razbiraemsya-v-protokole-konsensusa-stellar","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/30047","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=30047"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/30047\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=30047"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=30047"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=30047"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}