> For the complete documentation index, see [llms.txt](https://zokyo-auditing-tutorials.gitbook.io/zokyo-gas-savings/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://zokyo-auditing-tutorials.gitbook.io/zokyo-gas-savings/tutorials/gas-saving-tutorial-27-efficient-boolean-comparison.md).

# Gas Saving Tutorial 27: Efficient Boolean Comparison

{% hint style="info" %}
[**Book an audit with Zokyo**](https://www.zokyo.io/)
{% endhint %}

**Introduction:** In smart contract development, every bit of gas saved is crucial, especially for functions that get called frequently. One common micro-optimization that often goes unnoticed is how boolean values are compared. In this tutorial, we'll show you how to make your boolean comparisons more gas-efficient in Solidity.

**Concept:** Booleans inherently represent `true` or `false`. Comparing them directly to `true` or `false` is redundant and slightly gas inefficient. Rather than using `if (booleanValue == true)`, you can simply use `if (booleanValue)`. For false checks, instead of `if (booleanValue == false)`, `if (!booleanValue)` can be used.

Benefits include:

1. **Gas Efficiency:** Avoiding the direct comparison conserves some gas as fewer opcodes are executed in the EVM.
2. **Code Clarity:** Directly using the boolean value usually results in more readable and concise code.

**Example:**

Given the code snippet in a governance system:

```solidity
solidityCopy codefunction voteOnProposal(uint256 proposalId)
    external
    onlyRegisteredVoter
{
    require(
        hasVoted[msg.sender][proposalId] == false, //@audit gas: instead of comparing to a constant, just use "hasVoted[msg.sender][proposalId]"
        "Voter has already voted on this proposal!"
    );
    ...
}
```

The optimized boolean comparison would be:

```solidity
solidityCopy codefunction voteOnProposal(uint256 proposalId)
    external
    onlyRegisteredVoter
{
    require(
        !hasVoted[msg.sender][proposalId], // Simply negate the boolean value for a false check
        "Voter has already voted on this proposal!"
    );
    ...
}
```

**Recommendation:**

1. Examine your contracts for boolean comparisons using `== true` or `== false`.
2. Replace these direct comparisons with the efficient boolean evaluations.
3. Test to make sure the logic remains consistent and the behavior is as intended.

**Conclusion:**

Though the savings from boolean comparison optimizations might seem minute, they add up to provide a more gas-efficient and cleaner codebase. In projects with a multitude of such comparisons, the aggregated savings over numerous transactions can be significant. Always aim for efficient, clean code that accomplishes the same objective with fewer operations.
