forked from gaohtao/TomBlockChain
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwallets.go
127 lines (106 loc) · 3.09 KB
/
wallets.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
package main
import (
"bytes"
"crypto/elliptic"
"encoding/gob"
"fmt"
"io/ioutil"
"log"
"os"
)
const walletFile = "wallet.dat"
//定义钱包集,里面通过map存储了多个钱包
type Wallets struct{
Store map[string]*Wallet //这里的Store变量必须首字母大写,这样才能在序列化时被输出。
}
//读取文件建立钱包集
func NewWallets() (*Wallets,error){
wallets := Wallets{}
wallets.Store = make(map[string]*Wallet)
//改造: 如果发现钱包文件存在就读取文件内容,恢复钱包地址;不存在就创建文件,并新建地址。
_,err := os.Stat(walletFile)
if os.IsNotExist(err){ //检查文件是否存在
fmt.Printf("钱包文件(%s)不存在,创建钱包文件...\n",walletFile)
wallets.CreateWallet()
wallets.SaveToFile2() //钱包集重新写入文件
err=nil //必须清空错误信息
}else{
err = wallets.LoadFromFile()
}
return &wallets,err
}
//创建钱包,返回字符串形式的钱包地址
func (ws *Wallets) CreateWallet() string{
wallet := NewWallet()
address := fmt.Sprintf("%s",wallet.GetAddress())
ws.Store[address] = wallet
return address
}
//根据地址获取钱包
func (ws *Wallets) GetWallet(address string) Wallet{
//注意这里可能会犯错误。 如果在钱包集ws中找不到指定的钱包地址,就会出现空指针ws.Store[address]是nil,接着*ws.Store[address]就会出错了。
//容易出现矿工的钱包地址没在钱包集中情况。
//fmt.Printf("ws.Store[address]=",ws.Store[address])
//fmt.Println("")
return *ws.Store[address]
}
//获取钱包集中的所有地址,返回字符串数组
func (ws *Wallets) GetAllAddress() []string{
var alladdress []string
for address,_ := range ws.Store{
alladdress = append(alladdress,address)
}
return alladdress
}
// Encode via Gob to file
func (ws *Wallets) SaveToFile() {
file, err := os.Create(walletFile)
if err != nil {
log.Panic(err)
}
gob.Register(elliptic.P256()) //注册钱包地址中用的椭圆曲线
encoder := gob.NewEncoder(file)
err = encoder.Encode(ws)
if err != nil {
log.Panic(err)
}
file.Close()
}
//把ws序列化后写入文件保存
func (ws *Wallets) SaveToFile2() {
var content bytes.Buffer
gob.Register(elliptic.P256()) //注册钱包地址中用的椭圆曲线
encoder := gob.NewEncoder(&content)
err := encoder.Encode(ws)
if err != nil {
log.Panic(err)
}
err = ioutil.WriteFile(walletFile,content.Bytes(),0777)
if err != nil {
log.Panic(err)
}
}
//读取文件内容,反序列化成钱包集, 要求这个文件必须存在
func (ws *Wallets) LoadFromFile() error{
////检查文件是否存在
//_,err := os.Stat(walletFile)
//if os.IsNotExist(err){
// log.Panic(err)
// return err
//}
fileContent,err := ioutil.ReadFile(walletFile)
if err !=nil{
log.Panic(err)
return err
}
var wallets Wallets //接受反序列化的临时变量
gob.Register(elliptic.P256())
decoder := gob.NewDecoder(bytes.NewReader(fileContent))
err = decoder.Decode(&wallets)
if err !=nil{
log.Panic(err)
return err
}
ws.Store = wallets.Store //把当前对象的store替换掉
return nil
}