---
title: "Библиотеки смарт-контрактов"
description: "Откройте для себя библиотеки смарт-контрактов и строительные блоки для многократного использования, чтобы ускорить разработку ваших проектов на Эфириуме."
lang: ru
---

Вам не нужно писать каждый смарт-контракт в вашем проекте с нуля. Существует множество библиотек смарт-контрактов с открытым исходным кодом, которые предоставляют готовые строительные блоки для вашего проекта, что избавит вас от необходимости изобретать велосипед.

## Предварительные требования {#prerequisites}

Прежде чем переходить к библиотекам смарт-контрактов, полезно хорошо понимать структуру смарт-контракта. Перейдите к разделу [анатомия смарт-контракта](/developers/docs/smart-contracts/anatomy/), если вы этого еще не сделали.

## Что находится в библиотеке {#whats-in-a-library}

Обычно в библиотеках смарт-контрактов можно найти два вида строительных блоков: повторно используемые модели поведения, которые вы можете добавить в свои контракты, и реализации различных стандартов.

### Поведение {#behaviors}

При написании смарт-контрактов велика вероятность того, что вы будете писать похожие шаблоны снова и снова, например, назначать _адрес_ администратора для выполнения защищенных операций в контракте или добавлять кнопку экстренной _паузы_ на случай непредвиденной проблемы.

