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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package utils
import (
"crypto/ecdsa"
"crypto/elliptic"
"crypto/rand"
"example.com/m/log"
"fmt"
"github.com/ethereum/go-ethereum/accounts/keystore"
"github.com/ethereum/go-ethereum/crypto"
"io/ioutil"
"math/big"
"os"
)
const KEYPATH_PWD = "keystore"
func GenerateRandomNumber(privateKey *ecdsa.PrivateKey, length int64) *big.Int {
// 生成一个随机数
randNum, err := rand.Int(rand.Reader, elliptic.P256().Params().N)
if err != nil {
log.Error("Error generating random number:", err)
}
randNum.Mod(randNum, big.NewInt(length))
log.Info("Generating random number:", randNum)
return randNum
}
func GetPrv() (*ecdsa.PrivateKey, error) {
if _, err := os.Stat(KEYPATH_PWD); os.IsNotExist(err) {
//log.Info("Keystore not found. Generating a new one...")
// 生成私钥
privateKey, err := generatePrivateKey()
if err != nil {
log.Error("Error generating private key:", err)
return nil, err
}
// 保存私钥到 keystore 文件
err = savePrivateKey(privateKey)
if err != nil {
log.Error("Error saving private key:", err)
return nil, err
}
//log.Info("Keystore generated successfully.")
return privateKey, nil
} else {
//log.Info("Keystore found. Reading private key...")
// 读取私钥
privateKey, err := readPrivateKey()
if err != nil || privateKey == nil {
log.Error("Error reading private key:", err)
return nil, err
}
//log.Info("Private key read successfully:", privateKey)
return privateKey, nil
}
}
func generatePrivateKey() (*ecdsa.PrivateKey, error) {
return crypto.GenerateKey()
}
func savePrivateKey(privateKey *ecdsa.PrivateKey) error {
ks := keystore.NewKeyStore(KEYPATH_PWD, keystore.StandardScryptN, keystore.StandardScryptP)
account, err := ks.ImportECDSA(privateKey, KEYPATH_PWD)
if err != nil {
log.Fatal(err)
}
fmt.Println(account.Address.Hex())
return nil
}
func readPrivateKey() (*ecdsa.PrivateKey, error) {
file, err := ioutil.ReadDir(KEYPATH_PWD)
if err != nil {
return nil, err
}
for _, info := range file {
keystoreFile := fmt.Sprintf("%s%s%s", KEYPATH_PWD, "/", info.Name())
jsonBytes, err := ioutil.ReadFile(keystoreFile)
if err != nil {
log.Error("import ecdsa keystore error: ", err)
continue
}
key, err := keystore.DecryptKey(jsonBytes, KEYPATH_PWD)
if err != nil {
log.Error("keystore decrypt key failed:", err)
continue
}
return key.PrivateKey, nil
}
return nil, nil
}