Introducerea fluxurilor MultiChain

Nodul sursă: 1213525

Pentru baze de date imuabile cheie-valoare și serii de timp

Astăzi suntem mândri să lansăm cea mai recentă versiune a MultiChain, care implementează un nou set crucial de funcționalități numit „fluxuri”. Fluxurile oferă o abstracție naturală pentru cazurile de utilizare blockchain care se concentrează pe recuperarea generală a datelor, marcarea timpului și arhivarea, mai degrabă decât pe transferul de active între participanți. Fluxurile pot fi utilizate pentru a implementa trei tipuri diferite de baze de date pe un lanț:

  1. O bază de date valoare-cheie sau un magazin de documente, în stilul NoSQL.
  2. O bază de date de serii temporale, care se concentrează pe ordonarea intrărilor.
  3. O bază de date bazată pe identitate în care intrările sunt clasificate în funcție de autorul lor.

Acestea pot fi considerate ca „ce”, „când” și „cine” dintr-o bază de date partajată.

Elementele de bază ale fluxurilor

Orice număr de fluxuri poate fi creat într-un blockchain MultiChain, iar fiecare flux acționează ca o colecție independentă de articole numai pentru adăugare. Fiecare articol dintr-un flux are următoarele caracteristici:

  • Unul sau mai multe editori care au semnat digital acel articol.
  • Un opțional cheie pentru recuperare convenabilă ulterior.
  • niste de date, care poate varia de la o mică bucată de text la mulți megabyți de binar brut.
  • A timestamp-ul, care este preluat din antetul blocului în care este confirmat elementul.

În culise, fiecare element dintr-un flux este reprezentat de o tranzacție blockchain, dar dezvoltatorii pot citi și scrie fluxuri fără să cunoască acest mecanism de bază. (Utilizatorii mai avansați pot utiliza tranzacții brute să scrieți pe mai multe fluxuri, să emiteți sau să transferați active și / sau să atribuiți permisiuni într-o singură tranzacție atomică.)

Fluxurile se integrează cu sistemul de permisiuni MultiChain în mai multe moduri. În primul rând, fluxurile pot fi create numai de către cei care au permisiunea de a face acest lucru, în același mod în care activele pot fi emise numai de anumite adrese. Când este creat un flux, acesta este deschis sau închis. Fluxurile deschise pot fi scrise de oricine are permisiunea de a trimite o tranzacție blockchain, în timp ce fluxurile închise sunt limitate la o listă modificabilă de adrese permise. În acest din urmă caz, fiecare flux are unul sau mai mulți administratori care pot modifica aceste permisiuni de scriere în timp.

Fiecare blockchain are un flux opțional „rădăcină”, care este definit în parametrii și există din momentul creării lanțului. Acest lucru permite ca un blockchain să fie utilizat imediat pentru stocarea și recuperarea datelor, fără a aștepta ca un flux să fie creat în mod explicit.

Așa cum am făcut discutat anterior, confidențialitatea este cea mai mare provocare într-un număr mare de cazuri de utilizare blockchain. Acest lucru se datorează faptului că fiecare nod dintr-un blockchain vede o copie completă a conținutului întregului lanț. Fluxurile oferă un mod natural de a sprijini datele criptate pe un blockchain, după cum urmează:

  1. Un flux este utilizat de participanți pentru a distribui cheile lor publice pentru orice schemă de criptografie cu cheie publică.
  2. Un al doilea flux este utilizat pentru a publica date, unde fiecare bucată de date este criptată utilizând criptografie simetrică cu o cheie unică.
  3. Un al treilea flux oferă acces la date. Pentru fiecare participant care ar trebui să vadă o bucată de date, se creează o intrare de flux care conține cheia secretă a datelor, criptată folosind cheia publică a acelui participant.

Aceasta oferă o modalitate eficientă de arhivare a datelor pe un blockchain, făcându-le vizibile doar pentru anumiți participanți.

Preluarea din fluxuri

Valoarea de bază a fluxurilor este în indexare și recuperare. Fiecare nod poate alege la ce fluxuri să se aboneze, blockchain-ul garantând că toate nodurile care se abonează la un anumit flux vor vedea aceleași elemente din interior. (Un nod poate fi, de asemenea, configurat pentru a se abona automat la fiecare flux nou creat.)

Dacă un nod este abonat la un flux, informațiile pot fi preluate din acel flux în mai multe moduri:

  • Preluarea articolelor din flux în ordine.
  • Preluarea articolelor cu o anumită cheie.
  • Preluarea articolelor semnate de un anumit editor.
  • Listarea tastelor utilizate într-un flux, cu număr de articole pentru fiecare cheie.
  • Listarea editorilor într-un flux, cu numărul de articole.

