Přejít na hlavní obsah
Change page

Anatomie chytrých kontraktů

Chytrý kontrakt je program běžící na adrese na Ethereu. Skládá se z dat a funkcí, které se mohou spustit po přijetí transakce. Zde je přehled toho, co tvoří chytrý kontrakt.

Předpoklady

Ujistěte se, že jste si nejprve přečetli o chytrých kontraktech. Tento dokument předpokládá, že již znáte programovací jazyky, jako je JavaScript nebo Python.

Data

Jakákoli data kontraktu musí být přiřazena k umístění: buď do storage nebo memory. Úprava storage v chytrém kontraktu je nákladná, takže je třeba zvážit, kde by měla být vaše data uložena.

Úložiště

Trvalá data se označují jako storage a jsou reprezentována stavovými proměnnými. Tyto hodnoty se trvale uloží na blockchain. Datový typ je třeba deklarovat, aby kontrakt mohl při kompilaci sledovat, kolik potřebuje na blockchainu úložiště.

// Příklad v Solidity
contract SimpleStorage {
    uint storedData; // Stavová proměnná
    // ...
}
# Příklad ve Vyperu
storedData: int128

Pokud jste již programovali v objektově orientovaných jazycích, většinu typů pravděpodobně znáte. Nicméně address by pro vás mělo být novinkou, pokud s vývojem na Ethereu teprve začínáte.

Datový typ address může obsahovat adresu Ethereum, která odpovídá 20 bajtům nebo 160 bitům. Návratová hodnota je v hexadecimálním zápisu začínajícím 0x.

Mezi další datové typy patří:

  • boolean
  • integer
  • čísla s pevnou řádovou čárkou
  • pole bajtů s pevnou velikostí
  • pole bajtů s dynamickou velikostí
  • racionální a celočíselné literály
  • řetězcové literály
  • hexadecimální literály
  • enumy

Další vysvětlení najdete v těchto dokumentech:

Paměť

Hodnoty, které jsou uloženy pouze po dobu provádění funkce kontraktu, se nazývají paměťové proměnné. Protože nejsou trvale uloženy na blockchainu, je jejich používání mnohem levnější.

Dozvíte se více o tom, jak EVM ukládá data (úložiště, paměť a zásobník) v dokumentaci Solidity (opens in a new tab).

Proměnné prostředí

Kromě proměnných, které definujete v kontraktu, existují i speciální globální proměnné. Ty slouží především k poskytování informací o blockchainu nebo aktuální transakci.

Příklady:

VlastnostStavová proměnnáPopis
block.timestampuint256Časové razítko aktuální epochy bloku
msg.senderadresaOdesílatel zprávy (aktuální volání)

Funkce

Nejjednodušeji řečeno, funkce mohou získávat informace nebo nastavovat informace v reakci na příchozí transakce.

Existují dva typy volání funkcí:

  • internal – nevytvářejí volání EVM
    • K interním funkcím a stavovým proměnným lze přistupovat pouze interně (tj. v rámci aktuálního kontraktu nebo kontraktů z něho odvozených).
  • external – vytvářejí volání EVM
    • Externí funkce jsou součástí rozhraní kontraktu, což znamená, že je lze volat z jiných kontraktů a prostřednictvím transakcí. Externí funkci f nelze volat interně (tzn. f() nefunguje, ale this.f() ano).

Mohou být také public nebo private.

  • public funkce lze volat interně z kontraktu nebo externě prostřednictvím zpráv
  • private funkce jsou viditelné pouze pro kontrakt, ve kterém jsou definovány, a ne v odvozených kontraktech

Funkce i stavové proměnné mohou být veřejné nebo soukromé.

Zde je funkce pro aktualizaci stavové proměnné v kontraktu:

// Příklad v Solidity
function update_name(string value) public {
    dapp_name = value;
}
  • Parametr value typu string je předán do funkce update_name.
  • Je deklarována jako public, což znamená, že k ní má kdokoli přístup.
  • Není deklarována jako view, takže může měnit stav kontraktu.

Funkce view

Tyto funkce slibují, že nebudou měnit stav dat kontraktu. Běžným příkladem jsou „getter“ funkce – můžete je použít například k získání zůstatku uživatele.

// Příklad v Solidity
function balanceOf(address _owner) public view returns (uint256 _balance) {
    return ownerPizzaCount[_owner];
}
dappName: public(string)

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

Co se považuje jako změna stavu:

  1. Zápis do stavových proměnných.
  2. Vysílání událostí (opens in a new tab).
  3. Vytváření dalších kontraktů (opens in a new tab).
  4. Použití selfdestruct.
  5. Posílání etheru pomocí volání.
  6. Volání jakékoli funkce, která není označena jako view nebo pure.
  7. Používání nízkoúrovňových volání.
  8. Používání inline assembly, která obsahuje určité operační kódy.

Konstruktory

Funkce constructor se provedou pouze jednou, při prvním nasazení kontraktu. Podobně jako constructor v mnoha programovacích jazycích založených na třídách, tyto funkce často inicializují stavové proměnné na zadané hodnoty.

# Příklad ve Vyperu

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

Vestavěné funkce

Kromě proměnných a funkcí, které definujete v kontraktu, existují i speciální vestavěné funkce. Nejzřetelnějším příkladem je:

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

Ty umožňují posílat ETH na jiné účty.

Psaní funkcí

Vaše funkce potřebuje:

  • parametr a jeho datový typ (pokud parametry přijímá)
  • deklaraci, zda je internal/external
  • deklaraci, zda je pure/view/payable
  • datový typ návratové hodnoty (pokud nějakou vrací)

Kompletní kontrakt může vypadat následovně. Zde funkce constructor poskytuje počáteční hodnotu proměnné dapp_name.

Události a záznamy

Události umožňují vašemu chytrému kontraktu komunikovat s vaším frontendem nebo jinými přihlášenými aplikacemi. Jakmile je transakce ověřena a přidána do bloku, mohou chytré kontrakty vysílat události a zaznamenávat informace, které pak frontend může zpracovat a využít.

Příklady s poznámkami

Zde jsou příklady napsané v Solidity. Pokud si chcete s kódem pohrát, můžete s ním interagovat v Remixu (opens in a new tab).

Hello world

Token

Unikátní digitální aktivum

Další čtení

Kompletní přehled chytrých kontraktů najdete v dokumentaci Solidity a Vyper:

Poslední aktualizace stránky: 15. dubna 2026

Byl tento článek užitečný?