PROTOCOLLO SOCIALE PEER-TO-PEER SU SCALA WEB
TLDR:
- Solcial è stato creato per fornire agli utenti un'esperienza il più possibile simile alle piattaforme di social media Web2, sfruttando al contempo le tecnologie Web3.
- Un ostacolo che qualsiasi piattaforma basata su blockchain deve affrontare sono le tariffe degli utenti. Al fine di eliminare i costi per gli utenti sulle operazioni non legate ai token, pur mantenendo la privacy e il consenso, Solcial sta costruendo un livello peer-to-peer (P2P) ancorato su Solana e costruito sulla base di libp2p che fornisce contenuti (feed, Mi piace, ecc.) attraverso l’auto-hosting e la replica peer.
- Abbiamo anche sviluppato un tipo speciale di nodo che ha lo stesso protocollo esterno di una tipica app desktop o mobile, con ottimizzazioni aggiuntive progettate per gestire decine di migliaia di peer simultanei, chiamati Beacon Nodes. I beacon sono essenzialmente un insieme di servizi di blocco che conserveranno il contenuto degli utenti quando i creatori andranno offline e lo renderanno disponibile per gli altri utenti; tutto il contenuto dell'utente viene archiviato su IPFS e vi si accede tramite un livello P2P senza fare affidamento su server o gateway censurabili.
Introduzione
Questo è il primo post di una serie di note che descrivono come il funzionamento interno del protocollo Solcial conferisca proprietà uniche di resistenza alla censura, pur mantenendo ragionevoli prestazioni nello scambio di dati.
Topologia della rete
I nodi comunicano attraverso la rete Internet pubblica, formando una rete overlay specifica di Solcial, utilizzando una versione modificata del protocollo HyparView¹.
Ogni nodo mantiene un elenco di peer attivi con una dimensione di
log2(N)+1, dove N è la dimensione stimata dell'intera rete. Il valore di N viene estratto dalla blockchain trovando il numero di account utente registrati fino ad oggi, e viene aggiornato periodicamente al crescere del numero degli utenti. Le connessioni ai peer attivi sono stabili, bidirezionali e persistenti e questi sono i nodi con cui comunicano direttamente durante il gossip o qualsiasi altra attività p2p. Ogni nodo mantiene anche un elenco di peer passivi con una dimensione di 6⋅(log2(N)+1) che vengono utilizzati come peer di backup nel caso in cui uno dei peer attivi si disconnetta o non risponde. Il protocollo sottostante per le connessioni tra peer attivi è QUIC² con crittografia NOISE, basato su libp2p³.
L'attraversamento NAT si ottiene usando tre metodi che vengono utilizzati a seconda delle circostanze di rete del peer. Il primo metodo è usare IPv6 anziché di IPv4 quando possibile, perché in tal caso non sono necessari NAT, tuttavia secondo le statistiche solo meno del 40% di Internet è su IPv6⁴.
Il meccanismo di ripiego consiste nell'utilizzare AutoNAT, impiegando il protocollo d’identità di libp2p, che chiede ad altri nodi della rete l'indirizzo visibile della nostra unità. Quell'indirizzo, avviato dal peer dietro un NAT, è già registrato con il loro router verso la unità di destinazione, tuttavia esistono circostanze in cui questo meccanismo non funziona, quindi torniamo alla terza opzione, più affidabile ma costosa.
La terza opzione è utilizzare il protocollo libp2p circuit relay⁵ che imita il funzionamento di un protocollo TURN⁶ avendo un nodo intermedio che trasmette i pacchetti tra due peer dietro NAT. Questo ruolo può essere assunto dai nodi beacon e da alcuni peer con IP pubblici, che scelgono di essere relay con limiti configurati. Maggiori informazioni sui nodi beacon più avanti in questo post.
Identità dei peer
I peer vengono identificati utilizzando la loro chiave pubblica sotto forma di un multihash⁷ che è uguale alla chiave pubblica del loro indirizzo di portafoglio su Solana, che è registrato con il contratto on-chain Solcial. L'unico modo per assumere un determinato ID peer pubblico è possedere la chiave segreta di una coppia di chiavi ED25519.
Questa coppia di chiavi viene utilizzata anche per stabilire canali crittografati per tutti i messaggi che passano tra i peer, nonché un modo per verificare l'autenticità dei messaggi presumibilmente prodotti dal proprietario del portafoglio.
Iscrizione in sovrimpressione
I peer con chiavi pubbliche non registrate sulla catena non potranno accedere all'overlay di rete HyparView e per questo automaticamente esclusi dalla rete peer-to-peer di Solcial.
Tutti i peer che vogliono unirsi al Solcial p2p invieranno un messaggio JOIN a uno dei nodi bootstrap (alcuni di questi nodi bootstrap sono anche nodi beacon) sull'argomento /solcial/public. L'introduzione degli argomenti in HyparView è una delle nostre modifiche dal documento originale.
Qualsiasi nodo che riceve una richiesta di JOIN da un peer, verificherà prima che il multihash esista sulla catena ed è associato a un account Solcial, quindi invierà un messaggio FORWARDJOIN ad uno dei suoi peer attivi con un percorso casuale attivo impostato su 3, questi a loro volta propagheranno quel messaggio a tutti i loro peer attivi, aumentando il numero di hop corrente di uno fino a raggiungere 3 hop. Questa è una mitigazione per gli attacchi DDoS contro i nodi bootstrap, nonché un'efficace tecnica di decentralizzazione per diffondere e randomizzare il più possibile la connettività tra i nodi.
Qualsiasi nodo che si trova entro 3 hop dal ricevitore iniziale di JOIN invierà un messaggio NEIGHBOR al richiedente iniziale di JOIN, stabilendo una connessione persistente attiva tra di loro.
Periodicamente, ogni 15 secondi, i nodi trasmettono un messaggio SHUFFLE a un peer attivo casuale con un campione dei suoi peer attivi e passivi e impostano la lunghezza del percorso casuale di questo messaggio su 4. Ciò garantisce che tutti i peer nella rete abbiano sempre informazioni aggiornate sugli altri peer, che possono archiviare nella loro vista passiva scopi di riparazione della rete, ogni volta che uno dei loro peer attivi non risponde o si disconnette esplicitamente.
Spettegolare in modo efficiente
Solo i peer attivi partecipano alla diffusione dei messaggi tra i peer. I peer attivi formano una rete overlay su Internet pubblica ed esistono cicli nel grafico di connettività tra i nodi. Per consentire un gossip efficiente dei messaggi tra i peer della rete, dobbiamo prima ridurre al minimo la propagazione dei messaggi duplicati tra i peer e, in secondo luogo, trovare il percorso più ottimale per i messaggi.
Ciò si ottiene utilizzando l'algoritmo Epidemic Broadcast Trees⁸ che forma un albero di minima estensione (minimum spanning tree) tra i peer, dividendo i peer in un gruppo di nodi eager-push (attivo) e nodi lazy-push (pigro). I nodi eager-push ricevono sempre i messaggi non appena vengono ricevuti da qualsiasi altro nodo.
I nodi lazy-push ricevono periodicamente, ogni 500 ms, un batch di ID dei messaggi visti dal nodo corrente. Ogni volta che un nodo rileverà un ID messaggio nel batch lazy-push che non è stato ricevuto dal suo nodo centrale a monte, ricostruirà (GRAFT) la connessione e ripristinerà il suo stato di push attivo. Questo costituisce il meccanismo di riparazione dell’albero di spanning minimo nel caso in cui uno dei nodi vada giù e si formino gradi disgiunti. I messaggi GRAFT ripristinano la piena connettività della rete.
Ogni volta che un messaggio ricevuto risulta essere un duplicato di un messaggio ricevuto in precedenza da un nodo attivo, la connessione di quel nodo viene considerata un ciclo nel grafico e trasformata in un Lazy-Push inviando un messaggio PRUNE.
Un altro caso per sostituire una connessione attiva, con una dalla lista pigra, è quando osserviamo che il numero di salti che un messaggio ha percorso per raggiungerci attraverso un nodo pigro è inferiore a 4 salti rispetto a un messaggio dal peer attivo desiderato. Questo costituisce l'algoritmo di ottimizzazione dell'albero di trasmissione.
Diffusione dei contenuti
I messaggi trasmessi attraverso il protocollo p2p descritto nelle sezioni precedenti sono messaggi IPFS Bitswap⁹ con CID di contenuti prodotti dagli utenti di Solcial. Per capire meglio come vengono utilizzati Bitswap e IPFS su Solcial, descriviamo prima la struttura di un profilo utente.
Ogni account utente nella rete ha qualcosa chiamato indice del profilo. Questo indice punta ai CID delle ultime versioni del loro contenuto. L'indice è un CRDT (Eventually Consistent Sequence)che forma un registro immutabile delle operazioni eseguite dall'account.
L'indice del profilo può essere pensato come una lista collegata in cui ogni elemento punta al CID dell'elemento precedente ed è accettato dai peer come elemento successivo in sequenza solo se è firmato dalla chiave privata del proprietario dell'account. Un esempio logico di alto livello di un feed di profilo inviato, codificato in questo formato è simile al seguente:
{
"Author": "12D3KooWSoeYKbpkb5UoL2T5eiomWRHdxR9cPC4tk11gKU89fFwT",
"Prev": "QmYtUc4iTCbbfVSDNKvtQqrfyezPPnFvE33wFmutw9PBBk",
"Action": "append-feed-post",
"Timestamp": "2022–01–11T15: 58Z",
"parameters": {
"Content": "QmV8cfu6n4NT5xRr2AHdKxFMTZEJrA44qgrBCr739BN9Wb"
"Enckey": "z2DhMLJmV8kNQm6zeWUrXQKtmzoh6YkKHSRxVSibscDQ7nq"
},
"Signature": "2Lpnvt23H6qHswCNPmwCCUSas7YNP [...] jV1dC9qdNPR4zDqsCuBX"
}
Una voce del genere ha il proprio CID e viene trasmessa come oggetto IPFS PB-DAG¹⁰ all'argomento di sovrapposizione /solcial/content HyparView. Questa voce è collegata alla voce precedente e qualsiasi contenuto aggiuntivo. Interrogando ricorsivamente i CID collegati, gli utenti possono ottenere l'intera cronologia e il contenuto dell'account.
Questo oggetto viene prima convalidato da qualsiasi peer ricevente se la firma del contenuto corrisponde alla chiave pubblica dell'autore. In caso di verifica della firma fallita, il peer mittente viene definitivamente bandito dal nodo corrente per aver violato il protocollo. Una convalida della firma con successopropaga il contenuto a tutti gli altri peer interessati al contenuto creato da questo account.
Quando un tale CID viene ricevuto da un peer, viene aggiunto al registro delle operazioni dell'autore. La somma di tutte le operazioni eseguite dall'autore costituisce lo stato attuale del profilo.
Per impostazione predefinita, ogni nodo blocca e semina il contenuto del proprio account e il contenuto dei suoi amici. Ci sono peer speciali che stiamo costruendo come parte della nostra infrastruttura chiamati nodi beacon; che sono come normali peer degli utenti, tranne per il fatto che sono interessati ai contenuti pubblici e servono come una sorta di servizio di pinning IPFS specifico per i social per tutti i contenuti nel caso in cui tutti i seeders attuali siano offline. Pensate a loro come a nodi che sono amici di tutti. La rete può funzionare senza di loro, ma essi forniscono un ulteriore livello di disponibilità dei contenuti.
Accesso alla lettura
Tutti sull'overlay Solcial p2p possono interrogare, scaricare e fornire qualsiasi contenuto dell’utente trasmettendo messaggi IWANT e IHAVE Bitswap sull'argomento /solcial/content con CID dell'indice radice di primo livello dell'account, quindi richiedere ricorsivamente tutti i CID collegati.
La sincronizzazione iniziale di un account, o l'acquisizione delle voci più recenti dell'account si ottiene trasmettendo un messaggio HEAD all'argomento /solcial/sync, in cui gli altri peer che sono seeders (inclusi i nodi beacon) rispondono con il CID del contenuto più recente di cui sono a conoscenza. La traduzione tra gli handle dell'utente e le chiavi pubbliche dell'utente viene eseguita interrogando la blockchain di Solana.
Il campo della voce precedente può essere utilizzato per risolvere i conflitti tra le HEAD e decidere la voce più recente.
Accesso alla scrittura
Per poter scrivere in un registro di un account, l'utente deve possedere la chiave privata della coppia di chiavi ED25519 che corrisponde al proprio ID account. Avendo quella chiave, l'utente è in grado di generare una firma valida di una voce aggiunta al registro che non verrà rifiutata da altri peer della rete.
Accesso privilegiato ai contenuti
Alcuni contenuti pubblicati dagli utenti sono destinati solo a un gruppo selezionato di destinatari, come i feed di abbonamento di livello 1 o di livello 2. Questi post vengono prima crittografati utilizzando una chiave di crittografia AES-256 simmetrica. L'hash di quella chiave è allegato ai metadati del contenuto nel post originale.
La chiave viene diffusa a un sottoinsieme casuale di peer idonei attraverso il canale criptato NOISE stabilito durante l'handshake libp2p. L'autore del post può scegliere di consentire ai nodi beacon di partecipare anche a questo schema di scambio di chiavi per rendere il processo quasi istantaneo per tutti gli utenti, ma non è necessario se ritengono che il loro contenuto sia estremamente sensibile. Quando un utente idoneo desidera decifrare il contenuto, invia un messaggio GETKEY all'argomento di sovrapposizione /solcial/keyexchange con l'hash della chiave di crittografia.
Tutti i peer in possesso di quella chiave che sono online, verificheranno l'idoneità del peer per ottenere quella chiave interrogando la blockchain e verificando se l'utente possiede i token richiesti per accedere al contenuto. Dopo una verifica riuscita, la chiave viene trasmessa al peer richiedente utilizzando una connessione diretta quic/noise che bypassa il protocollo gossip.
Supporto della piattaforma
Questo protocollo peer-to-peer per contenuti resistenti alla censura è disponibile solo per client desktop e mobili e non è disponibile tramite l'interfaccia web. Ciò è dovuto alle limitazioni dei browser. I browser sono intrinsecamente progettati come consumatori di contenuti ospitati su server e il loro modello di sicurezza vieta di accettare connessioni casuali da altre unità.
La versione Web sarà quasi sempre centralizzata a causa del funzionamento dei browser e la durata di una scheda del browser è breve, e qualsiasi contenuto prodotto tramite l'interfaccia Web verrà rispecchiato sul p2p dai nodi beacon. Qualsiasi contenuto consumato dal client Web sarà una copia del p2p. Il P2P è la fonte della verità.
Lo stack tecnico sottostante viene implementato utilizzando Rust, libp2p con collegamenti a React Native e Tauri¹¹.
[1] Leitao, Joao, José Pereira e Luis Rodrigues. "HyParView: un protocollo di appartenenza per la trasmissione affidabile basato su gossip".
[2] https://en.wikipedia.org/wiki/QUIC
[3] https://libp2p.io/
[4] https://www.google.com/intl/en/ipv6/statistics.html
[5] https://docs.libp2p.io/concepts/circuit-relay/
[6] https://datatracker.ietf.org/doc/html/rfc5766
[7] https://docs.libp2p.io/reference/glossary/#multihash
[8] Leitao, Joao, Jose Pereira e Luis Rodrigues. "Alberi di trasmissione epidemici". 2007 26° IEEE International Symposium on Reliable Distributed Systems (SRDS 2007). IEEE, 2007.
[9] https://docs.ipfs.io/concepts/bitswap/
[10] https://github.com/ipld/ipld/blob/master/specs/codecs/dag-pb/spec.md
[11] https://tauri.studio/
Cos'è Solcial
Solcial è un social network decentralizzato che offre agli utenti la potenza del web3, consentendo alle persone di interagire tra loro senza temere la censura e consentendo ai creatori di contenuti di essere ricompensati equamente al valore di mercato.
Contatti
Telegram: https://t.me/solcial
Discord: https://discord.gg/solcial
Twitter: https://twitter.com/solcialofficial
Blog: http://blog.solcial.io/
Sito web: https://solcial.io
E-mail: [email protected]
Linktree: https://linktr.ee/solcial