W tym tygodniu badamy przypadek BSV jako maszyny Turinga. Ten temat zagłębia się w bardzo specjalistyczną dziedzinę, którą zwykle jest teoria obliczeniowa dziedziny, ale spróbuję zająć się nią w sposób, który odnosi się do ogólnych programistów i skoncentruję się na jej praktycznych zastosowaniach, zamiast pedantycznie podchodzić do teorii. Bycie kompletnym Turinga jest powszechnym terminem używanym do opisywania języków i systemów komputerowych i koncentruje się na ich zdolności do robienia tego samego, co maszyna teoretyczna, zwana maszyną Turinga. Maszyna Turinga to teoretyczny system komputerowy i model mentalny, który opisuje maszynę z głowicą do odczytu/zapisu, dowolnie długą taśmę, na której można zapisywać i czytać instrukcje oraz zestaw reguł. Jeśli system może teoretycznie wykonać te same zadania, co maszyna Turinga, mówi się, że jest kompletny.
Praktycznie rzecz biorąc, jeśli język komputerowy jest wystarczająco opisowy, aby wykonać obliczenia na tyle złożone, że wynik obliczeń nie może być wcześniej określony (analitycznie) bez faktycznego wykonania obliczeń, to jest to Turing kompletny. Wspólną cechą języków komputerowych, która generalnie czyni je kompletnymi pod względem Turinga, jest zdolność języka do umożliwienia strukturalnego sterowania przepływem programu poprzez pętle lub skoki. W terminologii informatyki język musi obsługiwać sekwencjonowanie, selekcję i powtarzanie. Ale koniecznym warunkiem kompletności Turinga dla języków jest obsługa warunkowego rozgałęzienia lub selekcji. Od dawna uważano, że skrypt Bitcoina nie był kompletny w architekturze Turinga, ponieważ nie obsługiwał pętli, a zatem pomysł wykonania gałęzi nie wydawał się możliwy.
Ale dzięki ponownemu włączeniu oryginalnych kodów operacyjnych Bitcoin w BSV, teraz wykazano, że BSV jest rzeczywiście Turing Complete, co udowodniono poprzez symulację gry Conway’s Game of Life (automat komórkowy, o którym wiadomo, że jest kompletny Turinga) na skrypt bitcoinowy. To wspaniale, ale jak to wpływa na przeciętnego programistę? Jedną rzeczą jest teoretycznie być równoważnym maszynie Turinga, ale zupełnie inną sprawą jest to, aby przeciętni programiści byli w stanie zastanowić się, jak programować obliczenia w systemie. Wiemy już, że pierwotna krytyka skryptu Bitcoin (zgłaszana głównie przez programistów Ethereum i pierwotnych założycieli projektu) polegała na tym, że w Bitcoin nie ma możliwości zapętlania lub powtarzania. To ograniczenie zostało przezwyciężone przez zwykłe rozwijanie pętli (podobnie jak to, co robi kompilator we współczesnych językach), ponieważ pętle są tylko cukrem składniowym dla języków wysokiego poziomu w celu uzyskania powtórzeń.
Ale jak osiągnąć rozgałęzienie warunkowe wymagane do wykonania użytecznych obliczeń? Poza tym, każdy wynik skryptu bitcoin jest po prostu predykatem, można go ocenić tylko jako PRAWDA/FAŁSZ, więc jak uzyskać z niego bardziej złożone obliczenia? Mówiąc najprościej, obliczenia mogą być po prostu uzyskaniem danych wyjściowych z predefiniowanej funkcji, przy określonych danych wejściowych.
Najogólniej chcemy umieć: y = f(x) Gdzie y jest pożądanym wyjściem, f jest funkcją, która jest algorytmem obliczeniowym skonstruowanym wcześniej, a x jest konkretnym wejściem instancji.
Więc jak to robimy na Bitcoinie? Z pewnością możemy umieścić funkcje, które mają zostać ocenione, w wyjściach transakcji Bitcoin (monetach). Mogą one siedzieć w łańcuchu bloków do czasu, w którym zostaną wykonane po podaniu danych wejściowych x. Przybierają one formę skryptów blokujących w Bitcoin, które należy odblokować (za pomocą skryptu odblokowującego), gdy chcesz wydać dane wyjściowe. Dlatego w Bitcoin „x” przybiera formę skryptu odblokowującego, a „f” to skrypt blokujący, który został wcześniej umieszczony na wyjściu (z niektórymi powiązanymi bitcoinami). Ale jeśli dane „f” jest publiczne w łańcuchu blokowym i każdy może je wydać, podając mu dowolny „x” jako skrypt odblokowujący, to nie byłoby to strasznie przydatne, prawda? Dobrze.
Tak więc jednym ze sposobów rozwiązania tego problemu jest metoda przekazywania transakcji w kanałach płatności i widziana tylko przez zamierzone strony (poza łańcuchem). W ten sposób nie tylko odblokują f za pomocą dowolnego x, ale tylko te dane wejściowe, które były wymagane lub potrzebne. Powód, dla którego to zrobili, jest prawdopodobnie spowodowany pewnymi zablokowanymi środkami w kanale, które zostały już wcześniej wynegocjowane z żądającym obliczeń. Inną techniką, którą można zastosować, może być wykorzystanie niesfinalizowanych transakcji. Transakcje na BSV nie są możliwe do wydobycia, dopóki wszystkie dane wejściowe nie zostaną oznaczone jako sfinalizowane, więc jednym ze sposobów zapewnienia, że transakcja nie zostanie opublikowana, zanim będzie gotowa, jest wielokrotne podpisywanie kolejnych wersji tej samej transakcji między węzłami i nie finalizowanie wejścia, aż do uzyskania pożądanego wyjścia y.
Można sobie wyobrazić metodę, za pomocą której osoba żądająca obliczeń mogłaby umieścić w sieci funkcję f, a następnie opublikować w sieci niezakończoną transakcję, z wymaganym wejściem x, pozwalając dowolnym stronom na wykonanie f i opublikowanie zaktualizowanego transakcja z wyjściem y jako wyjściem. Wówczas zleceniodawca mógłby sfinalizować transakcję, co pozwoliłoby na jej wydobycie, a tym samym opłacenie obliczenia i jego wyniku. A co z kompozycją funkcji? tj. y = h(g(f(x))) Mianowicie, być w stanie wziąć poprzednie wyjścia i połączyć je jako dane wejściowe z następną funkcją do wykonania? Kolejne funkcje można łączyć w łańcuch lub sekwencjonować, kolejno przepuszczając transakcje tam iz powrotem między żądającym a siecią. Żądający wysłałby początkowe niesfinalizowane dane wejściowe, które zawierałyby x, które byłyby danymi wejściowymi do obliczeń, wraz z sekwencją funkcji, które muszą być wykonane kolejno, a mianowicie f, g, h.
Sieć węzłów obliczeniowych rywalizowałaby wtedy o to, by jako pierwsza połączyć f, g i h jako dane wejściowe w txn, aby wytworzyć końcowy wynik y. Kluczowym punktem jest to, że aktorzy w sieci obliczeniowej BSV są tylko requesterem, który określa funkcje, które mają zostać wykonane, w jakiej kolejności i z jakim początkowym wejściem x. Rozgałęzienie warunkowe można osiągnąć, kontrolując, które funkcje można wydać. Jedyną rzeczą, na której musimy polegać, jest to, że sieć węzłów jako całość wykona pracę polegającą na wyborze i tworzeniu plików, które obliczają i wytwarzają dane wyjściowe, ponieważ robiąc to, będą w stanie zapłacić sobie nagrodę w bitcoinach.
Tak więc w przeciwieństwie do normalnego komputera, który wykonuje kod, ponieważ jest do tego podłączony sprzętowo, komputer Bitcoin wykonuje kod, ponieważ możemy polegać na fakcie, że jakiś węzeł będzie chciał zarabiać pieniądze i wykona obliczenia, aby mógł zarabiać pieniądze .
Autor : BitcoinSV.pl
Źródło : BSV as a Turing machine – CoinGeek