[Romanian] Wire Protocol

Iancu Aurel edited this page May 9, 2014 · 5 revisions
Clone this wiki locally

Wire Protocol

Comunicatiile peer-to-peer intre noduri care opereaza clienti Ethereum sunt create pentru a fi guvernate de un simplu protocol wire, care utilizeaza tehnologii si standarde Ethereum existente , cum ar fi RLP, care este practic oriunde.

Acest document are ca scop explicarea acestui tip de protocol intr-un mod comprehensibil.

Low-level

Nodurile Ethereum se pot conecta intre ele doar prin TCP.Perechile (peers) sunt libere sa promoveze si sa accepte conexiuni pe orice port/porturi doresc, cu toate acestea va exista un port default -30303; pe care conexiunea poate fi ascultata si facuta. Desi TCP furnizeaza un mediu orientat spre conexiuni, nodurile Ethereum functioneaza in termeni de pachete. Aceste pachete sunt formate ca jetoane(token) de 4 biti de sincronizare (0x22400891), 4 biti de “sarcina utila”, pentru a fi interpretate ca un intreg endian si, finalmente, o structura de date N-byte serializata RLP, unde N este “sarcina utila” mentionata mai sus. Pentru a clarifica, sarcina utila specifica numarul de biti din pachetul care “urmeaza” dupa primii 8. Continutul sarcinei utile Exista un numar de diferite tipuri de sarcini utile care pot fi codate in RLP. Acest “tip” este intotdeauna determinat de prima intrare a RPL, interpretata ca un numar intreg: Hello • [0x00, PROTOCOL_VERSION, NETWORK_ID, CLIENT_ID, CAPABILITIES, LISTEN_PORT, NODE_ID] • Primul pachet trimis prin conexiune, si trimis o data de ambele parti. Nici un alt mesaj nu poate fi trimis pana cand “Hello” este primit. • PROTOCOL_VERSION este unul dintre: o 0x00 pentru PoC-1; o 0x01 pentru PoC-2; o 0x07 pentru PoC-3. • NETWORK_ID trebuie sa fie 0. • CLIENT_ID Specifica identitatea software-ului clientului, ca un sir lizibil (e.x."Ethereum(++)/1.0.0"). • LISTEN_PORT specifica portul pe care asculta clientul (pe interfata pe care se efectueaza conexiunea curenta). Daca se indica 0, clientul nu asculta. • CAPABILITIES specifica capacitatile clientului ca un set de “flags”; in prezent sunt folositi trei biti: 0x01 pentru descoperirea perechilor, 0x02 pentru relocarea tranzactiilor, 0x04 pentru interogarea block-chain-ului. • NODE_ID este optional si specifica un hash de 512 biti, (cu potential de a fi utilizat ca public key) care identifica acest nod.

Disconnect • [0x01, REASON] • Informeaza perechea ca o deconectare este iminenta, daca se primeste acest mesaj, perechea trebuie sa se deconecteze automat. Cand se efectueaza operatiunea de trimitere, gazdele dau perechilor o sansa de lupta (a fighting chance) (a se citi: asteptati 2 secunde) pentru a se deconecta, inainte de a se deconecta ei insisi. • REASON este un intreg optional care specifica unul dintr-un numar de motive pentru care se efectueaza deconectarea: • 0x00 Deconectare solicitata; • 0x01 eroare de sub-sistem TCP; • 0x02 Protocol incorect; • 0x03 Pereche inutila; • 0x04 Prea multe perechi; • 0x05 Deja conectat; • 0x06 Bloc geneza incorect/gresit; • 0x07 Protocoale de retea incompatibile; • 0x08 Clientul a renuntat. Ping • [0x02] • Solicita un raspuns imediat la Pong de la pereche. Pong • [0x03] • Raspunde la pachetul Ping al perechii. GetPeers • [0x10] • Solicita perechii sa enumere cateva alte perechi cunoscute pentru ca noi sa ne putem conecta la ele. Aceasta enumerare ar trebui sa contina si perechea solicitata. Peers • [0x11, [IP1, Port1, Id1], [IP2, Port2, Id2], ... ] • Specifica un numar de perechi cunoscute. IP este o multime de 4 biti “ABCD” care trebuie interpretata ca adresa IP A.B.C.D. Port este o multime care trebuie intrepretata ca un intreg de 16 biti endian. Id este hash-ul de 512 biti care se comporta ca unicul identificator al nodului. Tranzactii • [0x12, [nonce, receiving_address, value, ... ], ... ] • Specifica unei tranzactii(unor tranzactii) ca perechea trebuie sa se asigure ca este inclusa in sirul tranzactiei.Elementele din lista (cele care il urmeaza primul 0x12) sunt tranzactii in formatul descris in specificatiile Ethereum principale. Blocks • [0x13, [block_header, transaction_list, uncle_list], ... ] • Specifica block-ului/-urilor ca perechea trebuie sa stie despre (atat scria, nu inteleg despre ce e vorba). Elementele din lista (cele care il urmeaza pe primul, 0x13) sunt blocks in formatul descris in specificatiile Ethereum principale. GetChain • [0x14, Parent1, Parent2, ..., ParentN, Count] • Solicita perechii sa trimita Count (a se interpreta ca numar) block-uri in block chain-ul canonic curent, care sunt copii ai Parent1 (a se interpreta ca SHA3 block hash). Daca Parent1 nu este prezent in block chain, ar trebui sa actionezeca si cum solicitarea ar fi facuta pentru Parent2 &c. pana la ParentN. Daca parintele desemnat este capul block chain-ului actual, un rapuns gol trebuie trimis.Daca nici unul dintre parinti nu sunt in block chain-ul canonic curent, NotInChain trebuie trimis impreuna cu ParentN (i.e. ultimul Parent din lista de parinti). Daca nu sunt trecuti parinti, atunci nu este necesar un raspuns. NotInChain • [0x15, Hash] • Comunica perechii ca un anume hash nu a fost gasit in block chain-ul sau. GetTransactions • [0x16] • Solicita perechii sa trimita toate tranzactiile aflate in acel moment in sir. Vedeti in sectiunea “Tranzactii”. Exemple de pachete 0x22400891000000088400000043414243 Un pachet Hello care mentioneaza ca id-ul clientului este “ABC”. Peer 1: 0x22400891000000028102 Peer 2: 0x22400891000000028103 Un Ping si Pong-ul returnat. Managementul sesiunii Dupa conectare, toti clientii(i.e. de ambele parti ale conexiunii) trebuie sa trimita un mesaj Hello. Dupa primirea mesajului Hello si dupa verificarea compatibilitatii retelei si versiunilor, o sesiune este activa si orice alte mesaje pot fi trimise. In orice moment, un mesaj Disconnect poate fi trimis.