Ethereum: Rollback with GS026 error for calling “isValidSignature” function
Introduction
In this article, we will explore the isValidSignature
function in Ethereum, which is used to verify the authenticity and integrity of signed messages. We will also show you how to use it to sign a message using an Easy Owner Access (EOA) wallet.
What is “isValidSignature”?
The “isValidSignature” function has two parameters:
messageHash
: Hash of the message being signed.
signature
: The sender’s digital signature, generated by signing the message with their private key.
Code Example
Here is a sample code snippet showing how to use “isValidSignature” to sign a message using an EOA wallet:
import { ethers } from 'eters';
// Set 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 sign
const message = "hello";
// Get the gas limit for signing (in ETH)
const gasLimit = 20000; // You can adapt this value to your needs
// Call isValidSignature function with message hash and signature
async function isValidSignature(messageHash, signature) {
Attempt {
const txReceipt = await wallet.signMessage(messageHash, signature);
return true;
} catch(error) {
console.error(error);
return false;
}
}
// Sign a new message using EOA wallet
const signatureMessage = await isValidSignature(messageHash, "0x1234567890abcdef"); // Replace with your private key
if (!signedMessage) {
console.log("Error: Message cannot be signed.");
} else {
console.log(Signature is valid. Message hash: ${messageHash}
);
}
Handling GS026 errors
When using the isValidSignature
function, a GS026 error may occur if the signature provided does not match the expected one or if there are issues with the wallet’s private key.
Here is a sample code snippet showing how to handle this error:
import { ethers } from 'eters';
// Setup 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 sign
const message = "hello";
// Get the gas limit for signing (in ETH)
const gasLimit = 20000; // You can adjust this value to your needs
Attempt {
async function isValidSignature(messageHash, signature) {
Attempt {
const txReceipt = await wallet.signMessage(messageHash, signature);
return true;
} catch(error) {
if (error code === "GS026") {
console.error("Error: GS026 error occurred. Please check your private key.");
return false;
} else {
throw an error;
}
}
}
// Call the isValidSignature function with the message hash and signature
const signatureMessage = await isValidSignature(messageHash, "0x1234567890abcdef");
if (!signedMessage) {
console.log("Error: Message cannot be signed.");
} else {
console.log(Signature is valid. Message hash: ${messageHash}
);
}
} catch (error) {
console.error(error);
}
Best Practices
When using the isValidSignature function, keep the following best practices in mind:
- Always check the gas limit to ensure that the signing task has enough gas available.
- Use a secure private key and wallet instance.