Architektura

Kora to workspace Rusta złożony z trzech crate'ów:

  • kora-lib zawiera główną logikę oraz serwer RPC,
  • kora-cli buduje binarkę kora, którą uruchamiają operatorzy, a
  • kora-deploy to wyspecjalizowane narzędzie do wdrażania programów, wersjonowane osobno. Wszystko poniżej znajduje się w crates/lib/src, chyba że zaznaczono inaczej.

Cykl życia żądania

Poniższy diagram przedstawia ogólny przepływ transakcji przez Korę. Zrozumienie ścieżki wywołań jest ważne przy konfiguracji węzła Kora oraz dodawaniu nowych funkcji.

A transaction travels from the client app through the gateway, validation, plugins, and signing, before Kora either returns it or broadcasts it. Each stage is governed by a matching section of kora.toml or signers.toml.

Gdzie znajduje się każdy etap

Etap na diagramieŹródłoPunkt wejścia
Brama (Gateway)rpc_server/server.rsrun_rpc_server
Dyspozycja (Dispatch)rpc_server/rpc.rsKoraRpc
Logika poszczególnych metodrpc_server/method/jeden plik na każdą metodę JSON-RPC
Walidacjavalidator/transaction_validator.rsTransactionValidator
Wtyczkiplugin/mod.rsTransactionPluginRunner
Podpisywaniesigner/oparte na crate'cie solana-keychain

Warto znać jeszcze dwa pliki: config.rs definiuje cały schemat kora.toml, a state.rs przechowuje zdeserializowaną konfigurację w stanie globalnym procesu.

Przegląd serwera RPC

rpc.rs to cienka warstwa dyspozycji, z jedną metodą na każdy endpoint JSON-RPC, i najszybszy sposób, by zobaczyć całe API. Logika każdej metody znajduje się w osobnym pliku w rpc_server/method/. Przeczytaj sign_transaction.rs od początku do końca; pozostałe metody podpisywania są jego wariacjami.

Przegląd walidatora

transaction_validator.rs i transaction/instruction_util.rs zawierają logikę walidacji transakcji i instrukcji. Dodatkowo znajdują się tu testy właściwości bezpieczeństwa polityki płatnika opłat (fee payer), które mieszczą się w osobnych plikach – po jednym na każdy objęty kontrolą program – w katalogu validator/transaction_validator/fee_payer_policy_props/.

Konwencje, które warto znać

Domyślna walidacja. Każda flaga w sekcji [validation.fee_payer_policy] domyślnie ma wartość false, a struktury polityk mają atrybut #[serde(default)]. To połączenie jest celowe: dodanie nowej objętej kontrolą instrukcji nie może zepsuć istniejącej konfiguracji operatora i musi skutkować odmową, a nie przypadkowym zezwoleniem. Zachowaj oba te elementy, dodając nową flagę.

Waliduj transakcję po rozwiązaniu adresów, nigdy surową. Surowa VersionedTransaction udostępnia wyłącznie statyczne klucze kont, więc walidacja lub wycena transakcji V0 na jej podstawie po cichu pomija konta z tablic wyszukiwania (lookup table) i pobiera zbyt niską opłatę. VersionedTransactionResolved::from_transaction rozwiązuje te adresy na samym początku, dlatego każdy kolejny etap przyjmuje już typ po rozwiązaniu adresów.

Dodawanie wtyczki transakcji

Wtyczki implementują trait TransactionPlugin z plugin/mod.rs. Ma on dwie metody: validate uruchamiana dla każdej transakcji w trakcie przepływów podpisywania oraz validate_config uruchamiana raz przy starcie, która zwraca operatorowi błędy i ostrzeżenia. Obiekt PluginExecutionContext informuje wtyczkę, która z czterech metod podpisywania ją wywołała.

TransactionPluginRunner::from_config dopasowuje wartość TransactionPluginType, zdefiniowaną w config.rs. Nowa wbudowana wtyczka to nowy wariant w tym miejscu oraz nowe ramię match w runnerze. Dwie wtyczki dostępne obecnie to gas_swap i deploy_authority.

Testowanie

Kora przechowuje konfigurację w stanie globalnym procesu, dlatego tests/ deklaruje jeden target [[test]] na każdą fazę, a każdy target uruchamia własny wbudowany surfnet oraz węzeł Kora, zainicjowane od zera. Jedna konfiguracja na binarkę: nowa faza wymaga nowego targetu, a nie nowego modułu w istniejącym.

cargo test -p tests --test <target>

Cała reszta jest podpięta przez justfile. Przeczytaj go, zamiast odtwarzać polecenia ręcznie.

Is this page helpful?

Spis treści

Edytuj stronę