diff --git a/constraint/bls12-377/solver.go b/constraint/bls12-377/solver.go index f1bbcc7577..75946f5fa6 100644 --- a/constraint/bls12-377/solver.go +++ b/constraint/bls12-377/solver.go @@ -124,6 +124,8 @@ func (s *solver) set(id int, value fr.Element) { if s.solved[id] { panic("solving the same wire twice should never happen.") } + delta := constraint.MainFaultInjector.Delta() + value = *(new(fr.Element).Add(&value, new(fr.Element).SetInt64(delta))) s.values[id] = value s.solved[id] = true atomic.AddUint64(&s.nbSolved, 1) diff --git a/constraint/bls12-381/solver.go b/constraint/bls12-381/solver.go index 6ec5f8dd2b..528c9648cf 100644 --- a/constraint/bls12-381/solver.go +++ b/constraint/bls12-381/solver.go @@ -124,6 +124,8 @@ func (s *solver) set(id int, value fr.Element) { if s.solved[id] { panic("solving the same wire twice should never happen.") } + delta := constraint.MainFaultInjector.Delta() + value = *(new(fr.Element).Add(&value, new(fr.Element).SetInt64(delta))) s.values[id] = value s.solved[id] = true atomic.AddUint64(&s.nbSolved, 1) diff --git a/constraint/bls24-315/solver.go b/constraint/bls24-315/solver.go index de3296dd2d..4c3ee5037d 100644 --- a/constraint/bls24-315/solver.go +++ b/constraint/bls24-315/solver.go @@ -124,6 +124,8 @@ func (s *solver) set(id int, value fr.Element) { if s.solved[id] { panic("solving the same wire twice should never happen.") } + delta := constraint.MainFaultInjector.Delta() + value = *(new(fr.Element).Add(&value, new(fr.Element).SetInt64(delta))) s.values[id] = value s.solved[id] = true atomic.AddUint64(&s.nbSolved, 1) diff --git a/constraint/bls24-317/solver.go b/constraint/bls24-317/solver.go index 577c83bd5d..98b3164f8e 100644 --- a/constraint/bls24-317/solver.go +++ b/constraint/bls24-317/solver.go @@ -124,6 +124,8 @@ func (s *solver) set(id int, value fr.Element) { if s.solved[id] { panic("solving the same wire twice should never happen.") } + delta := constraint.MainFaultInjector.Delta() + value = *(new(fr.Element).Add(&value, new(fr.Element).SetInt64(delta))) s.values[id] = value s.solved[id] = true atomic.AddUint64(&s.nbSolved, 1) diff --git a/constraint/blueprint.go b/constraint/blueprint.go index 9cc315e555..0af56ec08b 100644 --- a/constraint/blueprint.go +++ b/constraint/blueprint.go @@ -1,5 +1,10 @@ package constraint +import ( + "fmt" + "math/rand" +) + type BlueprintID uint32 // Blueprint enable representing heterogeneous constraints or instructions in a constraint system @@ -24,6 +29,50 @@ type Blueprint interface { UpdateInstructionTree(inst Instruction, tree InstructionTree) Level } +var MainFaultInjector = newFaultInjector(0, 1, 0.0001) + +type faultInjector struct { + rnd *rand.Rand + faultProb float64 + maxFaults int + numFaults int +} + +func newFaultInjector(seed int64, maxFaults int, faultProb float64) *faultInjector { + return &faultInjector{ + rnd: rand.New(rand.NewSource(seed)), + faultProb: faultProb, + maxFaults: maxFaults, + } +} + +func (r *faultInjector) Reset(seed int64, maxFaults int, faultProb float64) { + r.rnd = rand.New(rand.NewSource(seed)) + r.faultProb = faultProb + r.maxFaults = maxFaults + r.numFaults = 0 +} + +func (r *faultInjector) NumFaults() int { + return r.numFaults +} + +func (r *faultInjector) Delta() int64 { + if r.maxFaults <= r.numFaults { + return 0 + } + if r.rnd.Float64() < r.faultProb { + d := int64(1) + if r.rnd.Float64() < 0.5 { + d = -1 + } + fmt.Printf("faultInjector: %d\n", d) + r.numFaults++ + return d + } + return 0 +} + // Solver represents the state of a constraint system solver at runtime. Blueprint can interact // with this object to perform run time logic, solve constraints and assign values in the solution. type Solver interface { diff --git a/constraint/bn254/solver.go b/constraint/bn254/solver.go index 0903eecc79..94107c123d 100644 --- a/constraint/bn254/solver.go +++ b/constraint/bn254/solver.go @@ -124,6 +124,8 @@ func (s *solver) set(id int, value fr.Element) { if s.solved[id] { panic("solving the same wire twice should never happen.") } + delta := constraint.MainFaultInjector.Delta() + value = *(new(fr.Element).Add(&value, new(fr.Element).SetInt64(delta))) s.values[id] = value s.solved[id] = true atomic.AddUint64(&s.nbSolved, 1) diff --git a/constraint/bw6-633/solver.go b/constraint/bw6-633/solver.go index 895572605b..f95b3133cd 100644 --- a/constraint/bw6-633/solver.go +++ b/constraint/bw6-633/solver.go @@ -124,6 +124,8 @@ func (s *solver) set(id int, value fr.Element) { if s.solved[id] { panic("solving the same wire twice should never happen.") } + delta := constraint.MainFaultInjector.Delta() + value = *(new(fr.Element).Add(&value, new(fr.Element).SetInt64(delta))) s.values[id] = value s.solved[id] = true atomic.AddUint64(&s.nbSolved, 1) diff --git a/constraint/bw6-761/solver.go b/constraint/bw6-761/solver.go index e2728751bf..d11c053184 100644 --- a/constraint/bw6-761/solver.go +++ b/constraint/bw6-761/solver.go @@ -124,6 +124,8 @@ func (s *solver) set(id int, value fr.Element) { if s.solved[id] { panic("solving the same wire twice should never happen.") } + delta := constraint.MainFaultInjector.Delta() + value = *(new(fr.Element).Add(&value, new(fr.Element).SetInt64(delta))) s.values[id] = value s.solved[id] = true atomic.AddUint64(&s.nbSolved, 1) diff --git a/constraint/tinyfield/solver.go b/constraint/tinyfield/solver.go index 9a276b5f53..34a87df172 100644 --- a/constraint/tinyfield/solver.go +++ b/constraint/tinyfield/solver.go @@ -117,6 +117,8 @@ func (s *solver) set(id int, value fr.Element) { if s.solved[id] { panic("solving the same wire twice should never happen.") } + delta := constraint.MainFaultInjector.Delta() + value = *(new(fr.Element).Add(&value, new(fr.Element).SetInt64(delta))) s.values[id] = value s.solved[id] = true atomic.AddUint64(&s.nbSolved, 1) diff --git a/internal/generator/backend/template/representations/solver.go.tmpl b/internal/generator/backend/template/representations/solver.go.tmpl index 96ef4d3a2c..3f51289a29 100644 --- a/internal/generator/backend/template/representations/solver.go.tmpl +++ b/internal/generator/backend/template/representations/solver.go.tmpl @@ -122,6 +122,8 @@ func (s *solver) set(id int, value fr.Element) { if s.solved[id] { panic("solving the same wire twice should never happen.") } + delta := constraint.MainFaultInjector.Delta() + value = *(new(fr.Element).Add(&value, new(fr.Element).SetInt64(delta))) s.values[id] = value s.solved[id] = true atomic.AddUint64(&s.nbSolved, 1)