Przejdź do głównej treści
Change page

Anatomia inteligentnych kontraktów

Ostatnia aktualizacja strony: 15 kwietnia 2026

Inteligentny kontrakt to program, który działa pod adresem Ethereum. Składają się z danych i funkcji, które można wykonać po otrzymaniu transakcji. Oto przegląd tego, co stanowi inteligentny kontrakt.

Wymagania wstępne

Upewnij się, że najpierw przeczytałeś/aś o inteligentnych kontraktach. Ten dokument zakłada, że znasz już języki programowania, takie jak JavaScript lub Python.

Dane

Wszelkie dane kontraktu muszą być przypisane do lokalizacji: do storage lub memory. Modyfikacja pamięci masowej w inteligentnym kontrakcie jest kosztowna, więc musisz zastanowić się, gdzie powinny znajdować się Twoje dane.

Przechowywanie

Trwałe dane są nazywane pamięcią masową i są reprezentowane przez zmienne stanu. Te wartości są przechowywane na stałe w blockchain. Musisz zadeklarować typ, aby kontrakt mógł śledzić, ile pamięci w blockchainie potrzebuje podczas kompilacji.

// Przykład w Solidity
contract SimpleStorage {
    uint storedData; // Zmienna stanu
    // ...
}
# Przykład Vyper
storedData: int128

Jeśli programowałeś już w językach obiektowych, prawdopodobnie znasz większość typów. Jednak typ address powinien być dla Ciebie nowością, jeśli dopiero zaczynasz programować w Ethereum.

Typ address może zawierać adres Ethereum, który odpowiada 20 bajtom lub 160 bitom. Jest zwracany w zapisach szesnastkowych z wiodącym 0x.

Inne typy:

  • boolean
  • liczba całkowita
  • fixed point numbers
  • fixed-size byte arrays
  • dynamicznie wymiarowane tablice bajtów
  • literały wymierne i całkowite
  • literały ciągów znaków
  • literały szesnastkowe
  • enumy

Aby uzyskać więcej wyjaśnień, zapoznaj się z dokumentami:

Pamięć

Wartości przechowywane tylko przez cały okres wykonywania funkcji kontraktowej nazywane są zmiennymi pamięci. Ponieważ nie są one przechowywane na stałe w blockchain, są znacznie tańsze w użyciu.

Dowiedz się więcej o tym, jak EVM przechowuje dane (Storage, Memory i Stack) w dokumentacji Solidity (opens in a new tab).

Zmienne środowiskowe

Oprócz zmiennych, które definiujesz w kontrakcie, istnieją pewne specjalne zmienne globalne. Są one wykorzystywane głównie do dostarczania informacji na temat łańcucha bloków lub bieżącej transakcji.

Przykłady:

PropZmienna stanuOpis
block.timestampuint256Aktualny blok — znacznik czasu epoki
msg.senderaddressNadawca wiadomości (bieżące wywołanie)

Funkcje

W najbardziej uproszczonym ujęciu, funkcje mogą pobierać informacje lub ustawiać informacje w odpowiedzi na przychodzące transakcje.

Istnieją dwa rodzaje wywołań funkcji:

  • internal – nie tworzą wywołania EVM
    • Wewnętrzne funkcje i zmienne stanu są dostępne tylko wewnętrznie (tj. z poziomu bieżącego kontraktu lub kontraktów z niego dziedziczących)
  • external – tworzą wywołanie EVM
    • Funkcje zewnętrzne są częścią interfejsu kontraktu, co oznacza, że mogą być wywoływane z innych kontraktów oraz poprzez transakcje. Zewnętrzna funkcja f nie może być wywoływana wewnętrznie (tj. f() nie działa, ale this.f() działa).

Mogą być również public lub private

  • Funkcje public mogą być wywoływane wewnętrznie z poziomu kontraktu lub zewnętrznie za pomocą wiadomości
  • Funkcje private są widoczne tylko dla kontraktu, w którym są zdefiniowane, a nie w kontraktach pochodnych

Zarówno funkcje, jak i zmienne stanu mogą być publiczne lub prywatne

Oto funkcja aktualizacji zmiennej stanu w kontrakcie:

// Przykład Solidity
function update_name(string value) public {
    dapp_name = value;
}
  • Parametr value typu string jest przekazywany do funkcji: update_name
  • Jest zadeklarowana jako public, co oznacza, że każdy może uzyskać do niej dostęp
  • Nie jest zadeklarowana jako view, więc może modyfikować stan kontraktu

Funkcje view

Funkcje te obiecują nie zmieniać stanu danych kontraktu. Typowe przykłady to funkcje „getter”, które można wykorzystać na przykład do uzyskania salda użytkownika.

// Przykład Solidity
function balanceOf(address _owner) public view returns (uint256 _balance) {
    return ownerPizzaCount[_owner];
}
dappName: public(string)

@view
@public
def readName() -> string:
  return dappName

Co jest uważane za modyfikację stanu:

  1. Zapis do zmiennych stanu.
  2. Emitowanie zdarzeń (opens in a new tab).
  3. Tworzenie innych kontraktów (opens in a new tab).
  4. Używanie selfdestruct.
  5. Wysyłanie etheru za pomocą wywołań.
  6. Wywoływanie dowolnej funkcji nieoznaczonej jako view lub pure.
  7. Używanie wywołań niskiego poziomu.
  8. Korzystanie z asemblera wbudowanego, który zawiera określone kody operacji.

Funkcje konstruktora

Funkcje constructor są wykonywane tylko raz podczas pierwszego wdrożenia kontraktu. Podobnie jak constructor w wielu językach programowania opartych na klasach, funkcje te często inicjalizują zmienne stanu do ich określonych wartości.

# Przykład Vyper

@external
def __init__(_beneficiary: address, _bidding_time: uint256):
    self.beneficiary = _beneficiary
    self.auctionStart = block.timestamp
    self.auctionEnd = self.auctionStart + _bidding_time

Funkcje wbudowane

Oprócz zmiennych i funkcji, które definiujesz w kontrakcie, istnieje kilka specjalnych wbudowanych funkcji. Najbardziej oczywistym przykładem jest:

  • address.send() – Solidity
  • send(address) – Vyper

Pozwalają one na wysyłanie ETH do innych kont.

Pisanie funkcji

Twoja funkcja wymaga:

  • zmiennej i typu parametru (jeżeli akceptuje parametry)
  • deklaracji wewnętrznej/zewnętrznej
  • deklaracji pure/view/payable
  • typu zwrotów (jeśli zwraca wartość)

Pełny kontrakt może wyglądać w ten sposób. Tutaj funkcja constructor zapewnia wartość początkową dla zmiennej dapp_name.

Zdarzenia i logi

Wydarzenia umożliwiają inteligentnemu kontraktowi komunikację z frontendem oraz innymi subskrybującymi aplikacjami. Kiedy transakcja zostanie potwierdzona i dodana do bloku, inteligentne kontrakty mogą nadawać wydarzenia i rejestrować informacje, które frontend może przetwarzać i wykorzystywać.

Przykłady z adnotacjami

Są to niektóre przykłady napisane w Solidity. Jeśli chcesz pobawić się kodem, możesz wejść z nimi w interakcję w Remix (opens in a new tab).

Witaj, świecie

Token

Unikalny zasób cyfrowy

Dalsza lektura

Sprawdź dokumentację Solidity i Vyper, aby uzyskać pełniejszy przegląd inteligentnych kontraktów:

Czy ten artykuł był pomocny?