Bezpieczeństwo smart kontraktów – 5 zasad pisania bezpiecznych smart kontraktów. | Nextrope Academy

Paulina Lewandowska

10 paź 2022
Bezpieczeństwo smart kontraktów – 5 zasad pisania bezpiecznych smart kontraktów. | Nextrope Academy

Dlaczego bezpieczeństwo smart kontraktów jest ważne?

Smart kontrakty są główną częścią aplikacji opartych o technologię blockchain. W procesie developmentu smart kontraktów powinniśmy zachowywać najwyższe standardy bezpieczeństwa z powodu czynników takich jak: 

  • w wielu systemach odpowiadają one za najbardziej krytyczne funkcjonalności, których niepoprawne działanie może się wiązać z wieloma bardzo przykrymi konsekwencjami m.in nieodwracalna utrata środków, błąd logiczny rujnujący działanie całej aplikacji/protokołu.
  • smart kontrakt, który został już opublikowany na sieci nie może ulec modyfikacjom. Cecha ta powoduje, że błędy i podatności, które zostaną zdiagnozowane po uruchomieniu kontraktu produkcyjnie nie będą mogły zostać naprawione. (Istnieje zaawansowana technika pozwalająca na tworzenie “upgradeable contracts”, co pozwala na późniejszą modyfikację logiki kontraktu, lecz ma również szereg innych wad i ograniczeń, które nie zwalniają developera z pisania bezpiecznego kodu. Na potrzeby tego artykułu pominiemy szczegółową analizę tego rozwiązania.)
  • kod źródłowy większości kontraktów jest publicznie dostępny. Dobrą praktyką jest to, aby publikować kod źrodłowy w serwisach takich jak Etherscan co znacznie podnosi wiarygodność danych aplikacji bądź protokołów defi. Publiczne udostępnienie kodu wiąże się jednak z tym, że każdy może taki kod zweryfikować pod względem bezpieczeństwa, a ewentualne nieprawidłowości wykorzystać na swoją korzyść.

Bezpieczeństwo smart kontraktów, a raczej nauka pisania bezpiecznych smart kontraktów jest procesem wymagającym poznania wielu zaawansowanych aspektów języka Solidity. W tym artykule przedstawimy 5 porad, które pozwolą ten proces uprościć oraz zabezpieczą nasze oprogramowanie przed najbardziej popularnymi błędami.

1. Dokładne testowanie smart kontraktów

Pierwszym, a za razem najważniejszym czynnikiem pozwalającym nam na weryfikację, czy nasz kontrakt działa poprawnie jest pisanie testów automatycznych. Proces testowania najczęściej pozwala nam na wczesnym etapie developmentu ujawnić różnego rodzaju luki bezpieczeństwa bądź nieprawidłowości. Kolejną zaletą testów automatycznych jest zabezpieczene przed regresją kodu, czyli sytuacją, gdy podczas implementacji nowych funkcjonalności tworzone są błędy w wcześniej napisanym kodzie. W takich testach powinniśmy sprawdzać wszelkie możliwe scenariusze, 100% pokrycia kodu testami nie powinno być celem samym w sobie, lecz jedynie miarą pomagającą nam w upewnieniu się, że testy skrupulatnie sprawdzają każdą metodę na naszym kontrakcie.

2. Konfiguracja dodatkowych narzędzi

Warto posiłkować się narzędziami, które są w stanie mierzyć oraz sprawdzać jakość dostarczanego przez nas oprogramowania. Narzędzia, z których warto korzystać w codziennej pracy to:

  • Plugin do mierzenia pokrycia kodu np. solidity-coverage. Rozwijając myśl z pierwszego punktu, że pokrycie kodu nie powinno być celem samym w sobie to mimo wszystko warto taką analitykę w procesie testowania posiadać. Dzięki analizie pokrycia kodu testami jesteśmy w stanie w łatwy sposób zobaczyć, które fragmenty kodu wymagają napisania przez nas dodatkowych testów.
  • Framework do statycznej analizy kodu np. slither, mythril. Są to narzędzia, które za pomocą statycznej analizy są w stanie nie tylko wskazać miejsca w naszym kodzie, gdzie występuje jakaś podatność ale też zaproponować szereg wskazówek. Stosowanie się do tych wskazówek może podnieść nie tylko bezpieczeństwo, ale również jakość naszego oprogramowania.

