Jak napisać smart kontrakt w WebAssembly w sieci Ontology? Część 1: Rust

Jak napisać smart kontrakt w WebAssembly w sieci Ontology? Część 1: Rust

Technologia Ontology Wasm obniża koszty przenoszenia smart kontraktów dApp złożoną logiką biznesową na blockchain, znacznie wzbogacając ekosystem dApp.

Obecnie Ontology Wasm jednocześnie wspiera rozwój zarówno w języku Rust, jak i C++. Język Rust lepiej obsługuje Wasm, a generowany kod bajtowy jest prostszy, co może jeszcze bardziej obniżyć koszty wywołań kontraktów. Tak więc, jak użyć Rust do tworzenia kontraktów w sieci Ontology?

Tworzenie kontraktu WASM przy użyciu Rust

Utwórz kontrakt

Cargo to dobry narzędzie do tworzenia projektów i zarządzania paczkami w programowaniu w Rust, które pomaga programistom lepiej organizować interakcję kodu i zewnętrznych bibliotek. Aby utworzyć nowy kontrakt Ontology Wasm, wystarczy wykonać następujące polecenie:

Jak napisać smart kontrakt w WebAssembly w sieci Ontology? Część 1: Rust

Struktura projektu, którą generuje:

Jak napisać smart kontrakt w WebAssembly w sieci Ontology? Część 1: Rust

Plik Cargo.toml jest używany do konfiguracji podstawowych informacji o projekcie i zależnych bibliotek. Sekcja [lib] w pliku musi być ustawiona na wartość crate-type = ["cdylib"]. Plik lib.rs służy do pisania kodu logiki kontraktu. Dodatkowo, musisz dodać parametry zależności w sekcji [dependencies] pliku konfiguracyjnego Cargo.toml:

Jak napisać smart kontrakt w WebAssembly w sieci Ontology? Część 1: Rust

Dzięki tej zależności programiści mogą wywoływać interfejsy, które współdziałają z blockchainem Ontology, oraz narzędzia takie jak parametr serializacji.

Funkcja wejściowa kontraktu

Każdy program ma funkcję wejściową, taką jak funkcja main, którą zwykle widzimy, ale kontrakt nie ma funkcji main. Gdy rozwijany jest kontrakt Wasm przy użyciu Rust, funkcja invoke jest używana domyślnie jako funkcja wejściowa do użycia kontraktu. Nazwa funkcji w Rust będzie nieczytelna w czasie kompilacji kodu źródłowego Rust do kodu bajtowego, który może wykonywać wirtualna maszyna. Aby ostrzec kompilator przed generowaniem zbędnego kodu i skrócić rozmiar kontraktu, funkcja invoke dodaje adnotację #[no_mangle].

Jak funkcja invoke otrzymuje parametry do wykonania transakcji?

Biblioteka ontio_std oferuje funkcję runtime :: input (), aby uzyskać parametry do wykonania transakcji. Programiści mogą używać ZeroCopySource do deserializacji otrzymanej tablicy bajtów. Pierwsza odczytana tablica bajtów to nazwa metody invoke, a następnie parametry metody.

Jak zwracany jest wynik wykonania kontraktu?

Funkcja runtime::ret, która jest dostarczona przez bibliotekę ontio_std, zwraca wynik wykonania metody.

Zakończona funkcja invoke wygląda następująco:

Jak napisać smart kontrakt w WebAssembly w sieci Ontology? Część 1: Rust

Serializacja i deserializacja danych kontraktu

W trakcie rozwoju kontraktów programiści często napotykają problemy z serializacją i deserializacją, a konkretnie z tym, jak przechowywać typ danych struct w bazie danych oraz jak deserializować tablicę bajtów odczytaną z bazy danych, aby uzyskać typ danych struct.

Biblioteka ontio_std oferuje interfejsy dekodera i kodera do serializacji i deserializacji danych. Pola struktury struct również implementują interfejsy dekodera i kodera, dzięki czemu struktura może być serializowana i deserializowana. Eksporty klasy Sink są potrzebne podczas serializacji różnych typów danych. Eksport klasy Sink ma pole buf typu set, które przechowuje dane typu bajt, a wszystkie serializowane dane są przechowywane w buf.

Dla danych o stałej długości (na przykład: byte, u16, u32, u64 itd.) dane są bezpośrednio konwertowane na tablicę bajtów, a następnie zapisywane w buf; dla danych o zmiennej długości najpierw należy zserializować długość, a następnie dane (na przykład liczby całkowite bez znaku o nieznanej wielkości, w tym u16, u32 lub u64 itd.).

Deserializacja jest bezpośrednią odwrotnością. Dla każdej metody serializacji istnieje odpowiadająca metoda deserializacji. Deserializacja wymaga użycia instancji klasy Source. Ta instancja klasy ma dwa pola buf i pos. Buf jest używany do przechowywania danych, które będą deserializowane, a pos jest używane do przechowywania bieżącej pozycji odczytu. Gdy odczytujesz konkretny typ danych, jeśli znasz ich długość, możesz je odczytać bezpośrednio; dla danych o nieznanej długości najpierw odczytaj długość, a następnie odczytaj zawartość.

Dostęp i aktualizacja danych w łańcuchu

Ontology-wasm-cdt-rust — inkapsulował operacyjny sposób pracy z danymi w łańcuchu, który jest wygodny dla programistów, aby realizować operacje takie jak dodawanie, usuwanie, modyfikowanie i zapytywanie danych w łańcuchu w następujący sposób:

  • database::get(key) — używane do zapytania danych z łańcucha, a key wymaga realizacji interfejsu AsRef;
  • database::put(key, value) — używane do przechowywania danych w sieci. Key wymaga realizacji interfejsu AsRef, a value wymaga realizacji interfejsu Encoder;
  • database::delete(key) — używane do usuwania danych z łańcucha, a key wymaga realizacji interfejsu AsRef.

Testowanie kontraktu

Kiedy metody kontraktu są realizowane, potrzebujemy dostępu do danych w łańcuchu i wymagamy odpowiedniej wirtualnej maszyny, aby wykonać bajtkod kontraktu, dlatego zazwyczaj należy wdrożyć kontrakt w łańcuchu do testowania. Jednak taki sposób testowania jest problematyczny. Aby ułatwić programistom testowanie kontraktów, biblioteka ontio_std udostępnia moduł mock do testowania. Ten moduł zapewnia symulację danych w łańcuchu, co znacznie ułatwia programistom testowanie jednostkowe metod w kontrakcie. Konkretne przykłady można znaleźć tutaj.

Debugowanie kontraktu

console::debug(msg) wyświetla informacje debugujące podczas debugowania kontraktu. Informacja msg zostanie zapisana w pliku dziennika węzła. Obowiązkowym warunkiem jest ustawienie poziomu dziennika w trybie debugowania, gdy uruchomiona jest lokalna testowa węzeł Ontology.

runtime::notify(msg) wyświetla odpowiednie informacje debugowe podczas debugowania kontraktu. Ta metoda zapisze wprowadzone informacje w łańcuchu i może być zapytana z łańcucha za pomocą metody getSmartCodeEvent.

Artykuł został przetłumaczony przez redakcję Hashrate&Shares specjalnie dla OntologyRussia. klik

Jesteś programistą? Dołącz do naszej społeczności technicznej na Discord. Ponadto zajrzyj do Centrum dewelopera na naszej stronie, tam możesz znaleźć narzędzia dla deweloperów, dokumentację i wiele więcej.

Ontology

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster