Přeskočit na hlavní obsah
Change page

Úvod do smart kontraktů

Co to je smart kontrakt?

„Smart kontrakt“ je jednoduše program, který je spuštěn na blockchainu Ethereum. Je to sbírka kódu (jeho funkcí) a dat (jeho stavu), které sídlí na specifické adrese na blockchainu Ethereum.

Smart kontrakty jsou typem účtu na Ethereu. To znamená, že mají zůstatek a mohou být cílem transakcí. Nejsou však ovládány uživatelem, místo toho jsou nasazeny na síť a běží podle toho, jak jsou naprogramovány. Uživatelé pak mohou interagovat se smart kontraktem prostřednictvím transakcí, které spouštějí funkce definované na smart kontraktu. Smart kontrakty mohou definovat pravidla, podobně jako běžné smlouvy, a automaticky je vynucovat prostřednictvím kódu. Smart kontrakty nelze ve výchozím nastavení smazat a interakce s nimi jsou nevratné.

Předpoklady

Pokud teprve začínáte nebo hledáte méně technický úvod, doporučujeme si přečíst naši úvodní příručku ke smart kontraktům.

Ujistěte se, že jste si přečetli informace o účtech, transakcích a Virtuálním stroji Etherea, než se pustíte do světa smart kontraktů.

Digitální výdejní automat

Možná nejlepší metaforou pro smart kontrakt je výdejní automat, jak jej popsal Nick Szabo(opens in a new tab). S těmi správnými vstupy je zaručen určitý výstup.

Pakliže chcete svačinu z prodejního automatu:

1money + snack selection = snack dispensed

Tato logika je naprogramována do automatu.

Smart kontrakt má do sebe naprogramovanou logiku, podobně jako prodejní automat. Zde je jednoduchý příklad, jak by takový prodejní automat vypadal, kdyby to byl smart kontrakt napsaný v Solidity:

1pragma solidity 0.8.7;
2
3contract VendingMachine {
4
5 // Declare state variables of the contract
6 address public owner;
7 mapping (address => uint) public cupcakeBalances;
8
9 // When 'VendingMachine' contract is deployed:
10 // 1. set the deploying address as the owner of the contract
11 // 2. set the deployed smart contract's cupcake balance to 100
12 constructor() {
13 owner = msg.sender;
14 cupcakeBalances[address(this)] = 100;
15 }
16
17 // Allow the owner to increase the smart contract's cupcake balance
18 function refill(uint amount) public {
19 require(msg.sender == owner, "Only the owner can refill.");
20 cupcakeBalances[address(this)] += amount;
21 }
22
23 // Allow anyone to purchase cupcakes
24 function purchase(uint amount) public payable {
25 require(msg.value >= amount * 1 ether, "You must pay at least 1 ETH per cupcake");
26 require(cupcakeBalances[address(this)] >= amount, "Not enough cupcakes in stock to complete this purchase");
27 cupcakeBalances[address(this)] -= amount;
28 cupcakeBalances[msg.sender] += amount;
29 }
30}
Zobrazit vše
Kopírovat

Podobně jako prodejní automat odstraňuje potřebu zaměstnance prodejce, smart kontrakty mohou nahradit prostředníky v mnoha průmyslových odvětvích.

Bez nutnosti povolení

Kdokoli může napsat smart kontrakt a vypustit ho na síť. Stačí se naučit programovat v jazyce pro smart kontrakty a mít dostatek ETH k nasazení kontraktu. Nasazení smart kontraktu je z technického hlediska transakcí, takže musíte zaplatit poplatek za palivo, stejně jako při jednoduchém převodu ETH. Náklady na palivo jsou však při nasazení kontraktu mnohem vyšší.

Ethereum má programovací jazyky pro psaní smart kontraktů, které jsou vývojářsky přívětivé:

  • Solidity
  • Vyper

Další informace o jazycích

Je však třeba je před nasazením zkompilovat, aby je Virtuální stroj Etherea mohl interpretovat a uložit. Více informací o kompilaci

Složitelnost

Chytré kontrakty na Ethereu jsou veřejné a lze je považovat za otevřená API. To znamená, že ve svém smart kontraktu můžete volat jiné smart kontrakty, což značně rozšiřuje vaše možnosti. Kontrakty mohou dokonce nasazovat další kontrakty.

Další informace o komponovatelnosti smart kontraktů.

Omezení

Samotné smart kontrakty nemohou získávat informace o „skutečných“ událostech, protože nemohou získávat data z off-chain zdrojů. To znamená, že nemohou reagovat na události ve skutečném světě. Tento design je úmyslný. Spoléhat se na externí informace by mohlo ohrozit konsenzus, což je důležité pro bezpečnost a decentralizaci.

Nicméně je důležité, aby blockchainové aplikace mohly používat off-chain data. Řešením jsou orákly, což jsou nástroje, které přinášejí off-chain data a zpřístupňují je smart kontraktům.

Dalším omezením smart kontraktů je maximální velikost kontraktu. Smart kontrakt může mít maximálně 24 Kb, jinak dojde k vyčerpání paliva. Toto lze obejít pomocí tzv. Diamond Pattern(opens in a new tab).

Multisig kontrakty

Multisig (vícepodpisové) kontrakty jsou smart kontraktové účty, které vyžadují více platných podpisů k provedení transakce. To je velmi užitečné pro zabránění jednotlivým bodům selhání u kontraktů držících značné množství etheru nebo jiných tokenů. Multisigy také mohou rozdělit odpovědnost za provádění kontraktů a správu klíčů mezi více stran a zabraňují ztrátě prostředků v případě ztráty jediného soukromého klíče. Z těchto důvodů lze multisig kontrakty použít pro jednoduchou správu DAO. Multisigy vyžadují N podpisů z M možných přijatelných podpisů (kde N ≤ M a M > 1) k provedení transakce. Běžně se používají multisigy N = 3, M = 5 a N = 4, M = 7. Multisig 4/7 vyžaduje čtyři ze sedmi možných platných podpisů. To znamená, že prostředky jsou stále dostupné, i když jsou ztraceny tři podpisy. V tomto případě to také znamená, že většina držitelů klíčů musí souhlasit a podepsat, aby mohl být kontrakt exekuován.

Zdroje smart kontraktů

OpenZeppelin Contracts – knihovna pro vývoj bezpečných chytrých kontraktů.

Další informace

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