Jazyk chytrých kontraktů
Stránka naposledy aktualizována: 22. října 2025
Jednou z výhod Etherea je, že smart kontrakty lze programovat v relativně uživatelsky přívětivých programovacích jazycích. Pokud máte zkušenosti s Pythonem nebo jakýmkoli jazykem se složenými závorkamiopens in a new tab, můžete najít jazyk se známou syntaxí.
Dva nejaktivnější a nejvíce udržované jazyky jsou:
- Solidity
- Vyper
Remix IDE poskytuje komplexní vývojové prostředí pro vytváření a testování kontraktů jak v Solidity, tak ve Vyperu. Vyzkoušejte Remix IDE v prohlížečiopens in a new tab a začněte kódovat.
Zkušenější vývojáři mohou také chtít používat Yul, což je přechodný jazyk pro Ethereum Virtual Machine, nebo Yul+, rozšíření jazyka Yul.
Pokud jste zvědaví a rádi pomáháte testovat nové jazyky, které jsou stále ve fázi intenzivního vývoje, můžete experimentovat s Fe, nově vznikajícím jazykem pro smart kontrakty, který je v současnosti ještě v rané fázi.
Předpoklady
Předchozí znalosti programovacích jazyků, zejména JavaScriptu nebo Pythonu, vám mohou pomoci lépe porozumět rozdílům mezi jazyky pro smart kontrakty. Doporučujeme také, abyste nejprve pochopili koncept smart kontraktů, než se ponoříte do srovnání jazyků. Úvod do chytrých kontraktů.
Solidity
- Objektově orientovaný, vysoce úrovňový jazyk pro implementaci chytrých kontraktů.
- Jazyk se složenými závorkami, který je nejvíce ovlivněn jazykem C++.
- Staticky typovaný (typ proměnné je znám v době kompilace).
- Podporuje:
- Dědičnost (můžete rozšiřovat jiné kontrakty).
- Knihovny (můžete vytvářet opakovaně použitelný kód, který můžete volat z různých kontraktů – podobně jako statické funkce ve statické třídě v jiných objektově orientovaných programovacích jazycích).
- Komplexní uživatelem definované typy.
Důležité odkazy
- Dokumentaceopens in a new tab
- Portál jazyka Solidityopens in a new tab
- Příklady v Solidityopens in a new tab
- GitHubopens in a new tab
- Diskusní místnost Solidity na Gitteruopens in a new tab přemostěná do diskusní místnosti Solidity na Matrixuopens in a new tab
- Tahákopens in a new tab
- Blog Solidityopens in a new tab
- Solidity na Twitteruopens in a new tab
Příklad kontraktu
1// SPDX-License-Identifier: GPL-3.02pragma solidity >= 0.7.0;34contract Coin {5 // Klíčové slovo "public" zpřístupňuje proměnné6 // z ostatních kontraktů7 address public minter;8 mapping (address => uint) public balances;910 // Události umožňují klientům reagovat na specifické11 // změny kontraktu, které deklarujete12 event Sent(address from, address to, uint amount);1314 // Kód konstruktoru se spouští pouze při vytvoření15 // kontraktu16 constructor() {17 minter = msg.sender;18 }1920 // Odešle množství nově vytvořených mincí na adresu21 // Může být voláno pouze tvůrcem kontraktu22 function mint(address receiver, uint amount) public {23 require(msg.sender == minter);24 require(amount < 1e60);25 balances[receiver] += amount;26 }2728 // Odešle množství existujících mincí29 // od jakéhokoli volajícího na adresu30 function send(address receiver, uint amount) public {31 require(amount <= balances[msg.sender], "Insufficient balance.");32 balances[msg.sender] -= amount;33 balances[receiver] += amount;34 emit Sent(msg.sender, receiver, amount);35 }36}Zobrazit všeTento příklad by vám měl poskytnout představu o tom, jaká je syntaxe kontraktů v Solidity. Podrobnější popis funkcí a proměnných naleznete v dokumentaciopens in a new tab.
Vyper
- Pythonický programovací jazyk
- Silné typování
- Malý a srozumitelný kompilátor
- Efektivní generování bytekódu
- Úmyslně má méně funkcí než Solidity s cílem učinit kontrakty bezpečnějšími a snáze auditovatelnými. Vyper nepodporuje:
- Modifikátory
- Dědičnost
- Inline sestavení (assembly)
- Přetěžování funkcí
- Přetěžování operátorů
- Rekurzivní volání
- Nekonečné smyčky
- Binární pevné body
Pro více informací si přečtěte Vyper rationaleopens in a new tab.
Důležité odkazy
- Dokumentaceopens in a new tab
- Příklady ve Vyperuopens in a new tab
- Další příklady ve Vyperuopens in a new tab
- GitHubopens in a new tab
- Komunitní chat Vyperu na Discorduopens in a new tab
- Tahákopens in a new tab
- Frameworky a nástroje pro vývoj chytrých kontraktů pro Vyper
- VyperPunk – naučte se zabezpečit a hackovat chytré kontrakty ve Vyperuopens in a new tab
- Vyper Hub pro vývojopens in a new tab
- Vyper – nejlepší příklady chytrých kontraktůopens in a new tab
- Awesome Vyper – vybrané zdrojeopens in a new tab
Příklad
1# Otevřená aukce23# Parametry aukce45# Příjemce obdrží peníze od nejvyššího nabízejícího67beneficiary: public(address)8auctionStart: public(uint256)9auctionEnd: public(uint256)1011# Aktuální stav aukce1213highestBidder: public(address)14highestBid: public(uint256)1516# Na konci se nastaví na true, zakáže jakoukoli změnu1718ended: public(bool)1920# Sledujeme vrácené nabídky, abychom mohli použít vzor výběru2122pendingReturns: public(HashMap[address, uint256])2324# Vytvoří jednoduchou aukci s `_bidding_time`2526# sekundami pro přihazování jménem2728# adresy příjemce `_beneficiary`.2930@external31def __init__(_beneficiary: address, _bidding_time: uint256):32 self.beneficiary = _beneficiary33 self.auctionStart = block.timestamp34 self.auctionEnd = self.auctionStart + _bidding_time3536# Přihodí do aukce s hodnotou zaslanou3738# spolu s touto transakcí.3940# Hodnota bude vrácena pouze v případě,4142# že aukce nebude vyhrána.4344@external45@payable46def bid():47 # Zkontroluje, zda období pro přihazování skončilo.48 assert block.timestamp < self.auctionEnd49 # Zkontroluje, zda je nabídka dostatečně vysoká50 assert msg.value > self.highestBid51 # Sleduje vrácení peněz předchozímu nejvyššímu nabízejícímu52 self.pendingReturns[self.highestBidder] += self.highestBid53 # Sleduje novou nejvyšší nabídku54 self.highestBidder = msg.sender55 self.highestBid = msg.value5657# Vybere dříve vrácenou nabídku. Vzor výběru (withdraw pattern) se5859# zde používá k zamezení bezpečnostního problému. Pokud by byly refundace přímo6061# odesílány jako součást bid(), mohl by škodlivý kontrakt blokovat6263# tyto refundace a tím zabránit příchodu nových vyšších nabídek.6465@external66def withdraw():67 pending_amount: uint256 = self.pendingReturns[msg.sender]68 self.pendingReturns[msg.sender] = 069 send(msg.sender, pending_amount)7071# Ukončí aukci a pošle nejvyšší nabídku7273# příjemci.7475@external76def endAuction():77 # Je dobrým zvykem strukturovat funkce, které interagují78 # s jinými kontrakty (tj. volají funkce nebo posílají ether),79 # do tří fází:80 # 1. kontrola podmínek81 # 2. provádění akcí (potenciálně měnících podmínky)82 # 3. interakce s jinými kontrakty83 # Pokud jsou tyto fáze smíchány, jiný kontrakt by mohl volat84 # zpět do aktuálního kontraktu a upravit stav nebo způsobit,85 # že efekty (vyplacení etheru) budou provedeny vícekrát.86 # Pokud interně volané funkce zahrnují interakci s externími87 # kontrakty, musí být také považovány za interakci s88 # externími kontrakty.8990 # 1. Podmínky91 # Zkontroluje, zda bylo dosaženo konce aukce92 assert block.timestamp >= self.auctionEnd93 # Zkontroluje, zda tato funkce již byla volána94 assert not self.ended9596 # 2. Efekty97 self.ended = True9899 # 3. Interakce100 send(self.beneficiary, self.highestBid)Zobrazit všeTento příklad by vám měl poskytnout představu o tom, jaká je syntaxe kontraktů ve Vyperu. Podrobnější popis funkcí a proměnných najdete v dokumentaciopens in a new tab.
Yul a Yul+
Pokud jste v Ethereum nováčkem a ještě jste neprogramovali v jazycích pro smart kontrakty, doporučujeme začít se Solidity nebo Vyperem. Na Yul nebo Yul+ se zaměřte až poté, co si osvojíte osvědčené postupy v oblasti bezpečnosti smart kontraktů a specifika práce s EVM.
Yul
- Pokročilý jazyk pro Ethereum.
- Podporuje EVM a Ewasmopens in a new tab, což je varianta WebAssembly pro Ethereum, a je navržen tak, aby byl použitelným společným jmenovatelem obou platforem.
- Dobrá volba pro optimalizační fáze na vyšší úrovni, které mohou mít stejný přínos jak pro platformy EVM, tak pro Ewasm.
Yul+
- Nízkoúrovňové, vysoce efektivní rozšíření Yulu.
- Původně navrženo pro kontrakt optimistického rollupu.
- Yul+ lze považovat za experimentální návrh upgradu Yul, který do něj přidává nové funkce.
Důležité odkazy
- Dokumentace Yulopens in a new tab
- Dokumentace Yul+opens in a new tab
- Úvodní příspěvek o Yul+opens in a new tab
Příklad kontraktu
Následující jednoduchý příklad implementuje funkci mocniny. Lze jej zkompilovat pomocí solc --strict-assembly --bin input.yul. Příklad by měl
být uložen v souboru 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}Zobrazit všePokud již máte se smart kontrakty bohaté zkušenosti, úplnou implementaci ERC20 v jazyce Yul naleznete zdeopens in a new tab.
Fe
- Staticky typovaný jazyk pro Virtuální stroj Etherea (EVM).
- Inspirován jazyky Python a Rust.
- Cílem je, aby byl snadno naučitelný – i pro vývojáře, kteří jsou v ekosystému Ethereum noví.
- Vývoj Fe je stále v raných fázích, první alfa verze jazyka byla vydána v lednu 2021.
Důležité odkazy
- GitHubopens in a new tab
- Oznámení o Feopens in a new tab
- Plán vývoje Fe na rok 2021opens in a new tab
- Chat o Fe na Discorduopens in a new tab
- Fe na Twitteruopens in a new tab
Příklad kontraktu
Následuje jednoduchý kontrakt implementovaný v jazyce 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()16Zobrazit všeJak si vybrat
Stejně jako u jakéhokoli jiného programovacího jazyka jde především o výběr správného nástroje pro daný úkol a o osobní preference.
Uvádíme několik věcí, které byste měli zvážit, pokud jste ještě žádný z jazyků nezkusili:
Co je skvělé na Solidity?
- Pokud jste začátečník, najdete mnoho tutoriálů a vzdělávacích nástrojů. Více se o tom dozvíte v sekci Učte se kódováním.
- K dispozici je dobrá sada nástrojů pro vývojáře.
- Solidity má velkou vývojářskou komunitu, což znamená, že na případné otázky pravděpodobně najdete odpovědi poměrně rychle.
Co je skvělé na Vyperu?
- Skvělý na začátek pro Python vývojáře, kteří chtějí psát chytré kontrakty.
- Vyper má menší počet funkcí, což ho činí skvělým pro rychlé prototypování nápadů.
- Vyper usiluje o snadnou auditovatelnost a maximální čitelnost pro lidské bytosti.
Co je skvělé na Yul a Yul+?
- Jednoduchý a funkční nízkoúrovňový jazyk.
- Umožňuje dostat se mnohem blíže k surovému EVM, což vám může pomoci s optimalizací spotřeby paliva vašich kontraktů.
Srovnání jazyků
Pro srovnání základní syntaxe, životního cyklu kontraktů, rozhraní, operátorů, datových struktur, funkcí, řízení toku a dalšího se podívejte na tento tahák od Auditlessopens in a new tab