示例#1
0
    def process_header(self, header, block_origin):
        hash_ = header.GetHash()
        logging.info('process Block(hash={}) from {}'.format(core.b2lx(hash_), block_origin))

        fork_before = chainutil.get_private_public_fork(self.tips)
        logging.info('fork before {}'.format(fork_before))

        self.try_to_insert_header(header, block_origin)

        fork_after = chainutil.get_private_public_fork(self.tips)
        logging.info('fork after {}'.format(fork_after))

        if self.initializing:
            if hash_ == self.start_hash or header.hashPrevBlock == self.start_hash:
                self.initializing = False
                logging.info('Initializing over; now starting selfish mining')
            else:
                logging.info('chain is initializing - no action needs to be taken')
        else:
            if fork_before != fork_after:
                logging.debug('fork tip_private={}'.format(core.b2lx(fork_after.private_tip.hash())))
                logging.debug('fork tip_public={}'.format(core.b2lx(fork_after.public_tip.hash())))
                try:
                    action = self.strategy.find_action(fork_after.private_height, fork_after.public_height, block_origin)
                    logging.info('found action={}'.format(action))

                    self.executor.execute(action, fork_after.private_tip, fork_after.public_tip)
                except ActionException as exception:
                    logging.warn(exception.message)
            else:
                logging.debug('the two forks are the same - no action needs to be taken')
    def test_get_private_public_fork_no_public_tip(self):
        fork = chainutil.get_private_public_fork([self.second_block_chain_a])
        self.assertEqual(fork.public_height, 0)
        self.assertEqual(fork.public_tip.hash(), test_util.genesis_hash)

        self.assertEqual(fork.private_height, 2)
        self.assertEqual(fork.private_tip.hash(), '2a')
    def test_get_private_public_fork_lead_public(self):
        fork = chainutil.get_private_public_fork(
            [self.second_block_chain_b, self.first_block_chain_a])
        self.assertEqual(fork.private_height, 1)
        self.assertEqual(fork.private_tip.hash(), '1a')

        self.assertEqual(fork.public_height, 2)
        self.assertEqual(fork.public_tip.hash(), '2b')
    def test_get_private_public_fork_one_private_transferred(self):
        self.first_block_chain_a.transfer_allowed = True
        fork = chainutil.get_private_public_fork(
            [self.second_block_chain_a, self.first_block_chain_b])

        self.assertEqual(fork.private_height, 2)
        self.assertEqual(fork.private_tip.hash(), '2a')

        self.assertEqual(fork.public_height, 1)
    def test_get_private_public_fork_public_fork_point(self):
        fork = chainutil.get_private_public_fork([
            self.fourth_block_chain_b, self.third_b_block_chain_b,
            self.second_block_chain_a
        ])
        self.assertEqual(fork.private_height, 2)
        self.assertEqual(fork.private_tip.hash(), '2a')

        self.assertEqual(fork.public_height, 4)
        self.assertEqual(fork.public_tip.hash(), '4b')
    def test_get_private_public_fork_longest_private_fork_transferred(self):
        self.first_block_chain_a.transfer_allowed = True
        self.second_block_chain_a.transfer_allowed = True
        self.third_a_block_chain_a.transfer_allowed = True
        self.fourth_block_chain_a.transfer_allowed = True

        fork = chainutil.get_private_public_fork([
            self.second_block_chain_b, self.fourth_block_chain_a,
            self.third_b_block_chain_a
        ])
        self.assertEqual(fork.private_height, 0)
        self.assertEqual(fork.private_tip.hash(), '4a')

        self.assertEqual(fork.public_height, 0)
        self.assertEqual(fork.public_tip.hash(), '4a')