Ethereum: How can I fix this: (Non-canonical signature: S value is unnecessarily high)

Ethereum Scripting Issue: Fixing Non-Canonical Signature Error

Ethereum: How can I fix this: (Non-canonical signature: S value is unnecessarily high)

As a developer working with Ethereum smart contracts, you are probably no stranger to the complexities of writing and testing scripts. However, sometimes you may encounter issues that seem daunting. In this article, we will delve into the details of an error that occurs when using ECDSA (Elliptic Curve Digital Signature Algorithm) to sign transactions on the Ethereum network: “non-canonical signature” errors.

What is a non-canonical signature?

In Ethereum, a non-canonical signature refers to a signature in which the “v” (version) field does not match the expected version 1. The “v” field should be “0” or “4”, which are used for Verifiable Random Functions (VRFs) and digital signatures.

Error: Non-canonical signature

When you encounter a non-canonical signature, you will see an error message like this:

Ethereum: Non-canonical signature: S value is unnecessarily large

This error usually occurs when a script tries to verify a signature across multiple accounts. Here is what might happen in your code:

Issue 1: Incorrect use of getTransactionCount

The problem arises from incorrect use of the getTransactionCount function, which returns an integer representing the number of transactions on the Ethereum network. However, this number does not take into account different blocks and transactions.

consttransactionCount = wait getTransactionCount();

To work around this, use getBalanceOf instead:

const balance = wait ethers.getBalance(accountAddress);

transactionCount = wait ethers.getCountCountTransaction(AccountAddress);

Problem 2: Incorrect use of the `sign'' function.

The second problem is related to thesign'' function. In Ethereum, you should always usesign'' with a specific key or address to sign transactions.

const signature = wait ethers.signTransaction(transaction, accountAddress);

Example of corrected code

Here is an example of what the corrected script might look like:

import * as ethers fromethers'';

consttransactionCount = await ethers.getTransactionCount();

const balance = wait ethers.getBalance("accountAddress");

// Create a new signable transaction

const transaction = {

data: [

// Transaction data including account address and signed transaction

],

nonce: translationCount,

};

const signature = wait ethers.signTransaction(transaction);

Conclusion

In conclusion, the above issues can arise when writing scripts to create Ethereum transactions. By understanding the proper use of getTransactionCount, thesign` function, and other functions, you should be able to avoid non-canonical signature errors.

For more information on Ethereum scripting and development, see the official [Ethereum documentation] ( or online resources such as the [Etherscan Developer Portal] ( and the [Truffle Suite Guide] (

Leave a Comment

Your email address will not be published. Required fields are marked *