ecRecover function
Given an arbitrary message hash and an Ethereum message signature encoded in bytes, returns the public key that was used to sign it. https://github.com/web3j/web3j/blob/c0b7b9c2769a466215d416696021aa75127c2ff1/crypto/src/main/java/org/web3j/crypto/Sign.java#L241
Implementation
Uint8List ecRecover(Uint8List messageHash, MsgSignature signatureData) {
final r = padUint8ListTo32(unsignedIntToBytes(signatureData.r));
final s = padUint8ListTo32(unsignedIntToBytes(signatureData.s));
assert(r.length == 32);
assert(s.length == 32);
final header = signatureData.v & 0xFF;
// The header byte: 0x1B = first key with even y, 0x1C = first key with odd y,
// 0x1D = second key with even y, 0x1E = second key with odd y
if (header < 27 || header > 34) {
throw Exception('Header byte out of range: $header');
}
final sig = ECSignature(signatureData.r, signatureData.s);
final recId = header - 27;
final pubKey = _recoverFromSignature(recId, sig, messageHash, params);
if (pubKey == null) {
throw Exception('Could not recover public key from signature');
}
return unsignedIntToBytes(pubKey);
}