Języki inteligentnego kontraktu
Strona ostatnio zaktualizowana: 26 lutego 2026
Świetnym aspektem Ethereum jest to, że inteligentne kontrakty można programować przy użyciu stosunkowo przyjaznych dla programistów języków. Jeśli masz doświadczenie w Pythonie lub jakimkolwiek języku z nawiasami klamrowymi (opens in a new tab), możesz znaleźć język o znajomej składni.
Dwa najbardziej aktywne i obsługiwane języki to:
- Solidity
- Vyper
Remix IDE zapewnia kompleksowe środowisko programistyczne do tworzenia i testowania kontraktów zarówno w Solidity, jak i Vyper. Wypróbuj Remix IDE w przeglądarce (opens in a new tab), aby zacząć kodować.
Bardziej doświadczeni programiści mogą również chcieć użyć Yul, języka pośredniego dla Wirtualnej Maszyny Ethereum, lub Yul+, rozszerzenia Yul.
Jeśli jesteś ciekawy i chcesz pomóc w testowaniu nowych języków, które wciąż są w fazie intensywnego rozwoju, możesz poeksperymentować z Fe, nowym językiem inteligentnych kontraktów, który obecnie jest jeszcze w początkowej fazie rozwoju.
Wymagania wstępne
Wcześniejsza znajomość języków programowania, zwłaszcza JavaScript lub Python, może pomóc w zrozumieniu różnic w językach inteligentnych kontraktów. Zalecamy również zrozumienie inteligentnych kontraktów jako koncepcji przed zbytnim zagłębieniem się w porównania języków. Wprowadzenie do inteligentnych kontraktów.
Solidity
- Obiektowy język wysokiego poziomu do implementacji inteligentnych kontraktów.
- Język z nawiasami klamrowymi, na który największy wpływ miał C++.
- Typowanie statyczne (typ zmiennej jest znany w czasie kompilacji).
- Obsługuje:
- Dziedziczenie (możesz rozszerzać inne kontrakty).
- Biblioteki (możesz utworzyć kod wielokrotnego użytku, który można wywoływać z różnych kontraktów — jak funkcje statyczne w klasie statycznej w innych językach programowania obiektowego).
- Złożone typy zdefiniowane przez użytkownika.
Ważne linki
- Dokumentacja (opens in a new tab)
- Portal języka Solidity (opens in a new tab)
- Solidity na przykładach (opens in a new tab)
- GitHub (opens in a new tab)
- Czat Gitter Solidity (opens in a new tab) zmostowany z czatem Matrix Solidity (opens in a new tab)
- Ściągawka (opens in a new tab)
- Blog Solidity (opens in a new tab)
- Twitter Solidity (opens in a new tab)
Przykładowy kontrakt
1// SPDX-License-Identifier: GPL-3.02pragma solidity >= 0.7.0;34contract Coin {5 // Słowo kluczowe "public" udostępnia zmienne6 // z innych kontraktów7 address public minter;8 mapping (address => uint) public balances;910 // Zdarzenia pozwalają klientom reagować na określone11 // zmiany w kontrakcie, które zadeklarujesz12 event Sent(address from, address to, uint amount);1314 // Kod konstruktora jest uruchamiany tylko wtedy, gdy kontrakt15 // jest tworzony16 constructor() {17 minter = msg.sender;18 }1920 // Wysyła pewną ilość nowo utworzonych monet na dany adres21 // Może być wywołane tylko przez twórcę kontraktu22 function mint(address receiver, uint amount) public {23 require(msg.sender == minter);24 require(amount < 1e60);25 balances[receiver] += amount;26 }2728 // Wysyła pewną ilość istniejących monet29 // od dowolnego wywołującego na dany adres30 function send(address receiver, uint amount) public {31 require(amount <= balances[msg.sender], "Niewystarczające saldo.");32 balances[msg.sender] -= amount;33 balances[receiver] += amount;34 emit Sent(msg.sender, receiver, amount);35 }36}Pokaż wszystkoTen przykład powinien dać wyobrażenie o składni kontraktu Solidity. Aby uzyskać bardziej szczegółowy opis funkcji i zmiennych, zobacz dokumentację (opens in a new tab).
Vyper
- Pythonowy język programowania
- Silne typowanie
- Niewielki i zrozumiały kod kompilatora
- Efektywne generowanie kodu bajtowego
- Celowo ma mniej funkcji niż Solidity, aby zwiększyć bezpieczeństwo kontraktów i ułatwić ich audyt. Nieobsługiwane przez Vyper:
- Modyfikatory
- Dziedziczenie
- Wbudowany asembler
- Przeciążenie funkcji
- Przeciążenie operatora
- Wywołania rekurencyjne
- Pętle o nieskończonej długości
- Binarne punkty stałe
Aby uzyskać więcej informacji, przeczytaj uzasadnienie Vyper (opens in a new tab).
Ważne linki
- Dokumentacja (opens in a new tab)
- Vyper na przykładach (opens in a new tab)
- Więcej przykładów Vyper (opens in a new tab)
- GitHub (opens in a new tab)
- Czat Discord społeczności Vyper (opens in a new tab)
- Ściągawka (opens in a new tab)
- Frameworki i narzędzia do tworzenia inteligentnych kontraktów dla Vyper
- VyperPunk - naucz się zabezpieczać i hakować inteligentne kontrakty Vyper (opens in a new tab)
- Centrum programistyczne Vyper (opens in a new tab)
- Przykłady inteligentnych kontraktów Vyper – największe hity (opens in a new tab)
- Awesome Vyper – wyselekcjonowane zasoby (opens in a new tab)
Przykład
1# Otwarta aukcja23# Parametry aukcji45# Beneficjent otrzymuje pieniądze od licytującego, który złożył najwyższą ofertę67beneficiary: public(address)8auctionStart: public(uint256)9auctionEnd: public(uint256)1011# Obecny stan aukcji1213highestBidder: public(address)14highestBid: public(uint256)1516# Ustawiane na true na końcu, uniemożliwia wszelkie zmiany1718ended: public(bool)1920# Śledzenie zwróconych ofert, abyśmy mogli postępować zgodnie ze wzorcem wypłaty2122pendingReturns: public(HashMap[address, uint256])2324# Utwórz prostą aukcję z czasem licytacji `_bidding_time`2526# sekund w imieniu2728# adresu beneficjenta `_beneficiary`.2930@external31def __init__(_beneficiary: address, _bidding_time: uint256):32 self.beneficiary = _beneficiary33 self.auctionStart = block.timestamp34 self.auctionEnd = self.auctionStart + _bidding_time3536# Licytuj w aukcji z wartością wysłaną3738# razem z tą transakcją.3940# Wartość zostanie zwrócona tylko wtedy, gdy4142# aukcja nie zostanie wygrana.4344@external45@payable46def bid():47 # Sprawdź, czy okres licytacji się skończył.48 assert block.timestamp < self.auctionEnd49 # Sprawdź, czy oferta jest wystarczająco wysoka50 assert msg.value > self.highestBid51 # Śledź zwrot dla poprzedniego licytującego z najwyższą ofertą52 self.pendingReturns[self.highestBidder] += self.highestBid53 # Śledź nową wysoką ofertę54 self.highestBidder = msg.sender55 self.highestBid = msg.value5657# Wypłać wcześniej zwróconą ofertę. Wzorzec wypłaty jest5859# używany tutaj w celu uniknięcia problemu z bezpieczeństwem. Gdyby zwroty były bezpośrednio6061# wysyłane w ramach bid(), złośliwy kontrakt licytacyjny mógłby zablokować6263# te zwroty, a tym samym zablokować napływ nowych, wyższych ofert.6465@external66def withdraw():67 pending_amount: uint256 = self.pendingReturns[msg.sender]68 self.pendingReturns[msg.sender] = 069 send(msg.sender, pending_amount)7071# Zakończ aukcję i wyślij najwyższą ofertę7273# do beneficjenta.7475@external76def endAuction():77 # Dobrą wytyczną jest strukturyzowanie funkcji, które wchodzą w interakcję78 # z innymi kontraktami (tj. wywołują funkcje lub wysyłają ether)79 # w trzech fazach:80 # 1. sprawdzanie warunków81 # 2. wykonywanie działań (potencjalnie zmieniających warunki)82 # 3. interakcja z innymi kontraktami83 # Jeśli te fazy są pomieszane, inny kontrakt może wywołać84 # z powrotem bieżący kontrakt i zmodyfikować stan lub spowodować85 # wielokrotne wykonanie efektów (wypłata etheru).86 # Jeśli funkcje wywoływane wewnętrznie obejmują interakcję z zewnętrznymi87 # kontraktami, muszą być również traktowane jako interakcja z88 # kontraktami zewnętrznymi.8990 # 1. Warunki91 # Sprawdź, czy osiągnięto czas zakończenia aukcji92 assert block.timestamp >= self.auctionEnd93 # Sprawdź, czy ta funkcja została już wywołana94 assert not self.ended9596 # 2. Efekty97 self.ended = True9899 # 3. Interakcja100 send(self.beneficiary, self.highestBid)Pokaż wszystkoTen przykład powinien dać wyobrażenie o składni kontraktu Vyper. Aby uzyskać bardziej szczegółowy opis funkcji i zmiennych, zobacz dokumentację (opens in a new tab).
Yul i Yul+
Jeśli dopiero zapoznajesz się z Ethereum i nie kodowałeś jeszcze w językach inteligentnych kontraktów, zalecamy rozpoczęcie od Solidity lub Vyper. Przyjrzyj się Yul lub Yul+ dopiero po zapoznaniu się z najlepszymi praktykami w zakresie bezpieczeństwa inteligentnych kontraktów i specyfiką pracy z EVM.
Yul
- Język pośredni dla Ethereum.
- Obsługuje EVM i Ewasm (opens in a new tab), czyli WebAssembly w stylu Ethereum, i jest zaprojektowany jako użyteczny wspólny mianownik dla obu platform.
- Dobry cel dla etapów optymalizacji wysokiego poziomu, które mogą przynieść korzyści zarówno platformom EVM, jak i Ewasm.
Yul+
- Niskopoziomowe, bardzo wydajne rozszerzenie do Yul.
- Początkowo zaprojektowany dla kontraktu rollup optymistyczny.
- Yul+ można postrzegać jako eksperymentalną propozycję ulepszenia Yul, dodającą do niego nowe funkcje.
Ważne linki
- Dokumentacja Yul (opens in a new tab)
- Dokumentacja Yul+ (opens in a new tab)
- Wpis wprowadzający do Yul+ (opens in a new tab)
Przykładowy kontrakt
Poniższy prosty przykład implementuje funkcję potęgową. Można go skompilować za pomocą solc --strict-assembly --bin input.yul. Przykład należy zapisać
w pliku input.yul.
1{2 function power(base, exponent) -> result3 {4 switch exponent5 case 0 { result := 1 }6 case 1 { result := base }7 default8 {9 result := power(mul(base, base), div(exponent, 2))10 if mod(exponent, 2) { result := mul(base, result) }11 }12 }13 let res := power(calldataload(0), calldataload(32))14 mstore(0, res)15 return(0, 32)16}Pokaż wszystkoJeśli masz już duże doświadczenie z inteligentnymi kontraktami, pełną implementację ERC20 w Yul można znaleźć tutaj (opens in a new tab).
Fe
- Statycznie typowany język dla maszyny wirtualnej Ethereum (EVM).
- Zainspirowany Pythonem i Rustem.
- Ma być łatwy do nauczenia — nawet dla deweloperów, którzy są nowicjuszami w ekosystemie Ethereum.
- Rozwój Fe jest wciąż na wczesnym etapie, język miał swoją wersję alfa w styczniu 2021 roku.
Ważne linki
- GitHub (opens in a new tab)
- Ogłoszenie Fe (opens in a new tab)
- Plan rozwoju Fe 2021 (opens in a new tab)
- Czat Discord Fe (opens in a new tab)
- Twitter Fe (opens in a new tab)
Przykładowy kontrakt
Poniżej znajduje się prosty kontrakt zaimplementowany w Fe.
1type BookMsg = bytes[100]23contract GuestBook:4 pub guest_book: map<address, BookMsg>56 event Signed:7 book_msg: BookMsg89 pub def sign(book_msg: BookMsg):10 self.guest_book[msg.sender] = book_msg1112 emit Signed(book_msg=book_msg)1314 pub def get_msg(addr: address) -> BookMsg:15 return self.guest_book[addr].to_mem()16Pokaż wszystkoJak wybrać
Podobnie jak w przypadku każdego innego języka programowania, najczęściej chodzi o wybór odpowiedniego narzędzia do danej pracy, jak również o osobiste preferencje.
Oto kilka rzeczy do rozważenia, jeśli nie próbowałeś jeszcze żadnego z języków:
Co jest wspaniałego w Solidity?
- Jeśli dopiero zaczynasz, jest tam wiele samouczków i narzędzi do nauki. Zobacz więcej na ten temat w sekcji Nauka przez kodowanie.
- Dostępne dobre narzędzia programistyczne.
- Solidity ma dużą społeczność programistów, co oznacza, że najprawdopodobniej szybko znajdziesz odpowiedzi na swoje pytania.
Co jest wspaniałego w Vyper?
- Świetny sposób na rozpoczęcie pracy dla programistów Pythona, którzy chcą pisać inteligentne kontrakty.
- Vyper ma mniejszą liczbę funkcji, dzięki czemu świetnie nadaje się do szybkiego prototypowania pomysłów.
- Vyper ma być łatwy do skontrolowania i w największym stopniu czytelny dla człowieka.
Co jest wspaniałego w Yul i Yul+?
- Uproszczony i funkcjonalny język niskiego poziomu.
- Pozwala zbliżyć się do pierwotnej EVM, co może pomóc zoptymalizować zużycie gazu w Twoich kontraktach.
Porównania języków
Aby porównać podstawową składnię, cykl życia kontraktu, interfejsy, operatory, struktury danych, funkcje, przepływ sterowania i nie tylko, sprawdź tę ściągawkę od Auditless (opens in a new tab)