跳到主要内容

Using Assembly for Math Operations

When optimizing gas usage in Ethereum smart contracts, common mathematical operations can be made more efficient using assembly. While Solidity provides high-level math operations, using assembly implementations can lead to significant gas savings.

Standard vs Assembly Math Operations

Here's a comparison showing both approaches:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

contract MathOperations {
// Standard implementation
function standardMax(uint256 x, uint256 y) public pure returns (uint256) {
return x > y ? x : y;
}

// Assembly optimized implementation
function assemblyMax(uint256 x, uint256 y) public pure returns (uint256 z) {
/// @solidity memory-safe-assembly
assembly {
z := xor(x, mul(xor(x, y), gt(y, x)))
}
}

// Standard implementation
function standardMin(uint256 x, uint256 y) public pure returns (uint256) {
return x < y ? x : y;
}

// Assembly optimized implementation
function assemblyMin(uint256 x, uint256 y) public pure returns (uint256 z) {
/// @solidity memory-safe-assembly
assembly {
z := xor(x, mul(xor(x, y), lt(y, x)))
}
}
}

Gas Comparison

OperationStandard ImplementationAssembly ImplementationPotential Savings
Max~300 gas~200 gas~100 gas
Min~300 gas~200 gas~100 gas

Common Assembly Math Operations

  1. Maximum Value
function max(uint256 x, uint256 y) public pure returns (uint256 z) {
assembly {
z := xor(x, mul(xor(x, y), gt(y, x)))
}
}
  1. Minimum Value
function min(uint256 x, uint256 y) public pure returns (uint256 z) {
assembly {
z := xor(x, mul(xor(x, y), lt(y, x)))
}
}
  1. Average (with rounding up)
function average(uint256 x, uint256 y) public pure returns (uint256 z) {
assembly {
z := add(div(add(x, y), 2), and(and(x, y), 1))
}
}

Why Assembly is More Efficient

  1. Fewer Operations: Assembly implementations often use fewer EVM operations than their high-level counterparts.

  2. No Conditional Jumps: Assembly implementations can avoid conditional jumps (JUMPI operations) which are gas-intensive.

  3. Direct Memory Access: Assembly allows direct manipulation of values without additional overhead.

When to Use Assembly Math

Recommended for:

  • High-frequency mathematical operations
  • Gas-critical contracts
  • Simple mathematical functions
  • When maximum efficiency is required

Not recommended for:

  • Complex mathematical operations
  • When code readability is crucial
  • When maintaining type safety is important
  • Inexperienced developers

Additional Resources

For more optimized math operations, consider exploring:

Warning: Assembly code bypasses Solidity's safety features. Ensure thorough testing and auditing before deployment.

Recommendations for gas optimization:

🌟 Consider using these assembly implementations for frequently called math operations in your smart contracts.