3. Biblioteka smart kontraktów Openzeppelin

Istnieje wiele bibliotek i gotowych kontraktów które zostały przygotowane w celu późniejszego wykorzystania przez developerów aplikacji blockchain. Każda z tych bibliotek wymaga jednak przed użyciem zweryfikowania pod kątem tego czy posiada jakieś podatności. Najpopularniejszą na ten moment biblioteką jest openzeppelin. Jest to zbiór bezpiecznych, przetestowanych smart kontraktów, wykorzystywanych w wielu najbardziej popularnych protokołach DeFi takich jak np. uniswap. Umożliwia nam korzystanie z najczęściej używanych implementacji standardów ERC (Ethereum Request For Comments) oraz reużywalnych kontraktów.

Biblioteka ta posiada dużą gamę komponentów możliwych do wykorzystania przy implementacji najbardziej popularnych funkcjonalności po stronie smart kontraktów. Jako przykład podam dwa zastosowania biblioteki. Uważam jednak, że warto poznać wszystkie możliwości oraz kontrakty, które są tam udostępnione.

  • Rozszerzenie Ownable oraz AccessControl

Rozszerzenia te pozwalają nam w bardzo łatwy sposób na dodanie kontroli dostępu do funkcji, które zgodnie z wymaganiami biznesowymi powinny być dostępne do wykonania tylko dla uprawnionych adresów. Przykład z dokumentacji pokazujący wykorzystanie rozszerzenia Ownable w praktyce:

pragma solidity ^0.8.0;
 
import "@openzeppelin/contracts/access/Ownable.sol";
 
contract MyContract is Ownable {
    function normalThing() public {
        // anyone can call this normalThing()
    }
 
    function specialThing() public onlyOwner {
        // only the owner can call specialThing()!
    }
}

Jak widać korzystanie z biblioteki openzeppelin jest nie tylko bardzo proste, ale też pozwala na pisanie bardziej zwięzłego, zrozumiałego dla innych developerów kodu.

  • Implementacje popularnych standardów tokenów ERC-20, ERC-721 oraz ERC-1155

Wiele zdecentralizowanych aplikacji oraz protokołów bazuje na tokenach ERC-20 bądź NFT. Każdy token musi posiadać zaimplementowany interfejs, działający zgodnie z specyfikacją. Implementacja tokena w całości samodzielnie wiąże się z dużym ryzykiem popełnienia błędu przez co nasz token może posiadać luki bezpieczeństwa bądź problemy z działaniem na różnego rodzaju giełdach i portfelach. Z pomocą biblioteki openzeppelin jesteśmy w stanie przygotować standardowy, funkcjonalny token oraz wzbogacić go o najpopularniejsze rozszerzenia małym nakładem pracy. Dobrym miejsce na start jest interaktywny konfigurator tokenów w dokumentacji openzeppelin, pozwala on nam na wygenerowanie kodu źródłowego tokena, który spełniać będzie wymogi funkcjonalne oraz standardy bezpieczeństwa.

4. Używanie nowych wersji języka Solidity

Istotną wskazówką dotyczącą bezpieczeństwa jest to, żeby w projektach korzystać z nowych wersji języka Solidity. Kompilator wymaga od nas, aby na początku każdego pliku zródłowego z rozszerzeniem .sol znajdowała się informacja o wersji Solidity:

pragma solidity 0.8.17;

W raz z nowymi wersjami języka są wprowadzane nowe featury, ale oprócz tego istotne jest to, że dodawane są również poprawki do różnego rodzaju znanych błędów. Lista stwierdzonych błędów w poszczególnych wersjach znajduje się w tym pliku. Jak można zauważyć wraz z nowszymi wersjami języka liczba błędów maleje i jest sukcesywnie naprawiana. 

