-
Notifications
You must be signed in to change notification settings - Fork 1
/
walletmanager.go
130 lines (105 loc) · 2.64 KB
/
walletmanager.go
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package main
import (
"bytes"
"crypto/elliptic"
"encoding/gob"
"fmt"
"io/ioutil"
"sort"
)
// 负责对外,管理生成的钱包(公钥私钥)
//私钥1->公钥-》地址1
//私钥2->公钥-》地址2
//私钥3->公钥-》地址3
//私钥4->公钥-》地址4
type WalletManager struct {
//定义一个map来管理所有的钱包
//key:地址
//value:wallet结构(公钥,私钥)
Wallets map[string]*wallet
}
//创建walletManager结构
func NewWalletManager() *WalletManager {
//创建一个, Wallets map[string]*wallet
var wm WalletManager
//分配空间,一定要分配,否则没有空间
wm.Wallets = make(map[string]*wallet)
//从本地加载已经创建的钱包,写入Wallets结构
if !wm.loadFile() {
return nil
}
//返回 walletManager
return &wm
}
func (wm *WalletManager) createWallet() string {
// 创建秘钥对
w := newWalletKeyPair()
if w == nil {
fmt.Println("newWalletKeyPair 失败!")
return ""
}
// 获取地址
address := w.getAddress()
//把地址和wallet写入map中: Wallets map[string]*wallet
wm.Wallets[address] = w //<<<--------- 重要
// 将秘钥对写入磁盘
if !wm.saveFile() {
return ""
}
// 返回给cli新地址
return address
}
const walletFile = "wallet.dat"
func (wm *WalletManager) saveFile() bool {
//使用gob对wm进行编码
var buffer bytes.Buffer
//未注册接口函数
// encoder.Encode err: gob: type not registered for interface: elliptic.p256Curve
//注册一下接口函数,这样gob才能够正确的编码
gob.Register(elliptic.P256())
encoder := gob.NewEncoder(&buffer)
err := encoder.Encode(wm)
if err != nil {
fmt.Println("encoder.Encode err:", err)
return false
}
//将walletManager写入磁盘
err = ioutil.WriteFile(walletFile, buffer.Bytes(), 0600)
if err != nil {
fmt.Println("ioutil.WriteFile err:", err)
return false
}
return true
}
//读取wallet.dat文件,加载wm中
func (wm *WalletManager) loadFile() bool {
//判断文件是否存在
if !isFileExist(walletFile) {
fmt.Println("文件不存在,无需加载!")
return true
}
//读取文件
content, err := ioutil.ReadFile(walletFile)
if err != nil {
fmt.Println("ioutil.ReadFile err:", err)
return false
}
gob.Register(elliptic.P256())
decoder := gob.NewDecoder(bytes.NewReader(content))
//解密赋值,赋值给wm:====>map
err = decoder.Decode(wm)
if err != nil {
fmt.Println("decoder.Decode err:", err)
return false
}
return true
}
func (wm *WalletManager) listAddresses() []string {
var addresses []string
for address := range wm.Wallets {
addresses = append(addresses, address)
}
//排序, 升序
sort.Strings(addresses)
return addresses
}