După cum sa menționat la început, aceste metode de regăsire permit utilizarea fluxurilor pentru baze de date cheie-valoare, baze de date cu serii de timp și baze de date bazate pe identitate. Toate API-urile de recuperare oferă Începe și conta parametrii, permițând recuperarea eficientă a subsecțiunilor listelor lungi (cum ar fi o clauză LIMIT în SQL). Valori negative pentru Începe permite recuperarea celor mai recente articole.

Fluxurile pot conține mai multe elemente cu aceeași cheie, iar acest lucru rezolvă în mod firesc tensiunea dintre imuabilitatea blockchain-ului și necesitatea actualizării unei baze de date. Fiecărei „intrări” eficiente a bazei de date ar trebui să i se atribuie o cheie unică în aplicația dvs., fiecare actualizare a intrării respective fiind reprezentată de un nou element de flux cu cheia sa. API-urile de regăsire a fluxului MultiChain pot fi apoi utilizate pentru: (a) regăsirea primei sau ultimei versiuni a unei intrări date, (b) regăsirea unui istoric complet al versiunilor pentru o intrare, (c) regăsirea informațiilor despre intrări multiple, inclusiv prima și ultima intrare versiuni ale fiecăruia.

Rețineți că, din cauza arhitecturii peer-to-peer a unui blockchain, articolele dintr-un flux pot ajunge la noduri diferite în ordine diferite, iar MultiChain permite recuperarea articolelor înainte de a fi „confirmate” într-un bloc. Ca urmare, toate API-urile de recuperare oferă o alegere între comanda globală (implicită) sau locală. Comanda globală garantează că, odată ce lanțul a ajuns la consens, toate nodurile primesc aceleași răspunsuri de la aceleași apeluri API. Comanda locală garantează că, pentru un anumit nod, comanda elementelor unui flux nu se va schimba niciodată între apelurile API. Fiecare aplicație poate face alegerea potrivită pentru nevoile sale.

Fluxuri și foaia de parcurs MultiChain

Odată cu lansarea fluxurilor, am finalizat ultima lucrare majoră pentru MultiChain 1.0 și suntem acum pe drumul spre beta. Ne așteptăm să petrecem următoarele câteva luni extinzând suita noastră de testare internă (deja destul de mare!), Finalizând porturile Windows și Mac, adăugând câteva API-uri mai utile, actualizând Explorator pentru fluxuri, modificări ale aspectelor mecanismului de consens, lansarea demonstrației noastre web și, în general, ordonarea codului și a mesajelor de ajutor. Cel mai important, vom continua să remediem orice erori de îndată ce sunt descoperite, astfel încât greșelile noastre să nu vă întrerupă munca.

Pe termen mai lung, unde se încadrează fluxurile în foaia de parcurs MultiChain? Făcând un pas înapoi, MultiChain oferă acum trei domenii de funcționalitate la nivel înalt:

  • Permisiuni pentru a controla cine se poate conecta, tranzacționa, crea active / fluxuri, exploata / valida și administra.
  • Bunuri inclusiv emiterea, reemiterea, transferul, schimbul atomic, escrow și distrugere.
  • Curente cu API-uri pentru crearea fluxurilor, scrierea, abonarea, indexarea și recuperarea.

După lansarea MultiChain 1.0 (și o versiune premium), ce urmează în această listă? Dacă te uiți la Comandă API care este folosit pentru a crea fluxuri, veți observa un parametru aparent superflu, cu o valoare fixă ​​de stream. Acest parametru va permite MultiChain să susțină alte tipuri de entități de nivel înalt în viitor.

Valorile viitoare posibile pentru parametru includ evm (pentru un Ethereum-mașină virtuală compatibilă), sql (pentru o bază de date în stil SQL) sau chiar wiki (pentru text editat în colaborare). Orice entitate partajată a cărei stare este determinată de o serie ordonată de modificări este un potențial candidat. Fiecare astfel de entitate va avea nevoie de: (a) API-uri care oferă abstractizarea corectă pentru actualizarea stării sale, (b) mecanisme adecvate pentru nodurile abonate pentru a urmări starea respectivă și (c) API-uri pentru recuperarea eficientă a unei părți sau a întregului stat. Așteptăm să aflăm ce alte entități de nivel înalt ar fi cele mai utile, care să fie implementate de noi sau de terți printr-o arhitectură plug-in.

Dar contractele inteligente?

