Created
February 16, 2018 03:03
-
-
Save dominiek/9fecd4eb37f6e1fb23232a80df9739ca to your computer and use it in GitHub Desktop.
ethereum_ecrecover_native_contract.go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ECRECOVER implemented as a native contract. | |
type ecrecover struct{} | |
func (c *ecrecover) RequiredGas(input []byte) uint64 { | |
return params.EcrecoverGas | |
} | |
func (c *ecrecover) Run(input []byte) ([]byte, error) { | |
const ecRecoverInputLength = 128 | |
input = common.RightPadBytes(input, ecRecoverInputLength) | |
// "input" is (hash, v, r, s), each 32 bytes | |
// but for ecrecover we want (r, s, v) | |
r := new(big.Int).SetBytes(input[64:96]) | |
s := new(big.Int).SetBytes(input[96:128]) | |
v := input[63] - 27 | |
// tighter sig s values input homestead only apply to tx sigs | |
if !allZero(input[32:63]) || !crypto.ValidateSignatureValues(v, r, s, false) { | |
return nil, nil | |
} | |
// v needs to be at the end for libsecp256k1 | |
pubKey, err := crypto.Ecrecover(input[:32], append(input[64:128], v)) | |
// make sure the public key is a valid one | |
if err != nil { | |
return nil, nil | |
} | |
// the first byte of pubkey is bitcoin heritage | |
return common.LeftPadBytes(crypto.Keccak256(pubKey[1:])[12:], 32), nil | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment