Skip to content

Commit f83b7d1

Browse files
authored
Merge branch 'master' into dev_connection
2 parents 271e267 + eb7a122 commit f83b7d1

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+652
-291
lines changed

Blockchain/Sources/Blockchain/Config/ProtocolConfig.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public struct ProtocolConfig: Sendable, Codable, Equatable {
6464
// P = 6: The slot period, in seconds.
6565
public var slotPeriodSeconds: Int
6666

67-
// Q = 80: The maximum number of items in the authorizations queue.
67+
// Q = 80: The number of items in the authorizations queue.
6868
public var maxAuthorizationsQueueItems: Int
6969

7070
// R = 10: The rotation period of validator-core assignments, in timeslots.
@@ -107,7 +107,7 @@ public struct ProtocolConfig: Sendable, Codable, Equatable {
107107
// ZI = 2^24: The standard pvm program initialization input data size.
108108
public var pvmProgramInitInputDataSize: Int
109109

110-
// ZP = 2^14: The standard pvm program initialization page size.
110+
// ZG = 2^14: The standard pvm program initialization page size.
111111
public var pvmProgramInitPageSize: Int
112112

113113
// ZQ = 2^16: The standard pvm program initialization segment size.

Blockchain/Sources/Blockchain/RuntimeProtocols/Accumulation.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ extension Accumulation {
186186
}
187187

188188
switch service {
189-
case privilegedServices.empower:
189+
case privilegedServices.blessed:
190190
newPrivilegedServices = singleOutput.state.privilegedServices
191191
case privilegedServices.assign:
192192
newAuthorizationQueue = singleOutput.state.authorizationQueue

Blockchain/Sources/Blockchain/RuntimeProtocols/Runtime.swift

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,7 @@ public final class Runtime {
6060
throw Error.invalidHeaderStateRoot
6161
}
6262

63-
let expectedExtrinsicHash = try Result { try JamEncoder.encode(block.extrinsic).blake2b256hash() }
64-
.mapError(Error.encodeError).get()
65-
66-
guard block.header.extrinsicsHash == expectedExtrinsicHash else {
63+
guard block.header.extrinsicsHash == block.extrinsic.hash() else {
6764
throw Error.invalidExtrinsicHash
6865
}
6966

@@ -297,7 +294,7 @@ public final class Runtime {
297294
}
298295

299296
public func updateDisputes(block: BlockRef, state newState: inout State) throws {
300-
let (posState, offenders) = try newState.update(config: config, disputes: block.extrinsic.judgements)
297+
let (posState, offenders) = try newState.update(config: config, disputes: block.extrinsic.disputes)
301298
newState.mergeWith(postState: posState)
302299

303300
guard offenders == block.header.offendersMarkers else {
@@ -379,7 +376,7 @@ public final class Runtime {
379376
return availableReports
380377
}
381378

382-
public func updatePreimages(block: BlockRef, state newState: inout State) async throws {
379+
public func updatePreimages(block: BlockRef, state newState: inout State, prevState: StateRef) async throws {
383380
let preimages = block.extrinsic.preimages.preimages
384381

385382
guard preimages.isSortedAndUnique() else {
@@ -388,14 +385,26 @@ public final class Runtime {
388385

389386
for preimage in preimages {
390387
let hash = preimage.data.blake2b256hash()
388+
389+
// check prior state
390+
let prevPreimageData: Data? = try await prevState.value.get(serviceAccount: preimage.serviceIndex, preimageHash: hash)
391+
let prevInfo = try await prevState.value.get(
392+
serviceAccount: preimage.serviceIndex, preimageHash: hash, length: UInt32(preimage.data.count)
393+
)
394+
guard prevPreimageData == nil, prevInfo == nil else {
395+
throw Error.duplicatedPreimage
396+
}
397+
398+
// disregard no longer useful ones in new state
391399
let preimageData: Data? = try await newState.get(serviceAccount: preimage.serviceIndex, preimageHash: hash)
392400
let info = try await newState.get(
393401
serviceAccount: preimage.serviceIndex, preimageHash: hash, length: UInt32(preimage.data.count)
394402
)
395-
guard preimageData == nil, info == nil else {
396-
throw Error.duplicatedPreimage
403+
if preimageData != nil || info != nil {
404+
continue
397405
}
398406

407+
// update state
399408
newState[serviceAccount: preimage.serviceIndex, preimageHash: hash] = preimage.data
400409
newState[
401410
serviceAccount: preimage.serviceIndex, preimageHash: hash, length: UInt32(preimage.data.count)

Blockchain/Sources/Blockchain/State/State+Genesis.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,4 @@ extension State {
4242

4343
return (StateRef(state), block)
4444
}
45-
// TODO: add file genesis
46-
// public static func fileGenesis(config: ProtocolConfigRef) throws -> State
4745
}

Blockchain/Sources/Blockchain/State/State.swift

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,14 @@ public struct State: Sendable {
230230
await backend.rootHash
231231
}
232232
}
233+
234+
public func read(key: Data32) async throws -> Data? {
235+
let res = try layer[key].map { try JamEncoder.encode($0) }
236+
if let res {
237+
return res
238+
}
239+
return try await backend.readRaw(key)
240+
}
233241
}
234242

235243
extension State {
@@ -274,7 +282,7 @@ extension State: Dummy {
274282
let authorizationQueue: StateKeys.AuthorizationQueueKey.Value =
275283
try! ConfigFixedSizeArray(config: config, defaultValue: ConfigFixedSizeArray(config: config, defaultValue: Data32()))
276284
let privilegedServices: StateKeys.PrivilegedServicesKey.Value = PrivilegedServices(
277-
empower: ServiceIndex(),
285+
blessed: ServiceIndex(),
278286
assign: ServiceIndex(),
279287
designate: ServiceIndex(),
280288
basicGas: [:]

Blockchain/Sources/Blockchain/State/StateBackend.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,15 @@ public final class StateBackend: Sendable {
4747
return ret
4848
}
4949

50-
public func write(_ values: any Sequence<(key: any StateKey, value: (Codable & Sendable)?)>) async throws {
51-
try await trie.update(values.map { try (key: $0.key.encode(), value: $0.value.map { try JamEncoder.encode($0) }) })
50+
public func write(_ values: any Sequence<(key: Data32, value: (Codable & Sendable)?)>) async throws {
51+
try await trie.update(values.map { try (key: $0.key, value: $0.value.map { try JamEncoder.encode($0) }) })
5252
try await trie.save()
5353
}
5454

55+
public func readRaw(_ key: Data32) async throws -> Data? {
56+
try await trie.read(key: key)
57+
}
58+
5559
public func writeRaw(_ values: [(key: Data32, value: Data?)]) async throws {
5660
try await trie.update(values)
5761
try await trie.save()

Blockchain/Sources/Blockchain/State/StateKeys.swift

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,23 +33,23 @@ private func constructKey(_ idx: UInt8, _ service: ServiceIndex) -> Data32 {
3333
return Data32(data)!
3434
}
3535

36-
private func constructKey(_ service: ServiceIndex, _ val: UInt32, _: Data) -> Data32 {
37-
var data = Data(capacity: 32)
36+
private func constructKey(_ service: ServiceIndex, _ val: UInt32, _ data: Data) -> Data32 {
37+
var stateKey = Data(capacity: 32)
3838

3939
withUnsafeBytes(of: service) { servicePtr in
4040
withUnsafeBytes(of: val) { valPtr in
41-
data.append(servicePtr.load(as: UInt8.self))
42-
data.append(valPtr.load(as: UInt8.self))
43-
data.append(servicePtr.load(fromByteOffset: 1, as: UInt8.self))
44-
data.append(valPtr.load(fromByteOffset: 1, as: UInt8.self))
45-
data.append(servicePtr.load(fromByteOffset: 2, as: UInt8.self))
46-
data.append(valPtr.load(fromByteOffset: 2, as: UInt8.self))
47-
data.append(servicePtr.load(fromByteOffset: 3, as: UInt8.self))
48-
data.append(valPtr.load(fromByteOffset: 3, as: UInt8.self))
41+
stateKey.append(servicePtr.load(as: UInt8.self))
42+
stateKey.append(valPtr.load(as: UInt8.self))
43+
stateKey.append(servicePtr.load(fromByteOffset: 1, as: UInt8.self))
44+
stateKey.append(valPtr.load(fromByteOffset: 1, as: UInt8.self))
45+
stateKey.append(servicePtr.load(fromByteOffset: 2, as: UInt8.self))
46+
stateKey.append(valPtr.load(fromByteOffset: 2, as: UInt8.self))
47+
stateKey.append(servicePtr.load(fromByteOffset: 3, as: UInt8.self))
48+
stateKey.append(valPtr.load(fromByteOffset: 3, as: UInt8.self))
4949
}
5050
}
51-
data.append(contentsOf: data[relative: 0 ..< 24])
52-
return Data32(data)!
51+
stateKey.append(contentsOf: data[relative: 0 ..< 24])
52+
return Data32(stateKey)!
5353
}
5454

5555
public enum StateKeys {
@@ -316,7 +316,7 @@ public enum StateKeys {
316316
}
317317

318318
public func encode() -> Data32 {
319-
constructKey(index, length, hash.blake2b256hash().data)
319+
constructKey(index, length, hash.blake2b256hash().data[2...])
320320
}
321321
}
322322
}

0 commit comments

Comments
 (0)