Într-un sens general, MultiChain adoptă abordarea în care de date este încorporat imuabil într-un blockchain, dar cod pentru interpretarea faptului că datele se află în stratul nodului sau al aplicației. Acest lucru este în mod deliberat diferit de paradigma „contractelor inteligente”, așa cum este exemplificat de Ethereum, în care codul este încorporat în blockchain și rulează într-o mașină virtuală. În teorie, pentru că contractele inteligente sunt Turing complet, pot reproduce comportamentul MultiChain sau a oricărei alte platforme blockchain. În practică, totuși, contractele inteligente în stil Ethereum au multe neajunsuri dureroase:

  • Fiecare nod trebuie să efectueze fiecare calcul, indiferent dacă este de interes sau nu. În schimb, în ​​MultiChain fiecare nod decide la ce fluxuri să se aboneze și poate ignora datele conținute de alții.
  • Mașina virtuală utilizată pentru contractele inteligente are o performanță drastic mai slabă decât codul care a fost compilat nativ pentru o anumită arhitectură de computer.
  • Codul de contract inteligent este încorporat imuabil într-un lanț, împiedicând adăugarea caracteristicilor și remedierea erorilor. Acest lucru a fost demonstrat cu putere în moartea lui DAO.
  • Tranzacții trimise către un contract inteligent nu se poate actualiza starea unui blockchain până la ordinea lor finală este cunoscută, din cauza naturii de calcul general. Acest lucru duce la întârzieri (până când o tranzacție este confirmată într-un bloc), precum și posibile inversări (în cazul unei bifurcări în lanț). În schimb, MultiChain poate trata fiecare tip de tranzacție neconfirmată în modul adecvat: (a) activele primite actualizează imediat soldul neconfirmat al unui nod, (b) elementele fluxului de intrare sunt disponibile instantaneu, cu ordinea globală finalizată ulterior, (c) modificările permisiunilor sunt aplicate imediat și apoi redate în blocurile primite.

Cu toate acestea, așa cum am făcut eu a spus înainte, cu siguranță nu excludem contractele inteligente ca o paradigmă utilă pentru aplicațiile blockchain, dacă și când vedem cazuri de utilizare puternice. Cu toate acestea, în MultiChain, contractele inteligente ar fi implementate într-un strat de tip flux, deasupra blockchain-ului, mai degrabă decât cel mai scăzut nivel de tranzacție. Acest lucru va păstra performanța superioară a MultiChain pentru entități blockchain mai simple, cum ar fi activele și fluxurile, oferind în același timp un calcul mai lent pe lanț acolo unde este cu adevărat necesar. Dar există mai puține astfel de cazuri decât ai putea crede.

 

Vă rugăm să postați comentarii pe LinkedIn.

 

Addendum tehnic

Toate comenzile legate de fluxuri sunt documentate integral în Pagina API MultiChain, dar iată un scurt rezumat:

  • Creați un flux folosind create stream or createfrom ... stream
  • Adăugați un articol la un flux cu publish or publishfrom
  • Obțineți o listă de fluxuri folosind liststreams
  • Porniți sau opriți urmărirea unui flux cu subscribe și unsubscribe
  • Preluați elemente de flux folosind liststreamitems, liststreamkeyitems și liststreampublisheritems
  • Listează cheile de flux și editorii cu liststreamkeys și liststreampublishers
  • Pentru elementele de flux mare, preluați datele complete folosind gettxoutdata (A se vedea maxshowndata de mai jos)
  • Controlați permisiunile per-stream cu apeluri precum grant [address] stream1.write
  • Vizualizați permisiunile unui flux folosind listpermissions stream1.*

Câteva alte note pentru dezvoltatori referitoare la fluxuri:

  • create permisiunea permite unei adrese să creeze fluxuri.
  • Permisiunile per-stream relevante sunt write, admin și activate
  • Nou parametrii blockchain: root-stream-name (lăsați gol pentru niciunul), root-stream-open, anyone-can-create, admin-consensus-create, max-std-op-returns-count
  • Nou parametrii de rulare: autosubscribe pentru a vă abona automat la fluxurile noi create și maxshowndata pentru a limita cantitatea de date din răspunsurile API (a se vedea gettxoutdata de mai sus).
  • Dimensiunea maximă a datelor unui element de flux este stabilită de max-std-op-return-size parametrul blockchain, precum și cel mai mic dintre maximum-block-size și max-std-tx-size valori minus câteva sute de octeți.
  • Nodurile care folosesc vechiul format portofel nu se pot abona la fluxuri și ar trebui să fie actualizate.

 

Timestamp-ul:

Mai mult de la multicatenari