Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
qiweiii committed Jul 31, 2024
1 parent a9d40b6 commit 6ec72bd
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 35 deletions.
9 changes: 5 additions & 4 deletions Blockchain/Sources/Blockchain/Safrole.swift
Original file line number Diff line number Diff line change
Expand Up @@ -231,13 +231,14 @@ extension Safrole {
}

do {
let (newNextValidators, newCurrentValidators, newPreviousValidators, newTicketsVerifier) = try isEpochChange
let verifier = try Verifier(ring: nextValidators.map(\.bandersnatch))

let (newNextValidators, newCurrentValidators, newPreviousValidators, newTicketsVerifier) = isEpochChange
? (
validatorQueue, // TODO: Φ filter out the one in the punishment set
nextValidators,
currentValidators,
Verifier(ring: nextValidators.map(\.bandersnatch))
.ringRoot
verifier.ringRoot
)
: (nextValidators, currentValidators, previousValidators, ticketsVerifier)

Expand Down Expand Up @@ -284,7 +285,7 @@ extension Safrole {
nil
}

let newTickets = extrinsics.getTickets()
let newTickets = try extrinsics.getTickets(verifier, newEntropyPool.2)
guard newTickets.isSorted() else {
return .failure(.extrinsicsNotSorted)
}
Expand Down
14 changes: 8 additions & 6 deletions Blockchain/Sources/Blockchain/Types/ExtrinsicTickets.swift
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import Foundation
import ScaleCodec
import Utils

Expand Down Expand Up @@ -66,12 +67,13 @@ extension ExtrinsicTickets: ScaleCodec.Encodable {
}

extension ExtrinsicTickets {
public func getTickets() -> [Ticket] {
tickets.array.map {
// TODO: fix this
// this should be the Bandersnatch VRF output
let ticketId = Data32($0.signature.data[0 ..< 32])!
return Ticket(id: ticketId, attempt: $0.attempt)
public func getTickets(_ verifier: Verifier, _ entropy: Data32) throws -> [Ticket] {
try tickets.array.map {
var vrfInputData = Data("jam_ticket_seal".utf8)
vrfInputData.append(entropy.data)
vrfInputData.append($0.attempt)
let ticketId = verifier.ringVRFVerify(vrfInputData: vrfInputData, auxData: Data(), signature: $0.signature.data)
return try Ticket(id: ticketId.get(), attempt: $0.attempt)
}
}
}
52 changes: 27 additions & 25 deletions JAMTests/Tests/JAMTests/SafroleTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,11 @@ enum SafroleTestVariants: String, CaseIterable {

struct SafroleTests {
static func loadTests(variant: SafroleTestVariants) throws -> [SafroleTestcase] {
let tests = try TestLoader.getTestFiles(path: "safrole/\(variant)", extension: "scale")
// let tests = try TestLoader.getTestFiles(path: "safrole/\(variant)", extension: "scale")
let tests = [(
path: "/Users/qiweiyang/GitHub/boka/JAMTests/jamtestvectors/safrole/tiny/enact-epoch-change-with-no-tickets-4.scale",
description: ""
)]
return try tests.map {
let data = try Data(contentsOf: URL(fileURLWithPath: $0.path))
var decoder = LoggingDecoder(decoder: decoder(from: data), logger: NoopLogger())
Expand All @@ -244,30 +248,28 @@ struct SafroleTests {

@Test(arguments: try SafroleTests.loadTests(variant: .tiny))
func tinyTests(_ testcase: SafroleTestcase) throws {
withKnownIssue("not yet implemented", isIntermittent: true) {
let result = testcase.preState.updateSafrole(
slot: testcase.input.slot,
entropy: testcase.input.entropy,
extrinsics: testcase.input.extrinsics
)
switch result {
case let .success((state, epochMark, ticketsMark)):
switch testcase.output {
case let .ok(marks):
#expect(epochMark == marks.epochMark)
#expect(ticketsMark == marks.ticketsMark)
#expect(testcase.preState.mergeWith(postState: state) == testcase.postState)
case .err:
Issue.record("Expected error, got \(result)")
}
case .failure:
switch testcase.output {
case .ok:
Issue.record("Expected success, got \(result)")
case .err:
// ignore error code because it is unspecified
break
}
let result = testcase.preState.updateSafrole(
slot: testcase.input.slot,
entropy: testcase.input.entropy,
extrinsics: testcase.input.extrinsics
)
switch result {
case let .success((state, epochMark, ticketsMark)):
switch testcase.output {
case let .ok(marks):
#expect(epochMark == marks.epochMark)
#expect(ticketsMark == marks.ticketsMark)
#expect(testcase.preState.mergeWith(postState: state) == testcase.postState)
case .err:
Issue.record("Expected error, got \(result)")
}
case .failure:
switch testcase.output {
case .ok:
Issue.record("Expected success, got \(result)")
case .err:
// ignore error code because it is unspecified
break
}
}
}
Expand Down

0 comments on commit 6ec72bd

Please sign in to comment.