Golang实现web3.eth.accounts.sign

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package main

import (
"crypto/ecdsa"
"fmt"
"log"

"github.com/ethereum/go-ethereum/common/hexutil"

"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
)

func prefixHash(data []byte) common.Hash {
msg := fmt.Sprintf("\x19Ethereum Signed Message:\n%d%s", len(data), data)
return crypto.Keccak256Hash([]byte(msg))
}
func signMsg(msg, privKeyHex string) ([]byte, ecdsa.PublicKey) {
privKeyECDSA, err := crypto.HexToECDSA(privKeyHex)
if err != nil {
log.Fatal(err)
}
msgHash := prefixHash([]byte(msg))
signature, err := crypto.Sign(msgHash.Bytes(), privKeyECDSA)
if err != nil {
log.Fatal(err)
}
if signature[64] < 27{
signature[64] += 27
}
return signature, privKeyECDSA.PublicKey
}

var fakeP = "4c0883a69102937d6231471b5dbb6204fe5129617082792ae468d01a3f362318"

func main() {
sig, _ := signMsg("Some data", fakeP)
fmt.Println("signature", hexutil.Encode(sig))
}