Библиотеки - отличный способ повторно использовать код, ускорить разработку и сделать контракты более безопасными. В этом коротком руководстве я покажу вам пример использования библиотеки. Пойдем!

Пример ситуации

Один из вариантов использования библиотек - защита от двоичного переполнения. Предположим, у вас есть переменная 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: