# `bfa.py` Script en Python que reporta distintos datos sobre la BFA Este _script_ requiere Python 3 y la biblioteca web3 (que puede instalarse con `pip`). Para funcionar requiere conocer el directorio donde está el _socket_ `geth.ipc` (asume que es `${BFANETWORKDIR}/node/geth.ipc` o, en su defecto `~/bfa/network/node/geth.ipc`), y el puerto RPC (asume que es el 8545). Ambos valores pueden especificarse en la línea de comandos. También puede usarse como biblioteca. La clase BFA tiene un conjunto de métodos que permiten obtener información de un nodo `geth`. ``` bfa@bootnode:~$ bfa.py usage: bfa.py [-h] {signers,sealers,votes,proposals,block} ... bfa.py: error: the following arguments are required: command bfa@bootnode:~$ bfa.py --help usage: bfa.py [-h] {signers,sealers,votes,proposals,block} ... Proporciona información acerca de la Blockchain Federal Argentina positional arguments: {signers,sealers,votes,proposals,block} Consulta a realizar signers (sealers) Información sobre selladores votes (proposals) Indica el estado de una votación block Información sobre un bloque optional arguments: -h, --help show this help message and exit bfa@bootnode:~$ ``` El comando `signers` (o `sealers`) permite obtener información sobre los selladores (similar al script `sealer_status`. ``` bfa@bootnode:~$ bfa.py signers 0x19fe7b9b3a1bebde77c5374c8e13c623e3d1b5b2 0x2388d2cdb2cd6e7722b4af39c3bb406dd31f560e 0x2feb6a8876bd9e2116b47834b977506a08ea77bd 0x342e1d075d820ed3f9d9a05967ec4055ab23fa1e 0x39170a1ce03729d141dfaf8077c08b72c9cfdd0c 0x401d7a8432caa1025d5f093276cc6ec957b87c00 0x46991ada2a2544468eb3673524641bf293f23ccc 0x609043ebde4a06bd28a1de238848e8f82cca9c23 0x91c055c6478bd0ad6d19bcb58f5e7ca7b04e67f1 0x998c2651db6f76ca568c0071667d265bcc1b1e98 0x9b3ac6719b02ec7bb4820ae178d31c0bbda3a4e0 0xc0310a7b3b25f49b11b901a667208a3eda8d7ceb bfa@bootnode:~$ bfa.py signers --help usage: bfa.py signers [-h] [--ipc-path IPC_PATH] [--rpc-port RPC_PORT] [--json] [--status] [--use-block-number] [--blocks BLOCKS] optional arguments: -h, --help show this help message and exit --ipc-path IPC_PATH Path del archivo geth.ipc. Default: /home/bfa/bfa/network/node/geth.ipc --rpc-port RPC_PORT Puerto RPC. Default: 8545 --json Produce salida en formato JSON --status Indica cuantos bloques han pasado desde último sellado por cada sellador (-1 si no está activo) --use-block-number Indica el número de bloque en lugar de los bloques transcurridos --blocks BLOCKS Especifica cuantos bloques buscar hacia atrás (default: 5 *número_de_selladores) bfa@bootnode:~$ bfa.py signers --status 0x19fe7b9b3a1bebde77c5374c8e13c623e3d1b5b2: 7 0x2388d2cdb2cd6e7722b4af39c3bb406dd31f560e: -1 0x2feb6a8876bd9e2116b47834b977506a08ea77bd: 8 0x342e1d075d820ed3f9d9a05967ec4055ab23fa1e: 4 0x39170a1ce03729d141dfaf8077c08b72c9cfdd0c: 3 0x401d7a8432caa1025d5f093276cc6ec957b87c00: -1 0x46991ada2a2544468eb3673524641bf293f23ccc: 1 0x609043ebde4a06bd28a1de238848e8f82cca9c23: 0 0x91c055c6478bd0ad6d19bcb58f5e7ca7b04e67f1: 2 0x998c2651db6f76ca568c0071667d265bcc1b1e98: 6 0x9b3ac6719b02ec7bb4820ae178d31c0bbda3a4e0: 5 0xc0310a7b3b25f49b11b901a667208a3eda8d7ceb: 12 bfa@bootnode:~$ ``` Se puede pedir que la salida sea en formato JSON: ``` bfa@bootnode:~$ bfa.py signers --status --json { "0x19fe7b9b3a1bebde77c5374c8e13c623e3d1b5b2": 3, "0x2388d2cdb2cd6e7722b4af39c3bb406dd31f560e": -1, "0x2feb6a8876bd9e2116b47834b977506a08ea77bd": 9, "0x342e1d075d820ed3f9d9a05967ec4055ab23fa1e": 10, "0x39170a1ce03729d141dfaf8077c08b72c9cfdd0c": 0, "0x401d7a8432caa1025d5f093276cc6ec957b87c00": -1, "0x46991ada2a2544468eb3673524641bf293f23ccc": 4, "0x609043ebde4a06bd28a1de238848e8f82cca9c23": 6, "0x91c055c6478bd0ad6d19bcb58f5e7ca7b04e67f1": 7, "0x998c2651db6f76ca568c0071667d265bcc1b1e98": 1, "0x9b3ac6719b02ec7bb4820ae178d31c0bbda3a4e0": 5, "0xc0310a7b3b25f49b11b901a667208a3eda8d7ceb": 2 } bfa@bootnode:~$ ``` El comando `votes` (o `proposals`) brinda información sobre el estado de una votación (es similar al script `vote_status`: ``` bfa@bootnode:~$ bfa.py votes Bloque: 538426 Propuestas en curso: 0 bfa@bootnode:~$ ``` Se puede pedir el estado en un bloque determinado: ``` bfa@bootnode:~$ bfa.py votes --block-number 530000 Bloque: 530000 Propuestas en curso: 2 Propuesta: 0x2388d2cdb2cd6e7722b4af39c3bb406dd31f560e 0x19fe7b9b3a1bebde77c5374c8e13c623e3d1b5b2: None 0x2feb6a8876bd9e2116b47834b977506a08ea77bd: True 0x342e1d075d820ed3f9d9a05967ec4055ab23fa1e: None 0x39170a1ce03729d141dfaf8077c08b72c9cfdd0c: True 0x46991ada2a2544468eb3673524641bf293f23ccc: True 0x609043ebde4a06bd28a1de238848e8f82cca9c23: True 0x91c055c6478bd0ad6d19bcb58f5e7ca7b04e67f1: None 0x998c2651db6f76ca568c0071667d265bcc1b1e98: None 0x9b3ac6719b02ec7bb4820ae178d31c0bbda3a4e0: True 0xc0310a7b3b25f49b11b901a667208a3eda8d7ceb: None A favor: 5, en contra: 0, no votaron: 5 Propuesta: 0x401d7a8432caa1025d5f093276cc6ec957b87c00 0x19fe7b9b3a1bebde77c5374c8e13c623e3d1b5b2: None 0x2feb6a8876bd9e2116b47834b977506a08ea77bd: True 0x342e1d075d820ed3f9d9a05967ec4055ab23fa1e: None 0x39170a1ce03729d141dfaf8077c08b72c9cfdd0c: True 0x46991ada2a2544468eb3673524641bf293f23ccc: True 0x609043ebde4a06bd28a1de238848e8f82cca9c23: True 0x91c055c6478bd0ad6d19bcb58f5e7ca7b04e67f1: None 0x998c2651db6f76ca568c0071667d265bcc1b1e98: None 0x9b3ac6719b02ec7bb4820ae178d31c0bbda3a4e0: True 0xc0310a7b3b25f49b11b901a667208a3eda8d7ceb: None A favor: 5, en contra: 0, no votaron: 5 bfa@bootnode:~$ ``` O, en formato JSON: ``` bfa@bootnode:~$ bfa.py votes --block-number 530000 --json { "block": 530000, "proposals": [ "0x2388d2cdb2cd6e7722b4af39c3bb406dd31f560e", "0x401d7a8432caa1025d5f093276cc6ec957b87c00" ], "tally": { "0x2388d2cdb2cd6e7722b4af39c3bb406dd31f560e": { "None": 5, "True": 5 }, "0x401d7a8432caa1025d5f093276cc6ec957b87c00": { "None": 5, "True": 5 } }, "votes": { "0x2388d2cdb2cd6e7722b4af39c3bb406dd31f560e": { "0x19fe7b9b3a1bebde77c5374c8e13c623e3d1b5b2": null, "0x2feb6a8876bd9e2116b47834b977506a08ea77bd": true, "0x342e1d075d820ed3f9d9a05967ec4055ab23fa1e": null, "0x39170a1ce03729d141dfaf8077c08b72c9cfdd0c": true, "0x46991ada2a2544468eb3673524641bf293f23ccc": true, "0x609043ebde4a06bd28a1de238848e8f82cca9c23": true, "0x91c055c6478bd0ad6d19bcb58f5e7ca7b04e67f1": null, "0x998c2651db6f76ca568c0071667d265bcc1b1e98": null, "0x9b3ac6719b02ec7bb4820ae178d31c0bbda3a4e0": true, "0xc0310a7b3b25f49b11b901a667208a3eda8d7ceb": null }, "0x401d7a8432caa1025d5f093276cc6ec957b87c00": { "0x19fe7b9b3a1bebde77c5374c8e13c623e3d1b5b2": null, "0x2feb6a8876bd9e2116b47834b977506a08ea77bd": true, "0x342e1d075d820ed3f9d9a05967ec4055ab23fa1e": null, "0x39170a1ce03729d141dfaf8077c08b72c9cfdd0c": true, "0x46991ada2a2544468eb3673524641bf293f23ccc": true, "0x609043ebde4a06bd28a1de238848e8f82cca9c23": true, "0x91c055c6478bd0ad6d19bcb58f5e7ca7b04e67f1": null, "0x998c2651db6f76ca568c0071667d265bcc1b1e98": null, "0x9b3ac6719b02ec7bb4820ae178d31c0bbda3a4e0": true, "0xc0310a7b3b25f49b11b901a667208a3eda8d7ceb": null } } } bfa@bootnode:~$ ``` El comando `block` permite ver un bloque, y adicionalmente, identificar el sellador de ese bloque: ``` bfa@bootnode:~$ bfa.py block --sealer usage: bfa.py [-h] {signers,sealers,votes,proposals,block} ... bfa.py: error: unrecognized arguments: --sealer bfa@bootnode:~$ bfa.py block --signer difficulty: 0x1 extraData: 0x393938633236353164623666373663613536382e303035303536396633313166 gasLimit: 8000000 gasUsed: 0 hash: 0xacd7427e4db75c65cd63a41defce7b6284797093d85cc3ba22e50519faee267b logsBloom: 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 miner: 0x0000000000000000000000000000000000000000 mixHash: 0x0000000000000000000000000000000000000000000000000000000000000000 nonce: 0x0000000000000000 number: 0x8389c parentHash: 0xe6196028a81e9fae119b04d270b5b2f5c327d189d86358da9b8f29f40cb3d643 receiptsRoot: 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421 sha3Uncles: 0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347 signer: 0x998c2651db6f76ca568c0071667d265bcc1b1e98 size: 0x261 stateRoot: 0x343e9a5c6763047eb7c99aaab5bd3078bdcfda16f076fe5916eb2ea45f57715b timestamp: 0x5bd7aefc totalDifficulty: 0xd8bf3 transactions: [] transactionsRoot: 0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421 uncles: [] bfa@bootnode:~$ ```