/
CLI.go
175 lines (169 loc) · 4.92 KB
/
CLI.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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
package BLC
import (
"flag"
"fmt"
"log"
"os"
)
//对blockchain的命令进行管理
//client对象
type CLI struct{
BC *BlockChain //区块链对象
}
//用法展示
func PrintUsage() {
fmt.Println("Usage:")
//创建钱包
fmt.Println("\tcreatewallet --创建钱包")
//获取钱包地址列表
fmt.Println("\taccounts --获取地址列表")
//初始化区块链
fmt.Println("\tcreateblockchain -address address ----创建区块链")
//添加区块
fmt.Println("\taddblock -data DATA ----添加区块")
//打印完整的区块信息
fmt.Println("\tprintchain----输出区块链信息")
//通过命令转账
fmt.Println("\t-from From -to -amount AMOUNT -- 发起转账")
fmt.Println("\t转账参数说明")
fmt.Println("\t\t-from FROM -- 转账源地址")
fmt.Println("\t\t-to TO -- 转账目标地址")
fmt.Println("\t\t-AMOUNT amount -- 转账金额")
//查询余额
fmt.Printf("\tgetbalance -address FROM -- 查询指定地址的余额\n")
fmt.Println("\t查询余额参数说明")
fmt.Printf("\t\t-address -- 查询余额的地址\n")
}
//添加区块
func (cli *CLI)addBlock(txs []*Transaction) {
//判断数据库是否存在
if !dbExist(){
fmt.Println("数据库不存在...")
os.Exit(1)
}
blockchain:=BlockChainObject()
//获取到blockchain的对象实例
blockchain.AddBlock(txs)
//cli.BC.AddBlock([]byte(data))
}
//命令行运行函数
func (cli *CLI)Run() {
//检测参数数量
IsValidArgs()
//新建相关命令
//添加区块
addBlockCmd:=flag.NewFlagSet("addblock",flag.ExitOnError)
//创建钱包
createWalletCmd:=flag.NewFlagSet("createwallet",flag.ExitOnError)
//获取地址列表
getAccountsCmd:=flag.NewFlagSet("getaccounts",flag.ExitOnError)
//输出区块链完整的信息
printChainCmd:=flag.NewFlagSet("printchain",flag.ExitOnError)
//创建区块链
createBLCWithGenesisBlockCmd:=flag.NewFlagSet("createblockchain",flag.ExitOnError)
//数据参数
//发起交易
sendCmd:=flag.NewFlagSet("send",flag.ExitOnError)
//查询余额的命令
getBalanceCmd:=flag.NewFlagSet("getBalance",flag.ExitOnError)
//添加区块
flagAddBlockArg:=addBlockCmd.String("data","sent 100 btc to player","添加区块数据")
//创建区块链时指定的矿工地址(接收奖励)
flagCreateBlockchainArg:=createBLCWithGenesisBlockCmd.String("address","troytan","指定接收系统奖励的矿工地址")
//判断命令
flagSendFromArg:=sendCmd.String("from","","转账源地址")
flagSendToArg:=sendCmd.String("to","","转账目标地址")
flagSendAmountArg:=sendCmd.String("amount","","转账金额")
flagGetBalanceArg:=getBalanceCmd.String("address","","要查询的地址")
switch os.Args[1] {
case "accounts":
if err:=getAccountsCmd.Parse(os.Args[2:]);nil!=err{
log.Panicf("parse of cmd getaccounts failed! %v\n",err)
}
case "createwallet":
if err:=createWalletCmd.Parse(os.Args[2:]);nil!=err{
log.Panicf("parse cmd of create wallet failed! %v\n",err)
}
case "getbalance":
if err:=getBalanceCmd.Parse(os.Args[2:]);nil!=err{
log.Panicf("parse cmd get balance failed! %v\n",err)
}
case "send":
if err:=sendCmd.Parse(os.Args[2:]);nil!=err{
log.Panicf("parse sendCmd failed! %v\n",err)
}
case "addblock":
if err:=addBlockCmd.Parse(os.Args[2:]);nil!=err{
log.Panicf("parse addClockCmd failed! %v\n",err)
}
case "printchain":
if err:=printChainCmd.Parse(os.Args[2:]);nil!=err{
log.Panicf("parse printchainCmd failed! %v\n",err)
}
case "createblockchain":
if err:=createBLCWithGenesisBlockCmd.Parse(os.Args[2:]);nil!=err{
log.Panicf("parse createBLCWithGenesisBlockCmd failed! %v\n",err)
}
default:
PrintUsage()
os.Exit(1)
}
//获取地址列表
if getAccountsCmd.Parsed(){
cli.GetAccounts()
}
//创建钱包
if createWalletCmd.Parsed(){
cli.CreateWallets()
}
//查询余额
if getBalanceCmd.Parsed(){
if *flagGetBalanceArg==""{
fmt.Println("请输入查询地址...")
os.Exit(1)
}
cli.getBalance(*flagGetBalanceArg)
}
//添加转账
if sendCmd.Parsed(){
if *flagSendFromArg==""{
fmt.Printf("源地址不能为空...")
PrintUsage()
os.Exit(1)
}
if *flagSendToArg==""{
fmt.Printf("目标地址不能为空...")
PrintUsage()
os.Exit(1)
}
if *flagSendAmountArg==""{
fmt.Printf("转账金额不能为空...")
PrintUsage()
os.Exit(1)
}
fmt.Printf("\tFROM:[%s]\n",JSONToSlice(*flagSendFromArg))
fmt.Printf("\tTO:[%s]\n",JSONToSlice(*flagSendToArg))
fmt.Printf("\tAMOUNT:[%s]\n",JSONToSlice(*flagSendAmountArg))
cli.send(JSONToSlice(*flagSendFromArg),JSONToSlice(*flagSendToArg),JSONToSlice(*flagSendAmountArg))
}
//添加区块命令
if addBlockCmd.Parsed(){
if *flagAddBlockArg==""{
PrintUsage()
os.Exit(1)
}
cli.addBlock([]*Transaction{})
}
//输出区块链信息
if printChainCmd.Parsed(){
cli.printchain()
}
//创建区块链命令
if createBLCWithGenesisBlockCmd.Parsed(){
if *flagCreateBlockchainArg==""{
PrintUsage()
os.Exit(1)
}
cli.createBlockchain(*flagCreateBlockchainArg)
}
}