From 574aa68491f5882215da65ebad3c5703840adf8d Mon Sep 17 00:00:00 2001 From: yqrashawn Date: Wed, 23 Aug 2023 14:49:41 +0800 Subject: [PATCH 1/2] ci: failed to create commit in bump version action (#860) Co-authored-by: yqrashawn --- .github/workflows/bump_version.yml | 6 ++++++ common/version/version.go | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/bump_version.yml b/.github/workflows/bump_version.yml index 5b3f8c398..91307bc13 100644 --- a/.github/workflows/bump_version.yml +++ b/.github/workflows/bump_version.yml @@ -15,6 +15,8 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v3 + with: + ref: ${{ github.head_ref }} - name: check diff id: check_diff run: | @@ -49,7 +51,11 @@ jobs: - name: bump version in common/version/version.go if: steps.check_diff.outputs.result == 'bump' run: node .github/scripts/bump_version_dot_go.mjs + + # Commits made by this Action do not trigger new Workflow runs - uses: stefanzweifel/git-auto-commit-action@3ea6ae190baf489ba007f7c92608f33ce20ef04a if: steps.check_diff.outputs.result == 'bump' with: + skip_fetch: true # already did fetch in check diff + file_pattern: "common/version/version.go" commit_message: "chore: auto version bump [bot]" diff --git a/common/version/version.go b/common/version/version.go index ba172515b..a636ad10d 100644 --- a/common/version/version.go +++ b/common/version/version.go @@ -6,7 +6,7 @@ import ( "strings" ) -var tag = "v4.1.94" +var tag = "v4.1.95" var commit = func() string { if info, ok := debug.ReadBuildInfo(); ok { From 3d1a8374d0dbeba47070af9d2e00dbdbe8e42fec Mon Sep 17 00:00:00 2001 From: HAOYUatHZ <37070449+HAOYUatHZ@users.noreply.github.com> Date: Wed, 23 Aug 2023 17:12:39 +0800 Subject: [PATCH 2/2] feat(coordinator): check vk (#859) Co-authored-by: HAOYUatHZ --- common/version/version.go | 6 +-- .../internal/controller/api/controller.go | 10 ++++- .../internal/controller/api/get_task.go | 7 ++-- .../internal/controller/api/submit_proof.go | 5 ++- .../logic/provertask/batch_prover_task.go | 11 ++++- .../logic/provertask/chunk_prover_task.go | 12 ++++-- .../logic/submitproof/proof_receiver.go | 6 +-- coordinator/internal/logic/verifier/mock.go | 5 --- coordinator/internal/logic/verifier/types.go | 15 +++++++ .../internal/logic/verifier/verifier.go | 40 ++++++++++++++----- coordinator/internal/types/get_task.go | 5 ++- prover/client/types.go | 1 + prover/core/mock.go | 4 ++ prover/prover.go | 3 ++ 14 files changed, 93 insertions(+), 37 deletions(-) create mode 100644 coordinator/internal/logic/verifier/types.go diff --git a/common/version/version.go b/common/version/version.go index a636ad10d..7dc1ffc9a 100644 --- a/common/version/version.go +++ b/common/version/version.go @@ -6,7 +6,7 @@ import ( "strings" ) -var tag = "v4.1.95" +var tag = "v4.1.96" var commit = func() string { if info, ok := debug.ReadBuildInfo(); ok { @@ -44,7 +44,5 @@ func CheckScrollProverVersion(proverVersion string) bool { return false } // compare the `scroll_prover` version - return remote[2] == local[2] || // libzkp v0.6.6 - remote[2] == "ccb3cd4" || // libzkp v0.6.5 - remote[2] == "8c439b1" // libzkp v0.6.2 + return remote[2] == local[2] } diff --git a/coordinator/internal/controller/api/controller.go b/coordinator/internal/controller/api/controller.go index 526bee57a..1f518a77b 100644 --- a/coordinator/internal/controller/api/controller.go +++ b/coordinator/internal/controller/api/controller.go @@ -7,6 +7,7 @@ import ( "gorm.io/gorm" "scroll-tech/coordinator/internal/config" + "scroll-tech/coordinator/internal/logic/verifier" ) var ( @@ -25,9 +26,14 @@ var ( // InitController inits Controller with database func InitController(cfg *config.Config, db *gorm.DB, reg prometheus.Registerer) { initControllerOnce.Do(func() { + vf, err := verifier.NewVerifier(cfg.ProverManager.Verifier) + if err != nil { + panic("proof receiver new verifier failure") + } + Auth = NewAuthController(db) HealthCheck = NewHealthCheckController() - GetTask = NewGetTaskController(cfg, db, reg) - SubmitProof = NewSubmitProofController(cfg, db, reg) + GetTask = NewGetTaskController(cfg, db, vf, reg) + SubmitProof = NewSubmitProofController(cfg, db, vf, reg) }) } diff --git a/coordinator/internal/controller/api/get_task.go b/coordinator/internal/controller/api/get_task.go index c2594572b..cbaec9ebd 100644 --- a/coordinator/internal/controller/api/get_task.go +++ b/coordinator/internal/controller/api/get_task.go @@ -13,6 +13,7 @@ import ( "scroll-tech/coordinator/internal/config" "scroll-tech/coordinator/internal/logic/provertask" + "scroll-tech/coordinator/internal/logic/verifier" coordinatorType "scroll-tech/coordinator/internal/types" ) @@ -22,9 +23,9 @@ type GetTaskController struct { } // NewGetTaskController create a get prover task controller -func NewGetTaskController(cfg *config.Config, db *gorm.DB, reg prometheus.Registerer) *GetTaskController { - chunkProverTask := provertask.NewChunkProverTask(cfg, db, reg) - batchProverTask := provertask.NewBatchProverTask(cfg, db, reg) +func NewGetTaskController(cfg *config.Config, db *gorm.DB, vf *verifier.Verifier, reg prometheus.Registerer) *GetTaskController { + chunkProverTask := provertask.NewChunkProverTask(cfg, db, vf.ChunkVK, reg) + batchProverTask := provertask.NewBatchProverTask(cfg, db, vf.BatchVK, reg) ptc := &GetTaskController{ proverTasks: make(map[message.ProofType]provertask.ProverTask), diff --git a/coordinator/internal/controller/api/submit_proof.go b/coordinator/internal/controller/api/submit_proof.go index 5a5c98cd6..cc6398d4a 100644 --- a/coordinator/internal/controller/api/submit_proof.go +++ b/coordinator/internal/controller/api/submit_proof.go @@ -13,6 +13,7 @@ import ( "scroll-tech/coordinator/internal/config" "scroll-tech/coordinator/internal/logic/submitproof" + "scroll-tech/coordinator/internal/logic/verifier" coodinatorType "scroll-tech/coordinator/internal/types" ) @@ -22,9 +23,9 @@ type SubmitProofController struct { } // NewSubmitProofController create the submit proof api controller instance -func NewSubmitProofController(cfg *config.Config, db *gorm.DB, reg prometheus.Registerer) *SubmitProofController { +func NewSubmitProofController(cfg *config.Config, db *gorm.DB, vf *verifier.Verifier, reg prometheus.Registerer) *SubmitProofController { return &SubmitProofController{ - submitProofReceiverLogic: submitproof.NewSubmitProofReceiverLogic(cfg.ProverManager, db, reg), + submitProofReceiverLogic: submitproof.NewSubmitProofReceiverLogic(cfg.ProverManager, db, vf, reg), } } diff --git a/coordinator/internal/logic/provertask/batch_prover_task.go b/coordinator/internal/logic/provertask/batch_prover_task.go index dba838a5a..c2ff70b82 100644 --- a/coordinator/internal/logic/provertask/batch_prover_task.go +++ b/coordinator/internal/logic/provertask/batch_prover_task.go @@ -25,13 +25,14 @@ import ( // BatchProverTask is prover task implement for batch proof type BatchProverTask struct { BaseProverTask + vk string batchAttemptsExceedTotal prometheus.Counter batchTaskGetTaskTotal prometheus.Counter } // NewBatchProverTask new a batch collector -func NewBatchProverTask(cfg *config.Config, db *gorm.DB, reg prometheus.Registerer) *BatchProverTask { +func NewBatchProverTask(cfg *config.Config, db *gorm.DB, vk string, reg prometheus.Registerer) *BatchProverTask { bp := &BatchProverTask{ BaseProverTask: BaseProverTask{ db: db, @@ -40,6 +41,7 @@ func NewBatchProverTask(cfg *config.Config, db *gorm.DB, reg prometheus.Register batchOrm: orm.NewBatch(db), proverTaskOrm: orm.NewProverTask(db), }, + vk: vk, batchAttemptsExceedTotal: promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "coordinator_batch_attempts_exceed_total", Help: "Total number of batch attempts exceed.", @@ -68,7 +70,12 @@ func (bp *BatchProverTask) Assign(ctx *gin.Context, getTaskParameter *coordinato if !proverVersionExist { return nil, fmt.Errorf("get prover version from context failed") } - if !version.CheckScrollProverVersion(proverVersion.(string)) { + if getTaskParameter.VK != "" && // allow vk being empty, because for the first time the prover may not know its vk + getTaskParameter.VK != bp.vk { + if version.CheckScrollProverVersion(proverVersion.(string)) { // same prover version but different vks + return nil, fmt.Errorf("incompatible vk. please check your params files or config files") + } + // different prover versions and different vks return nil, fmt.Errorf("incompatible prover version. please upgrade your prover, expect version: %s, actual version: %s", version.Version, proverVersion.(string)) } diff --git a/coordinator/internal/logic/provertask/chunk_prover_task.go b/coordinator/internal/logic/provertask/chunk_prover_task.go index 8b98eb80d..cd25483ad 100644 --- a/coordinator/internal/logic/provertask/chunk_prover_task.go +++ b/coordinator/internal/logic/provertask/chunk_prover_task.go @@ -25,13 +25,14 @@ import ( // ChunkProverTask the chunk prover task type ChunkProverTask struct { BaseProverTask + vk string chunkAttemptsExceedTotal prometheus.Counter chunkTaskGetTaskTotal prometheus.Counter } // NewChunkProverTask new a chunk prover task -func NewChunkProverTask(cfg *config.Config, db *gorm.DB, reg prometheus.Registerer) *ChunkProverTask { +func NewChunkProverTask(cfg *config.Config, db *gorm.DB, vk string, reg prometheus.Registerer) *ChunkProverTask { cp := &ChunkProverTask{ BaseProverTask: BaseProverTask{ db: db, @@ -40,7 +41,7 @@ func NewChunkProverTask(cfg *config.Config, db *gorm.DB, reg prometheus.Register blockOrm: orm.NewL2Block(db), proverTaskOrm: orm.NewProverTask(db), }, - + vk: vk, chunkAttemptsExceedTotal: promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "coordinator_chunk_attempts_exceed_total", Help: "Total number of chunk attempts exceed.", @@ -69,7 +70,12 @@ 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 getTaskParameter.VK != "" && // allow vk being empty, because for the first time the prover may not know its vk + getTaskParameter.VK != cp.vk { + if version.CheckScrollProverVersion(proverVersion.(string)) { // same prover version but different vks + return nil, fmt.Errorf("incompatible vk. please check your params files or config files") + } + // different prover versions and different vks return nil, fmt.Errorf("incompatible prover version. please upgrade your prover, expect version: %s, actual version: %s", version.Version, proverVersion.(string)) } diff --git a/coordinator/internal/logic/submitproof/proof_receiver.go b/coordinator/internal/logic/submitproof/proof_receiver.go index 867258792..d4b91ce54 100644 --- a/coordinator/internal/logic/submitproof/proof_receiver.go +++ b/coordinator/internal/logic/submitproof/proof_receiver.go @@ -60,11 +60,7 @@ type ProofReceiverLogic struct { } // NewSubmitProofReceiverLogic create a proof receiver logic -func NewSubmitProofReceiverLogic(cfg *config.ProverManager, db *gorm.DB, reg prometheus.Registerer) *ProofReceiverLogic { - vf, err := verifier.NewVerifier(cfg.Verifier) - if err != nil { - panic("proof receiver new verifier failure") - } +func NewSubmitProofReceiverLogic(cfg *config.ProverManager, db *gorm.DB, vf *verifier.Verifier, reg prometheus.Registerer) *ProofReceiverLogic { return &ProofReceiverLogic{ chunkOrm: orm.NewChunk(db), batchOrm: orm.NewBatch(db), diff --git a/coordinator/internal/logic/verifier/mock.go b/coordinator/internal/logic/verifier/mock.go index f3a8eb3f5..37568078b 100644 --- a/coordinator/internal/logic/verifier/mock.go +++ b/coordinator/internal/logic/verifier/mock.go @@ -8,11 +8,6 @@ import ( "scroll-tech/coordinator/internal/config" ) -const InvalidTestProof = "this is a invalid proof" - -// Verifier represents a mock halo2 verifier. -type Verifier struct{} - // NewVerifier Sets up a mock verifier. func NewVerifier(_ *config.VerifierConfig) (*Verifier, error) { return &Verifier{}, nil diff --git a/coordinator/internal/logic/verifier/types.go b/coordinator/internal/logic/verifier/types.go new file mode 100644 index 000000000..9a8dc07af --- /dev/null +++ b/coordinator/internal/logic/verifier/types.go @@ -0,0 +1,15 @@ +package verifier + +import ( + "scroll-tech/coordinator/internal/config" +) + +// InvalidTestProof invalid proof used in tests +const InvalidTestProof = "this is a invalid proof" + +// Verifier represents a rust ffi to a halo2 verifier. +type Verifier struct { + cfg *config.VerifierConfig + BatchVK string + ChunkVK string +} diff --git a/coordinator/internal/logic/verifier/verifier.go b/coordinator/internal/logic/verifier/verifier.go index 7580bb752..38139eaab 100644 --- a/coordinator/internal/logic/verifier/verifier.go +++ b/coordinator/internal/logic/verifier/verifier.go @@ -11,7 +11,11 @@ package verifier import "C" //nolint:typecheck import ( + "encoding/base64" "encoding/json" + "io" + "os" + "path" "unsafe" "github.com/scroll-tech/go-ethereum/log" @@ -21,14 +25,6 @@ import ( "scroll-tech/common/types/message" ) -// InvalidTestProof invalid proof used in tests -const InvalidTestProof = "this is a invalid proof" - -// Verifier represents a rust ffi to a halo2 verifier. -type Verifier struct { - cfg *config.VerifierConfig -} - // NewVerifier Sets up a rust ffi to call verify. func NewVerifier(cfg *config.VerifierConfig) (*Verifier, error) { if cfg.MockMode { @@ -44,7 +40,21 @@ func NewVerifier(cfg *config.VerifierConfig) (*Verifier, error) { C.init_batch_verifier(paramsPathStr, assetsPathStr) C.init_chunk_verifier(paramsPathStr, assetsPathStr) - return &Verifier{cfg: cfg}, nil + batchVK, err := readVK(path.Join(cfg.AssetsPath, "agg_vk.vkey")) + if err != nil { + return nil, err + } + + chunkVK, err := readVK(path.Join(cfg.AssetsPath, "chunk_vk.vkey")) + if err != nil { + return nil, err + } + + return &Verifier{ + cfg: cfg, + BatchVK: batchVK, + ChunkVK: chunkVK, + }, nil } // VerifyBatchProof Verify a ZkProof by marshaling it and sending it to the Halo2 Verifier. @@ -96,3 +106,15 @@ func (v *Verifier) VerifyChunkProof(proof *message.ChunkProof) (bool, error) { verified := C.verify_chunk_proof(proofStr) return verified != 0, nil } + +func readVK(filePat string) (string, error) { + f, err := os.Open(filePat) + if err != nil { + return "", err + } + byt, err := io.ReadAll(f) + if err != nil { + return "", err + } + return base64.StdEncoding.EncodeToString(byt), nil +} diff --git a/coordinator/internal/types/get_task.go b/coordinator/internal/types/get_task.go index f36dd82a0..6eebf4f1a 100644 --- a/coordinator/internal/types/get_task.go +++ b/coordinator/internal/types/get_task.go @@ -2,8 +2,9 @@ package types // GetTaskParameter for ProverTasks request parameter type GetTaskParameter struct { - ProverHeight int `form:"prover_height" json:"prover_height"` - TaskType int `form:"task_type" json:"task_type"` + ProverHeight int `form:"prover_height" json:"prover_height"` + TaskType int `form:"task_type" json:"task_type"` + VK string `form:"vk" json:"vk"` } // GetTaskSchema the schema data return to prover for get prover task diff --git a/prover/client/types.go b/prover/client/types.go index a92fd8b39..24ab012a9 100644 --- a/prover/client/types.go +++ b/prover/client/types.go @@ -43,6 +43,7 @@ type LoginResponse struct { type GetTaskRequest struct { TaskType message.ProofType `json:"task_type"` ProverHeight uint64 `json:"prover_height,omitempty"` + VK string `json:"vk"` } // GetTaskResponse defines the response structure for GetTask API diff --git a/prover/core/mock.go b/prover/core/mock.go index 6fa1240b4..1fcd8df3f 100644 --- a/prover/core/mock.go +++ b/prover/core/mock.go @@ -42,3 +42,7 @@ func (p *ProverCore) ProveBatch(taskID string, chunkInfos []*message.ChunkInfo, Vk: _empty[:], }, nil } + +func (p *ProverCore) GetVk() string { + return "" +} diff --git a/prover/prover.go b/prover/prover.go index 393698aac..29c32f15a 100644 --- a/prover/prover.go +++ b/prover/prover.go @@ -177,6 +177,9 @@ func (r *Prover) fetchTaskFromCoordinator() (*store.ProvingTask, error) { // prepare the request req := &client.GetTaskRequest{ TaskType: r.Type(), + // we may not be able to get the vk at the first time, so we should pass vk to the coordinator every time we getTask + // instead of passing vk when we login + VK: r.proverCore.GetVk(), } if req.TaskType == message.ProofTypeChunk {