Twórcy języka w oficjalnej dokumentacji również rekomendują używanie najnowszej wersji w nowo wdrażanych smart kontraktach: “Podczas wdrażania kontraktów, należy używać najnowszej wydanej wersji Solidity. Poza wyjątkowymi przypadkami, tylko najnowsza wersja otrzymuje poprawki bezpieczeństwa"

5. Nauka na cudzych błędach

Niezbędnym czynnikiem, który pozwoli nam na dostarczanie bezpiecznego oprogramowania jest sama wiedza na temat zaawansowanych aspektów języka Solidity, a także świadomość potencjalnych zagrożeń. W przeszłości byliśmy świadkami wielu podatności, gdzie łupem atakującego padały środki o wartości wielu milionów dolarów. W internecie można znaleźć wiele przykładów takich incydentów wraz z dokładną informacją, jaki błąd został popełniony przez developerów oraz jak można było temu zapobiec. Przykładem powyższego jest artykuł wyjaśniający atak typu “reentrancy”, z pomocą którego atakujący dokonał kradzieży ETH o wartości 150 milionów dolarów. Lista możliwości zaatakowania smart kontraktów jest zdecydowanie dłuższa, warto zatem zapoznać się z listą najpopularniejszych podatności w języku Solidity. Dobrym sposobem nauki bezpieczeństwa jest również wcielenie się w rolę atakującego, w tym celu wartym uwagi jest serwis ethernaut. Znajdziemy tam zbiór zadań polegających na zhakowaniu różnych smart kontraktów, zadania te pomogą utrwalić wcześniej zdobytą wiedzę na temat bezpieczeństwa oraz poznać nowe zaawansowane aspekty języka Solidity.

Podsumowanie

Podsumowując, bezpieczeństwo smart kontraktów jest bardzo istotnym, ale też trudnym zagadnieniem wymagającym znajomości nie tylko samego języka programowania. Wymagana jest również umiejętności testowania, chęć do ciągłego explorowania tematyki podatności smart kontraktów, wiedza na temat nowych bibliotek oraz narzędzi. Temat ten jest rozległy i skomplikowany, a powyższe 5 punktów to jedynie wskazówki, które mogą pomóc w poprawie bezpieczeństwa naszego kodu oraz z związaną z tym nauką. Koniecznie zajrzyjcie również do innych artykułów z serii Nextrope Academy, gdzie przybliżamy inne techniczne zagadnienia.

Most viewed


Never miss a story

Stay updated about Nextrope news as it happens.

You are subscribed

AI w Branży Nieruchomości. Jak wspiera rynek mieszkań?

Miłosz Mach

13 mar 2025
AI w Branży Nieruchomości. Jak wspiera rynek mieszkań?

Obecnie wiele sektorów gospodarki przechodzi transformację cyfrową. AI w 2025 to już nie tylko gadżet, a narzędzie, które przeprowadza rozmowy z klientami, usprawnia podejmowanie decyzji i optymalizuje procesy sprzedażowe. Równolegle, technologia blockchain zapewnia bezpieczeństwo , transparentność i skalowalność transakcji. Tym wpisem rozpoczynamy serię publikacji o AI w biznesie, a dzisiejszy artykuł poświęcimy wykorzystaniu sztucznej inteligencji w branży nieruchomości.

AI vs. Tradycja: Kluczowe Implementacje AI w Sektorze Nieruchomości

Projektowanie, sprzedaż, i zarządzanie - dotychczasowe metody ustępują miejsca decyzjom wspieranym danymi.

Przełom w Obsłudze Klienta

Chatboty i Asystenci AI zmieniają sposób, w jaki firmy komunikują się z klientami. Obsługują równocześnie setki zapytań, personalizują oferty i prowadzą klientów przez proces zakupowy. Wdrożenie agentów AI może prowadzić do wzrostu jakościowych leadów dla deweloperów oraz automatyzacji odpowiedzi na większość standardowych zapytań klientów. Wyzwania techniczne przy implementacji takich systemów obejmują:

  • Integrację z istniejącymi bazami danych nieruchomości - chatbot musi mieć dostęp do aktualnych ofert, cen i dostępności
  • Personalizację komunikacji - system musi dostosowywać komunikację do indywidualnych potrzeb klienta
  • Zarządzanie wiedzą branżową - chatbot potrzebuje specjalistycznej wiedzy o lokalnym rynku nieruchomości

