Presentazione di MultiChain Streams

Nodo di origine: 1213525

Per database di valori-chiave e serie temporali immutabili condivisi

Oggi siamo orgogliosi di rilasciare l'ultima versione di MultiChain, che implementa un nuovo set cruciale di funzionalità chiamato "stream". Gli stream forniscono un'astrazione naturale per i casi di utilizzo della blockchain che si concentrano sul recupero generale dei dati, il timestamp e l'archiviazione, piuttosto che sul trasferimento di risorse tra i partecipanti. Gli stream possono essere utilizzati per implementare tre diversi tipi di database su una catena:

  1. Un database di valori-chiave o archivio documenti, nello stile di NoSQL.
  2. Un database di serie temporali, che si concentra sull'ordinamento delle voci.
  3. Un database basato sull'identità in cui le voci sono classificate in base al loro autore.

Questi possono essere considerati come "cosa", "quando" e "chi" di un database condiviso.

Nozioni di base sui flussi

Qualsiasi numero di flussi può essere creato in una blockchain MultiChain e ogni flusso agisce come una raccolta indipendente di soli articoli di appendice. Ogni elemento in uno stream ha le seguenti caratteristiche:

  • Uno o più editori che hanno firmato digitalmente quell'elemento.
  • un optional chiave per un comodo recupero successivo.
  • Alcuni dati, che può variare da un piccolo pezzo di testo a molti megabyte di file binario non elaborato.
  • A timestamp, che viene preso dall'intestazione del blocco in cui l'elemento è confermato.

Dietro le quinte, ogni elemento in uno stream è rappresentato da una transazione blockchain, ma gli sviluppatori possono leggere e scrivere flussi senza consapevolezza di questo meccanismo sottostante. (Gli utenti più esperti possono utilizzare transazioni non elaborate per scrivere su più flussi, emettere o trasferire risorse e / o assegnare autorizzazioni in una singola transazione atomica.)

Gli stream si integrano con il sistema di autorizzazioni di MultiChain in vari modi. In primo luogo, i flussi possono essere creati solo da coloro che hanno il permesso di farlo, allo stesso modo in cui i beni possono essere emessi solo da determinati indirizzi. Quando viene creato uno stream, questo è aperto o chiuso. I flussi aperti sono scrivibili da chiunque abbia il permesso di inviare una transazione blockchain, mentre i flussi chiusi sono limitati a un elenco modificabile di indirizzi consentiti. In quest'ultimo caso, ogni flusso ha uno o più amministratori che possono modificare tali autorizzazioni di scrittura nel tempo.

Ogni blockchain ha un flusso 'root' opzionale, che è definito al suo interno parametri ed esiste dal momento in cui viene creata la catena. Ciò consente di utilizzare immediatamente una blockchain per l'archiviazione e il recupero di dati, senza attendere la creazione esplicita di un flusso.

Come ho fatto discusso in precedenza, la riservatezza è la più grande sfida in un gran numero di casi d'uso di blockchain. Questo perché ogni nodo in una blockchain vede una copia completa del contenuto dell'intera catena. Gli stream forniscono un modo naturale per supportare i dati crittografati su una blockchain, come segue:

  1. Uno stream viene utilizzato dai partecipanti per distribuire le loro chiavi pubbliche per qualsiasi schema di crittografia a chiave pubblica.
  2. Un secondo flusso viene utilizzato per pubblicare dati, in cui ogni parte di dati viene crittografata utilizzando la crittografia simmetrica con una chiave univoca.
  3. Un terzo flusso fornisce l'accesso ai dati. Per ogni partecipante che dovrebbe vedere un dato, viene creata una voce di flusso che contiene la chiave segreta di tali dati, crittografata utilizzando la chiave pubblica di quel partecipante.

Ciò fornisce un modo efficiente per archiviare i dati su una blockchain, rendendoli visibili solo a determinati partecipanti.

Recupero da flussi

Il valore fondamentale degli stream è nell'indicizzazione e nel recupero. Ogni nodo può scegliere a quali flussi iscriversi, con la blockchain che garantisce che tutti i nodi che si iscrivono a un determinato flusso vedranno gli stessi elementi all'interno. (È inoltre possibile configurare un nodo per iscriversi automaticamente a ogni nuovo flusso creato.)

Se un nodo è abbonato a un flusso, le informazioni possono essere recuperate da quel flusso in vari modi:

  • Recupero di elementi dallo stream in ordine.
  • Recupero di elementi con una chiave particolare.
  • Recupero di elementi firmati da un determinato editore.
  • Elenco delle chiavi utilizzate in uno stream, con conteggi degli articoli per ciascuna chiave.
  • Elenco dei publisher in uno stream, con conteggi degli articoli.

