Strona głównaArtykułyMaszyna stosu: Jak wykonują się smart kontrakty

Maszyna stosu: Jak wykonują się smart kontrakty

Każdy wywołanie smart kontraktu jest na prawdę małą programem uruchamianym na maszynie wirtualnej opierającej się o stos: instrukcje push i pop wartości jednoznacznie, a każda sieć powtarza dokładnie te same kroki, aby osiągnąć dokładnie ten sam wynik.

mysimulator teamZaktualizowano — czerwiec 2026≈ 8 min czytania▶ Otwórz symulację

Dlaczego platformy smart-kontraktów używają maszyny wirtuowej opartej na stosie

Maszyna wirtualna oparta na stosie przechowuje swoje dane robocze na prostym stosie z ostatnio dodanym elementem na szczycie, zamiast nazwanych rejestrów. To sprawia, że zestaw instrukcji jest mały i jednolity: prawie każda operacja kodu (opcode) po prostu wyprowadza swoje argumenty z góry stosu i wrzuca swój wynik ponownie na stos. Ta proste struktura jest dokładnie tym, czym potrzebuje sieć dezentralizowana. Tysiące niezależnych węzłów muszą wykonywać to samo bytecode i kończyć się w identycznym stanie finalnym bajt po bajcie, bez szans na zrozumienie, który rejestr przechowywał jakąś daną. Maszyna stosowa nie ma ukrytego pliku rejestrów do dyskusji, ani konwencji wywoływania specyficznych dla kompilatora, a także nie ma nieokreślonej zachowania — zawartość stosu na dowolnej instrukcji jest całkowicie wyznaczona przez sekwencję operacji kodu (opcodes) wykonanych do tej pory. Ta determinizm pozwala każdemu węźle niezależnie ponownie uruchomić transakcję i zweryfikować jej wynik, zamiast zaufać wyjściowi jednej osoby.

Sposób działania opkodów push i pop krok po kroku

Wykonanie przeprowadza się jeden opkode za drugim z licznika programu, który automatycznie postępuje dalej po każdej instrukcji. Opcodes push umieszczają stałą literałową na szczycie stosu. Opcodes arytmetyczne, takie jak ADD lub MUL, wypisują dokładnie dwie wartości z góry, obliczają wynik i wrzucają ten pojedynczy wynik ponownie — efekt netto: stos zmniejsza się o jedną pozycję. Rozważymy PUSH 3, PUSH 5, ADD: po dwóch umieszczeniach stos zawiera [3, 5], z 5 na szczycie; ADD wypisuje obie wartości, oblicza 3 + 5 i wrzuca 8, pozostawiając stos jako [8]. Opcodes DUP i SWAP przestawiają istniejące elementy stosu bez dotarcia do magazynu. Ponieważ wpływ każdego opkodu na stos jest zawsze taki sam i niezależny od kontekstu, węzeł może zweryfikować poprawność tylko przez symulację tej samej sekwencji — nie ma predykcji gałęzi ani wykonywania przewidzianego do zrównoważenia między maszynami.

Zapis versus stos: trwały stan

Stos jest transencjalny — istnieje tylko podczas jednej execucji i jest zrzucony w chwili zakończenia wywołania. Trwały zapis kontraktu jest przeciwnym do niego: to mapowanie klucz-wartość, które przetrwuje między transakcjami i jest częścią trwałości blockchaina, powtarzanej identycznie na każdym węźle. Czytanie zapisu (SLOAD) przenosi wartość dla danego klucza na stos; pisanie do zapisu (SSTORE) usuwa klucz i wartość z stosu i komittuje tę wartość do trwałości. Przetransferowanie tokenu, na przykład, liczy nowy bilans nadawcy na stosie, a następnie SSTORE to miejsce zapisu konta nadawcy; robi to samo dla odbiorcy — dwie małe obliczenia na stosie, następujące za dwoma trwałymi zapisami. Ponieważ zapisy są deterministycznymi funkcjami transakcji wejściowych, każdy węzeł kończy się z identycznym aktualizowanym stanem.

Dlaczego granice gazu i kroków ograniczają każdą execucję