Zaawansowana Analiza Danych

Systemy kognitywnej AI wykorzystują uczenie głębokie (deep learning) do analizy złożonych zależności na rynku nieruchomości, t.j. trendów makroekonomicznych, lokalnych planów zagospodarowania czy zachowań użytkowników na platformach społecznościowych. Wdrożenie takiego rozwiązania wymaga:

  • Zebrania wysokiej jakości danych historycznych
  • Stworzenia infrastruktury do przetwarzania danych w czasie rzeczywistym
  • Opracowania odpowiednich modeli uczenia maszynowego
  • Ciągłego monitorowania i aktualizacji modeli w oparciu o nowe dane

Inteligentne Projektowanie

Generatywna sztuczna inteligencja rewolucjonizuje projektowanie architektoniczne. Te zaawansowane algorytmy potrafią generować dziesiątki wariantów projektu budynku uwzględniających ograniczenia działki, wymogi prawne, efektywność energetyczną i preferencje estetyczne.

Optymalizacja Efektywności Energetycznej Budynków

Inteligentne systemy zarządzania budynkami (BMS) wykorzystują AI do optymalizacji zużycia energii przy jednoczesnym zachowaniu komfortu mieszkańców. Algorytmy uczenia ze wzmocnieniem (reinforcement learning) badają dane z czujników temperatury, wilgotności i jakości powietrza, a następnie dostosowują parametry ogrzewania, klimatyzacji i wentylacji.

Integracja AI z Blockchain a Tokenizacja Nieruchomości

Połączenie AI z technologią blockchain stwarza nowe możliwości dla branży nieruchomości. Blockchain to rozproszona baza danych, w której informacje są przechowywane w niezmienialnych "blokach". Zapewnia bezpieczeństwo transakcji i transparentność danych, podczas gdy AI analizuje te dane i wyciąga wnioski. W praktyce oznacza to, że historia własności, wszystkie transakcje i modyfikacje nieruchomości są zapisane w sposób niemożliwy do podrobienia, a AI pomaga w interpretacji tych danych i podejmowaniu decyzji.

Przyszłość AI w Branży Nieruchomości: Trendy i Prognozy

AI w sektorze nieruchomości ma potencjał przyniesienia branży wartości od 110 do 180 miliardów dolarów amerykańskich, jak podkreślają eksperci McKinsey & Company.

Kluczowe kierunki rozwoju w najbliższych latach to:

  • Autonomiczne systemy negocjacyjne - agenci AI wyposażeni w strategie teorii gier, zdolni do prowadzenia złożonych negocjacji
  • AI w planowaniu urbanistycznym - algorytmy planujące rozwój miast i optymalną alokację przestrzeni
  • Tokenizacja nieruchomości - wykorzystanie blockchain do podziału nieruchomości na cyfrowe tokeny, umożliwiające inwestowanie w części nieruchomości

Wnioski

Pytanie dla firm nie brzmi już "czy", ale "jak" wdrażać AI, aby maksymalizować korzyści i konkurencyjność swoich ofert. Strategiczne podejście zaczyna się od zdefiniowania konkretnych problemów biznesowych, a następnie doboru odpowiednich technologii.

Jakie wartości potencjalnie wniesie do Twojej organizacji?
  • Obniżenie kosztów operacyjnych dzięki automatyzacji
  • Poprawę doświadczenia klienta i skrócenie czasu transakcji
  • Zwiększenie dokładności prognoz i wycen, redukcja ryzyka biznesowego
Nextrope Logo

Chcesz wdrożyć AI w swoim biznesie nieruchomości?

