Anatomie chytrých kontraktů
Stránka naposledy aktualizována: 23. února 2026
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ě.
1// Příklad v Solidity2contract SimpleStorage {3 uint storedData; // Stavová proměnná4 // ...5}1# Příklad ve Vyperu2storedData: int128Pokud 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:
| Vlastnost | Stavová proměnná | Popis |
|---|---|---|
block.timestamp | uint256 | Časové razítko aktuální epochy bloku |
msg.sender | adresa | Odesí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
fnelze volat interně (tzn.f()nefunguje, alethis.f()ano).
- Externí funkce jsou součástí rozhraní kontraktu, což znamená, že je lze volat z jiných kontraktů a prostřednictvím transakcí. Externí funkci
Mohou být také public nebo private.
publicfunkce lze volat interně z kontraktu nebo externě prostřednictvím zprávprivatefunkce 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:
1// Příklad v Solidity2function update_name(string value) public {3 dapp_name = value;4}- Parametr
valuetypustringje předán do funkceupdate_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.
1// Příklad v Solidity2function balanceOf(address _owner) public view returns (uint256 _balance) {3 return ownerPizzaCount[_owner];4}1dappName: public(string)23@view4@public5def readName() -> string:6 return dappNameCo se považuje jako změna stavu:
- Zápis do stavových proměnných.
- Vysílání událostí (opens in a new tab).
- Vytváření dalších kontraktů (opens in a new tab).
- Použití
selfdestruct. - Posílání etheru pomocí volání.
- Volání jakékoli funkce, která není označena jako
viewnebopure. - Používání nízkoúrovňových volání.
- 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.
1// Příklad v Solidity2// Inicializuje data kontraktu, nastaví `owner`3// na adresu tvůrce kontraktu.4constructor() public {5 // Všechny chytré kontrakty spoléhají na externí transakce, které spouští jejich funkce.6 // `msg` je globální proměnná, která obsahuje relevantní údaje o dané transakci,7 // jako je adresa odesílatele a hodnota ETH obsažená v transakci.8 // Více informací: https://solidity.readthedocs.io/en/v0.5.10/units-and-global-variables.html#block-and-transaction-properties9 owner = msg.sender;10}Zobrazit vše1# Příklad ve Vyperu23@external4def __init__(_beneficiary: address, _bidding_time: uint256):5 self.beneficiary = _beneficiary6 self.auctionStart = block.timestamp7 self.auctionEnd = self.auctionStart + _bidding_timeVestavě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()– Soliditysend(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í)
1pragma solidity >=0.4.0 <=0.6.0;23contract ExampleDapp {4 string dapp_name; // stavová proměnná56 // Volá se při nasazení kontraktu a inicializuje hodnotu7 constructor() public {8 dapp_name = "My Example dapp";9 }1011 // Funkce pro získání (Get)12 function read_name() public view returns(string) {13 return dapp_name;14 }1516 // Funkce pro nastavení (Set)17 function update_name(string value) public {18 dapp_name = value;19 }20}Zobrazit všeKompletní 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
1// Určuje verzi Solidity pomocí sémantického verzování.2// Více informací: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma3pragma solidity ^0.5.10;45// Definuje kontrakt s názvem `HelloWorld`.6// Kontrakt je soubor funkcí a dat (jeho stav).7// Po nasazení se kontrakt nachází na specifické adrese na ethereovém blockchainu.8// Více informací: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html9contract HelloWorld {1011 // Deklaruje stavovou proměnnou `message` typu `string`.12 // Stavové proměnné jsou proměnné, jejichž hodnoty jsou trvale uloženy v úložišti kontraktu.13 // Klíčové slovo `public` zpřístupňuje proměnné zvenčí kontraktu14 // a vytváří funkci, kterou mohou jiné kontrakty nebo klienti volat pro přístup k hodnotě.15 string public message;1617 // Podobně jako v mnoha objektově orientovaných jazycích založených na třídách je konstruktor18 // speciální funkce, která se provádí pouze při vytvoření kontraktu.19 // Konstruktory se používají k inicializaci dat kontraktu.20 // Více informací: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors21 constructor(string memory initMessage) public {22 // Přijímá argument `initMessage` typu string a nastavuje hodnotu23 // do úložné proměnné kontraktu `message`.24 message = initMessage;25 }2627 // Veřejná funkce, která přijímá argument typu string28 // a aktualizuje úložnou proměnnou `message`.29 function update(string memory newMessage) public {30 message = newMessage;31 }32}Zobrazit všeToken
1pragma solidity ^0.5.10;23contract Token {4 // Typ `address` je srovnatelný s e-mailovou adresou – používá se k identifikaci účtu na Ethereu.5 // Adresy mohou představovat chytrý kontrakt nebo externí (uživatelské) účty.6 // Více informací: https://solidity.readthedocs.io/en/v0.5.10/types.html#address7 address public owner;89 // `mapping` je v podstatě datová struktura hašovací tabulky.10 // Tento `mapping` přiřazuje celé číslo bez znaménka (zůstatek tokenů) k adrese (držiteli tokenů).11 // Více informací: https://solidity.readthedocs.io/en/v0.5.10/types.html#mapping-types12 mapping (address => uint) public balances;1314 // Události umožňují zaznamenávat aktivitu na blockchainu.15 // Klienti Etherea mohou naslouchat událostem, aby mohli reagovat na změny stavu kontraktu.16 // Více informací: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#events17 event Transfer(address from, address to, uint amount);1819 // Inicializuje data kontraktu, nastaví `owner`20 // na adresu tvůrce kontraktu.21 constructor() public {22 // Všechny chytré kontrakty spoléhají na externí transakce, které spouští jejich funkce.23 // `msg` je globální proměnná, která obsahuje relevantní údaje o dané transakci,24 // jako je adresa odesílatele a hodnota ETH obsažená v transakci.25 // Více informací: https://solidity.readthedocs.io/en/v0.5.10/units-and-global-variables.html#block-and-transaction-properties26 owner = msg.sender;27 }2829 // Vytvoří množství nových tokenů a pošle je na adresu.30 function mint(address receiver, uint amount) public {31 // `require` je řídicí struktura používaná k vynucení určitých podmínek.32 // Pokud se příkaz `require` vyhodnotí jako `false`, dojde k výjimce,33 // která vrátí všechny změny stavu provedené během aktuálního volání.34 // Více informací: https://solidity.readthedocs.io/en/v0.5.10/control-structures.html#error-handling-assert-require-revert-and-exceptions3536 // Tuto funkci může volat pouze vlastník kontraktu37 require(msg.sender == owner, "You are not the owner.");3839 // Vynucuje maximální množství tokenů40 require(amount < 1e60, "Maximum issuance exceeded");4142 // Zvýší zůstatek `receiver` o `amount`43 balances[receiver] += amount;44 }4546 // Odesílá množství existujících tokenů od libovolného volajícího na adresu.47 function transfer(address receiver, uint amount) public {48 // Odesílatel musí mít dostatek tokenů k odeslání49 require(amount <= balances[msg.sender], "Insufficient balance.");5051 // Upravuje zůstatky tokenů na obou adresách52 balances[msg.sender] -= amount;53 balances[receiver] += amount;5455 // Vysílá dříve definovanou událost56 emit Transfer(msg.sender, receiver, amount);57 }58}Zobrazit všeUnikátní digitální aktivum
1pragma solidity ^0.5.10;23// Importuje symboly z jiných souborů do aktuálního kontraktu.4// V tomto případě se jedná o sérii pomocných kontraktů z OpenZeppelin.5// Více informací: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#importing-other-source-files67import "../node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol";8import "../node_modules/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";9import "../node_modules/@openzeppelin/contracts/introspection/ERC165.sol";10import "../node_modules/@openzeppelin/contracts/math/SafeMath.sol";1112// Klíčové slovo `is` se používá k dědění funkcí a klíčových slov z externích kontraktů.13// V tomto případě `CryptoPizza` dědí z kontraktů `IERC721` a `ERC165`.14// Více informací: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#inheritance15contract CryptoPizza is IERC721, ERC165 {16 // Používá knihovnu SafeMath od OpenZeppelin k bezpečnému provádění aritmetických operací.17 // Více informací: https://docs.openzeppelin.com/contracts/2.x/api/math#SafeMath18 using SafeMath for uint256;1920 // Konstantní stavové proměnné v Solidity jsou podobné jako v jiných jazycích21 // ale musíte je přiřadit z výrazu, který je konstantní v době kompilace.22 // Více informací: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constant-state-variables23 uint256 constant dnaDigits = 10;24 uint256 constant dnaModulus = 10 ** dnaDigits;25 bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;2627 // Typy `struct` umožňují definovat vlastní typ28 // Více informací: https://solidity.readthedocs.io/en/v0.5.10/types.html#structs29 struct Pizza {30 string name;31 uint256 dna;32 }3334 // Vytvoří prázdné pole struktur Pizza35 Pizza[] public pizzas;3637 // Mapování z ID pizzy na adresu jejího vlastníka38 mapping(uint256 => address) public pizzaToOwner;3940 // Mapování z adresy vlastníka na počet vlastněných tokenů41 mapping(address => uint256) public ownerPizzaCount;4243 // Mapování z ID tokenu na schválenou adresu44 mapping(uint256 => address) pizzaApprovals;4546 // Mapování lze vnořovat, tento příklad mapuje vlastníka na schválení operátora47 mapping(address => mapping(address => bool)) private operatorApprovals;4849 // Interní funkce pro vytvoření náhodné pizzy z řetězce (jméno) a DNA50 function _createPizza(string memory _name, uint256 _dna)51 // Klíčové slovo `internal` znamená, že tato funkce je viditelná pouze52 // v rámci tohoto kontraktu a kontraktů, které z něj dědí53 // Více informací: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#visibility-and-getters54 internal55 // `isUnique` je modifikátor funkce, který kontroluje, zda pizza již existuje56 // Více informací: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html#function-modifiers57 isUnique(_name, _dna)58 {59 // Přidá pizzu do pole pizz a získá ID60 uint256 id = SafeMath.sub(pizzas.push(Pizza(_name, _dna)), 1);6162 // Kontroluje, zda je vlastník pizzy stejný jako aktuální uživatel63 // Více informací: https://solidity.readthedocs.io/en/v0.5.10/control-structures.html#error-handling-assert-require-revert-and-exceptions6465 // Všimněte si, že address(0) je nulová adresa,66 // což znamená, že pizza[id] ještě není přidělena konkrétnímu uživateli.6768 assert(pizzaToOwner[id] == address(0));6970 // Mapuje pizzu na vlastníka71 pizzaToOwner[id] = msg.sender;72 ownerPizzaCount[msg.sender] = SafeMath.add(73 ownerPizzaCount[msg.sender],74 175 );76 }7778 // Vytvoří náhodnou pizzu z řetězce (jméno)79 function createRandomPizza(string memory _name) public {80 uint256 randDna = generateRandomDna(_name, msg.sender);81 _createPizza(_name, randDna);82 }8384 // Generuje náhodné DNA z řetězce (jméno) a adresy vlastníka (tvůrce)85 function generateRandomDna(string memory _str, address _owner)86 public87 // Funkce označené jako `pure` slibují, že nebudou číst ani upravovat stav88 // Více informací: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#pure-functions89 pure90 returns (uint256)91 {92 // Generuje náhodné uint z řetězce (jméno) + adresy (vlastník)93 uint256 rand = uint256(keccak256(abi.encodePacked(_str))) +94 uint256(_owner);95 rand = rand % dnaModulus;96 return rand;97 }9899 // Vrací pole pizz nalezených podle vlastníka100 function getPizzasByOwner(address _owner)101 public102 // Funkce označené jako `view` slibují, že nebudou upravovat stav103 // Více informací: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#view-functions104 view105 returns (uint256[] memory)106 {107 // Používá `memory` jako umístění úložiště pro uložení hodnot pouze pro108 // životní cyklus tohoto volání funkce.109 // Více informací: https://solidity.readthedocs.io/en/v0.5.10/introduction-to-smart-contracts.html#storage-memory-and-the-stack110 uint256[] memory result = new uint256[](ownerPizzaCount[_owner]);111 uint256 counter = 0;112 for (uint256 i = 0; i < pizzas.length; i++) {113 if (pizzaToOwner[i] == _owner) {114 result[counter] = i;115 counter++;116 }117 }118 return result;119 }120121 // Převádí pizzu a vlastnictví na jinou adresu122 function transferFrom(address _from, address _to, uint256 _pizzaId) public {123 require(_from != address(0) && _to != address(0), "Invalid address.");124 require(_exists(_pizzaId), "Pizza does not exist.");125 require(_from != _to, "Cannot transfer to the same address.");126 require(_isApprovedOrOwner(msg.sender, _pizzaId), "Address is not approved.");127128 ownerPizzaCount[_to] = SafeMath.add(ownerPizzaCount[_to], 1);129 ownerPizzaCount[_from] = SafeMath.sub(ownerPizzaCount[_from], 1);130 pizzaToOwner[_pizzaId] = _to;131132 // Vysílá událost definovanou v importovaném kontraktu IERC721133 emit Transfer(_from, _to, _pizzaId);134 _clearApproval(_to, _pizzaId);135 }136137 /**138 * Bezpečně převede vlastnictví daného ID tokenu na jinou adresu139 * Pokud je cílová adresa kontrakt, musí implementovat `onERC721Received`,140 * která se volá při bezpečném převodu a vrátí magickou hodnotu141 * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`;142 * jinak se převod vrátí zpět.143 */144 function safeTransferFrom(address from, address to, uint256 pizzaId)145 public146 {147 // solium-disable-next-line arg-overflow148 this.safeTransferFrom(from, to, pizzaId, "");149 }150151 /**152 * Bezpečně převede vlastnictví daného ID tokenu na jinou adresu153 * Pokud je cílová adresa kontrakt, musí implementovat `onERC721Received`,154 * která se volá při bezpečném převodu a vrátí magickou hodnotu155 * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`;156 * jinak se převod vrátí zpět.157 */158 function safeTransferFrom(159 address from,160 address to,161 uint256 pizzaId,162 bytes memory _data163 ) public {164 this.transferFrom(from, to, pizzaId);165 require(_checkOnERC721Received(from, to, pizzaId, _data), "Must implement onERC721Received.");166 }167168 /**169 * Interní funkce pro vyvolání `onERC721Received` na cílové adrese170 * Volání se neprovede, pokud cílová adresa není kontrakt171 */172 function _checkOnERC721Received(173 address from,174 address to,175 uint256 pizzaId,176 bytes memory _data177 ) internal returns (bool) {178 if (!isContract(to)) {179 return true;180 }181182 bytes4 retval = IERC721Receiver(to).onERC721Received(183 msg.sender,184 from,185 pizzaId,186 _data187 );188 return (retval == _ERC721_RECEIVED);189 }190191 // Spálí pizzu - kompletně zničí token192 // Modifikátor funkce `external` znamená, že tato funkce je193 // součástí rozhraní kontraktu a mohou ji volat jiné kontrakty194 function burn(uint256 _pizzaId) external {195 require(msg.sender != address(0), "Invalid address.");196 require(_exists(_pizzaId), "Pizza does not exist.");197 require(_isApprovedOrOwner(msg.sender, _pizzaId), "Address is not approved.");198199 ownerPizzaCount[msg.sender] = SafeMath.sub(200 ownerPizzaCount[msg.sender],201 1202 );203 pizzaToOwner[_pizzaId] = address(0);204 }205206 // Vrací počet pizz podle adresy207 function balanceOf(address _owner) public view returns (uint256 _balance) {208 return ownerPizzaCount[_owner];209 }210211 // Vrací vlastníka pizzy nalezeného podle ID212 function ownerOf(uint256 _pizzaId) public view returns (address _owner) {213 address owner = pizzaToOwner[_pizzaId];214 require(owner != address(0), "Invalid Pizza ID.");215 return owner;216 }217218 // Schvaluje jinou adresu k převodu vlastnictví pizzy219 function approve(address _to, uint256 _pizzaId) public {220 require(msg.sender == pizzaToOwner[_pizzaId], "Must be the Pizza owner.");221 pizzaApprovals[_pizzaId] = _to;222 emit Approval(msg.sender, _to, _pizzaId);223 }224225 // Vrací schválenou adresu pro konkrétní pizzu226 function getApproved(uint256 _pizzaId)227 public228 view229 returns (address operator)230 {231 require(_exists(_pizzaId), "Pizza does not exist.");232 return pizzaApprovals[_pizzaId];233 }234235 /**236 * Soukromá funkce pro zrušení aktuálního schválení daného ID tokenu237 * Vrátí se zpět, pokud daná adresa není skutečně vlastníkem tokenu238 */239 function _clearApproval(address owner, uint256 _pizzaId) private {240 require(pizzaToOwner[_pizzaId] == owner, "Must be pizza owner.");241 require(_exists(_pizzaId), "Pizza does not exist.");242 if (pizzaApprovals[_pizzaId] != address(0)) {243 pizzaApprovals[_pizzaId] = address(0);244 }245 }246247 /*248 * Nastavuje nebo ruší schválení daného operátora249 * Operátor má povoleno převádět všechny tokeny odesílatele jeho jménem250 */251 function setApprovalForAll(address to, bool approved) public {252 require(to != msg.sender, "Cannot approve own address");253 operatorApprovals[msg.sender][to] = approved;254 emit ApprovalForAll(msg.sender, to, approved);255 }256257 // Sdělí, zda je operátor schválen daným vlastníkem258 function isApprovedForAll(address owner, address operator)259 public260 view261 returns (bool)262 {263 return operatorApprovals[owner][operator];264 }265266 // Přebírá vlastnictví pizzy - pouze pro schválené uživatele267 function takeOwnership(uint256 _pizzaId) public {268 require(_isApprovedOrOwner(msg.sender, _pizzaId), "Address is not approved.");269 address owner = this.ownerOf(_pizzaId);270 this.transferFrom(owner, msg.sender, _pizzaId);271 }272273 // Kontroluje, zda pizza existuje274 function _exists(uint256 pizzaId) internal view returns (bool) {275 address owner = pizzaToOwner[pizzaId];276 return owner != address(0);277 }278279 // Kontroluje, zda je adresa vlastníkem nebo je schválena k převodu pizzy280 function _isApprovedOrOwner(address spender, uint256 pizzaId)281 internal282 view283 returns (bool)284 {285 address owner = pizzaToOwner[pizzaId];286 // Vypnout kontrolu solium kvůli287 // https://github.com/duaraghav8/Solium/issues/175288 // solium-disable-next-line operator-whitespace289 return (spender == owner ||290 this.getApproved(pizzaId) == spender ||291 this.isApprovedForAll(owner, spender));292 }293294 // Zkontrolujte, zda je pizza jedinečná a ještě neexistuje295 modifier isUnique(string memory _name, uint256 _dna) {296 bool result = true;297 for (uint256 i = 0; i < pizzas.length; i++) {298 if (299 keccak256(abi.encodePacked(pizzas[i].name)) ==300 keccak256(abi.encodePacked(_name)) &&301 pizzas[i].dna == _dna302 ) {303 result = false;304 }305 }306 require(result, "Pizza with such name already exists.");307 _;308 }309310 // Vrací, zda je cílová adresa kontrakt311 function isContract(address account) internal view returns (bool) {312 uint256 size;313 // V současné době neexistuje lepší způsob, jak zkontrolovat, zda je na adrese kontrakt314 // než zkontrolovat velikost kódu na dané adrese.315 // Viz https://ethereum.stackexchange.com/a/14016/36603316 // pro více detailů o tom, jak to funguje.317 // TODO Zkontrolovat znovu před vydáním Serenity, protože všechny adresy budou318 // poté kontrakty.319 // solium-disable-next-line security/no-inline-assembly320 assembly {321 size := extcodesize(account)322 }323 return size > 0;324 }325}Zobrazit všeDalší čtení
Kompletní přehled chytrých kontraktů najdete v dokumentaci Solidity a Vyper:
Související témata
Související návody
- Zmenšování kontraktů pro boj s limitem velikosti kontraktu – Několik praktických tipů pro zmenšení velikosti vašeho chytrého kontraktu.
- Zaznamenávání dat z chytrých kontraktů pomocí událostí – Úvod do událostí chytrých kontraktů a jak je můžete použít k zaznamenávání dat.
- Interakce s dalšími kontrakty ze Solidity – Jak nasadit chytrý kontrakt z existujícího kontraktu a interagovat s ním.