···472472473473 var err error
474474 for proofHeight, proof := range store.Consensus.BlockChalengeProofsIterator(tx, uint64(max(cacheKey.startHeight-1, 0)), &err) {
475475+ select {
476476+ case <-ctx.Done():
477477+ return zeroValue, stacktrace.Propagate(ctx.Err(), "")
478478+ default:
479479+ }
480480+475481 if proofHeight > uint64(cacheKey.endHeight) {
476482 break
477483 }
+16-1
abciapp/tx_challenge.go
···2121const CommitToChallengeMaxRange = 10000
2222const CommitToChallengeTargetInterval = 5000
23232424+// TODO adjust these depending on how fast we want inactive validators to lose reputation
2525+// TODO reputation loss (and gain?) should probably be based on a % of the current reputation
2626+// or loss should stack (multiplicatively?) if a validator remains inactive for too long
2727+// so that if a very reputable validator goes offline, it doesn't continue to have a lot of voting power for too long
2828+// perhaps simpler idea: in addition to entropy, apply additional (separate) penalty based on age of last proven height
2929+// (store.Consensus.ValidatorRangeChallengeCompletion) when age crosses some threshold
3030+const ReputationGainPerProvenBlock = 100
3131+const ReputationEntropyLossPerBlock = 90
3232+2433var CommitToChallengeMaxAge = lo.Must(time.ParseDuration("10s"))
25342635const CompleteChallengeMaxAgeInBlocks = 4
···318327 return nil, stacktrace.Propagate(err, "")
319328 }
320329321321- // TODO effects on validator reputation
330330+ numProvenBlocks := toHeight - fromHeight + 1
331331+ repGain := numProvenBlocks * ReputationGainPerProvenBlock
332332+333333+ err = store.Consensus.ChangeValidatorReputation(writeTx, tx.Arguments.Validator, int64(repGain))
334334+ if err != nil {
335335+ return nil, stacktrace.Propagate(err, "")
336336+ }
322337 }
323338324339 return &processResult{