34 lines
1.2 KiB
Python
34 lines
1.2 KiB
Python
from typing import Union
|
|
|
|
from chia.consensus.block_record import BlockRecord
|
|
from chia.consensus.blockchain_interface import BlockchainInterface
|
|
from chia.types.header_block import HeaderBlock
|
|
|
|
|
|
def find_fork_point_in_chain(
|
|
blocks: BlockchainInterface,
|
|
block_1: Union[BlockRecord, HeaderBlock],
|
|
block_2: Union[BlockRecord, HeaderBlock],
|
|
) -> int:
|
|
"""Tries to find height where new chain (block_2) diverged from block_1 (assuming prev blocks
|
|
are all included in chain)
|
|
Returns -1 if chains have no common ancestor
|
|
* assumes the fork point is loaded in blocks
|
|
"""
|
|
while block_2.height > 0 or block_1.height > 0:
|
|
if block_2.height > block_1.height:
|
|
block_2 = blocks.block_record(block_2.prev_hash)
|
|
elif block_1.height > block_2.height:
|
|
block_1 = blocks.block_record(block_1.prev_hash)
|
|
else:
|
|
if block_2.header_hash == block_1.header_hash:
|
|
return block_2.height
|
|
block_2 = blocks.block_record(block_2.prev_hash)
|
|
block_1 = blocks.block_record(block_1.prev_hash)
|
|
if block_2 != block_1:
|
|
# All blocks are different
|
|
return -1
|
|
|
|
# First block is the same
|
|
return 0
|