Newer
Older
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
#!/usr/bin/env python3
from os import environ
ipc_path = "{}/node/geth.ipc".format(environ.get('BFANETWORKDIR', "~/bfa/network"))
rpc_port = 8545
rpc_host = "localhost"
import requests
from web3 import Web3, IPCProvider
from web3.middleware import geth_poa_middleware
from itertools import groupby
import argparse
def getSigners():
session = requests.Session()
payload = {"jsonrpc":"2.0", "method":'clique_getSigners',"params":[],"id":1}
headers = {'Content-type':'application/json'}
response = session.post(
"http://{}:{}".format(rpc_host,rpc_port),
json=payload,
headers=headers)
return response.json()['result']
def getVotes():
session = requests.Session()
payload = {"jsonrpc":"2.0", "method":'clique_getSnapshot',"params":[],"id":1}
headers = {'Content-type':'application/json'}
response = session.post(
"http://{}:{}".format(rpc_host,rpc_port),
json=payload,
headers=headers)
votes = {}
for vote in response.json()['result']['votes']:
if vote['address'] not in votes:
votes[vote['address']] = {signer:"" for signer in getSigners()}
votes[vote['address']][vote['signer']] = vote['authorize']
return votes
if __name__ == "__main__":
parser = argparse.ArgumentParser(description=
"""Muestra el estado de una votación""")
parser.add_argument("--ipc-path", help ="Path del archivo geth.ipc. Default: {}".format(ipc_path))
parser.add_argument("--rpc-port", help ="Puerto RPC. Default: {}".format(rpc_port),type=int)
args = parser.parse_args()
if args.ipc_path:
ipc_path = args.ipc_path
if args.rpc_port:
rpc_port = args.rpc_port
w3 = Web3(Web3.IPCProvider(ipc_path))
w3.middleware_stack.inject(geth_poa_middleware, layer=0)
for proposal, votes in sorted(getVotes().items()):
print("Propuesta: {}".format(proposal))
for voter, vote in sorted(votes.items()):
print("\t{}: {}".format(voter,vote))
tally = { k:len(list(v)) for (k,v) in groupby(sorted(map(str,votes.values())))}
print("A favor: {}, en contra: {}, no votaron: {}\n".format(
tally.get("True",0),
tally.get("False",0),
tally.get("",0)))