Solidity SafeMath-Unterstützung für uint64

Das häufig verwendete Snippet für SafeMath in Solidity ist das folgende: https://github.com/OpenZeppelin/openzeppelin-solidity/blob/64c324e37c17c5e0501bb746975040d1ae020806/contracts/math/SafeMath.sol

pragma solidity ^0.4.24;


/**
 * @title SafeMath
 * @dev Math operations with safety checks that revert on error
 */
library SafeMath {

  /**
  * @dev Multiplies two numbers, reverts on overflow.
  */
  function mul(uint256 _a, uint256 _b) internal pure returns (uint256) {
    // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (_a == 0) {
      return 0;
    }

    uint256 c = _a * _b;
    require(c / _a == _b);

    return c;
  }

  /**
  * @dev Integer division of two numbers truncating the quotient, reverts on division by zero.
  */
  function div(uint256 _a, uint256 _b) internal pure returns (uint256) {
    require(_b > 0); // Solidity only automatically asserts 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 Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {
    require(_b <= _a);
    uint256 c = _a - _b;

    return c;
  }

  /**
  * @dev Adds two numbers, reverts on overflow.
  */
  function add(uint256 _a, uint256 _b) internal pure returns (uint256) {
    uint256 c = _a + _b;
    require(c >= _a);

    return c;
  }

  /**
  * @dev Divides two numbers and returns the remainder (unsigned integer modulo),
  * reverts when dividing by zero.
  */
  function mod(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b != 0);
    return a % b;
  }
}

Wenn ich den gleichen Ansatz für uint64 verwenden möchte, kann ich dann einfach uint256 finden und durch uint64 ersetzen?

Antworten (1)

Wenn Ihr Problem hauptsächlich darin besteht, einen Unter-/Überlauf zu vermeiden, können Sie etwas Ähnliches mit jeder Ganzzahl tun, auch wenn die Ganzzahl kleiner als uint256 ist.

Das Problem, dem Sie sich im Allgemeinen stellen müssen, ist, dass EVM uint256 am besten verwaltet als uint64 und insbesondere weniger Gas verbrauchen kann, wenn zwei uint256 hinzugefügt werden, als wenn zwei uint64 hinzugefügt werden.

Prüfen Sie also, ob es sinnvoll ist, sie zu verwenden.

Wie auch immer, Sie können sicher die Safemath für uint64 ohne Änderungen umschreiben, aber die Größe der beteiligten Ganzzahlen.