Nextrope specjalizuje się w implementacji rozwiązań AI i blockchain dostosowanych do konkretnych potrzeb biznesowych. Nasze doświadczenie pozwala na:

  • Tworzenie inteligentnych chatbotów obsługujących klientów 24/7
  • Implementację systemów analitycznych do wyceny nieruchomości
  • Budowę bezpiecznych rozwiązań blockchain dla transakcji nieruchomościowych
Umów bezpłatną konsultację

Lub sprawdź pozostałe artykuły z serii "AI w biznesie"

AI w automatyzacji frontendowej – jak zmienia pracę programisty?

Gracjan Prusik

10 mar 2025
AI w automatyzacji frontendowej – jak zmienia pracę programisty?

Rewolucja AI w Warsztacie Frontendowca

W dzisiejszych czasach programowanie bez wsparcia AI to rezygnacja z potężnego narzędzia, które radykalnie zwiększa produktywność i wydajność developera. Dla współczesnego developera AI w automatyzacji frontendowej to nie tylko ciekawostka, ale kluczowe narzędzie zwiększające produktywność. Od automatycznego generowania komponentów, przez refaktoryzację, aż po testowanie - narzędzia AI fundamentalnie zmieniają naszą codzienną pracę, pozwalając skupić się na kreatywnych aspektach programowania zamiast na żmudnym pisaniu powtarzalnego kodu. W tym artykule pokażę, jak najczęściej wykorzystywane są te narzędzia, aby pracować szybciej, mądrzej i z większą satysfakcją.

Ten wpis rozpoczyna serię poświęconą zastosowaniu AI w automatyzacji frontendowej, w której będziemy analizować i omawiać konkretne narzędzia, techniki i praktyczne przypadki użycia AI, pomagające programistom w codziennej pracy.

AI w automatyzacji frontendowej – jak pomaga w refaktoryzacji kodu?

Jednym z najczęstszych zastosowań AI jest poprawianie jakości kodu i znajdowanie błędów. Narzędzia potrafią analizować kod i sugerować optymalizacje. Dzięki temu będziemy w stanie pisać kod znacznie szybciej, a także znacznie zmniejszyć ryzyko związane z ludzkim błędem.

Jak AI ratuje nas przed frustrującymi błędami

Wyobraź sobie sytuację: spędzasz godziny debugując aplikację, nie rozumiejąc dlaczego dane nie są pobierane. Wszystko wydaje się poprawne, składnia jest prawidłowa, a jednak coś nie działa. Często problem tkwi w drobnych szczegółach, które trudno wychwycić podczas przeglądania kodu.

Spójrzmy na przykład:

function fetchData() {
    fetch("htts://jsonplaceholder.typicode.com/posts")
      .then((response) => response.json())
      .then((data) => console.log(data))
      .catch((error) => console.error(error));
}

Na pierwszy rzut oka kod wygląda poprawnie. Jednak po uruchomieniu nie otrzymamy żadnych danych. Dlaczego? W URL-u znajduje się literówka - "htts" zamiast "https". To klasyczny przykład błędu, który może kosztować developera godziny frustrującego debugowania.

Kiedy poprosimy AI o refaktoryzację tego kodu, nie tylko otrzymamy bardziej czytelną wersję wykorzystującą nowsze wzorce (async/await), ale również - co najważniejsze - AI automatycznie wykryje i naprawi literówkę w adresie URL:

async function fetchPosts() {
    try {
      const response = await fetch(
        "https://jsonplaceholder.typicode.com/posts"
      );
      const data = await response.json();
      console.log(data);
    } catch (error) {
      console.error(error);
    }
}

Jak AI w automatyzacji frontendowej przyspiesza tworzenie UI?

Jednym z najbardziej oczywistych zastosowań AI w frontendzie jest generowanie komponentów UI. Narzędzia takie jak GitHub Copilot, ChatGPT czy Claude potrafią wygenerować kod komponentu na podstawie krótkiego opisu lub przesłanego im obrazu.

Dzięki tym narzędziom możemy tworzyć złożone interfejsy użytkownika w zaledwie kilkadziesiąt sekund. Wygenerowanie kompletnego, funkcjonalnego komponentu UI zajmuje często mniej niż minutę. Co więcej, wygenerowany kod jest zazwyczaj pozbawiony błędów, zawiera odpowiednie animacje i jest w pełni responsywny, dostosowując się do różnych rozmiarów ekranu. Ważne jest, aby dokładnie opisać czego oczekujemy.

