ecrecover is problematically hardcoded to pre-EIP-155 transactions #2743
Replies: 24 comments 5 replies
-
At least, I think this is what's happening?
Any help would be appreciated. |
Beta Was this translation helpful? Give feedback.
-
Can you provide the actual inputs you're passing to |
Beta Was this translation helpful? Give feedback.
-
In our |
Beta Was this translation helpful? Give feedback.
-
var v = 45; // goerli (5 * 2 + 35)
var publicKey = ecrecover(hash, v, r, s, BigInt(5)); This should do the trick. |
Beta Was this translation helpful? Give feedback.
-
|
Beta Was this translation helpful? Give feedback.
-
I think if you make It should work. Ensure that |
Beta Was this translation helpful? Give feedback.
-
Thanks, but same result. "invalid type" |
Beta Was this translation helpful? Give feedback.
-
Try this:
I'm not able to reproduce your exact error but the above code works. The 2 issues that I found where 1) the |
Beta Was this translation helpful? Give feedback.
-
Invalid type again, pasted exactly as above. Not sure what the disconnect is. Why would v need to be a BigInt? It's typically within a single byte range (0-255) except for Sepolia. |
Beta Was this translation helpful? Give feedback.
-
FYI, if I just hardcode mainnet (27) in there like this:
I no longer get an error and what appears to be a valid byte Buffer. So clearly ecrecover doesn't require a BigInt for v. edit: if I try
I get the same results as 28 and 27, respectively. (yes, 0=28 and 1=27). If I try 45 and 46, I get "invalid signature v value". |
Beta Was this translation helpful? Give feedback.
-
What version of
I used your script exactly in a pure JS file and got the above error. |
Beta Was this translation helpful? Give feedback.
-
I'm using the stock npm repos. Here's my full list of installs.
|
Beta Was this translation helpful? Give feedback.
-
Several of those are quite out of date. |
Beta Was this translation helpful? Give feedback.
-
Updated everything and restarted node console. Still "invalid type" when trying to provide a BigInt for v.
Here is the full script:
|
Beta Was this translation helpful? Give feedback.
-
Is the first line still possibly the issue? const { ecrecover, toBuffer } = require('@ethereumjs/util');
var digestHashInputToTheSigningAlgorithm = '0xee3a667ed717a89d2012240dc28760ab4df39ab6949267aab31cebc4a33ce735';
var v = BigInt(45);
var our_r_and_s = "0x012345678901234567890123456789012345678901234567890123456789012";
var r = toBuffer(our_r_and_s);
var s = toBuffer(our_r_and_s);
var hash = toBuffer(digestHashInputToTheSigningAlgorithm);
var publicKey = ecrecover(hash, v, r, s, BigInt(5));
console.log(publicKey) |
Beta Was this translation helpful? Give feedback.
-
No. Still doesn't work. Same as before. Are you installing from public repos? What are your package versions? |
Beta Was this translation helpful? Give feedback.
-
Here's an example repo with the most recent version of Just run |
Beta Was this translation helpful? Give feedback.
-
This should work on your install with
Do not use BigInts in your version, use "normal" numbers vor |
Beta Was this translation helpful? Give feedback.
-
And this works for me for:
var { ecsign, ecrecover, pubToAddress, toBuffer } = require('ethereumjs-util');
var Web3 = require('web3')
var web3 = new Web3()
// Given values
var contractAddress = "0xc5edca3ebf230f0df3d75b3138d733fe58d234a0";
var unwrapTxValue = "1000000000000000";
var unwrapTxGasLimit = 1000000;
var unwrapTxGasPrice = "50000000000";
// Given values for col and row
var col = 16;
var row = 16;
// Generate the data for the transaction using the function signature and parameters
var unwrapTxData = web3.eth.abi.encodeFunctionCall({
name: 'unwrap',
type: 'function',
inputs: [{
type: 'uint8',
name: 'col'
},{
type: 'uint8',
name: 'row'
}]
}, [col, row]);
var parameters = [
contractAddress,
unwrapTxValue,
unwrapTxGasLimit,
unwrapTxGasPrice,
unwrapTxData
];
// Encode the parameters
var encodedParameters = web3.eth.abi.encodeParameters(
['address', 'uint256', 'uint256', 'uint256', 'bytes'],
parameters
);
// Hash the encoded parameters
var digestHashInputToTheSigningAlgorithm = web3.utils.keccak256(encodedParameters);
var v = 45
var our_r_and_s = '0x012345678901234567890123456789012345678901234567890123456789012'
var r = toBuffer(our_r_and_s)
var s = toBuffer(our_r_and_s)
var hash = toBuffer(digestHashInputToTheSigningAlgorithm)
var publicKey = ecrecover(hash, v, r, s, 5)
console.log(publicKey) I.e. do not use BigInts but use normal numbers. |
Beta Was this translation helpful? Give feedback.
-
Thanks. That "works" but maybe not? The resulting byte sequence I get for v=45 is identical to v=27. That doesn't seem right, does it?
|
Beta Was this translation helpful? Give feedback.
-
If I take this code
I get I change the final lines to:
I get an error. Which should be, due to EIP-155. (Note: If I now remove the chainId 5 from
I again get |
Beta Was this translation helpful? Give feedback.
-
From EIP-155 |
Beta Was this translation helpful? Give feedback.
-
If you want to have a chat feel free to join our discord! 😄 https://discord.gg/FV4VnwXMG6 |
Beta Was this translation helpful? Give feedback.
-
Ugh. I'm just gonna use pre-eip-155 transactions. This is all too convoluted. (Not to mention solidity ecrecover can't handle Sepolia's chain id.) In your opinions, do you think pre-eip-155 transactions are in any danger of ever being sunset? |
Beta Was this translation helpful? Give feedback.
-
ethereumjs-utils' ecrecover function rejects any attempt to use v = anything other than 27 or 28 which means it only supports pre-EIP-155 transactions. This is self-evidently sub-optimal.
Beta Was this translation helpful? Give feedback.
All reactions