Offloading expensive computation to off-chain for saving gas, as simple & fast as possiblePhoto by Shubham Dhage on Unsplash, more artworks at http://guerrillabuzz.com/ Table of Contents i. Introductionii. Practical exampleiii. Conclusion Introduction Ethereum’s high gas problem should not be unfamiliar to you, as a crypto trader, a blockchain developer, or just an enthusiast in the space. With Ether's price standing strong in the $3000 area and gas price on the rise averaging 50–70 Gwei, the gas fee for every transaction is getting more expensive and takes about $4 USD for a simple transfer. There is a way to go around the gas problem, is to put this computation off-chain and let the server do the work. A lot of tutorials online teaching ECDSA involves the use of maths, something about s, r, v, which we all developers (code monkeys) can agree, is boring and difficult to implement without bugs. So in this article, we are just gonna use the built-in functions from contracts written by OpenZeppelin and Ethers.js to build this feature. Practical example In this project, we are going to use a common use case for ECDSA to demonstrate the method, which is setting up a whitelist for an NFT project, and include code snippets to help you get started. This project is written in JavaScript and Solidity. 1. Setup To prepare for ECDSA, you should create a new wallet and use it only for this project as the signature signer. Do not use this wallet for any other purpose but only for signing the message in this project. After creating the wallet, save its private key for later use. 2. Off-chain Signature 2.1. To get started, we will need to first install Ether.js by running: npm run ethers and importing it into the project by: import ethers from ethers 2.2. Then we can initialize the signer instance by creating a new Wallet using the library: const signer = new ethers.Wallet("0x" + "<your private key>"); Remember to add 0x in the prefix of your private key if you exported directly from Metamask. 2.3. Pack the message together, and we can try to pack the address and the nonce for whitelisting: let message = ethers.utils.solidityPack(["address", "uint256"], ["0xabc", "0"]); This is to concatenate the message together to be hashed in the next section. Ethers.js supports a wide range of variables, including string and array like uint256[]: 2.4. Hash the message with keccak256 and sign with the signer wallet: message = ethers.utils.solidityKeccak256(["bytes"], [message]);const signature = await signer.signMessage(ethers.utils.arrayify(message)); This signature is the signature signed for the message with the signer's private key. We can pass this signature along with the verified parameters into the blockchain to ensure that the parameters are valid. The whole code snippet:https://medium.com/media/b7bf0931c9291dc5ff9d222c2f8a4753/href 3. On-chain Verification 3.1. To verify the signature on-chain, we can make use of the contract EDCSA written by OpenZeppelin. To use it, install Openzepplin locally or use it in Remix: npm install @openzeppelin/contracts 3.2. Set up the storage for signer on-chain with a setter: address signer; function setSigner(address _signer) external { signer = _signer;} 3.3. Then pack the values together by abi.encodePacked and hash it with keccack256: bytes32 hash = keccak256(abi.encodePacked(msg.sender, nonce)); 3.4. Turn the signature to an Ethereum signed message: bytes32 message = ECDSA.toEthSignedMessageHash(hash); 3.5. Recover the signer address from the signature: address receivedAddress = ECDSA.recover(message, signature); 3.6. Check if the signer of the message matches the signer store on-chain, only approve if the signer matches: require(receivedAddress != address(0) && receivedAddress == signer); The whole code snippet is:https://medium.com/media/9d470e1a4f48d90b838f2c876555677c/href Conclusion And now you learned how to use ECDSA as simply as possible, without the use of any complex maths. However, there are also tradeoffs of putting computation off-chain but that is beyond the scope of this article. I am going to explain more on this so follow to stay tuned! Want to Connect? You can find me at Twitter Github Discord. Verify Off-chain Results and Whitelist With ECDSA in Solidity Using OpenZeppelin and Ethers.js was originally published in Coinmonks on Medium, where people are continuing the conversation by highlighting and responding to this storyOffloading expensive computation to off-chain for saving gas, as simple & fast as possiblePhoto by Shubham Dhage on Unsplash, more artworks at http://guerrillabuzz.com/ Table of Contents i. Introductionii. Practical exampleiii. Conclusion Introduction Ethereum’s high gas problem should not be unfamiliar to you, as a crypto trader, a blockchain developer, or just an enthusiast in the space. With Ether's price standing strong in the $3000 area and gas price on the rise averaging 50–70 Gwei, the gas fee for every transaction is getting more expensive and takes about $4 USD for a simple transfer. There is a way to go around the gas problem, is to put this computation off-chain and let the server do the work. A lot of tutorials online teaching ECDSA involves the use of maths, something about s, r, v, which we all developers (code monkeys) can agree, is boring and difficult to implement without bugs. So in this article, we are just gonna use the built-in functions from contracts written by OpenZeppelin and Ethers.js to build this feature. Practical example In this project, we are going to use a common use case for ECDSA to demonstrate the method, which is setting up a whitelist for an NFT project, and include code snippets to help you get started. This project is written in JavaScript and Solidity. 1. Setup To prepare for ECDSA, you should create a new wallet and use it only for this project as the signature signer. Do not use this wallet for any other purpose but only for signing the message in this project. After creating the wallet, save its private key for later use. 2. Off-chain Signature 2.1. To get started, we will need to first install Ether.js by running: npm run ethers and importing it into the project by: import ethers from ethers 2.2. Then we can initialize the signer instance by creating a new Wallet using the library: const signer = new ethers.Wallet("0x" + "<your private key>"); Remember to add 0x in the prefix of your private key if you exported directly from Metamask. 2.3. Pack the message together, and we can try to pack the address and the nonce for whitelisting: let message = ethers.utils.solidityPack(["address", "uint256"], ["0xabc", "0"]); This is to concatenate the message together to be hashed in the next section. Ethers.js supports a wide range of variables, including string and array like uint256[]: 2.4. Hash the message with keccak256 and sign with the signer wallet: message = ethers.utils.solidityKeccak256(["bytes"], [message]);const signature = await signer.signMessage(ethers.utils.arrayify(message)); This signature is the signature signed for the message with the signer's private key. We can pass this signature along with the verified parameters into the blockchain to ensure that the parameters are valid. The whole code snippet:https://medium.com/media/b7bf0931c9291dc5ff9d222c2f8a4753/href 3. On-chain Verification 3.1. To verify the signature on-chain, we can make use of the contract EDCSA written by OpenZeppelin. To use it, install Openzepplin locally or use it in Remix: npm install @openzeppelin/contracts 3.2. Set up the storage for signer on-chain with a setter: address signer; function setSigner(address _signer) external { signer = _signer;} 3.3. Then pack the values together by abi.encodePacked and hash it with keccack256: bytes32 hash = keccak256(abi.encodePacked(msg.sender, nonce)); 3.4. Turn the signature to an Ethereum signed message: bytes32 message = ECDSA.toEthSignedMessageHash(hash); 3.5. Recover the signer address from the signature: address receivedAddress = ECDSA.recover(message, signature); 3.6. Check if the signer of the message matches the signer store on-chain, only approve if the signer matches: require(receivedAddress != address(0) && receivedAddress == signer); The whole code snippet is:https://medium.com/media/9d470e1a4f48d90b838f2c876555677c/href Conclusion And now you learned how to use ECDSA as simply as possible, without the use of any complex maths. However, there are also tradeoffs of putting computation off-chain but that is beyond the scope of this article. I am going to explain more on this so follow to stay tuned! Want to Connect? You can find me at Twitter Github Discord. Verify Off-chain Results and Whitelist With ECDSA in Solidity Using OpenZeppelin and Ethers.js was originally published in Coinmonks on Medium, where people are continuing the conversation by highlighting and responding to this story

Verify Off-chain Results and Whitelist With ECDSA in Solidity Using OpenZeppelin and Ethers.js

2025/09/09 21:02

Offloading expensive computation to off-chain for saving gas, as simple & fast as possible

Photo by Shubham Dhage on Unsplash, more artworks at http://guerrillabuzz.com/
Table of Contents
i.   Introduction
ii. Practical example
iii. Conclusion

Introduction

Ethereum’s high gas problem should not be unfamiliar to you, as a crypto trader, a blockchain developer, or just an enthusiast in the space. With Ether's price standing strong in the $3000 area and gas price on the rise averaging 50–70 Gwei, the gas fee for every transaction is getting more expensive and takes about $4 USD for a simple transfer.

There is a way to go around the gas problem, is to put this computation off-chain and let the server do the work.

A lot of tutorials online teaching ECDSA involves the use of maths, something about s, r, v, which we all developers (code monkeys) can agree, is boring and difficult to implement without bugs. So in this article, we are just gonna use the built-in functions from contracts written by OpenZeppelin and Ethers.js to build this feature.

Practical example

In this project, we are going to use a common use case for ECDSA to demonstrate the method, which is setting up a whitelist for an NFT project, and include code snippets to help you get started.

This project is written in JavaScript and Solidity.

1. Setup

To prepare for ECDSA, you should create a new wallet and use it only for this project as the signature signer. Do not use this wallet for any other purpose but only for signing the message in this project.

After creating the wallet, save its private key for later use.

2. Off-chain Signature

2.1. To get started, we will need to first install Ether.js by running:

npm run ethers

and importing it into the project by:

import ethers from ethers

2.2. Then we can initialize the signer instance by creating a new Wallet using the library:

const signer = new ethers.Wallet("0x" + "<your private key>");

Remember to add 0x in the prefix of your private key if you exported directly from Metamask.

2.3. Pack the message together, and we can try to pack the address and the nonce for whitelisting:

let message = ethers.utils.solidityPack(["address", "uint256"], ["0xabc", "0"]);

This is to concatenate the message together to be hashed in the next section. Ethers.js supports a wide range of variables, including string and array like uint256[]:

2.4. Hash the message with keccak256 and sign with the signer wallet:

message = ethers.utils.solidityKeccak256(["bytes"], [message]);
const signature = await signer.signMessage(ethers.utils.arrayify(message));

This signature is the signature signed for the message with the signer's private key.

