Вам нужна безопасная дорожка в версии Solidity 0.8 , и если нет, вы все равно можете ее импортировать?

#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.