Skip to content

Commit 35061f7

Browse files
committed
sync
1 parent 3e2af6c commit 35061f7

File tree

6 files changed

+68
-16
lines changed

6 files changed

+68
-16
lines changed

Blockchain/Sources/Blockchain/Validator/ValidatorService.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import Foundation
22
import Utils
33

4-
public class ValidatorService {
4+
public final class ValidatorService: Sendable {
55
private let blockchain: Blockchain
66
private let keystore: KeyStore
77
private let safrole: SafroleService

Boka/Sources/Boka.swift

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ struct Boka: AsyncParsableCommand {
5858
var basePath: String?
5959

6060
@Option(name: .long, help: "A preset config or path to chain config file.")
61-
var chain: Genesis = .preset(.dev)
61+
var chain: Genesis = .preset(.minimal)
6262

6363
@Option(name: .long, help: "Listen address for RPC server. Pass 'no' to disable RPC server. Default to 127.0.0.1:9955.")
6464
var rpc: MaybeEnabled<NetAddr> = .enabled(NetAddr(address: "127.0.0.1:9955")!)
@@ -81,6 +81,12 @@ struct Boka: AsyncParsableCommand {
8181
@Option(name: .long, help: "Node name. For telemetry only.")
8282
var name: String?
8383

84+
@Flag(name: .long, help: "Enable local mode, whereas peers are not expected.")
85+
var local: Bool = false
86+
87+
@Flag(name: .long, help: "Enable dev mode. This is equivalent to --local --validator")
88+
var dev: Bool = false
89+
8490
mutating func run() async throws {
8591
let services = try await Tracing.bootstrap("Boka", loggerOnly: true)
8692
for service in services {
@@ -95,6 +101,16 @@ struct Boka: AsyncParsableCommand {
95101

96102
logger.info("Chain: \(chain)")
97103

104+
if dev {
105+
local = true
106+
validator = true
107+
logger.info("Dev mode enabled. Enabling local and validator.")
108+
}
109+
110+
if local {
111+
logger.info("Local mode enabled.")
112+
}
113+
98114
if let name {
99115
logger.info("Node name: \(name)")
100116
}
@@ -146,7 +162,12 @@ struct Boka: AsyncParsableCommand {
146162
handlerMiddleware: .tracing(prefix: "Handler")
147163
)
148164

149-
let config = Node.Config(rpc: rpcConfig, network: networkConfig, peers: peers)
165+
let config = Node.Config(
166+
rpc: rpcConfig,
167+
network: networkConfig,
168+
peers: peers,
169+
local: local
170+
)
150171

151172
let node: Node = if validator {
152173
try await ValidatorNode(

Node/Sources/Node/NetworkingProtocol/NetworkManager.swift

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,22 @@ enum BroadcastTarget {
1515
}
1616

1717
public final class NetworkManager: Sendable {
18-
private let peerManager: PeerManager
19-
private let network: Network
20-
private let syncManager: SyncManager
21-
private let blockchain: Blockchain
18+
let peerManager: PeerManager
19+
let network: Network
20+
let syncManager: SyncManager
21+
let blockchain: Blockchain
2222
private let subscriptions: EventSubscriptions
2323

2424
// This is for development only
2525
// Those peers will receive all the messages regardless the target
2626
private let devPeers: Set<NetAddr>
2727

28-
public init(config: Network.Config, blockchain: Blockchain, eventBus: EventBus, devPeers: Set<NetAddr>) async throws {
28+
public init(
29+
config: Network.Config,
30+
blockchain: Blockchain,
31+
eventBus: EventBus,
32+
devPeers: Set<NetAddr>
33+
) async throws {
2934
peerManager = PeerManager(eventBus: eventBus)
3035

3136
network = try await Network(

Node/Sources/Node/NetworkingProtocol/SyncManager.swift

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,17 @@ let BLOCK_REQUEST_BLOCK_COUNT: UInt32 = 50
1313
// - remove slow one
1414
// - sync peer rotation
1515
// - fast sync mode (no verification)
16-
public actor SyncManager {
16+
public actor SyncManager: Sendable {
1717
private let blockchain: Blockchain
1818
private let network: Network
1919
private let peerManager: PeerManager
2020

2121
private let subscriptions: EventSubscriptions
2222

2323
// starts with bulk syncing mode, until our best have catched up with the peer best
24-
private var bulkSyncing = true
24+
private var bulkSyncing = false
25+
private var syncContinuation: [CheckedContinuation<Void, Never>] = []
26+
2527
private var networkBest: HashAndSlot?
2628
private var networkFinalizedBest: HashAndSlot?
2729
private var currentRequest: (peer: NetAddr, request: BlockRequest)?
@@ -42,6 +44,15 @@ public actor SyncManager {
4244
}
4345
}
4446

47+
public func waitForSyncCompletion() async {
48+
if !bulkSyncing {
49+
return
50+
}
51+
await withCheckedContinuation { continuation in
52+
syncContinuation.append(continuation)
53+
}
54+
}
55+
4556
private func on(peerUpdated info: PeerInfo, newBlockHeader: HeaderRef?) async {
4657
// TODO: improve this to handle the case misbehaved peers seding us the wrong best
4758
if let networkBest {
@@ -97,7 +108,9 @@ public actor SyncManager {
97108
if currentHead.timeslot >= networkBest!.timeslot {
98109
if bulkSyncing {
99110
bulkSyncing = false
100-
subscriptions.publish(NetworkEvents.BulkSyncCompleted())
111+
syncContinuation.forEach { $0.resume() }
112+
syncContinuation = []
113+
logger.info("bulk sync completed")
101114
return
102115
}
103116
}

Node/Sources/Node/Node.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,17 @@ public class Node {
1414
public var rpc: RPCConfig?
1515
public var network: NetworkConfig
1616
public var peers: [NetAddr]
17+
public var local: Bool
1718

18-
public init(rpc: RPCConfig?, network: NetworkConfig, peers: [NetAddr] = []) {
19+
public init(rpc: RPCConfig?, network: NetworkConfig, peers: [NetAddr] = [], local: Bool = false) {
1920
self.rpc = rpc
2021
self.network = network
2122
self.peers = peers
23+
self.local = local
2224
}
2325
}
2426

27+
public let config: Config
2528
public let blockchain: Blockchain
2629
public let rpcServer: Server?
2730
public let timeProvider: TimeProvider
@@ -35,6 +38,8 @@ public class Node {
3538
eventBus: EventBus,
3639
keystore: KeyStore
3740
) async throws {
41+
self.config = config
42+
3843
let (genesisState, genesisBlock, protocolConfig) = try await genesis.load()
3944

4045
logger.info("Genesis: \(genesisBlock.hash)")

Node/Sources/Node/ValidatorNode.swift

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,24 @@ public class ValidatorNode: Node {
1212
try await super.init(config: config, genesis: genesis, eventBus: eventBus, keystore: keystore)
1313

1414
let scheduler = DispatchQueueScheduler(timeProvider: timeProvider)
15-
validator = await ValidatorService(
15+
let validator = await ValidatorService(
1616
blockchain: blockchain,
1717
keystore: keystore,
1818
eventBus: eventBus,
1919
scheduler: scheduler,
2020
dataProvider: dataProvider
2121
)
22+
self.validator = validator
2223

23-
let genesisState = try await dataProvider.getState(hash: blockchain.dataProvider.genesisBlockHash)
24-
25-
await validator.on(genesis: genesisState)
24+
let syncManager = network.syncManager
25+
let dataProvider = blockchain.dataProvider
26+
let local = config.local
27+
Task {
28+
let genesisState = try await dataProvider.getState(hash: dataProvider.genesisBlockHash)
29+
if !local {
30+
await syncManager.waitForSyncCompletion()
31+
}
32+
await validator.on(genesis: genesisState)
33+
}
2634
}
2735
}

0 commit comments

Comments
 (0)