Napisał: Sui Network
Sui to publiczna sieć L1 przeprojektowana i zbudowana w oparciu o podstawowe zasady, której celem jest zapewnienie twórcom i programistom platformy programistycznej zdolnej do hostowania kolejnego miliarda użytkowników w Web3. Aplikacje w Sui są oparte na języku inteligentnych kontraktów Move i są skalowalne w poziomie, umożliwiając programistom szybkie i niedrogie wspieranie szerokiego zakresu tworzenia aplikacji. Sieć główna Sui została oficjalnie uruchomiona 3 maja 2023 r.
Ten artykuł będzie dla programistów krótkim źródłem informacji na temat najlepszych praktyk w Sui Network.
Przenieś wiedzę ogólną
Przeczytaj więcej o aktualizacjach pakietów i napisz kod przyjazny dla aktualizacji.
Pakiety są niezmienne, a podatny na ataki kod pakietu można wywołać na zawsze. Rozwiązaniem jest dodanie ochrony na poziomie obiektu. Jeśli uaktualnisz pakiet z P do P', inne pakiety i klienci zależni od P będą nadal korzystać z P, zamiast automatycznie aktualizować się do P'. Dlatego kod zależny zarówno od pakietu, jak i klienta musi zostać zaktualizowany, aby jawnie wskazywał P'. Pakiety, które mają być rozszerzane przez pakiety zależne, mogą uniknąć przerwania swoich poprzednich rozszerzeń przy każdej aktualizacji, zapewniając (niezmienny) interfejs zgodny ze standardem we wszystkich wersjach. Biorąc za przykład most międzyłańcuchowy Wormhole, wiadomości są wysyłane przez Wormhole jako most. Aby wygenerować pakiet rozszerzeń do wysyłania wiadomości, możesz użyć instrukcji przygotowania_message w dowolnej wersji pakietu Wormhole w celu wygenerowania MessageTicket i klienta. kod wysyłający wiadomość musi przekazać MessageTicket do metodypublic_message w pakiecie najnowszej wersji. Funkcji publicznych nie można usunąć ani zmienić, ale można to zrobić w przypadku funkcji publicznych (znajomych). Możesz używać funkcji publicznych (znajomych) lub tylko widocznych dla siebie, chyba że chcesz, aby funkcja teraz biblioteki była publiczna na zawsze. Nie można usuwać typów struktur, dodawać nowych pól (chociaż można dodawać pola dynamiczne) ani aktualizować nowych funkcji. Zastanów się dobrze, dodając nowe typy, raz dodane pozostają tam na zawsze!
Używaj kolekcji obsługiwanych wektorowo (takich jak wektor, VecSet, VecMap, PriorityQueue) zawierających maksymalnie 1000 elementów danych.
Kolekcje korzystające z obsługi pól dynamicznych (takie jak Table, Bag, ObjectBag, ObjectTable, LinkedTable) są używane w przypadku dowolnej kolekcji, która umożliwia dodawanie stron trzecich, większych kolekcji i kolekcji o nieznanym rozmiarze. Obiekty Sui Move mogą mieć maksymalny rozmiar 250 KB - każda próba utworzenia większego obiektu spowoduje przerwanie transakcji. Upewnij się, że obiekt nie powiększy się powyżej obsługiwanej kolekcji wektora.
Jeśli Twoja funkcja f wymaga płatności od osoby wywołującej, na przykład przy użyciu SUI , użyj funkcji fun f(payment: Coin) zamiast funkcji fun f(payment: &mut Coin, kwota: u64). Jest to bezpieczniejsze dla dzwoniącego, ponieważ wie dokładnie, ile zapłacić i nie musi polegać na funkcji f, aby wyodrębnić prawidłową kwotę.
Nie jest wymagana drobna optymalizacja zużycia gazu. Przy obliczaniu kosztu na Sui jest on zaokrąglany do najbliższego wiadra, więc tylko bardzo ostre wahania spowodują zmiany gazu. Zwłaszcza jeśli Twoja oferta jest już w najniższym przedziale cenowym, taniej nie będzie. Aby uzyskać szczegółowe informacje, zobacz zdjęcie poniżej.
Postępuj zgodnie z konwencjami kodowania Move, aby osiągnąć spójny styl.
Możliwość składania Użyj standardu wyświetlania, aby dostosować sposób wyświetlania obiektów w portfelach, aplikacjach i przeglądarkach. Unikaj korzystania z funkcji „samotransferu” – w każdej chwili można zwrócić obj z bieżącej funkcji zamiast pisać transfer::transfer(obj, tx_context::sender(ctx)), co pozwala wywołującemu lub programowalnemu blokowi transakcji (programowalny blok transakcji) wykorzystuje obj. Test Użyj sui::test_scenario`, aby symulować scenariusz testowy z wieloma transakcjami i wieloma nadawcami. Użyj sui::test_utilsmodule, aby uzyskać lepsze komunikaty o korekcji błędów za pomocą testów Asser_eq, drukowania debugowania za pomocą print i niszczenia tylko testowo za pomocązniszczenia. Użyj sui move test --coverage, aby obliczyć informacje o pokryciu kodu podczas testowania, i użyj sui move cover source --module, aby wyświetlić nieprzykryte linie podświetlone na czerwono. Jeśli to możliwe, zaleca się ustawienie pokrycia na 100%. Aplikacje Aby uzyskać optymalną wydajność i spójność danych, aplikacje powinny przesyłać żądania zapisu i odczytu w tym samym pełnym węźle. W pakiecie TS SDK oznacza to, że aplikacja powinna korzystać z interfejsu API portfelasignTransactionBlock, a następnie przesłać transakcję, wywołując funkcję generate_transactionBlock w pełnym węźle aplikacji, zamiast korzystać z interfejsu API portfela SignAndExecuteTransactionBlock. Zapewnia to spójność zapisu przed odczytem — odczyty z pełnego węzła aplikacji natychmiast odzwierciedlają zapisy transakcji, zamiast czekać na punkt kontrolny. Aby zmniejszyć opóźnienia, jeśli aplikacja musi wiedzieć, że transakcja została potwierdzona, ale nie musi natychmiast widzieć efektów transakcji ani czytać obiektów/zdarzeń zapisanych przez transakcję, użyj generateTransactionBlock z „showEffects”: false i „ showEvents": fałsz. Aplikacje powinny buforować często odczytywane dane lokalnie, a nie często pobierać je z całego węzła. Jeśli to możliwe, używaj programowalnych bloków transakcji, aby łączyć istniejącą funkcjonalność w łańcuchu, zamiast udostępniać nowy inteligentny kod kontraktu. Programowalne bloki transakcyjne pozwalają na przetwarzanie wsadowe na dużą skalę i heterogeniczny skład, dodatkowo obniżając i tak już niskie opłaty za gaz. Aplikacje powinny pozostawić budżet gazu, cenę paliwa i wybór monet portfelowi, co zapewni portfelowi większą elastyczność, a obowiązkiem portfela jest przetestowanie transakcji, aby upewnić się, że transakcja nie zakończy się niepowodzeniem. Podpisywanie Nigdy nie podpisuj dwóch równoczesnych transakcji, które dotyczą tego samego ekskluzywnego obiektu, albo używając tego ekskluzywnego obiektu oddzielnie, albo czekając na zakończenie jednej transakcji przed wysłaniem kolejnej transakcji. Naruszenie tej zasady może spowodować dwuznaczność Klienta, blokującą ekskluzywne przedmioty biorące udział w obu transakcjach do końca bieżącej epoki. Każde polecenie klienta sui, które inicjuje transakcję (np. publikacja klienta sui, wywołanie klienta sui) może zaakceptować flagę --serialize-output w celu wygenerowania transakcji base64 do podpisania. Sui obsługuje wiele schematów podpisów do podpisywania transakcji, w tym natywne multipodpisy.
