Przedstawiamy strumienie MultiChain

Węzeł źródłowy: 1213525

Dla udostępnionych niezmiennych baz danych klucz-wartość i szeregów czasowych

Dziś z dumą udostępniamy najnowszą wersję MultiChain, która zawiera kluczowy nowy zestaw funkcji zwanych „strumieniami”. Strumienie zapewniają naturalną abstrakcję dla przypadków użycia blockchain, które koncentrują się na ogólnym pobieraniu danych, oznaczaniu czasu i archiwizacji, a nie na przenoszeniu zasobów między uczestnikami. Strumienie mogą służyć do implementacji trzech różnych typów baz danych w łańcuchu:

  1. Baza danych klucz-wartość lub magazyn dokumentów w stylu NoSQL.
  2. Baza danych szeregów czasowych, która koncentruje się na kolejności wpisów.
  3. Baza danych oparta na tożsamości, w której wpisy są klasyfikowane według ich autora.

Można je traktować jako „co”, „kiedy” i „kto” we wspólnej bazie danych.

Podstawy strumieni

W łańcuchu blokowym MultiChain można utworzyć dowolną liczbę strumieni, a każdy strumień działa jako niezależna kolekcja elementów tylko do dołączania. Każdy element w strumieniu ma następujące cechy:

  • Jeden lub więcej wydawcy którzy podpisali cyfrowo ten przedmiot.
  • Opcjonalne klucz do wygodnego późniejszego pobierania.
  • Trochę dane, który może zawierać od małego fragmentu tekstu do wielu megabajtów nieprzetworzonego pliku binarnego.
  • A znak czasu, który jest pobierany z nagłówka bloku, w którym pozycja jest potwierdzana.

Za kulisami każdy element w strumieniu jest reprezentowany przez transakcję blockchain, ale programiści mogą czytać i zapisywać strumienie bez świadomości tego podstawowego mechanizmu. (Bardziej zaawansowani użytkownicy mogą używać surowe transakcje aby pisać do wielu strumieni, wydawać lub przenosić zasoby i / lub przypisywać uprawnienia w jednej niepodzielnej transakcji).

Strumienie integrują się z systemem uprawnień MultiChain na wiele sposobów. Po pierwsze, strumienie mogą być tworzone tylko przez tych, którzy mają na to pozwolenie, w taki sam sposób, w jaki zasoby mogą być wydawane tylko przez określone adresy. Utworzony strumień jest otwarty lub zamknięty. Otwarte strumienie są zapisywane przez każdego, kto ma pozwolenie na wysyłanie transakcji w ramach łańcucha bloków, podczas gdy strumienie zamknięte są ograniczone do zmiennej listy dozwolonych adresów. W tym drugim przypadku każdy strumień ma jednego lub więcej administratorów, którzy mogą zmieniać te uprawnienia do zapisu w czasie.

Każdy łańcuch bloków ma opcjonalny strumień „główny”, który jest zdefiniowany w pliku parametry i istnieje od momentu utworzenia łańcucha. Umożliwia to natychmiastowe użycie łańcucha bloków do przechowywania i pobierania danych, bez czekania na jawne utworzenie strumienia.

Jak ja omówione wcześniej, poufność jest największym wyzwaniem w wielu przypadkach użycia blockchain. Dzieje się tak, ponieważ każdy węzeł w łańcuchu bloków widzi pełną kopię zawartości całego łańcucha. Strumienie zapewniają naturalny sposób obsługi zaszyfrowanych danych w łańcuchu bloków, jak następuje:

  1. Jeden strumień jest używany przez uczestników do dystrybucji ich kluczy publicznych dla dowolnego schematu kryptografii klucza publicznego.
  2. Drugi strumień jest używany do publikowania danych, w których każdy fragment danych jest szyfrowany za pomocą kryptografii symetrycznej z unikalnym kluczem.
  3. Trzeci strumień zapewnia dostęp do danych. Dla każdego uczestnika, który powinien zobaczyć fragment danych, tworzony jest wpis strumienia zawierający tajny klucz tych danych, zaszyfrowany przy użyciu klucza publicznego tego uczestnika.

Zapewnia to skuteczny sposób archiwizowania danych w łańcuchu bloków, jednocześnie czyniąc je widocznymi tylko dla niektórych uczestników.

Pobieranie ze strumieni

Podstawową wartością strumieni jest indeksowanie i pobieranie. Każdy węzeł może wybrać, które strumienie subskrybować, przy czym łańcuch bloków gwarantuje, że wszystkie węzły, które subskrybują określony strumień, zobaczą w nim te same elementy. (Węzeł można również skonfigurować tak, aby automatycznie subskrybował każdy nowy utworzony strumień).

Jeśli węzeł subskrybuje strumień, informacje można pobrać z tego strumienia na kilka sposobów:

  • Pobieranie elementów ze strumienia w kolejności.
  • Pobieranie elementów z określonym kluczem.
  • Pobieranie elementów podpisanych przez określonego wydawcę.
  • Lista kluczy używanych w strumieniu wraz z liczbą elementów dla każdego klucza.
  • Lista wydawców w strumieniu wraz z liczbą elementów.