We can pass this signature along with the verified parameters into the blockchain to ensure that the parameters are valid.

The whole code snippet:

https://medium.com/media/b7bf0931c9291dc5ff9d222c2f8a4753/href

3. On-chain Verification

3.1. To verify the signature on-chain, we can make use of the contract EDCSA written by OpenZeppelin. To use it, install Openzepplin locally or use it in Remix:

npm install @openzeppelin/contracts

3.2. Set up the storage for signer on-chain with a setter:

address signer;
function setSigner(address _signer) external { 
signer = _signer;
}

3.3. Then pack the values together by abi.encodePacked and hash it with keccack256:

bytes32 hash = keccak256(abi.encodePacked(msg.sender, nonce));

3.4. Turn the signature to an Ethereum signed message:

bytes32 message = ECDSA.toEthSignedMessageHash(hash);

3.5. Recover the signer address from the signature:

address receivedAddress = ECDSA.recover(message, signature);

3.6. Check if the signer of the message matches the signer store on-chain, only approve if the signer matches:

require(receivedAddress != address(0) && receivedAddress == signer);

The whole code snippet is:

https://medium.com/media/9d470e1a4f48d90b838f2c876555677c/href

Conclusion

And now you learned how to use ECDSA as simply as possible, without the use of any complex maths. However, there are also tradeoffs of putting computation off-chain but that is beyond the scope of this article. I am going to explain more on this so follow to stay tuned!

Want to Connect?
You can find me at Twitter Github Discord.

Verify Off-chain Results and Whitelist With ECDSA in Solidity Using OpenZeppelin and Ethers.js was originally published in Coinmonks on Medium, where people are continuing the conversation by highlighting and responding to this story.

Disclaimer: The articles reposted on this site are sourced from public platforms and are provided for informational purposes only. They do not necessarily reflect the views of MEXC. All rights remain with the original authors. If you believe any content infringes on third-party rights, please contact [email protected] for removal. MEXC makes no guarantees regarding the accuracy, completeness, or timeliness of the content and is not responsible for any actions taken based on the information provided. The content does not constitute financial, legal, or other professional advice, nor should it be considered a recommendation or endorsement by MEXC.

You May Also Like

Vitalik Buterin Supports Native Rollup Integration on Ethereum

Vitalik Buterin Supports Native Rollup Integration on Ethereum

The post Vitalik Buterin Supports Native Rollup Integration on Ethereum appeared on BitcoinEthereumNews.com. Key Points: Vitalik Buterin supports ZK Rollups for
Share
BitcoinEthereumNews2026/01/19 15:43
Fan Token Firm Chiliz Acquires 2-Time ‘Dota 2’ Champions, OG Esports

Fan Token Firm Chiliz Acquires 2-Time ‘Dota 2’ Champions, OG Esports

The post Fan Token Firm Chiliz Acquires 2-Time ‘Dota 2’ Champions, OG Esports appeared on BitcoinEthereumNews.com. In brief The Chiliz Group has acquired a controlling stake in OG Esports, a prominent competitive gaming organization. OG Esports unveiled its own fan token on Chiliz’s Socios.com platform back in 2020. It recently hit an all-time high price. Chiliz has teased various future team-related benefits for OG token holders, along with a new Web3-related project. The Chiliz Group, which operates the Socios.com crypto fan token platform, announced Tuesday that it has acquired a 51% controlling stake in OG Esports, the competitive gaming organization founded in 2015 by Dota 2 legends Johan “nOtail” Sundstein and Sébastien “Ceb” Debs. OG made history as the first team to win consecutive titles at The International—the annual, high-profile Dota 2 world championship tournament—in 2018 and 2019, and has since expanded into multiple games including Counter-Strike, Honor of Kings, and Marvel Rivals. The team was also the first esports organization to join the Socios platform with the 2020 debut of its own fan token, which Chiliz said recently became the first esports team token to exceed a $100 million market capitalization. OG was recently priced at $16.88, up nearly 9% on the day following the announcement. The token’s price peaked at a new all-time high of $24.78 last week ahead of The International 2025, where OG did not compete this year. Following the acquisition, Xavier Oswald will assume the CEO role, while the co-founders will turn their attention to “a new strategic project consolidating the team’s competitive foundation [and] driving innovation at the intersection of esports and Web3,” per a press release. No further details were provided regarding that project. “Bringing OG into the Chiliz Group is a major step toward further strengthening fan experiences, one where the community doesn’t just watch from the sidelines but gets to shape the journey,” Chiliz CEO Alex Dreyfus…
Share
BitcoinEthereumNews2025/09/18 09:40
NEAR Price Prediction: Testing Critical $1.88 Resistance with $2.10-$2.35 Targets by February 2026

NEAR Price Prediction: Testing Critical $1.88 Resistance with $2.10-$2.35 Targets by February 2026

The post NEAR Price Prediction: Testing Critical $1.88 Resistance with $2.10-$2.35 Targets by February 2026 appeared on BitcoinEthereumNews.com. Rebeca Moen
Share
BitcoinEthereumNews2026/01/19 15:34