#!/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)