-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathcli.py
163 lines (136 loc) · 4.75 KB
/
cli.py
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
# coding:utf-8
import argparse
import threading
from block_chain import BlockChain
from wallet import Wallet
from wallets import Wallets
from utxo import UTXOSet
from txpool import TxPool
from xmlrpc.server import SimpleXMLRPCServer
from xmlrpc.client import ServerProxy
from network import P2p, PeerServer, TCPServer
from rpcserver import RPCServer
def new_parser():
parser = argparse.ArgumentParser()
sub_parser = parser.add_subparsers(help='commands')
# A print command
print_parser = sub_parser.add_parser(
'print', help='Print all the blocks of the blockchain')
print_parser.add_argument(type=int, dest='height', help='HEIGHT')
balance_parser = sub_parser.add_parser(
'balance', help='Print balance of address')
balance_parser.add_argument(type=str, dest='address', help='ADDRESS')
send_parser = sub_parser.add_parser(
'send', help='Send AMOUNT of coins from FROM address to TO')
send_parser.add_argument(
'--from', type=str, dest='send_from', help='FROM')
send_parser.add_argument(
'--to', type=str, dest='send_to', help='TO')
send_parser.add_argument(
'--amount', type=int, dest='send_amount', help='AMOUNT')
bc_parser = sub_parser.add_parser(
'createwallet', help='Create a wallet')
bc_parser.add_argument('--createwallet', dest='createwallet', help='create wallet')
prin_wallet_parser = sub_parser.add_parser(
'printwallet', help='print all wallet')
prin_wallet_parser.add_argument('--printwallet', dest='printwallet', help='print wallets')
start_parser = sub_parser.add_parser(
'start', help='start server')
start_parser.add_argument('--start', dest='start', help='start server')
genesis_block_parser = sub_parser.add_parser(
'genesis_block', help='create genesis block')
genesis_block_parser.add_argument('--genesis_block', dest='genesis_block')
return parser
class Cli(object):
def get_balance(self, addr):
bc = BlockChain()
balance = 0
utxo = UTXOSet()
utxo.reindex(bc)
utxos = utxo.find_utxo(addr)
print(utxos)
for fout in utxos:
balance += fout.txoutput.value
print('%s balance is %d' %(addr, balance))
return balance
def create_wallet(self):
w = Wallet.generate_wallet()
ws = Wallets()
ws[w.address] = w
ws.save()
return w.address
def print_all_wallet(self):
ws = Wallets()
wallets = []
for k, _ in ws.items():
wallets.append(k)
return wallets
def send(self, from_addr, to_addr, amount):
bc = BlockChain()
tx = bc.new_transaction(from_addr, to_addr, amount)
# bc.add_block([tx])
tx_pool = TxPool()
tx_pool.add(tx)
try:
server = PeerServer()
server.broadcast_tx(tx)
if tx_pool.is_full():
bc.add_block(tx_pool.txs)
tx_pool.clear()
except Exception as e:
pass
print('send %d from %s to %s' %(amount, from_addr, to_addr))
def print_chain(self, height):
bc = BlockChain()
return bc[height].block_header.serialize()
def create_genesis_block(self):
bc = BlockChain()
w = Wallet.generate_wallet()
ws = Wallets()
ws[w.address] = w
ws.save()
tx = bc.coin_base_tx(w.address)
bc.new_genesis_block(tx)
return w.address
def start():
bc = BlockChain()
utxo_set = UTXOSet()
utxo_set.reindex(bc)
tcpserver = TCPServer()
tcpserver.listen()
tcpserver.run()
rpc = RPCServer(export_instance=Cli())
rpc.start(False)
p2p = P2p()
server = PeerServer()
server.run(p2p)
p2p.run()
def main():
parser = new_parser()
args = parser.parse_args()
s = ServerProxy("http://localhost:9999")
if hasattr(args, 'height'):
block_data = s.print_chain(args.height)
print(block_data)
if hasattr(args, 'address'):
balance = s.get_balance(args.address)
print("%s balance is %d" %(args.address, balance))
if hasattr(args, 'createwallet'):
address = s.create_wallet()
print('Wallet address is %s' % address)
if hasattr(args, 'start'):
start()
if hasattr(args, 'printwallet'):
wallets = s.print_all_wallet()
print('Wallet are:')
for wallet in wallets:
print("\t%s" % wallet)
if hasattr(args, 'genesis_block'):
address = s.create_genesis_block()
print('Genesis Wallet is: %s' % address)
if hasattr(args, 'send_from') \
and hasattr(args, 'send_to') \
and hasattr(args, 'send_amount'):
s.send(args.send_from, args.send_to, args.send_amount)
if __name__ == "__main__":
main()