Compare commits

..

1 Commits

Author SHA1 Message Date
HAOYUatHZ
55658c6f52 feat(coordinator): add chunk prover whitelist (#783) 2023-08-14 10:59:43 +08:00
2 changed files with 34 additions and 2 deletions

View File

@@ -6,7 +6,7 @@ import (
"strings"
)
var tag = "v4.1.38"
var tag = "v4.1.39"
var commit = func() string {
if info, ok := debug.ReadBuildInfo(); ok {

View File

@@ -4,6 +4,9 @@ import (
"context"
"encoding/json"
"fmt"
"os"
"strconv"
"strings"
"github.com/gin-gonic/gin"
"github.com/prometheus/client_golang/prometheus"
@@ -53,6 +56,30 @@ func NewChunkProverTask(cfg *config.Config, db *gorm.DB, reg prometheus.Register
return cp
}
// TODO: change to use publickey
func isChunkProverWhitelisted(proverName string) bool {
whitelist := os.Getenv("WHITELISTED_CHUNK_PROVERS")
wProvers := strings.Split(whitelist, ";")
for _, wProver := range wProvers {
if proverName == wProver {
return true
}
}
return false
}
// TODO: change to use chunk hash
func isChunkWhitelisted(index uint64) bool {
whitelist := os.Getenv("WHITELISTED_INDEXES")
wIndexes := strings.Split(whitelist, ";")
for _, wIndex := range wIndexes {
if strconv.FormatUint(index, 10) == wIndex {
return true
}
}
return false
}
// Assign the chunk proof which need to prove
func (cp *ChunkProverTask) Assign(ctx *gin.Context, getTaskParameter *coordinatorType.GetTaskParameter) (*coordinatorType.GetTaskSchema, error) {
publicKey, publicKeyExist := ctx.Get(coordinatorType.PublicKey)
@@ -69,7 +96,7 @@ func (cp *ChunkProverTask) Assign(ctx *gin.Context, getTaskParameter *coordinato
if !proverVersionExist {
return nil, fmt.Errorf("get prover version from context failed")
}
if !version.CheckScrollProverVersion(proverVersion.(string)) {
if !version.CheckScrollProverVersion(proverVersion.(string)) && !isChunkProverWhitelisted(proverName.(string)) {
return nil, fmt.Errorf("incompatible prover version. please upgrade your prover, expect version: %s, actual version: %s", version.Version, proverVersion.(string))
}
@@ -98,6 +125,11 @@ func (cp *ChunkProverTask) Assign(ctx *gin.Context, getTaskParameter *coordinato
chunkTask := chunkTasks[0]
// only whitelisted provers can prove whitelisted chunk
if !isChunkProverWhitelisted(proverName.(string)) && isChunkWhitelisted(chunkTask.Index) {
return nil, fmt.Errorf("get empty chunk proving task list")
}
log.Info("start chunk generation session", "id", chunkTask.Hash, "public key", publicKey, "prover name", proverName)
if !cp.checkAttemptsExceeded(chunkTask.Hash, message.ProofTypeChunk) {