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
#!/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
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 lastSeen(n = 720, use_block_number = False):
last = w3.eth.blockNumber
signers = set(map(lambda x: x[2:21],getSigners()))
for i in range(n):
if not signers: break
block = last - i
address = w3.eth.getBlock(block).proofOfAuthorityData[:19].decode('ascii')
if address in signers:
print("{}: {}".format(address, block if use_block_number else i))
signers.remove(address)
for address in signers:
print("{}: -1".format(address))
if __name__ == "__main__":
parser = argparse.ArgumentParser(description=
"""Muestra la cantidad de bloques transcurridos desde la ultima aparición
de cada uno de los selladores de la BFA. Si un sellador no ha aparecido por
un cierto tiempo (por default 1 hora) imprime -1.""")
parser.add_argument("-n", help='Máxima cantidad de bloques a recorrer. Default: 720 (1 hora)',type=int, default=720)
parser.add_argument("-b", "--blockNumber", help="Muestra el número de bloque en lugar de la cantidad de bloques transcurridos", action="store_true")
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)
lastSeen(args.n, args.blockNumber)