-
Notifications
You must be signed in to change notification settings - Fork 273
Validate input/output against of ecsign/ecrecover in line with the Yellowpaper #20
Comments
that should be caught by seckp256k1's verify I believe |
@wanderer |
We always subtract 27 from seckp so we can think of v as 0 or 1 but v is valid if its 0, 1, 2 or 3 in seckp256k1. I wonder if this is a mistake in the YP. |
Hei guys, I have 1 question: How can I simulate ecrecover function in Solidity? I know the function exists, but it doesn't seem to return the same result as your ecrecover. Node example: var ethUtils = require('ethereumjs-util');
var privkey = new Buffer('3c9229289a6125f7fdf1885a77bb12c37a8d3b4962d936f7e3084dece32a3ca1', 'hex');
var data = ethUtils.sha3('a');
var vrs = ethUtils.ecsign(data, privkey);
var pubkey = ethUtils.ecrecover(data, vrs.v, vrs.r, vrs.s);
// Check !
var check1 = pubkey.toString('hex') ==
ethUtils.privateToPublic(privkey).toString('hex');
var check2 = ethUtils.publicToAddress(pubkey).toString('hex') ==
ethUtils.privateToAddress(privkey).toString('hex');
// Check is ok ! Now, I'm trying this in Solidity: // Sending ::
// "3ac225168df54212a25c1c01fd35bebfea408fdac2e31ddd6f80a4bbf9a5f1cb",
// 27
// "5caec23c6aa80c772fef1a52655cbb46ed5e017573b054ba8d3fa61d9d26df98",
// "48a8a544478726b4b2140b444831c2f0bbd97c819e1344482190c2ad265865ca"
contract Test {
function check(bytes32 data, uint8 v, bytes32 r, bytes32 s) returns(address) {
return ecrecover(data, v, r, s);
}
}
// Result: "0x0000000000000000000000003432313261323563316330316664333562656266" Any ideas how I can compare the result? Thank you !! |
@croqaz Solidity's ecrecover returns an address and not a public key. Re: the private keys. You can use ethereumjs-wallet (or probably keythereum supports that too?) to convert back-and-forth between keyfiles and private keys. |
With #27 merged we check for v = {27,28} |
In Appendix F:
The text was updated successfully, but these errors were encountered: