Ethereum: Reverting with GS026 error for isValidSignature
function call
Introduction
In this article, we will be exploring the isValidSignature
function in Ethereum, which is used to verify the authenticity and integrity of signed messages. We will also demonstrate how to use it to sign a message using the EOA (Easy Access Owner) wallet.
What is isValidSignature
?
The isValidSignature
function takes two parameters:
-
messageHash
: The hash of the message being signed.
-
signature
: The digital signature of the sender, generated by signing the message with their private key.
Example Code
Here’s an example code snippet that demonstrates how to use isValidSignature
to sign a message using the EOA wallet:
import { ethers } from 'ethers';
// Set up the wallet and provider
const privateKey = "0x1234567890abcdef";
const provider = new ethers.providers.JsonRpcProvider("
// Create a new wallet instance
const wallet = new ethers.Wallet(privateKey, provider);
// Define the message to be signed
const message = "hello";
// Get the gas limit for signing (in ETH)
const gasLimit = 20000; // You can adjust this value according to your needs
// Call isValidSignature function with the message hash and signature
async function isValidSignature(messageHash, signature) {
try {
const txReceipt = await wallet.signMessage(messageHash, signature);
return true;
} catch (error) {
console.error(error);
return false;
}
}
// Sign a new message using EOA wallet
const signedMessage = await isValidSignature(messageHash, "0x1234567890abcdef"); // Replace with your own private key
if (!signedMessage) {
console.log("Error: Unable to sign the message.");
} else {
console.log(The signature is valid. Message hash: ${messageHash}
);
}
GS026 Error Handling
When using the isValidSignature
function, you might encounter a GS026 error if the provided signature does not match with the expected one or if there are any issues with the wallet’s private key.
Here’s an example code snippet that demonstrates how to handle this error:
import { ethers } from 'ethers';
// Set up the wallet and provider
const privateKey = "0x1234567890abcdef";
const provider = new ethers.providers.JsonRpcProvider("
// Create a new wallet instance
const wallet = new ethers.Wallet(privateKey, provider);
// Define the message to be signed
const message = "hello";
// Get the gas limit for signing (in ETH)
const gasLimit = 20000; // You can adjust this value according to your needs
try {
async function isValidSignature(messageHash, signature) {
try {
const txReceipt = await wallet.signMessage(messageHash, signature);
return true;
} catch (error) {
if (error.code === "GS026") {
console.error("Error: GS026 error occurred. Check the private key.");
return false;
} else {
throw error;
}
}
}
// Call isValidSignature function with the message hash and signature
const signedMessage = await isValidSignature(messageHash, "0x1234567890abcdef");
if (!signedMessage) {
console.log("Error: Unable to sign the message.");
} else {
console.log(The signature is valid. Message hash: ${messageHash}
);
}
} catch (error) {
console.error(error);
}
Best Practices
When using isValidSignature
function, keep in mind the following best practices:
- Always verify the gas limit to ensure that the signing operation has enough available gas.
- Use a secure private key and wallet instance.