
Wprowadzenie
Kiedy zacząłem programować w Solidity, szybko porzuciłem internetowe środowiska IDE i przyjąłem Hardhat jako mój nowy główny framework. Po kilku miesiącach pracy nad projektami i tworzenia związanego z nimi przepływu pracy poczułem się komfortowo z jego układem sieciowym, strategią testowania i organizacją projektów.
Jednak kiedy ktoś powiedział, że wydajność Foundry jest imponująca, zainteresowałem się tym na tyle, że postanowiłem dokonać rzetelnego porównania obu popularnych frameworków do tworzenia inteligentnych kontraktów (smart contracts development) (/smart-contract-development).
Aby dokonać sprawiedliwej oceny, stworzyłem te same projekty z pomocą obu narzędzi i zastosowałem tę samą umowę MiniBank oraz dalsze ustawienia testowe. To praktyczne doświadczenie pokazało, że wydajność, doświadczenie programistów i przepływ pracy różnią się znacznie między tymi dwoma narzędziami i warto to zbadać, decydując się na jedno z nich.
Architektura projektu i konfiguracje
Wstępne doświadczenia związane z ich konfiguracją są zupełnie różne w obu frameworkach. Foundry tworzy plik konfiguracyjny foundry.toml oparty na parach klucz-wartość, który jest analogiczny do pliku hardhat.config.js w Hardhat. Oba obsługują również dostosowywanie folderów źródłowych, katalogów wyjściowych kompilacji itp.
Domyślna struktura folderów w Foundry jest jednak zupełnie inna, nie można bezpośrednio skonfigurować wielu sieci w pliku konfiguracyjnym, ponieważ Hardhat doskonale radzi sobie z obsługą wielu sieci. Pozostałe parametry w foundry.toml są związane z opcjami testowymi, w tym szczegółowością lub ustawieniami konta i opcjami ceny gazu.
Funkcja remappingu Foundry jest szczególnie interesująca, ponieważ oferuje skuteczne podejście do importowania zależności. Możesz znacznie ułatwić importowanie kontraktów, tworząc skróty w konfiguracji.
Na przykład, zamiast pisać długie ścieżki importu, możesz użyć skrótów, które sprawią, że twój kod będzie bardziej czytelny i łatwiejszy w utrzymaniu.
Podejścia do zarządzania zależnościami
Frameworki różnią się radykalnie sposobem zarządzania zależnościami:
- Hardhat korzysta z uznanego ekosystemu npm, który jest natychmiast dostępny dla programistów JavaScript
- Instalacja kontraktów OpenZeppelin polega jedynie na wykonaniu polecenia npm install
- Foundry opiera się na zarządzaniu zależnościami przez podmoduł Git za pomocą narzędzia CLI forge
- Zależności są przechowywane w folderze lib/ i zapisywane w pliku .gitmodules, w przeciwieństwie do pliku package.json
Ta metoda wykorzystuje dowolne repozytorium GitHub, które zawiera inteligentne kontrakty jako zależność, i pozwala na większą elastyczność w wyborze bibliotek.
Możesz określić nazwę organizacji i repozytorium GitHub oraz opcjonalnie określić gałąź lub tag do zainstalowania. Po zainstalowaniu forge można użyć polecenia forge remapping, aby wyświetlić domyślne ścieżki importu, które będą używane przez Foundry, a następnie dostosować je za pomocą plików konfiguracyjnych.
Narzędzia programistyczne i debugujące
Jednym z obszarów, w których Hardhat wyróżnia się, jest doświadczenie związane z debugowaniem. Framework oferuje również domyślne użycie console.log, które przypomina oczekiwany styl debugowania w programowaniu JavaScript. Funkcja ta jest intensywnie promowana jako atut i może być łatwo śledzona przez programistów, aby zrozumieć sposób wykonania i wykryć błędy.
Foundry potrzebuje alternatywnej metody rejestrowania umów. Chociaż możliwe jest ręczne zainstalowanie i zaimportowanie Hardhat oraz zainstalowanie umowy konsolowej, najlepszym sposobem byłoby skopiowanie specjalistycznej umowy konsolowej do twojego projektu.
W przypadku plików testowych w szczególności umowa DSTest zawiera zdarzenia logowania, takie jak logstring, logint i logaddress, które mogą być wysyłane bez dodatkowych zależności.
Metodyki testowania
Doświadczenie testowe jest prawdopodobnie najbardziej zauważalną różnicą między tymi dwoma frameworkami.
Podejście do testowania Hardhat
Hardhat opiera się na standardowych wzorcach testowania JavaScript:
- Używa opisów i bloków it wraz z Mocha jako domyślną biblioteką asercji
- Pliki testowe mogą przypominać ten bardziej naturalny styl programistów zaznajomionych z tworzeniem stron internetowych
- Oferuj opisowe nazwy testów, które jasno określają ich cel
- Znane wzorce asynchroniczne
- Krzywa uczenia się jest minimalna dla osób, które są już zaznajomione z nowoczesnym tworzeniem stron internetowych
Podejście do testowania Foundry
Foundry działa w zupełnie inny sposób:
- Testy są opracowywane jako inteligentne kontrakty Solidity, które dziedziczą DSTest
- Wszystkie testy mają przedrostki test lub testFail.
- Wszystkie twierdzenia są formułowane za pośrednictwem odziedziczonej umowy DSTest
- Pliki testowe to prawdziwe inteligentne kontrakty, które są wykorzystywane w testowaniu
Testowanie inteligentnych kontraktów
Porównaj frameworki i wybierz najlepsze podejście testowe dla swojego projektu.
Metoda Foundry ma szereg implikacji:
- Kontrakty testowe muszą być instancjonowane w procedurze setUp() analogicznej do beforeEach w klientach JavaScript.
- Wysyłanie metod kontraktowych ETH wymaga określonej składni z parametrami wartości zamkniętymi w nawiasach klamrowych
- Początkowa trudność w nauce może być zrównoważona przez fakt, że nie wymaga obsługi operacji asynchronicznych
Funkcje testowania Learning Foundry
Foundry wprowadza koncepcję znaną jako tzw. kody oszukańcze, które oferują potężne narzędzia testowe. Są to funkcje specjalne pod wyznaczonym adresem kontraktu, które umożliwiają dostęp do stanu w łańcuchu bloków podczas testowania.
Możesz:
- Zmieniaj aktualny numer bloku
- Nie podszywajcie się pod inne konta.
- Domagaj się określonego zachowania w ramach umowy
Aby używać kodów, musisz zdefiniować interfejs i zainicjować go jako zmienną stanu pod specjalnym adresem kodu. Po skonfigurowaniu można oszukiwać za pomocą takich funkcji, jak:
- vm.prank(), aby ustawić następne wywołanie kontraktu do innego odbiorcy
- vm.roll(), aby przejść do określonego punktu łańcucha bloków
Jednym z najciekawszych kodów oszukańczych jest vm.expectRevert(), który należy wywołać przed transakcją, która ma zakończyć się niepowodzeniem. To odwrócenie standardowych wzorców asercji może być sprzeczne z intuicją, ale zapewnia wyraźną kontrolę nad prawdopodobnymi warunkami niepowodzenia.
Wyniki porównania wydajności
Różnice w wydajności między frameworkami są znaczące i od razu rzucają się w oczy. Na podstawie tych samych umów i scenariuszy testowych uzyskałem odkrywcze wyniki dotyczące czasu kompilacji i wykonywania testów:
Wyniki porównania wydajności
| Scenariusz | Foundry | Kask ochronny |
|---|---|---|
| Czyste projekty (bez pamięci podręcznej) | 1.44 sekundy | 5,17 sekundy |
| Przy włączonej pamięci podręcznej | 0,45 sekundy | 3.98 sekund |
| 26 projektów inteligentnych kontraktów | 8,53 sekundy | 14,56 sekundy |
Różnice w wydajności są bardziej widoczne wraz ze wzrostem złożoności projektu.
Testowanie odlewni: zalety i wady
Zalety i wady testowania odlewni
| Zalety | Wady |
|---|---|
| Żadnych złożonych konstrukcji async/await | Nazwy testów nie są tak opisowe jak w testach JavaScript. |
| Testy działają bardzo szybko | Twierdzenie expectRevert jest sprzeczne z intuicją. |
| Automatycznie generowany raport dotyczący gazu | Krzywa uczenia się dla kodów oszukańczych |
| Wszystko napisane w Solidity | Narzędzia wdrożeniowe są nadal w fazie rozwoju |
Korzyści płynące z wydajności są niepodważalne, a nazwy testów Solidity nie mogą być tak opisowe jak nazwy testów JavaScript, co może utrudniać zrozumienie intencji testu. System kodów oszukańczych, choć potężny, wymaga nakładów na naukę.
Strategie wdrażania umów
Wdrożenie jest jednym z obszarów, w którym Hardhat zapewnia obecnie lepsze doświadczenia programistyczne. Framework akceptuje:
- Skrypty wdrożeniowe oparte na JavaScript
- Połączenie z różnymi sieciami
- Załaduj konfigurację za pomocą zmiennych środowiskowych
- Z wdziękiem radź sobie ze skomplikowanymi sytuacjami związanymi z wdrażaniem.
W Foundry wymagane są obecnie skrypty wdrożeniowe oparte na JavaScript, ale mogą one być uciążliwe, gdy konstruktorzy muszą podawać swoje argumenty. Sugerowanym rozwiązaniem jest opracowanie skryptów bash do obsługi złożonych wdrożeń, ale zespół programistów pracuje obecnie nad bardziej zaawansowanymi rozwiązaniami wdrożeniowymi.
Jest to jedna z najpoważniejszych współczesnych słabości Foundry w porównaniu z Hardhat, który ma rozwinięty ekosystem wdrożeniowy.
Narzędzia interfejsu wiersza poleceń
Foundry posiada narzędzie CLI cast do interakcji z łańcuchem bloków i wysyłania zapytań do inteligentnych kontraktów. Jest to potężne narzędzie, które umożliwia:
- Wywołuj funkcje kontraktowe
- Zapytanie o stan łańcucha bloków
- Wykonuj szereg czynności związanych z łańcuchem bloków w wierszu poleceń
Chociaż cast zapewnia pełną funkcjonalność w interakcji z łańcuchem bloków, wymaga on złożonej konstrukcji wiersza poleceń, aby wykonać złożone operacje. Podobnie jak w przypadku wdrażania, może to wymagać skryptów bash, aby uniknąć wielokrotnego wpisywania długich poleceń.
Podsumowanie porównania frameworków
Porównanie funkcji frameworków
| Funkcja | Foundry | Kask ochronny |
|---|---|---|
| Instalacja | Za pomocą polecenia CLI curl | Nie jest to wymagane w przypadku npx lub poprzez npm |
| Narzędzia CLI | forge do zarządzania projektem, cast do interakcji z umowami | zarządzaj projektem hardhat (buduj/kompiluj/uruchamiaj skrypty) |
| Buduj i testuj wydajność | Wyjątkowa szybkość | Umiarkowana wydajność |
| Zależności | Podmoduły Git | pakiety npm |
| Konfiguracja | foundry.toml | hardhat.config.js |
| Izolacja testowa | Tak poprzez -match-test -match-contract | Tak, tylko poprzez lub pomiń w plikach testowych |
| Wdrażanie umów | Za pomocą narzędzia Cast CLI | Skrypty oparte na JavaScript |
Dokonywanie właściwego wyboru
Foundry wykazuje ogromny potencjał dzięki swojej wyjątkowej wydajności, zaangażowanej społeczności i kreatywnej metodzie testowania inteligentnych kontraktów. Struktura jest doskonała w szybkim cyklu rozwoju i posiada świetne narzędzia testowe, które mogą znacznie przyspieszyć rozwój po zrozumieniu, jak z nich korzystać.
Niemniej jednak Foundry nadal się rozwija, zwłaszcza w zakresie narzędzi wdrażania i ulepszeń dotyczących doświadczeń programistów. Foundry ma kilka interesujących zalet dla programistów, którzy preferują model hybrydowy z:
- Foundry do opracowywania i testowania umów
- Hardhat do wdrażania i skryptów
Użytkownicy, którzy są bardziej przyzwyczajeni do standardowych narzędzi JavaScript i ustalonych praktyk wdrażania, mogą teraz być bardziej produktywni dzięki Hardhat, chociaż decyzja ta ponownie zależy od twojego doświadczenia i umiejętności korzystania z nowszych narzędzi.
Obie architektury wciąż szybko się zmieniają, a ekosystem tworzenia inteligentnych kontraktów oferuje wiele realnych alternatyw, które odpowiadają potrzebom różnych programistów i zastosowań.


