Browse Source

Refactor/reentrancy guard gas optimization #1056 (#1057)

* optimizing ReentrancyGuard gas usage

* style fixed
Alex 7 years ago
parent
commit
1200969eb6
1 changed files with 12 additions and 5 deletions
  1. 12 5
      contracts/ReentrancyGuard.sol

+ 12 - 5
contracts/ReentrancyGuard.sol

@@ -3,16 +3,23 @@ pragma solidity ^0.4.24;
 
 /**
  * @title Helps contracts guard against reentrancy attacks.
- * @author Remco Bloemen <remco@2π.com>
+ * @author Remco Bloemen <remco@2π.com>, Eenae <alexey@mixbytes.io>
  * @dev If you mark a function `nonReentrant`, you should also
  * mark it `external`.
  */
 contract ReentrancyGuard {
 
+  /// @dev Constant for unlocked guard state - non-zero to prevent extra gas costs.
+  /// See: https://github.com/OpenZeppelin/openzeppelin-solidity/issues/1056
+  uint private constant REENTRANCY_GUARD_FREE = 1;
+
+  /// @dev Constant for locked guard state
+  uint private constant REENTRANCY_GUARD_LOCKED = 2;
+
   /**
    * @dev We use a single lock for the whole contract.
    */
-  bool private reentrancyLock = false;
+  uint private reentrancyLock = REENTRANCY_GUARD_FREE;
 
   /**
    * @dev Prevents a contract from calling itself, directly or indirectly.
@@ -23,10 +30,10 @@ contract ReentrancyGuard {
    * wrapper marked as `nonReentrant`.
    */
   modifier nonReentrant() {
-    require(!reentrancyLock);
-    reentrancyLock = true;
+    require(reentrancyLock == REENTRANCY_GUARD_FREE);
+    reentrancyLock = REENTRANCY_GUARD_LOCKED;
     _;
-    reentrancyLock = false;
+    reentrancyLock = REENTRANCY_GUARD_FREE;
   }
 
 }