class IpcTest(TestCase): client = None def setUp(self): self.client = EthIpc() def test_eth_coinbase(self): coinbase = self.client.eth_coinbase() self.assertTrue(coinbase.startswith("0x"), "coinbase should be a hex string") self.assertEqual(len(coinbase), 42, "coinbase is a string with length of 42") def test_eth_blockNumber(self): block_number = self.client.eth_blockNumber() self.assertGreater(block_number, 0, "we have made sure the blockNumber is > 0 for testing") def test_eth_getBalance(self): balance = self.client.eth_getBalance(address="0x0000000000000000000000000000000000000000") self.assertGreater(balance, 10000000, "specified address should have a lot of balance") def test_eth_getStorageAt(self): storage = self.client.eth_getStorageAt(address="0x0000000000000000000000000000000000000000") self.assertEqual(storage, '0x0000000000000000000000000000000000000000000000000000000000000000') def test_eth_getBlockByNumber(self): block = self.client.eth_getBlockByNumber(0) self.assertEqual(block["extraData"], "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", "the data of the first block should be right") def test_eth_getCode(self): # TODO: can't find a proper address for getting code code = self.client.eth_getCode(address="0x0000000000000000000000000000000000000001") self.assertEqual(code, "0x") def test_eth_getTransactionReceipt(self): transaction = self.client.eth_getTransactionReceipt(tx_hash="0xe363505adc6b2996111f8bd774f8653a61d244cc6567b5372c2e781c6c63b737") self.assertEqual(transaction["from"], "0x22f2dcff5ad78c3eb6850b5cb951127b659522e6") self.assertEqual(transaction["to"], "0x0000000000000000000000000000000000000000")
def initialize(self, rpchost, rpcport, rpctls, sync_all, ipc): if ipc: eth = EthIpc() else: eth = EthJsonRpc(rpchost, rpcport, rpctls) if self.last_block: blockNum = self.last_block print("Resuming synchronization from block " + str(blockNum)) else: blockNum = eth.eth_blockNumber() print("Starting synchronization from latest block: " + str(blockNum)) while (blockNum > 0): if not blockNum % 1000: print("Processing block " + str(blockNum) + ", " + str(len(self.contracts.keys())) + " unique contracts in database") block = eth.eth_getBlockByNumber(blockNum) for tx in block['transactions']: if not tx['to']: receipt = eth.eth_getTransactionReceipt(tx['hash']) if receipt is not None: contract_address = receipt['contractAddress'] contract_code = eth.eth_getCode(contract_address) contract_balance = eth.eth_getBalance(contract_address) if not contract_balance and not sync_all: # skip contracts with zero balance (disable with --sync-all) continue code = ETHContract(contract_code, tx['input']) m = hashlib.md5() m.update(contract_code.encode('UTF-8')) contract_hash = m.digest() try: self.contracts[contract_hash] except KeyError: self.contracts[contract_hash] = code m = InstanceList() self.instance_lists[contract_hash] = m self.instance_lists[contract_hash].add( contract_address, contract_balance) transaction.commit() self.last_block = blockNum blockNum -= 1 # If we've finished initializing the database, start over from the end of the chain if we want to initialize again self.last_block = 0 transaction.commit()