Exemple #1
0
    def get(self, request, *args, **kwargs):

        block_hash = kwargs['hash']

        block_info = w3_client.eth.getBlock(block_hash)

        block_data = web3_to_dict(block_info)

        miner = self.get_address(block_data['miner'])

        existing_block = Block.objects.filter(hash=block_data['hash'])

        if existing_block.exists():
            block = existing_block.first()
            block.difficulty = block_data['difficulty']
            block.gas_limit = block_data['gasLimit']
            block.gas_used = block_data['gasUsed']
            block.hash = block_data['hash']
            block.miner = miner
            block.nonce = block_data['nonce']
            block.number = block_data['number']
            block.parent_hash = Block.objects.filter(
                hash=block_data['parentHash']).first()
            block.size = block_data['size']
            block.timestamp = block_data['timestamp']
            block.total_difficulty = block_data['totalDifficulty']
            block.save()
        else:
            # Create Block Instance
            block = Block()
            block.difficulty = block_data['difficulty']
            block.gas_limit = block_data['gasLimit']
            block.gas_used = block_data['gasUsed']
            block.hash = block_data['hash']
            block.miner = miner
            block.nonce = block_data['nonce']
            block.number = block_data['number']
            block.parent_hash = Block.objects.filter(
                hash=block_data['parentHash']).first()
            block.size = block_data['size']
            block.timestamp = block_data['timestamp']
            block.total_difficulty = block_data['totalDifficulty']
            block.save()

        # Create transactions for block
        for transaction in block_data['transactions']:
            transaction_info = w3_client.eth.getTransaction(transaction)
            transaction_data = web3_to_dict(transaction_info)

            existing_transaction = Transaction.objects.filter(
                hash=transaction_data['hash'])

            if existing_transaction.exists():
                transaction = existing_transaction.first()

                transaction.block_hash = block
                transaction.block_number = block.number
                # transaction.cumulative_gas_used = ''
                transaction.created_contract_address_hash = None
                transaction.error = ''
                transaction.from_address_hash = self.get_address(
                    transaction_data['from'])
                transaction.gas = transaction_data['gas']
                transaction.gas_price = transaction_data['gasPrice']
                transaction.gas_used = (transaction_data['gas'] *
                                        transaction_data['gasPrice'])
                transaction.hash = transaction_data['hash']
                transaction.index = transaction_data['transactionIndex']
                transaction.input = transaction_data['input']
                transaction.internal_transactions_indexed_at = None
                transaction.nonce = transaction_data['nonce']
                transaction.r = transaction_data['r']
                transaction.s = transaction_data['s']
                # transaction.status = ''
                transaction.to_address_hash = self.get_address(
                    transaction_data['to'])
                transaction.v = transaction_data['v']
                transaction.value = transaction_data['value']
                transaction.save()

            else:
                transaction = Transaction()

                transaction.block_hash = block
                transaction.block_number = block.number
                # transaction.cumulative_gas_used = ''
                transaction.created_contract_address_hash = None
                transaction.error = ''
                transaction.from_address_hash = self.get_address(
                    transaction_data['from'])
                transaction.gas = transaction_data['gas']
                transaction.gas_price = transaction_data['gasPrice']
                transaction.gas_used = (transaction_data['gas'] *
                                        transaction_data['gasPrice'])
                transaction.hash = transaction_data['hash']
                transaction.index = transaction_data['transactionIndex']
                transaction.input = transaction_data['input']
                transaction.internal_transactions_indexed_at = None
                transaction.nonce = transaction_data['nonce']
                transaction.r = transaction_data['r']
                transaction.s = transaction_data['s']
                # transaction.status = ''
                transaction.to_address_hash = self.get_address(
                    transaction_data['to'])
                transaction.v = transaction_data['v']
                transaction.value = transaction_data['value']
                transaction.save()

        # Create uncle block if exists
        for uncle in block_data['uncles']:
            uncle_info = w3_client.eth.getBlock(uncle)

            uncle_data = web3_to_dict(uncle_info)

            miner = self.get_address(uncle_data['miner'])

            existing_uncle_block = Block.objects.filter(
                hash=uncle_data['hash'])

            if existing_uncle_block.exists():
                uncle_block = existing_uncle_block.first()
                uncle_block.consensus = False
                uncle_block.difficulty = uncle_data['difficulty']
                uncle_block.gas_limit = uncle_data['gasLimit']
                uncle_block.gas_used = uncle_data['gasUsed']
                uncle_block.hash = uncle_data['hash']
                uncle_block.miner = miner
                uncle_block.nonce = uncle_data['nonce']
                uncle_block.number = uncle_data['number']
                uncle_block.parent_hash = Block.objects.filter(
                    hash=uncle_data['parentHash']).first()
                uncle_block.size = uncle_data['size']
                uncle_block.timestamp = uncle_data['timestamp']
                uncle_block.total_difficulty = uncle_data['totalDifficulty']
                uncle_block.save()
            else:
                uncle_block = Block()
                uncle_block.consensus = False
                uncle_block.difficulty = uncle_data['difficulty']
                uncle_block.gas_limit = uncle_data['gasLimit']
                uncle_block.gas_used = uncle_data['gasUsed']
                uncle_block.hash = uncle_data['hash']
                uncle_block.miner = miner
                uncle_block.nonce = uncle_data['nonce']
                uncle_block.number = uncle_data['number']
                uncle_block.parent_hash = Block.objects.filter(
                    hash=uncle_data['parentHash']).first()
                uncle_block.size = uncle_data['size']
                uncle_block.timestamp = uncle_data['timestamp']
                uncle_block.total_difficulty = uncle_data['totalDifficulty']
                uncle_block.save()

            # Save relation between nephew and uncle
            SecondDegreeRelation.objects.get_or_create(
                nephew_hash=block,
                uncle_hash=uncle_block,
                defaults={'uncle_fetched_at': block.timestamp})

            # Save transaction relation for uncle block
            transaction_index = 0
            for transaction in uncle_data['transactions']:
                transaction = Transaction.objects.filter(hash=transaction)

                if not transaction.exists():
                    continue

                Fork.objects.create(hash=transaction.first(),
                                    index=transaction_index,
                                    uncle_hash=uncle_block)

                transaction_index += 1

        return JsonResponse(status=200, data=block_data, safe=False)