Rock Paper Scissors

First Flight #38
Beginner FriendlySolidity
100 EXP
View results
Submission Details
Severity: low
Invalid

Gas Optimization Opportunities in Winner Determination Logic

Summary

The RockPaperScissors smart contract contains optimization opportunities in its winner determination logic. Specifically, there's a redundant initialization of the turnWinner variable in the _determineWinner function, and the winner determination flow in the same function can be restructured to improve gas efficiency.

Vulnerability Details

Two inefficiencies were identified in the _determineWinner function (lines 449-496):

  • Redundant Variable Initialization:

address turnWinner = address(0);

This initialization is unnecessary as Solidity already initializes all variables to their default values (which is address(0) for address types).

  • Suboptimal Control Flow Structure:
    The current implementation for determining the overall game winner uses nested if-else statements:

if (game.scoreA > game.scoreB) {
winner = game.playerA;
} else if (game.scoreB > game.scoreA) {
winner = game.playerB;
} else {
// This should never happen with odd turns, but just in case
// of timeouts or other unusual scenarios, handle as a tie
_handleTie(_gameId);
return;
}
_finishGame(_gameId, winner);

This structure requires an additional variable assignment and potentially unnecessary comparisons.

Impact

The impact of these issues is minor:

  • Slightly Increased Gas Costs: The redundant initialization consumes a small amount of extra gas.

  • Suboptimal Control Flow: The nested if-else structure with additional variable assignment is less gas-efficient than direct function calls.

These inefficiencies do not compromise the security or functional correctness of the contract but represent opportunities for gas optimization.

Tools Used

  • Manual code review

  • Gas optimization analysis

Recommendations

Implement the following changes to optimize gas usage:

  • Remove Redundant Initialization

  • Restructure Winner Determination Logic:

// Directly call the appropriate function instead of using an intermediate variable
if (game.scoreA > game.scoreB) {
_finishGame(_gameId, game.playerA);
} else if (game.scoreB > game.scoreA) {
_finishGame(_gameId, game.playerB);
} else {
_handleTie(_gameId);
}
// No need for return statement here as all paths lead to function calls
Updates

Appeal created

m3dython Lead Judge about 1 month ago
Submission Judgement Published
Invalidated
Reason: Non-acceptable severity
Assigned finding tags:

Gas Optimization

Support

FAQs

Can't find an answer? Chat with us on Discord, Twitter or Linkedin.