Библиотеки смарт-контрактов обычно предоставляют повторно используемые реализации такого поведения в виде [библиотек](https://solidity.readthedocs.io/en/v0.7.2/contracts.html#libraries) или через [наследование](https://solidity.readthedocs.io/en/v0.7.2/contracts.html#inheritance) в Solidity.

В качестве примера ниже приведена упрощенная версия [контракта `Ownable`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.2.0/contracts/access/Ownable.sol) из [библиотеки контрактов ОпенЗеппелин](https://github.com/OpenZeppelin/openzeppelin-contracts), которая назначает адрес владельцем контракта и предоставляет модификатор для ограничения доступа к методу только для этого владельца.

```solidity
contract Ownable {
    address public owner;

    constructor() internal {
        owner = msg.sender;
    }

    modifier onlyOwner() {
        require(owner == msg.sender, "Ownable: caller is not the owner");
        _;
    }
}
```

Чтобы использовать подобный строительный блок в своем контракте, вам нужно сначала импортировать его, а затем унаследовать от него свои собственные контракты. Это позволит вам использовать модификатор, предоставляемый базовым контрактом `Ownable`, для защиты ваших собственных функций.

```solidity
import ".../Ownable.sol"; // Путь к импортированной библиотеке

contract MyContract is Ownable {
    // Следующая функция может быть вызвана только владельцем
    function secured() onlyOwner public {
        msg.sender.transfer(1 ether);
    }
}
```

Другим популярным примером является [SafeMath](https://docs.openzeppelin.com/contracts/3.x/utilities#math) или [DsMath](https://dappsys.readthedocs.io/en/latest/ds_math.html). Это библиотеки (в отличие от базовых контрактов), которые предоставляют арифметические функции с проверками на переполнение, которые не предусмотрены языком. Хорошей практикой является использование любой из этих библиотек вместо встроенных арифметических операций, чтобы защитить ваш контракт от переполнений, которые могут иметь катастрофические последствия!

### Стандарты {#standards}

Для облегчения [композируемости и интероперабельности](/developers/docs/smart-contracts/composability/) сообщество Эфириума определило несколько стандартов в виде **ERC**. Вы можете узнать о них больше в разделе [стандартов](/developers/docs/standards/).

При включении ERC в ваши контракты лучше искать стандартные реализации, а не пытаться создать свои собственные. Многие библиотеки смарт-контрактов включают реализации для самых популярных ERC. Например, повсеместно распространенный [стандарт взаимозаменяемого токена ERC-20](/developers/tutorials/understand-the-erc-20-token-smart-contract/) можно найти в [HQ20](https://github.com/HQ20/contracts/blob/master/contracts/token/README.md), [DappSys](https://github.com/dapphub/ds-token/) и [ОпенЗеппелин](https://docs.openzeppelin.com/contracts/3.x/erc20). Кроме того, некоторые ERC также предоставляют канонические реализации как часть самого ERC.

Стоит отметить, что некоторые ERC не являются самостоятельными, а служат дополнениями к другим ERC. Например, [ERC-2612](https://eips.ethereum.org/EIPS/eip-2612) добавляет расширение к ERC-20 для улучшения его удобства использования.

## Как добавить библиотеку {#how-to}

Всегда обращайтесь к документации подключаемой библиотеки за конкретными инструкциями о том, как включить ее в ваш проект. Некоторые библиотеки контрактов Solidity упакованы с использованием `npm`, поэтому вы можете просто использовать `npm install` для их установки. Большинство инструментов для [компиляции](/developers/docs/smart-contracts/compiling/) контрактов будут искать библиотеки смарт-контрактов в вашей папке `node_modules`, поэтому вы можете сделать следующее:

```solidity
// Это загрузит библиотеку @openzeppelin/contracts из ваших node_modules
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";

contract MyNFT is ERC721 {
    constructor() ERC721("MyNFT", "MNFT") public { }
}
```

Независимо от используемого метода, при подключении библиотеки всегда обращайте внимание на версию [языка](/developers/docs/smart-contracts/languages/). Например, вы не можете использовать библиотеку для Solidity 0.6, если пишете свои контракты на Solidity 0.5.

## Когда использовать {#when-to-use}

Использование библиотеки смарт-контрактов для вашего проекта имеет несколько преимуществ. В первую очередь, это экономит ваше время, предоставляя готовые к использованию строительные блоки, которые вы можете включить в свою систему, вместо того чтобы программировать их самостоятельно.

Безопасность также является большим плюсом. Библиотеки смарт-контрактов с открытым исходным кодом часто подвергаются тщательной проверке. Учитывая, что от них зависят многие проекты, у сообщества есть сильный стимул постоянно их проверять. Гораздо чаще ошибки встречаются в коде приложения, чем в повторно используемых библиотеках контрактов. Некоторые библиотеки также проходят [внешние аудиты](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/audits) для обеспечения дополнительной безопасности.

Однако использование библиотек смарт-контрактов несет в себе риск включения в ваш проект кода, с которым вы не знакомы. Заманчиво импортировать контракт и включить его непосредственно в свой проект, но без хорошего понимания того, что делает этот контракт, вы можете непреднамеренно внести проблему в свою систему из-за неожиданного поведения. Всегда обязательно читайте документацию импортируемого кода, а затем просматривайте сам код, прежде чем делать его частью своего проекта!

Наконец, принимая решение о том, стоит ли включать библиотеку, учитывайте ее общую распространенность. Широко используемая библиотека имеет преимущества в виде большего сообщества и большего количества глаз, ищущих в ней проблемы. Безопасность должна быть вашим главным приоритетом при создании смарт-контрактов!

## Связанные инструменты {#related-tools}

**Контракты ОпенЗеппелин -** **_Самая популярная библиотека для безопасной разработки смарт-контрактов._**

- [Документация](https://docs.openzeppelin.com/contracts/)
- [GitHub](https://github.com/OpenZeppelin/openzeppelin-contracts)
- [Форум сообщества](https://forum.openzeppelin.com/c/general/16)

**DappSys -** **_Безопасные, простые и гибкие строительные блоки для смарт-контрактов._**

- [Документация](https://dappsys.readthedocs.io/)
- [GitHub](https://github.com/dapphub/dappsys)

**HQ20 -** **_Проект на Solidity с контрактами, библиотеками и примерами, которые помогут вам создавать полнофункциональные распределенные приложения для реального мира._**

- [GitHub](https://github.com/HQ20/contracts)

**thirdweb Solidity SDK -** **_Предоставляет инструменты, необходимые для эффективного создания пользовательских смарт-контрактов_**

- [Документация](https://portal.thirdweb.com/contracts/build/overview)
- [GitHub](https://github.com/thirdweb-dev/contracts)

## Связанные руководства {#related-tutorials}

- [Соображения безопасности для разработчиков на Эфириуме](/developers/docs/smart-contracts/security/) _– Руководство по соображениям безопасности при создании смарт-контрактов, включая использование библиотек._
- [Понимание смарт-контракта токена ERC-20](/developers/tutorials/understand-the-erc-20-token-smart-contract/) _– Руководство по стандарту ERC-20, предоставляемому несколькими библиотеками._

## Дополнительная литература {#further-reading}

_Знаете ресурс сообщества, который вам помог? Отредактируйте эту страницу и добавьте его!_