Jak wspomniano na początku, te metody pobierania pozwalają na używanie strumieni bazy danych klucz-wartość, bazy danych szeregów czasowych i baz danych opartych na tożsamości. Wszystkie oferowane interfejsy API pobierania początek i liczyć parametrów, umożliwiając efektywne pobieranie podsekcji długich list (jak klauzula LIMIT w SQL). Ujemne wartości dla początek zezwalaj na pobieranie najnowszych pozycji.

Strumienie mogą zawierać wiele elementów z tym samym kluczem, a to naturalnie rozwiązuje napięcie między niezmiennością łańcucha bloków a potrzebą aktualizacji bazy danych. Każdemu efektywnemu „wpisowi” bazy danych należy przypisać unikalny klucz w aplikacji, a każda aktualizacja tego wpisu będzie reprezentowana przez nowy element strumienia z jego kluczem. Interfejsy API pobierania strumienia MultiChain mogą być następnie użyte do: (a) pobrania pierwszej lub ostatniej wersji danego wpisu, (b) pobrania pełnej historii wersji wpisu, (c) pobrania informacji o wielu wpisach, w tym o pierwszym i ostatnim wersje każdego.

Zwróć uwagę, że ze względu na architekturę peer-to-peer blockchain elementy w strumieniu mogą docierać do różnych węzłów w różnych kolejności, a MultiChain umożliwia pobieranie elementów, zanim zostaną „potwierdzone” w bloku. W rezultacie wszystkie interfejsy API pobierania oferują wybór między porządkiem globalnym (domyślnym) lub lokalnym. Globalne porządkowanie gwarantuje, że gdy łańcuch osiągnie konsensus, wszystkie węzły otrzymają te same odpowiedzi z tych samych wywołań API. Porządkowanie lokalne gwarantuje, że dla dowolnego węzła kolejność elementów strumienia nigdy nie zmieni się między wywołaniami interfejsu API. Każda aplikacja może dokonać odpowiedniego wyboru do swoich potrzeb.

Strumienie i mapa drogowa MultiChain

Wraz z wydaniem strumieni zakończyliśmy ostatnią dużą pracę nad MultiChain 1.0 i jesteśmy teraz na dobrej drodze do beta. Spodziewamy się spędzić kilka następnych miesięcy na rozbudowie naszego wewnętrznego zestawu testów (już całkiem sporego!), Dokończeniu portów Windows i Mac, dodaniu kilku bardziej użytecznych API, aktualizacji badacz w przypadku strumieni, ulepszania aspektów mechanizmu konsensusu, publikowania naszej internetowej wersji demonstracyjnej i ogólnie porządkowania kodu i komunikatów pomocy. Co najważniejsze, będziemy nadal naprawiać wszelkie błędy, gdy tylko zostaną odkryte, aby nasze błędy nie zakłócały Twojej pracy.

W dłuższej perspektywie, gdzie strumienie pasują do mapy drogowej MultiChain? Cofając się o krok, MultiChain oferuje teraz trzy obszary funkcjonalności na wysokim poziomie:

  • Uprawnienia kontrolować, kto może łączyć się, przeprowadzać transakcje, tworzyć zasoby / strumienie, wydobywać / weryfikować i administrować.
  • Aktywa w tym emisja, wznowienie, transfer, wymiana atomowa, depozyt i zniszczenie.
  • Strumienie z interfejsami API do tworzenia strumieni, pisania, subskrybowania, indeksowania i pobierania.

Po wydaniu MultiChain 1.0 (i wersji premium), co dalej na tej liście? Jeśli spojrzysz na Polecenie API który jest używany do tworzenia strumieni, zauważysz pozornie zbędny parametr o stałej wartości stream. Ten parametr pozwoli w przyszłości MultiChain obsługiwać inne typy encji wysokiego poziomu.

Możliwe przyszłe wartości parametru obejmują evm (na Ethereum-kompatybilna maszyna wirtualna), sql (dla bazy danych w stylu SQL) lub nawet wiki (dla tekstu redagowanego wspólnie). Każdy wspólny podmiot, którego stan jest określany przez uporządkowaną serię zmian, jest potencjalnym kandydatem. Każdy taki podmiot będzie potrzebował: (a) interfejsów API, które zapewniają odpowiednią abstrakcję do aktualizacji jego stanu, (b) odpowiednich mechanizmów śledzenia tego stanu przez subskrybowane węzły oraz (c) interfejsów API do efektywnego pobierania części lub całości stanu. Czekamy, aby dowiedzieć się, które inne jednostki wysokiego poziomu byłyby najbardziej przydatne do wdrożenia przez nas lub przez osoby trzecie za pośrednictwem architektury wtyczek.

A co z inteligentnymi kontraktami?

W ogólnym sensie MultiChain przyjmuje podejście, w którym dane jest osadzony niezmiennie w łańcuchu bloków, ale kod do interpretacji danych znajdujących się w węźle lub warstwie aplikacji. Celowo różni się to od paradygmatu „inteligentnych kontraktów”, którego przykładem jest Ethereum, w którym kod jest osadzony w łańcuchu bloków i działa na maszynie wirtualnej. W teorii, ponieważ inteligentne kontrakty są Turing zakończony, mogą odtworzyć zachowanie MultiChain lub dowolnej innej platformy blockchain. W praktyce jednak inteligentne kontrakty w stylu Ethereum mają wiele bolesnych niedociągnięć:

  • Każdy węzeł musi wykonać wszystkie obliczenia, niezależnie od tego, czy jest to interesujące, czy nie. Z kolei w MultiChain każdy węzeł decyduje, które strumienie subskrybować, i może ignorować dane zawarte w innych.
  • Maszyna wirtualna używana do inteligentnych kontraktów ma drastycznie gorszą wydajność niż kod, który został skompilowany natywnie dla danej architektury komputera.
  • Inteligentny kod kontraktu jest niezmiennie osadzony w łańcuchu, co zapobiega dodawaniu funkcji i naprawianiu błędów. Zostało to wyraźnie zademonstrowane w upadek DAO.
  • Transakcje wysłane do inteligentnego kontraktu nie można zaktualizować stan blockchaina do czasu poznania ich ostatecznej kolejności, ze względu na naturę obliczeń ogólnego przeznaczenia. Prowadzi to do opóźnień (do momentu potwierdzenia transakcji w bloku), a także do ewentualnych cofnięć (w przypadku rozwidlenia łańcucha). Z kolei MultiChain może traktować każdy rodzaj niepotwierdzonej transakcji w odpowiedni sposób: (a) przychodzące aktywa natychmiast aktualizują niepotwierdzone saldo węzła, (b) przychodzące elementy strumieniowe są natychmiast dostępne, a ich globalne zamówienia są następnie finalizowane, (c) zmiany uprawnień są stosowane natychmiast, a następnie odtwarzane w nadchodzących blokach.

Niemniej jednak, tak jak ja powiedział wcześniej, z pewnością nie wykluczamy inteligentnych kontraktów jako przydatnego paradygmatu dla aplikacji blockchain, jeśli i kiedy zobaczymy silne przypadki użycia. Jednak w MultiChain inteligentne kontrakty byłyby wdrażane w warstwie podobnej do strumienia na szczycie łańcucha blokowego, a nie na najniższym poziomie transakcji. Pozwoli to zachować doskonałą wydajność MultiChain dla prostszych elementów łańcucha blokowego, takich jak zasoby i strumienie, oferując jednocześnie wolniejsze obliczenia w łańcuchu tam, gdzie jest to naprawdę potrzebne. Ale takich przypadków jest mniej, niż mogłoby się wydawać.

 

Prosimy o umieszczanie komentarzy na LinkedIn.

 

Dodatek techniczny

Wszystkie polecenia związane ze strumieniami są w pełni udokumentowane w Strona interfejsu MultiChain API, ale oto krótkie podsumowanie:

  • Utwórz strumień za pomocą create stream or createfrom ... stream
  • Dodaj element do strumienia za pomocą publish or publishfrom
  • Pobierz listę strumieni za pomocą liststreams
  • Rozpoczynanie lub zatrzymywanie śledzenia strumienia za pomocą subscribe i unsubscribe
  • Pobierz elementy ze strumienia za pomocą liststreamitems, liststreamkeyitems i liststreampublisheritems
  • Lista kluczy strumienia i wydawców z liststreamkeys i liststreampublishers
  • W przypadku dużych elementów strumienia pobierz pełne dane za pomocą gettxoutdata (Patrz maxshowndata poniżej)
  • Kontroluj uprawnienia na strumień za pomocą połączeń, takich jak grant [address] stream1.write
  • Wyświetl uprawnienia strumienia za pomocą listpermissions stream1.*

Inne uwagi deweloperów dotyczące strumieni:

  • Połączenia create uprawnienie umożliwia adresowi tworzenie strumieni.
  • Odpowiednie uprawnienia na strumień to write, admin i activate
  • Nowości parametry łańcucha bloków: root-stream-name (pozostaw puste dla żadnego), root-stream-open, anyone-can-create, admin-consensus-create, max-std-op-returns-count
  • Nowości parametry wykonawcze: autosubscribe aby automatycznie subskrybować nowe utworzone strumienie i maxshowndata aby ograniczyć ilość danych w odpowiedziach API (patrz gettxoutdata powyżej).
  • Maksymalny rozmiar danych elementu strumienia jest ustalany przez max-std-op-return-size parametr blockchain, a także mniejszy z maximum-block-size i max-std-tx-size wartości minus kilkaset bajtów.
  • Węzły używające starego formatu portfela nie mogą subskrybować strumieni oraz powinien zostać zaktualizowany.

 

Znak czasu:

Więcej z Multichain