Come accennato all'inizio, questi metodi di recupero consentono di utilizzare i flussi database di valori-chiave, database di serie storiche e database basati sull'identità. Tutte le API di recupero offrono inizia a ed contare parametri che consentono di recuperare in modo efficiente sottosezioni di lunghi elenchi (come una clausola LIMIT in SQL). Valori negativi per inizia a consentire il recupero degli elementi più recenti.

Gli stream possono contenere più elementi con la stessa chiave e questo risolve naturalmente la tensione tra l'immutabilità della blockchain e la necessità di aggiornare un database. A ogni 'voce' del database efficace deve essere assegnata una chiave univoca nell'applicazione, con ogni aggiornamento di quella voce rappresentato da un nuovo elemento di flusso con la sua chiave. Le API di recupero stream di MultiChain possono quindi essere utilizzate per: (a) recuperare la prima o l'ultima versione di una determinata voce, (b) recuperare una cronologia completa delle versioni per una voce, (c) recuperare informazioni su più voci, tra cui la prima e l'ultima versioni di ciascuno.

Si noti che a causa dell'architettura peer-to-peer di una blockchain, gli elementi in uno stream possono arrivare a nodi diversi in ordini diversi e MultiChain consente di recuperare gli elementi prima che vengano "confermati" in un blocco. Di conseguenza, tutte le API di recupero offrono una scelta tra ordinamento globale (predefinito) o locale. L'ordinamento globale garantisce che, una volta che la catena ha raggiunto il consenso, tutti i nodi ricevono le stesse risposte dalle stesse chiamate API. L'ordinamento locale garantisce che, per qualsiasi nodo particolare, l'ordinamento degli articoli di uno stream non cambierà mai tra le chiamate API. Ogni applicazione può fare la scelta appropriata per le sue esigenze.

Stream e la roadmap di MultiChain

Con il rilascio di stream, abbiamo completato l'ultimo importante lavoro per MultiChain 1.0 e ora siamo fermamente sulla strada per la beta. Ci aspettiamo di dedicare i prossimi mesi all'espansione della nostra suite di test interna (già abbastanza grande!), Al completamento delle porte Windows e Mac, all'aggiunta di alcune API più utili, all'aggiornamento Explorer per streaming, ottimizzazione degli aspetti del meccanismo di consenso, rilascio della demo Web e, in generale, riordino del codice e dei messaggi di aiuto. Soprattutto, continueremo a correggere eventuali bug non appena vengono scoperti, in modo che i nostri errori non interrompano il tuo lavoro.

A più lungo termine, dove si inseriscono i flussi nella roadmap di MultiChain? Facendo un passo indietro, MultiChain offre ora tre aree di funzionalità di alto livello:

  • Permessi per controllare chi può connettersi, effettuare transazioni, creare risorse / flussi, estrarre / convalidare e amministrare.
  • Attività tra cui emissione, riemissione, trasferimento, scambio atomico, impegno e distruzione.
  • Streams con API per la creazione di stream, scrittura, iscrizione, indicizzazione e recupero.

Dopo il rilascio di MultiChain 1.0 (e una versione premium), quali sono le novità in questo elenco? Se guardi il Comando API che viene utilizzato per creare flussi, noterai un parametro apparentemente superfluo, con un valore fisso di stream. Questo parametro consentirà a MultiChain di supportare altri tipi di entità di alto livello in futuro.

Possibili valori futuri per il parametro includono evm (per un Ethereum-compatibile macchina virtuale), sql (per un database in stile SQL) o anche wiki (per il testo modificato in modo collaborativo). Qualsiasi entità condivisa il cui stato è determinato da una serie ordinata di modifiche è un potenziale candidato. Ciascuna di tali entità avrà bisogno di: (a) API che forniscano la giusta astrazione per aggiornare il proprio stato, (b) meccanismi appropriati per i nodi sottoscritti per tracciare tale stato e (c) API per recuperare in modo efficiente parte o tutto lo stato. Stiamo aspettando di scoprire quali altre entità di alto livello sarebbero più utili, da implementare da noi o da terze parti tramite un'architettura plug-in.

E i contratti intelligenti?