Maszyna stosu ogólnego przeznaczenia w teorii mógłaby pętać nieskończenie, co jest niewykluczone, gdy każdy węzeł w sieci musi zakończyć wykonanie każdej transakcji. Aby zagwarantować, że wykonanie zawsze się zakończy, każdemu kodowi operacji przypisano stałą koszty obliczeniowe, a wywołujący dostarcza maksymalny bilet na początku. Maszyna wirtuałowa odejmuje ten bilet po każdym instrukcji i natychmiast zatrzymuje wykonanie, jeśli osiągnie zero, cofając każdą zmianę stanu częściowego. To zamienia inaczej nieodludzalny problem zakończenia wykonywania na ograniczonego: żaden program nie może działać dłużej niż pozwolone mu zaplacenie. To również utrzymuje koszt walidacji transakcji podobnym do porównywalnym między węzłami o różnych sprzętach, ponieważ jednostka liczone jest jako liczba instrukcji i skomplikowania, a nie czas zegara.

Często zadawane pytania

Co exactly oznacza 'stack-based' dla maszyny wirtuowej?

Oznacza to, że glowna pamiec robocza maszyny wirtualnej jest stosem (LIFO) zamiast zestawu nazwanych rejestrów. Wielotypy instrukcji biorą operandy implicitnie z góry stosu i wrzucają swoje wyniki ponownie na górę, zamiast jasno określonego źródła i docelowego rejestru. To sprawia, że kod instrukcji jest kompaktowy i interpreter prosty: maszyna wirtualna musi śledzić tylko jeden wskaźnik do góry stosu oraz licznik programu. Maszyny stosowe sa łatwiejsze do prawidłowego zaimplementowania i zweryfikowania na wielu niezależnych implementacjach, co ma znaczenie, gdy sieć węzłów musi wykonywać identyczne kodbyte i zgadza się na wynik bez jakiegokolwiek koordynacji poza wspólnym sekwencją instrukcji.

Dlaczego wykonanie musi być deterministyczne w każdym węźle?

Sieć dezentralizowana nie ma jednej autorytetowej osoby, której obliczenia sa prosto zaufane — zamiast tego, kazdy uczestniczacy węzeł samodzielnie rewykuwuje kodbyte każdej transakcji i sprawdza, czy dochodzi do tego samego stanu końcowego. Jeśli wykonanie zależało od zaokrąglania liczb zmiennoprzecinkowych, harmonogramu wątków, czasu zegara lub jakiegoś innego czynnika specyficznie maszynowego, różne węzły mogłyby obliczać różne wyniki na tej samej wejściowej danych, łamiąc zgody. Maszyna wirtualna stosowa unikae tego używając tylko dokładnej arytmetyki całkowitej na dobrze zdefiniowanym stosie, z zestawem instrukcji oznaczonych precyzyjnie tyle, że dowolne poprawne implementacje, na jakimkolwiek sprzęcie, generują identyczny wyjście dla tego samego kodbyte i danych wejściowych.

Jak jest różna przechowywanie kontraktów od stosu wykonania?

Stos to tymczasowe miejsce do robienia, które istnieje tylko podczas wykonywania jednego wywołania; jest tworzony pustym na początku wywołania i całkowicie zrzuca się go, gdy wywołanie zwraca. Przechowywanie to niezmienna mapa klucz-wartoscia dołączona do konta kontraktu na stałe, a przetrwuje poza oddzielnymi transakcjami i wywołaniami — jest częścią trwałości stanu łańcucha, który każdy węzeł utrzymuje. Operacje przenoszą dane między oboma: SLOAD kopiuje wartość z klucza przechowywania na stos do użytku w obliczeniach, a SSTORE bierze wartość, która została obliczona na stosie i komituje ją do klucza przechowywania, czyniąc zmianę trwałą i widoczną dla przyszłych wykonywań.

Wypróbuj na żywo

Wszystko powyżej działa bezpośrednio w Twojej przeglądarce — otwórz Stack Machine: How Smart Contracts Execute i zmieniaj parametry podczas działania. Nic nie jest instalowane ani przesyłane na serwer, cały model działa w jednej karcie.

▶ Otwórz symulację Stack Machine: How Smart Contracts Execute

Co znalazłeś?

Dodaj kroki odtworzenia (opcjonalnie)