mirror of
https://github.com/logos-blockchain/logos-blockchain-specs.git
synced 2026-01-04 06:03:10 +00:00
wip
This commit is contained in:
parent
113d3bb6d7
commit
781f762ecd
@ -1,30 +1,31 @@
|
|||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
from typing import Generator
|
from typing import Generator
|
||||||
|
|
||||||
from dill.tests.test_diff import A
|
|
||||||
|
|
||||||
from cryptarchia.cryptarchia import BlockHeader, Follower, Id, Slot
|
from cryptarchia.cryptarchia import BlockHeader, Follower, Id, Slot
|
||||||
|
|
||||||
SLOT_TOLERANCE = 2
|
SLOT_TOLERANCE = 1
|
||||||
|
|
||||||
|
|
||||||
def range_sync(local: Follower, remotes: list[Follower], start_slot: Slot):
|
def full_sync(local: Follower, remotes: list[Follower], start_slot: Slot):
|
||||||
while groups := {
|
while groups := group_sync_targets(remotes, start_slot):
|
||||||
tip: group
|
|
||||||
for tip, group in group_by_tip(remotes).items()
|
|
||||||
if group[0].tip().slot.absolute_slot - start_slot.absolute_slot > SLOT_TOLERANCE
|
|
||||||
}:
|
|
||||||
for _, group in groups.items():
|
for _, group in groups.items():
|
||||||
remote = group[0]
|
remote = group[0]
|
||||||
for block in request_blocks_by_range(remote, start_slot, remote.tip().slot):
|
range_sync(local, remote, start_slot, remote.tip().slot)
|
||||||
local.on_block(block)
|
|
||||||
start_slot = Slot(local.tip().slot.absolute_slot + 1)
|
start_slot = Slot(local.tip().slot.absolute_slot + 1)
|
||||||
|
|
||||||
|
|
||||||
def group_by_tip(remotes: list[Follower]) -> dict[Id, list[Follower]]:
|
def range_sync(local: Follower, remote: Follower, from_slot: Slot, to_slot: Slot):
|
||||||
|
for block in request_blocks_by_range(remote, from_slot, to_slot):
|
||||||
|
local.on_block(block)
|
||||||
|
|
||||||
|
|
||||||
|
def group_sync_targets(
|
||||||
|
targets: list[Follower], start_slot: Slot
|
||||||
|
) -> dict[Id, list[Follower]]:
|
||||||
groups: dict[Id, list[Follower]] = defaultdict(list)
|
groups: dict[Id, list[Follower]] = defaultdict(list)
|
||||||
for remote in remotes:
|
for target in targets:
|
||||||
groups[remote.tip_id()].append(remote)
|
if target.tip().slot.absolute_slot - start_slot.absolute_slot > SLOT_TOLERANCE:
|
||||||
|
groups[target.tip_id()].append(target)
|
||||||
return groups
|
return groups
|
||||||
|
|
||||||
|
|
||||||
@ -1,7 +1,7 @@
|
|||||||
from unittest import TestCase
|
from unittest import TestCase
|
||||||
|
|
||||||
from cryptarchia.cryptarchia import Coin, Follower
|
from cryptarchia.cryptarchia import Coin, Follower
|
||||||
from cryptarchia.sync.range_sync import range_sync
|
from cryptarchia.sync.full_sync import full_sync
|
||||||
from cryptarchia.test_common import mk_block, mk_config, mk_genesis_state
|
from cryptarchia.test_common import mk_block, mk_config, mk_genesis_state
|
||||||
|
|
||||||
|
|
||||||
@ -21,6 +21,6 @@ class TestRangeSync(TestCase):
|
|||||||
assert follower.forks == []
|
assert follower.forks == []
|
||||||
|
|
||||||
new_follower = Follower(genesis, config)
|
new_follower = Follower(genesis, config)
|
||||||
range_sync(new_follower, [follower], genesis.block.slot)
|
full_sync(new_follower, [follower], genesis.block.slot)
|
||||||
assert new_follower.tip() == b2
|
assert new_follower.tip() == b2
|
||||||
assert new_follower.forks == []
|
assert new_follower.forks == []
|
||||||
Loading…
x
Reference in New Issue
Block a user