In senso generale, MultiChain adotta l'approccio in cui dati è immutabilmente immerso in una blockchain, ma il file codice per interpretare che i dati si trovano nel nodo o nel livello dell'applicazione. Questo è deliberatamente diverso dal paradigma dei "contratti intelligenti", come esemplificato da Ethereum, in cui il codice è incorporato nella blockchain e viene eseguito in una macchina virtuale. In teoria, perché i contratti intelligenti lo sono Turing completo, possono riprodurre il comportamento di MultiChain o di qualsiasi altra piattaforma blockchain. In pratica, tuttavia, i contratti intelligenti in stile Ethereum presentano molte dolorose carenze:

  • Ogni nodo deve eseguire ogni calcolo, che sia di interesse o meno. Al contrario, in MultiChain ogni nodo decide a quali flussi iscriversi e può ignorare i dati contenuti da altri.
  • La macchina virtuale utilizzata per i contratti intelligenti ha prestazioni notevolmente peggiori rispetto al codice che è stato compilato in modo nativo per una determinata architettura di computer.
  • Il codice del contratto intelligente è immutabilmente incorporato in una catena, impedendo l'aggiunta di funzionalità e la correzione di bug. Ciò è stato dimostrato con forza nel morte di DAO.
  • Transazioni inviate a un contratto intelligente impossibile aggiornare lo stato di una blockchain fino a quando non si conosce il loro ordinamento finale, a causa della natura del calcolo per scopi generali. Ciò comporta ritardi (fino a quando una transazione non viene confermata in un blocco) nonché possibili inversioni (nel caso di un fork nella catena). Al contrario, MultiChain può trattare ogni tipo di transazione non confermata nel modo appropriato: (a) gli asset in entrata aggiornano immediatamente il saldo non confermato di un nodo, (b) gli elementi del flusso in entrata sono immediatamente disponibili, con il loro ordinamento globale successivamente finalizzato, (c) le modifiche delle autorizzazioni vengono applicati immediatamente e quindi riprodotti nei blocchi in arrivo.

Tuttavia, come ho fatto io detto prima, certamente non escludiamo i contratti intelligenti come un paradigma utile per le applicazioni blockchain, se e quando vediamo casi d'uso forti. Tuttavia, in MultiChain i contratti intelligenti verrebbero implementati in uno strato simile a stream in cima alla blockchain, piuttosto che al livello di transazione più basso. Ciò preserverà le prestazioni superiori di MultiChain per entità blockchain più semplici come asset e flussi, offrendo al contempo un calcolo su catena più lento dove è realmente necessario. Ma ci sono meno casi del genere di quanto tu possa pensare.

 

Si prega di inviare eventuali commenti LinkedIn.

 

Addendum tecnico

Tutti i comandi relativi agli stream sono documentati per intero nel file Pagina API MultiChain, ma ecco un breve riassunto:

  • Crea uno stream usando create stream or createfrom ... stream
  • Aggiungi un elemento a uno stream con publish or publishfrom
  • Recupera un elenco di flussi utilizzando liststreams
  • Inizia o interrompi il monitoraggio di un flusso con subscribe ed unsubscribe
  • Recupera gli elementi del flusso usando liststreamitems, liststreamkeyitems ed liststreampublisheritems
  • Elenca le chiavi di streaming e i publisher con liststreamkeys ed liststreampublishers
  • Per gli elementi di flusso di grandi dimensioni, recuperare i dati completi utilizzando gettxoutdata (Vedi maxshowndata di seguito)
  • Controlla le autorizzazioni per stream con chiamate simili grant [address] stream1.write
  • Visualizza le autorizzazioni di uno stream utilizzando listpermissions stream1.*

Alcune altre note dello sviluppatore relative ai flussi:

  • I create l'autorizzazione consente a un indirizzo di creare flussi.
  • Le autorizzazioni per-stream pertinenti sono write, admin ed activate
  • New parametri blockchain: root-stream-name (lasciare vuoto per nessuno), root-stream-open, anyone-can-create, admin-consensus-create, max-std-op-returns-count
  • New parametri di runtime: autosubscribe per iscriversi automaticamente ai nuovi flussi creati e maxshowndata per limitare la quantità di dati nelle risposte API (vedere gettxoutdata sopra).
  • La dimensione massima dei dati di un elemento stream è fissata da max-std-op-return-size parametro blockchain, nonché il più piccolo di maximum-block-size ed max-std-tx-size valori meno alcune centinaia di byte.
  • I nodi che utilizzano il vecchio formato di portafoglio non possono iscriversi ai flussi e dovrebbe essere aggiornato.

 

Timestamp:

Di più da più giri