#ethereum #solidity #smartcontracts #evm
Вопрос:
У меня есть смарт-контракт солидности, подобный этому pragma solidity gt;=0.7.0 lt;0.9.0;
, могу ли я по-прежнему импортировать SafeMath, даже если он не нужен для 0.8 ? Поскольку SafeMath работает с 0.7, но в моем контракте указано, что он принимает значение 0.7.0 до значения ниже 0.9.0, что будет делать SafeMath в этом случае.
Ответ №1:
Библиотека SafeMath проверяет, приведет ли арифметическая операция к переполнению/неполному потоку целых чисел. Если это так, библиотека создает исключение, эффективно возвращая транзакцию.
Начиная с солидности 0.8, проверка переполнения/недостаточного потока реализована на уровне языка — она добавляет проверку в байт-код во время компиляции.
Вам не нужна библиотека SafeMath для солидности 0.8 . Вы все еще можете свободно использовать его в этой версии, он просто выполнит одну и ту же проверку дважды (один на уровне языка и один в библиотеке).
И настоятельно рекомендуется использовать его в версии 0.7, так как проверка в этой версии еще не выполняется на уровне языка.
Поэтому, если вы разрешаете компилировать свой контракт в обеих версиях, вам следует включить библиотеку.
pragma solidity gt;=0.7.0 lt;0.9.0; library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256 c) { c = a b; assert(c gt;= a); return c; } } contract MyContract { using SafeMath for uint256; function foo() external pure { uint256 number = 1; number.add(1); } }
Комментарии:
1. хорошо, и что произойдет, если вы не используете безопасный путь и произойдет переполнение/недостаточный поток, отменит ли это транзакцию, но в конечном итоге будет стоить больше газа?
2. @msa720 В версии 0.8 транзакция возвращается… В версии 0.7 число просто переполняется или переполняется. Например, у вас есть
uint8
(минимальное значение 0, максимальное значение 255) со значением 0. Если вы вычтете 1 из этого числа, оно переполнится, в результате чего получится 255.