Od Blockchain do DAG (II)
Przeszłe i obecne życie MEERDAG
Przedmowa
Perspektywa rozwoju blockchain 3.0 była kiedyś przedmiotem gorących dyskusji, wśród których DAG jest uważany za najbardziej obiecującą nową generację technologii blockchain po Bitcoinie i Ethereum. Jakie jest więc pochodzenie blockchaina DAG? Jaka jest jego koncepcja techniczna?
DAG i blockchain były pierwotnie dwiema różnymi technologiami, ale połączenie tych dwóch, koncepcji „DAG blockchain” i jej pierwszego pojawienia się w centrum uwagi, było możliwe dzięki dwóm Izraelczykom, Yonatanowi Sompolinsky'emu i Avivowi Zoharowi, pionierom tej pionierskiej koncepcji .
Protokół GHOST zaproponowany przez Aviva Zohara został przyjęty przez Ethereum na wczesnym etapie. Protokół ten rozwiązuje problemy bezpieczeństwa powodowane przez widły łańcuchowe. Struktura danych rozwidlonego łańcucha bloków ewoluuje od pojedynczego łańcucha do łańcucha drzewa. Później Aviv Zohar dalej zaproponował protokół włączający. Zgodnie z zasadami protokołu Inclusive struktura danych łańcucha blokowego ewoluuje w ukierunkowany graf acykliczny (DAG). Wraz z nieustanną eksploracją DAG przez DAGlabs, koncepcja frameworka BlockDAG i architektura techniczna zostały stopniowo ustalone, podczas których sukcesywnie wypuszczano protokół SPECTER, protokół PHANTOM i protokół GHOSTDAG.
Qitmeer badał protokoły konsensusu, które dotyczą skalowalności (dostępności) bez poświęcania decentralizacji (tolerancja błędów partycjonowania) i bezpieczeństwa (spójność) na początku projektu i odkrył, że zbiegło się to z filozofią projektowania BlockDAG.
W wąskim znaczeniu BlockDAG można rozumieć jako techniczne ramy protokołu konsensusu, który ma na celu dalsze ulepszanie technologii DAG z wysoką wydajnością współbieżności przy założeniu zapewnienia decentralizacji i bezpieczeństwa. Mechanizm konsensusu PoW oparty na dowodzie pracy może zapewnić, że sieć blockchain jest wystarczająco zdecentralizowana, więc wydobywanie bloków w celu generowania bloków stało się ważną cechą techniczną, dlatego nazywa się BlockDAG.
Zespół Qitmeer dokonał wielu optymalizacji na poziomie inżynierskim dla algorytmów konsensusu GHOSTDAG i SPECTRE oraz stworzył protokół MeerDAG z własnymi cechami, zachowując zalety obu protokołów.
1. Podstawowa struktura DAG
1.1 Jak wygląda DAG?
Wszyscy dobrze znamy strukturę danych drzewa Merkle. Wewnątrz każdego bloku Bitcoina drzewo Merkle służy do zapisywania informacji o transakcjach, patrz obrazek poniżej
Można zauważyć, że drzewo Merkle należy do struktury drzewa skierowanego, każdy wierzchołek w drzewie może wskazywać tylko na jeden poprzedni wierzchołek, a całe dane mają oczywisty kierunek przepływu. Struktura DAG pozwala każdemu wierzchołkowi wskazywać na wiele poprzednich wierzchołków, a cały przepływ danych ma również oczywisty kierunek. Inną strukturą danych jest graf skierowany. W przeciwieństwie do DAG, graf skierowany pozwala na cofanie się danych, a przepływ danych w całej strukturze nie jest zbyt oczywisty. Zobacz obraz 2, aby zobaczyć różnicę między tymi trzema.
1.2 Blockchain to specjalna struktura DAG
Po intuicyjnym zrozumieniu struktury DAG, zastanówmy się, dlaczego blockchain jest uważany za specjalną strukturę DAG?
Czy widełki blockchain są powiązane z szybkością generowania bloków i szybkością transmisji. Kiedy prędkość produkcji bloku przekroczy prędkość transmisji, wiele bloków zostanie nadanych w tym samym czasie i nastąpi rozwidlenie. Im więcej widelców, tym gorsze bezpieczeństwo. Aby zredukować rozwidlenia, Bitcoin znajduje równowagę między wydajnością a bezpieczeństwem: co dziesięć minut generowany jest blok. Załóżmy teraz, że czas dla każdego bloku jest wystarczająco długi, aby żaden nowy blok nie został wydobyty przed emisją poprzedniego bloku. Wtedy struktura tego łańcucha blokowego jest pojedynczym łańcuchem, patrz obraz 3
W rzeczywistości, z powodu opóźnień w sieci i innych powodów, nieuchronnie wystąpią bifurkacje, więc rzeczywista struktura blockchain będzie taka, jak pokazano na obrazku 4, a tylko jeden z ważnych głównych łańcuchów (biały) zostanie wybrany zgodnie z zasadą najdłuższego łańcucha konsensus księgi. Informacje o transakcji w pozostałych blokach (czerwone) są nieprawidłowe i nie zostaną przyjęte.
Teraz odłóż na bok konsensus księgi, to znaczy zignoruj jak wybrać skuteczny łańcuch główny. Z perspektywy podstawowej struktury sieci typowa struktura łańcucha bloków jest pokazana na obrazku 5, a typowa struktura DAG jest pokazana na obrazie 6.
Można zauważyć, że jedyną różnicą między tymi dwiema strukturami jest to, że blok DAG może wskazywać na wiele poprzednich bloków, podczas gdy łańcuch blokowy może wskazywać tylko na poprzedni blok. W szczególności nagłówek bloku łańcucha blokowego może zawierać tylko wartość skrótu jednego bloku, wskazującą na jedyny blok nadrzędny; podczas gdy nagłówek bloku w strukturze DAG może zawierać wartości mieszania wielu bloków, wskazujące na różne poprzednie bloki. Jak pokazano na obrazku 7.
Teraz wprowadzamy współczynnik rozwidlenia K, który odnosi się do liczby rozwidleń, na jakie może pozwolić sieć.
Gdy K=0, cała sieć nie zezwala na rozwidlenia, jak pokazano na obrazku 3.
Ta sieć, która nie pozwala na forki, to blockchain.
Bitcoin spełnia tę definicję; chociaż Ethereum ma widełki bloków wujka, te bloki wujka są używane tylko do oceny wagi głównego łańcucha i nie zostaną dodane do głównego łańcucha na końcu (zapisy wujka blokowego Informacje o transakcji nie są zawarte w głównym łańcuchu ), więc Ethereum również spełnia tę definicję.
Wartość K sieci DAG musi być liczbą całkowitą większą od 0. Zatem ze strukturalnego punktu widzenia DAG jest rozszerzeniem struktury blockchain, a blockchain jest specjalnym i uproszczonym DAG.
1.3 Wpływ struktury DAG na wydajność
Mówiąc prościej, możemy uznać DAG za strukturę sieci, która dopuszcza rozwidlenia, a liczba dozwolonych rozwidleń jest określona przez współczynnik rozwidlenia K.
Więc co dokładnie oznacza sieć, która zezwala na rozwidlenia? Oznacza to, że prędkość generowania bloków może przekraczać prędkość transmisji. Z jednej strony prowadzi to do większej liczby transakcji spakowanych w jednostce czasu; z drugiej strony, gdy blok A jest nadawany przez całą sieć, inny rozwidlony blok B jest również nadawany przez całą sieć, a na koniec niektóre węzły potwierdzą tylko A, inne węzły potwierdzą tylko B, więc DAG zezwala węzłom w sieci w celu jednoczesnego rejestrowania różnych informacji. Połączenie tych dwóch aspektów sprawia, że DAG prezentuje cechy wysokiej współbieżności i słabej synchronizacji.
DAG to rodzaj księgowości asynchronicznej, która może znacznie poprawić szybkość sieciowego przetwarzania informacji, czyli TPS.
Blockchain to sieć silnej synchronicznej księgowości, która wymaga, aby każdy węzeł w sieci zapisywał te same informacje w tym samym czasie. Jednak to wymaganie często ogranicza zdolność sieci blockchain do przetwarzania informacji, przez co TPS jest stosunkowo niski.
Pytanie brzmi więc, jakiego rodzaju konsensusu należy użyć dla tej asynchronicznej sieci księgowej, która pozwala na rozwidlenia? W poprzednim artykule szczegółowo wspomnimy o mechanizmie konsensusu opartym na DAG. Mechanizm konsensusu dzieli się na konsensus blokowy i konsensus księgi. Konsensus blokowy DAG może być taki sam jak konsensus blokowy. Na przykład używany jest również POW. Ponieważ widełki są dozwolone, czas generowania bloku można ustawić bardzo krótko. Konsensus blokowy może również różnić się od blockchaina. Na przykład projekt IOTA bezpośrednio anuluje proces pakowania i generowania bloków. Dopóki transakcja ma miejsce, jest natychmiast zapisywana w sieci (każdy blok na diagramie DAG nie jest blokiem, ale transakcją długopisu), uzyskując w ten sposób możliwość przetwarzania transakcji z bardzo dużą szybkością.
Konsensus księgi DAG jest znacznie bardziej złożony niż blockchain. Jak zapobiec czynieniu zła przez węzły? Jak monitorować, gdy są dwie sprzeczne transakcje? Jak zapobiegać „podwójnym wydatkom”? Ze względu na złożoność podstawowej struktury sieci konsensus księgi ma również wyższe wymagania. Zostanie to podkreślone w kolejnych artykułach.
1.4 TXDAG i BlockDAG
Różnica między uogólnionym BlockDAG (wykres blokowy) a TxDAG (transakcyjny DAG, transakcyjny DAG). Mówiąc ogólnie lub pod względem struktur danych, BlockDAG i TxDAG to tylko dwie różne struktury danych. Różnica polega na tym, że ta pierwsza pakuje wiele transakcji w bloki, a księga jest zorganizowana według bloków; podczas gdy ten ostatni nie ma pojęcia bloków, a księga składa się z transakcji, co można również rozumieć jako tylko jedną transakcję w bloku. Ponieważ transakcja ma wiele wspólnych informacji opisujących transakcję, to znaczy informacje nagłówka, ta część informacji może być przechowywana w bloku, a transakcja musi tylko zapisać różne części transakcji, aby proces HASH (wydobywanie) jest pomijany i bezpośrednio przesyłany łańcuch. Ponieważ BlockDAG nie tylko zachowuje wysoką współbieżność DAG,
1.5 Zalety DAG
W porównaniu z łańcuchem bloków, DAG jest właściwie różnicą między wykresem a łańcuchem. W przypadku łańcucha nie może on zajmować się tylko jedną częścią, ponieważ istnieje tylko jeden stopień wejściowy i wyjściowy łańcucha, a węzłów w łańcuchu nie można podzielić na kilka węzłów do przetworzenia, ale możliwe jest, aby wykresy, ponieważ grafy mogą mieć wiele stopni zewnętrznych, węzły połączone wieloma stopniami zewnętrznymi mogą być przetwarzane w tym samym czasie.
W przypadku sieci łańcuchowej nie chodzi o to, że zdolność przetwarzania węzłów nie jest silna, ale struktura łańcucha nie może być obliczana równolegle, a stracony czas to głównie czas oczekiwania: jednym z nich jest zainicjowanie transakcji, która musi zostać zsynchronizowana ze wszystkimi węzłami; drugi to czas potwierdzenia, kiedy następuje potwierdzenie węzła, które należy zsynchronizować z całą siecią. W przypadku DAG nie ma takiego problemu. Kiedy portfel inicjuje transakcję, nie musi czekać na liczbę transakcji, które miał wcześniej. Musi tylko przejść częściową weryfikację, transmisję sieciową i inną częściową weryfikację, co jest równoznaczne z decentralizacją potwierdzania transakcji. Węzły wykonują pracę podobną do puzzli, łącząc własne transakcje z transakcjami potwierdzonymi przez innych.
W związku z tym stwierdza się, że DAG ma następujące zalety:
(1). Szybka prędkość transakcji
Osiągając ten sam poziom decentralizacji i bezpieczeństwa, co Bitcoin i Ethereum, lokalne przetwarzanie DAG i rozliczenia równoległe mogą znacznie zwiększyć szybkość transakcji, zwiększając przepustowość transakcji (TPS) i ostateczne opóźnienie o ponad dwa rzędy wielkości.
(2). Silna rozszerzalność
Ponieważ DAG obsługuje asynchroniczne księgowanie, węzły w sieci mogą przetwarzać nowe transakcje równolegle bez czekania na synchronizację danych innych węzłów, unikając marnowania czasu, poprawiając efektywność transakcji i umożliwiając szybkie rozszerzenie każdego węzła uczestniczącego w księgowaniu. Dlatego DAG doskonale nadaje się do projektów płatniczych, takich jak transgraniczne mikropłatności i integracyjne finansowe scenariusze biznesowe zalecane przez zespół Qitmeer.
(3). Trudniej zmodyfikować złośliwie
W porównaniu ze strukturą łańcuchową złośliwa modyfikacja w DAG jest znacznie trudniejsza, ponieważ DAG ma wiele stopni wyjściowych i wejściowych, a jeśli zmodyfikowany zostanie węzeł, odpowiednie stopnie wejściowe muszą zostać zmodyfikowane.
2. Przeszłość i teraźniejszość MEERDAG
2.1 Pochodzenie technologii DAG
W 2013 roku na bitcointalk.org, słynnym miejscu narodzin blockchain, uczony z izraelskiego Uniwersytetu Hebrajskiego o ID Avivz78 zaproponował wprowadzenie koncepcji DAG jako algorytmu konsensusu do struktury blockchain i stworzył protokół GHOST.
Po zaproponowaniu protokołu GHOST Yonatan Sompolinsky zaproponował kolejny nowy pomysł, w którym nowo wygenerowane bloki wskazują na wszystkie znane rozwidlone bloki końcowe, tj. blok ma wielu ojców, w którym to momencie
łańcuch bloków zmienia się z pojedynczego łańcucha w strukturę składającą się z wielu rozwidlonych łańcuchów razem, a taka struktura łańcucha nazywa się DAG (skierowany graf acykliczny).
W 2016 roku opublikowano protokół techniczny SPECTER, który jeszcze bardziej ulepszył szczegóły architektury technicznej, stworzył prototyp protokołu blockDAG pierwszej generacji i zaproponował wielką ideę opóźnienia sieci bez parametryzacji (lub dostosowania parametrów opóźnienia).
W 2018 roku firma DAGlabs uruchomiła protokół PHANTOM. Rozwiązano problem polegający na tym, że protokół SPECTER nie mógł handlować sortowaniem liniowym, i kontynuowano jego optymalizację, tworząc protokół GHOSTDAG, który jest pierwszym protokołem BlockDAG klasy przemysłowej, a także wyznacza dojrzałość BlockDAG.
Na końcu protokołu GHOSTDAG Yonatan Sompolinsky przewidział możliwy protokół łączący GHOSTDAG + SPECTRE, ale nie przedstawił go szczegółowo
3. Przemyślenia nad wyborem technologii MEERDAG
3.1 Zastanawiałem się nad wyborem technologii MEERDAG
W pierwszym etapie Qitmeer Network, Mecca Network, zbiegło się to z gwałtownym wzrostem eksploracji technologii ekspansji, w obliczu wielu głównych rozwiązań rozszerzających w łańcuchu i poza łańcuchem, przy wyborze technologii łańcucha publicznego Qitmeer również stanął w obliczu trudnego wyboru.
Jeśli chodzi o wybór technologii ekspansji, branża na ogół boryka się z problemem niemożliwego trójkąta. Niemożliwe jest jednoczesne osiągnięcie skalowalności (Scalability), decentralizacji (Decentralizacja) i bezpieczeństwa (Bezpieczeństwo), a tylko dwa z trzech można osiągnąć. Zespół Qitmeer w tym czasie również stanął przed takim problemem. Po przestudiowaniu wielu rozwiązań rozszerzających zespół ostatecznie wybrał technologię o nazwie BlockDAG.
3.2 Krótkie wprowadzenie do protokołu SPECTER
SPECTER to protokół blockDAG, który obsługuje szybkie potwierdzanie. Algorytm konsensusu SPECTRE jest algorytmem głosowania. Po znalezieniu sprzecznej transakcji blok zawierający sprzeczną transakcję zostanie użyty jako kandydat do zaakceptowania głosów ze wszystkich bloków, z jednym głosem na każdy blok. Głosowanie SPECTRE ma efekt wzmocnienia. Na przykład blok będzie podążał za większością głosów, na których koncentrował się w przeszłości, więc prędkość konwergencji jest bardzo duża, a niewielka różnica w liczbie głosów może skutkować ogromną przewagą dla zwycięzcy. Niech uczciwe bloki głosują na uczciwe bloki, a późniejsze uczciwe bloki dadzą poprzednią moc układania, dzięki czemu złośliwe ataki się nie powiodą, a bezpieczeństwo sieci zostanie zagwarantowane.
SPECTER gwarantuje jedynie szybkie potwierdzenie uczciwych bloków. W przypadku dwóch sprzecznych bloków, których czas zwolnienia jest bliski, czas potwierdzenia SPECTER jest niepewny. Jest to koncepcja słabej aktywności zaproponowana przez SPECTRE, co oznacza, że nie można zagwarantować, że wszystkie bloki będą mogły zostać ostatecznie potwierdzone w rozsądnym czasie.
SPECTER to protokół konsensusu oparty na systemie transakcyjnym. W systemie transakcyjnym tylko złoczyńcy mogą tworzyć transakcje podwójnego wydatkowania. Oznacza to, że transakcje podwójnego wydatkowania nie będą miały większego wpływu na uczciwe bloki. Ponadto dokonywanie transakcji podwójnego wydatkowania wymaga bardzo ścisłej kontroli czasu i trudno jest wywołać ataki w normalnych okolicznościach. Dlatego zespół Qitmeer uważa, że problem słabej aktywności SPECTER jest do zaakceptowania w rzeczywistych projektach.
3.3 Krótkie wprowadzenie do protokołu GHOSTDAG
Jak widać na powyższym profilu SPECTER, SPECTER bardzo dobrze radzi sobie z rozwiązywaniem problemów z konfliktowymi transakcjami i obroną przed atakami. Jeśli projekt jest używany tylko do celów płatniczych, takich jak Bitcoin, wystarczy szybkie potwierdzenie protokołu SPECTER. Ale jeśli chcesz zintegrować inteligentne kontrakty, SPECTER nie może tego zrobić.
Ponieważ SPECTER może przeprowadzić tylko względne sortowanie sprzecznych transakcji (oceniając kolejność sprzecznych transakcji), ale nie może przeprowadzić bezwzględnego sortowania dla wszystkich bloków. Ponieważ język inteligentnego kontraktu musi być kompletny Turinga, podobnie jak piszemy fragment programu komputerowego, musimy wykonywać różne operacje w ściśle określonej kolejności, więc sieć z funkcją inteligentnego kontraktu ma pewną cechę: transakcje w sieci mogą być w czasie Wykonuj sortowanie liniowe (chronologiczne) jedno po drugim.
W odpowiedzi Yonatan Sompolinsky na nowo zaprojektował protokół GHOSTDAG, aby utworzyć liniową kolejność bloków DAG. SPECTER i GHOSTDAG to dwa kompletne i niezależne protokoły, żaden nie uzupełnia drugiego.
Mechanizm wydobywania GHOSTDAG jest taki sam jak mechanizm SPECTRE, który wygeneruje ten sam typ struktury DAG. Różnica polega na tym, że GHOSTDAG ocenia, czy blok jest uczciwy, czy złośliwy, analizując łączność bloków, sortuje bloki zgodnie z klasyfikacją i generuje ścisły blok DAG. Liniowy porządek sprzecznej transakcji jest oceniany na podstawie porządku liniowego.
Protokół GHOSTDAG nie tylko umożliwia DAG uzyskanie możliwości liniowego porządkowania transakcji, ale także rozwiązuje problem słabej aktywności protokołu SPECTER. Protokół GHOSTDAG jest również pierwszym protokołem blockDAG obsługującym liniowe porządkowanie transakcji.
3.4 Protokół MEERDAG
Możliwy protokół łączący GHOSTDAG + SPECTRE, który Yonatan Sompolinsky przewidział na końcu dokumentu dotyczącego protokołu GHOSTDAG, dotyczy raczej dostarczania wskazówek w zakresie pomysłów, a nacisk kładziony jest na zademonstrowanie rygoru algorytmu, który obejmuje wiele zagadnień związanych z praktyką inżynierską i wymaga opierać się na rzeczywistości Sytuacja jest stale ćwiczona i testowana, a jednym z najbardziej typowych problemów jest wydajność. Jeśli zostanie zaimplementowany bezpośrednio zgodnie z algorytmem referencyjnym w oryginalnym tekście, wydajność jest prawie nie do przyjęcia.
Zespół Qitmeer uważa, że podstawowe scenariusze zastosowań łańcucha publicznego obejmują głównie finanse sprzyjające włączeniu społecznemu, transakcje dotyczące aktywów cyfrowych i zarządzanie łańcuchem dostaw.
Biorąc pod uwagę mechanizm nagrody blokowej i wymagania konsensusu księgi dotyczące możliwości sortowania liniowego, a jednocześnie biorąc pod uwagę szybkość potwierdzania transakcji, która jest ważniejsza dla doświadczenia wymiany wartości.
Niebieski zestaw (uczciwy blok) GHOSTDAG jest trudniejszy do ustabilizowania, a czas potwierdzenia będzie znacznie dłuższy niż SPECTRE. Ponieważ jednak nagroda blokowa nie wymaga długiego czasu potwierdzenia, nie wpłynie to na sieć. Jako podstawowy protokół konsensusu wybrano protokół GHOSTDAG, a jako protokół konsensusu wspomaganego protokół SPECTER.
MeerDAG, hybrydowe rozwiązanie konsensusu łączące SPECTER i GHOSTDAG, to rozwiązanie skalujące BlockDAG, które jest zgodne z klasycznymi ustawieniami łańcucha bloków (otwarty, uczciwy, bezpieczny, skalowalny) i jest najbardziej kompatybilne z klasycznym modelem łańcucha bloków UTXO. Podczas gdy klasyczny blockchain odrzuca wszystkie bloki poza najdłuższym łańcuchem, MeerDAG jest modelem kooperacyjnym, który zachowuje protokół SPECTER i zachowuje wszystkie bloki, dzięki czemu może osiągnąć wysoką przepustowość i zapewnić rzeczywistą wysoką przepustowość na poziomie transakcji, a także szybkie potwierdzenie transakcji blockchain usługi. Po drugie, BlockDAG opiera się na najcięższej regule łańcucha i może osiągnąć 51% tolerancji na błędy porównywalne z Bitcoinem. Ponadto sieć BlockDAG nie ma żadnych specjalnych węzłów i nie wymaga, aby węzły były online lub nie. w górnictwie,
W okresie Qitmeer Network Medina sieć wprowadziła testy środowiska rzeczywistej mocy obliczeniowej. Zespół stale iterował algorytm PoW i poprawiał wydajność algorytmu, w pełni zachowując zalety protokołu GHOSTDAG+SPECTRE i stale zmniejszając trudność implementacji protokołu w implementacji inżynierskiej. Na przykład: zgodnie z pierwszą wersją dokumentów GHOSTDAG Algorithm obliczenie odwrotnych stożków musi być wyczerpujące, a złożoność algorytmu wynosi O(n^3). Po dużej liczbie testów na poziomie inżynierskim złożoność została zmniejszona o dwa rzędy wielkości do O(n), co znacznie spełnia wymagania dotyczące użyteczności. Zgodnie z podstawowymi wymogami zapewnienia bezpieczeństwa, decentralizacji i uczciwości, wydajność TPS jest zmaksymalizowana.
Zespół Qitmeer w innowacyjny sposób połączył protokół GHOSTDAG+SPECTRE, tworząc własny, charakterystyczny protokół MeerDAG, który stał się technicznym prototypem nowej generacji BlockDAG. Podstawowym pozycjonowaniem leżącej u podstaw sieci Qitmeer BlockDAG jest służenie jako sieć obiegu wartości. W warstwie 2 łączy oparty na MeerEVM system podłączanych maszyn wirtualnych w celu tworzenia bogatych aplikacji blockchain i obejmujących całą ekologię blockchain.
Źródło:
[1] Od blockchain do DAG (2) -- podstawowa struktura DAG,https://mp.weixin.qq.com/s/Mc2uEOLtT_Z3OMapNh1TGg
[2] Od łańcuchów bloków do bloków DAG,https://www.youtube.com/watch?v=tk38AAV_whw
[3] Jeff Zhou: szybka asynchroniczna technologia blockchain DAG,https://www.jianshu.com/p/45d73e0e74ec
[4] DUCH, SPECTRE, PHANTOM Teoria techniczna,https://mp.weixin.qq.com/s/nGR0ld73oXgs_p_MtDcv-Q
[5]Zespół Qitmeer – „Biała księga Qitmeer”

![Czym w ogóle jest lista połączona? [Część 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































