Библиотеки - отличный способ повторно использовать код, ускорить разработку и сделать контракты более безопасными. В этом коротком руководстве я покажу вам пример использования библиотеки. Пойдем!
Пример ситуации
Один из вариантов использования библиотек - защита от двоичного переполнения. Предположим, у вас есть переменная uint256. Эта переменная имеет 256 бит и поэтому может представлять только числа до (2²⁵⁶ -1). Что произойдет, если мы добавим число к этой переменной и результат будет больше (2²⁵⁶ -1)? Число будет циклически повторяться, начиная с нуля снова. Это то, что мы называем двоичным переполнением.
А теперь представьте, представляет ли эта переменная баланс пользователя в токенах ERC-20. Пользователь увидит, что его баланс увеличится с огромного до почти нуля, и потенциально потеряет миллионы долларов. Да, нам нужно предотвратить это.
Поэтому мы должны жестко закодировать защиту от такого события, как в приведенном ниже коде.
function transferTokens (address _from, address _to, uint amount) { //must have enough funds require(balances[_from] >= amount); //here we protect ourselves against overflows //by verifying that the addition does not result //in a wrap-around (thus making the result < the result) uint result = balances[_to] + amount; assert(result >= amount); balances[_to] += amount; balances[_from] -= amount; }
Теперь может стать обременительным постоянно проверять, не происходит ли переполнение при каждом добавлении. К счастью, мы можем использовать библиотеки для ускорения процесса. В частности, мы будем использовать библиотеку SafeMath от OpenZeppelin, инициативы с открытым исходным кодом, целью которой является создание проверенного и безопасного повторно используемого кода для смарт-контрактов.
Использование библиотеки SafeMath в OpenZeppelin
Вот веб-сайт OpenZeppelin https://openzeppelin.org/. Вот ссылка на их репозиторий на gitHub. Https://github.com/OpenZeppelin/zeppelin-solidity
В частности, нам будет интересна их библиотека SafeMath. Из репозитория gitHub перейдите в папку Contracts, а затем в Math, и вы найдете файл SafeMath.sol. Вы должны оказаться на следующей странице https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/math/SafeMath.sol и увидеть приведенный ниже код.
/** * @title SafeMath * @dev Math operations with safety checks that throw on error */ library SafeMath { /** * @dev Multiplies two numbers, throws on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; assert(c / a == b); return c; } /** * @dev Integer division of two numbers, truncating the quotient. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // assert(b > 0); // Solidity automatically throws when dividing by 0 uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn’t hold return c; } /** * @dev Substracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a — b; } /** * @dev Adds two numbers, throws on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } }
Как видите, эта библиотека содержит функции, которые мы можем использовать для безопасного сложения, вычитания, умножения и деления. Функция add () будет полезна, чтобы избежать переполнения. Но как мы сообщаем нашему контракту, что нужно использовать библиотеку? Мы начнем наш контракт с ключевого слова using и типа, к которому будет применяться ключевое слово.
library SafeMath { [code is here] } contract myCoolToken { using SafeMath for uint; [code goes here] }
Теперь мы можем использовать методы библиотеки SafeMath с нашим uint, переданным в качестве первого параметра. Например, чтобы вычислить x = x + y, мы должны ввести x = x.add (y). Ниже приведена переписанная передаточная функция с использованием библиотек.
function transferTokens (address _from, address _to, uint amount) { //below the add method of the SafeMath library verifies that there is no overflow //balances[_from] become the first argument “a” and amount is the second argument “b” //it reverts the transaction if an error is found //if there are no errors, it returns the result balances[_to] = balances[_to].add(amount); //we can remove the require statement than to the line below since // the sub method of the //SafeMath library is going to take care of making sure there are enough funds balances[_from] = balances[_from].sub(amount); }
Вот как вы используете библиотеки с Solidity!
Если вам понравилась эта статья и вы хотите поддержать меня, подумайте о пожертвовании!
Ethereum: 0x0715Fd06D9c8ED3835Aa41482171adbd85FFBA86
биткойн: 1J8vExhVDMnEUx3uqSwTFfAa35c9RmHNwJ2LiteMQuCoin: