@@ -11,28 +11,36 @@ open Lean.ToJson (toJson)
1111open Std (HashMap)
1212
1313
14- def certify {env : Environment} (state : State) : Outcomes :=
14+ def forge {env : Environment} (state : State) : Outcomes :=
1515 let state' :=
1616 {
1717 state with
18- rbCount := state.rbCount + 1
19- canCertify := true
18+ clock := state.clock + 1
2019 }
20+ let p := 1 - env.fAdversary
21+ [
22+ ({state' with rbCount := state.rbCount + 1 }, p)
23+ , (state', 1 - p)
24+ ]
25+
26+ def certify {env : Environment} (state : State) : Outcomes :=
27+ let p := env.pSpacingOkay * (1 - env.fAdversary)
2128 if state.canCertify
2229 then [
23- ⟨{state' with ebCount := state.ebCount + 1 }, env.pSpacingOkay ⟩
24- , ⟨state' , 1 - env.pSpacingOkay ⟩
30+ ⟨{state with ebCount := state.ebCount + 1 }, p ⟩
31+ , ⟨state, 1 - p ⟩
2532 ]
26- else [(state' , 1 )]
33+ else [(state, 1 )]
2734
2835def vote {env : Environment} (state : State) : Outcomes :=
36+ let p := env.pQuorum * (1 - env.fAdversary)
2937 [
30- (state, env.pQuorum )
31- , ({state with canCertify := false }, 1 - env.pQuorum )
38+ ({ state with canCertify := true }, p )
39+ , ({state with canCertify := false }, 1 - p )
3240 ]
3341
3442def step {env : Environment} : List (State → Outcomes) :=
35- [@certify env, @vote env]
43+ [@forge env, @ certify env, @vote env]
3644
3745
3846def prune (ε : Float) : Probabilities → Probabilities :=
@@ -75,10 +83,10 @@ def ebDistributionJson : Probabilities → Json :=
7583 Json.mkObj ∘ List.map (fun ⟨k, v⟩ => ⟨toString k, toJson v⟩) ∘ HashMap.toList ∘ ebDistribution
7684
7785def ebEfficiency (states : Probabilities) : Float :=
78- let rbCount := states.keys.head!.rbCount
86+ let clock := states.keys.head!.clock
7987 let ebCount :=
8088 HashMap.fold
8189 (fun acc state p =>acc + state.ebCount.toFloat * p)
8290 0
8391 states
84- ebCount / (rbCount .toFloat - 1 )
92+ ebCount / (clock .toFloat - 1 )
0 commit comments