Knihovny chytrých kontraktů
Nemusíte psát každý chytrý kontrakt ve svém projektu od nuly. K dispozici je mnoho open source knihoven chytrých kontraktů, které poskytují znovupoužitelné stavební bloky pro váš projekt a mohou vás ušetřit nutnosti znovu vynalézat kolo.
Předpoklady
Než se vrhnete na knihovny chytrých kontraktů, je dobré mít solidní představu o struktuře chytrého kontraktu. Pokud jste tak ještě neučinili, přejděte na anatomii chytrého kontraktu.
Co obsahuje knihovna
V knihovnách chytrých kontraktů obvykle najdete dva druhy stavebních bloků: znovupoužitelná chování, která můžete přidat do svých kontraktů, a implementace různých standardů.
Chování
Při psaní chytrých kontraktů je velká šance, že se přistihnete, jak píšete podobné vzory stále dokola, jako je přiřazení admin adresy k provádění chráněných operací v kontraktu, nebo přidání nouzového tlačítka pause (pozastavit) pro případ neočekávaného problému.
Knihovny chytrých kontraktů obvykle poskytují znovupoužitelné implementace těchto chování jako knihovny (opens in a new tab) nebo prostřednictvím dědičnosti (opens in a new tab) v Solidity.
Jako příklad uvádíme zjednodušenou verzi kontraktu Ownable (opens in a new tab) z knihovny OpenZeppelin Contracts (opens in a new tab), který určuje adresu jako vlastníka kontraktu a poskytuje modifikátor pro omezení přístupu k metodě pouze pro tohoto vlastníka.
contract Ownable {
address public owner;
constructor() internal {
owner = msg.sender;
}
modifier onlyOwner() {
require(owner == msg.sender, "Ownable: caller is not the owner");
_;
}
}
Chcete-li ve svém kontraktu použít takovýto stavební blok, musíte jej nejprve importovat a poté z něj ve svých vlastních kontraktech dědit. To vám umožní použít modifikátor poskytovaný základním kontraktem Ownable k zabezpečení vašich vlastních funkcí.
import ".../Ownable.sol"; // Cesta k importované knihovně
contract MyContract is Ownable {
// Následující funkci může volat pouze vlastník
function secured() onlyOwner public {
msg.sender.transfer(1 ether);
}
}
Dalším oblíbeným příkladem je SafeMath (opens in a new tab) nebo DsMath (opens in a new tab). Jedná se o knihovny (na rozdíl od základních kontraktů), které poskytují aritmetické funkce s kontrolou přetečení, což samotný jazyk neposkytuje. Je dobrou praxí používat některou z těchto knihoven místo nativních aritmetických operací, abyste svůj kontrakt ochránili před přetečením, které může mít katastrofální následky!
Standardy
Pro usnadnění skládatelnosti a interoperability definovala komunita Etherea několik standardů ve formě ERC. Více si o nich můžete přečíst v sekci standardy.
Při začleňování ERC do vašich kontraktů je dobré hledat standardní implementace, spíše než se snažit vytvořit vlastní. Mnoho knihoven chytrých kontraktů obsahuje implementace pro nejpopulárnější ERC. Například všudypřítomný standard pro zaměnitelný token ERC-20 lze nalézt v HQ20 (opens in a new tab), DappSys (opens in a new tab) a OpenZeppelin (opens in a new tab). Některé ERC navíc poskytují kanonické implementace jako součást samotného ERC.
Stojí za zmínku, že některé ERC nejsou samostatné, ale jsou doplňky k jiným ERC. Například ERC-2612 (opens in a new tab) přidává rozšíření k ERC-20 pro zlepšení jeho použitelnosti.
Jak přidat knihovnu
Vždy se podívejte do dokumentace knihovny, kterou začleňujete, kde najdete konkrétní pokyny, jak ji do projektu zahrnout. Několik knihoven kontraktů v Solidity je zabaleno pomocí npm, takže je můžete jednoduše nainstalovat pomocí npm install. Většina nástrojů pro kompilaci kontraktů bude hledat knihovny chytrých kontraktů ve vaší složce node_modules, takže můžete udělat následující:
// Toto načte knihovnu @openzeppelin/contracts z vašich node_modules
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
contract MyNFT is ERC721 {
constructor() ERC721("MyNFT", "MNFT") public { }
}
Bez ohledu na použitou metodu při začleňování knihovny vždy dávejte pozor na verzi jazyka. Například nemůžete použít knihovnu pro Solidity 0.6, pokud píšete své kontrakty v Solidity 0.5.
Kdy je použít
Použití knihovny chytrých kontraktů pro váš projekt má několik výhod. V první řadě vám šetří čas tím, že vám poskytuje stavební bloky připravené k použití, které můžete zahrnout do svého systému, místo abyste je museli kódovat sami.
Bezpečnost je také velkým plusem. Open source knihovny chytrých kontraktů jsou často velmi pečlivě zkoumány. Vzhledem k tomu, že na nich závisí mnoho projektů, má komunita silnou motivaci udržovat je pod neustálým dohledem. Je mnohem běžnější najít chyby v kódu aplikace než ve znovupoužitelných knihovnách kontraktů. Některé knihovny také procházejí externími audity (opens in a new tab) pro zajištění dodatečné bezpečnosti.
Používání knihoven chytrých kontraktů však s sebou nese riziko zahrnutí kódu, se kterým nejste obeznámeni, do vašeho projektu. Je lákavé importovat kontrakt a zahrnout ho přímo do projektu, ale bez dobrého pochopení toho, co daný kontrakt dělá, můžete do svého systému neúmyslně zanést problém kvůli neočekávanému chování. Vždy si přečtěte dokumentaci kódu, který importujete, a předtím, než ho učiníte součástí svého projektu, zkontrolujte i samotný kód!
Nakonec, při rozhodování, zda knihovnu zahrnout, zvažte její celkové využití. Široce přijímaná knihovna má výhodu větší komunity a více očí, které hledají případné problémy. Bezpečnost by měla být vaším hlavním zaměřením při budování s chytrými kontrakty!
Související nástroje
OpenZeppelin Contracts – Nejpopulárnější knihovna pro bezpečný vývoj chytrých kontraktů.
DappSys – Bezpečné, jednoduché a flexibilní stavební bloky pro chytré kontrakty.
HQ20 – Projekt v Solidity s kontrakty, knihovnami a příklady, které vám pomohou budovat plně vybavené distribuované aplikace pro reálný svět.
thirdweb Solidity SDK – Poskytuje nástroje potřebné k efektivnímu budování vlastních chytrých kontraktů.
Související tutoriály
- Bezpečnostní aspekty pro vývojáře na Ethereu – Tutoriál o bezpečnostních aspektech při budování chytrých kontraktů, včetně použití knihoven.
- Porozumění chytrému kontraktu pro token ERC-20 – Tutoriál o standardu ERC-20, který poskytuje více knihoven.
Další čtení
Víte o komunitním zdroji, který vám pomohl? Upravte tuto stránku a přidejte ho!