-
Notifications
You must be signed in to change notification settings - Fork 30
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Refs #454 -- Added BitOperation to general/build/smart-contracts/gas-…
…optimization (#482) * add bitmap and bitwise operations * update bitmap
- Loading branch information
Showing
1 changed file
with
48 additions
and
0 deletions.
There are no files selected for viewing
48 changes: 48 additions & 0 deletions
48
docs/general/build/smart-contracts/gas-optimization/bitmap.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
--- | ||
displayed_sidebar: generalSidebar | ||
--- | ||
|
||
# Bitmap & Bitwise operation | ||
|
||
Storing data on the blockchain is extremely expensive. To decrease gas costs, innovative projects implement clever techniques. The method we're discussing today is often found in the source code of leading projects. | ||
|
||
Consider a `uint8`, represented in binary as `00000000`, where each bit can be either `0` or `1`. Traditionally, `1` is treated as true and `0` as false. This strategy allows for the effective and economical management of boolean value through bitwise operation. | ||
|
||
In Solidity, `1 << n` represents a bit shift operation, moving the number `1` left by `n` bits, with the right-hand vacated bits filled with `0`. For example, if `n` is `2`, then `1 << 2` results in `100`. | ||
|
||
|
||
**Demo Code** | ||
|
||
The following demonstrates managing the same data using both a boolean array and bitwise operation. | ||
|
||
```solidity | ||
contract Bitmap { | ||
bool[8] boolArrayImplementation; | ||
uint8 bitmapImplementation; | ||
function setBoolArrayData(bool[8] memory data) external { | ||
boolArrayImplementation = data; | ||
} | ||
function setBitmapData(uint8 data) external { | ||
bitmapImplementation = data; | ||
} | ||
// gas:35729 | ||
function readBoolArray(uint8 index) external returns (bool) { | ||
return boolArrayImplementation[index]; | ||
} | ||
// gas:22366 | ||
function readBitmap(uint indexFromRight) external returns (bool) { | ||
uint256 bitAtIndex = bitmapImplementation & (1 << indexFromRight); | ||
return bitAtIndex > 0; | ||
} | ||
} | ||
``` | ||
|
||
In the `readBitmap` function, The `&` performs an `AND` operation on each bit of `bitmapImplementation` and `(1 << indexFromRight)`. The resulting bit is `1` only if both bits at that position are `1`, otherwise, it's `0`. This operation is commonly used to check if a specific bit is set to `1`. | ||
|
||
### Gas Optimization Suggestions: | ||
|
||
🌟Considering practical scenarios, bitwise operators can be used for managing certain variables to save gas. |