Widok wygenerowany przez Claude po wpisaniu "Na podstawie wczytywanych danych wyświetl posty. Strona ma być responsywna. Kolory przewodnie to: #CCFF89, #151515 i #E4E4E4".

Wygenerowany widok postów

AI w analizie i rozumieniu kodu

AI może analizować istniejący kod i pomóc w jego zrozumieniu, co jest szczególnie przydatne w przypadku dużych, skomplikowanych projektów lub kodu napisanego przez kogoś innego.

Przykład: Generowanie podsumowania działania funkcji

Załóżmy, że mamy funkcję do przetwarzania danych użytkowników, której działania nie rozumiemy na pierwszy rzut oka. AI może przeanalizować kod i wygenerować jego czytelne wyjaśnienie:

function processUserData(users) {
  return users
    .filter(user => user.isActive) // Sprawdza wartość `isActive` dla każdego użytkownika i zostawia tylko te obiekty, gdzie `isActive` jest prawdziwe (true)
    .map(user => ({ 
      id: user.id, // Pobiera wartość `id` z każdego obiektu użytkownika
      name: `${user.firstName} ${user.lastName}`, // Tworzy nowy string, łącząc `firstName` i `lastName`
      email: user.email.toLowerCase(), // Zamienia adres e-mail na małe litery
    }));
}

W tym przypadku AI nie tylko podsumowuje działanie kodu, ale też rozbija poszczególne operacje na łatwiejsze do zrozumienia fragmenty.

AI w automatyzacji frontendowej – tłumaczenia i wykrywanie błędów

Każdy frontendowiec wie, że praca programisty to nie tylko kreatywne tworzenie interfejsów, ale także mnóstwo powtarzalnych, żmudnych zadań. Jednym z nich jest implementacja tłumaczeń dla aplikacji wielojęzycznych (i18n). Dodawanie tłumaczeń dla każdego klucza w plikach JSON, a następnie ich weryfikacja, potrafi być czasochłonna i podatna na błędy.

Dzięki AI możemy jednak znacznie przyspieszyć ten proces. Wykorzystanie ChatGPT, DeepSeek czy Claude pozwala na automatyczne generowanie tłumaczeń dla interfejsu użytkownika, a także wychwytywanie błędów językowych i stylistycznych.

Przykład:

Mamy plik tłumaczeń w formacie JSON:

{
  "welcome_message": "Witaj w naszej aplikacji!",
  "logout_button": "Wyloguj się",
  "error_message": "Coś poszło nie tak. Spróbuj ponownie później."
}

AI może automatycznie wygenerować jego wersję w języku angielskim:

{
  "welcome_message": "Welcome to our application!",
  "logout_button": "Log out",
  "error_message": "Something went wrong. Please try again later."
}

Co więcej, AI potrafi wykryć błędy ortograficzne czy niekonsekwencje w tłumaczeniach. Jeśli na przykład w jednym miejscu użyliśmy "Wyloguj się", a w innym "Wyjdź", AI może zasugerować ujednolicenie terminologii.

Tego typu automatyzacja nie tylko oszczędza czas, ale też minimalizuje ryzyko ludzkich błędów. A to tylko jeden z przykładów – AI pomaga również w generowaniu dokumentacji, pisaniu testów oraz optymalizacji wydajności – o czym opowiemy w kolejnych artykułach.

Podsumowanie

Sztuczna inteligencja zmienia sposób, w jaki frontendowcy pracują na co dzień. Od generowania komponentów, przez refaktoryzację kodu i wykrywanie błędów, aż po automatyczne testowanie i dokumentację – AI znacząco przyspiesza i usprawnia pracę. Bez tych narzędzi stracimy bardzo dużo czasu, czego oczywiście nie chcemy.

W kolejnych częściach serii omówimy m.in.:

Śledź nas, aby być na bieżąco!