mirror of
https://github.com/scroll-tech/scroll.git
synced 2026-01-09 14:08:03 -05:00
fix(integration test): fix TestCoordinatorProverInteraction (#765)
Co-authored-by: HAOYUatHZ <37070449+HAOYUatHZ@users.noreply.github.com> Co-authored-by: Péter Garamvölgyi <peter@scroll.io>
This commit is contained in:
3
.github/workflows/integration.yaml
vendored
3
.github/workflows/integration.yaml
vendored
@@ -16,8 +16,7 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
tests:
|
tests:
|
||||||
# if: github.event.pull_request.draft == false
|
if: github.event.pull_request.draft == false
|
||||||
if: false
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Install Go
|
- name: Install Go
|
||||||
|
|||||||
@@ -20,12 +20,17 @@ var (
|
|||||||
MessageRelayerApp MockAppName = "message-relayer-test"
|
MessageRelayerApp MockAppName = "message-relayer-test"
|
||||||
// RollupRelayerApp the name of mock rollup-relayer app.
|
// RollupRelayerApp the name of mock rollup-relayer app.
|
||||||
RollupRelayerApp MockAppName = "rollup-relayer-test"
|
RollupRelayerApp MockAppName = "rollup-relayer-test"
|
||||||
// CoordinatorApp the name of mock coordinator app.
|
|
||||||
CoordinatorApp MockAppName = "coordinator-test"
|
|
||||||
// DBCliApp the name of mock database app.
|
// DBCliApp the name of mock database app.
|
||||||
DBCliApp MockAppName = "db_cli-test"
|
DBCliApp MockAppName = "db_cli-test"
|
||||||
// ProverApp the name of mock prover app.
|
|
||||||
ProverApp MockAppName = "prover-test"
|
// CoordinatorApp the name of mock coordinator app.
|
||||||
|
CoordinatorApp MockAppName = "coordinator-test"
|
||||||
|
|
||||||
|
// ChunkProverApp the name of mock chunk prover app.
|
||||||
|
ChunkProverApp MockAppName = "chunkProver-test"
|
||||||
|
// BatchProverApp the name of mock batch prover app.
|
||||||
|
BatchProverApp MockAppName = "batchProver-test"
|
||||||
)
|
)
|
||||||
|
|
||||||
// RegisterSimulation register initializer function for integration-test.
|
// RegisterSimulation register initializer function for integration-test.
|
||||||
|
|||||||
@@ -20,11 +20,13 @@ var commit = func() string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ""
|
// Set default value for integration test.
|
||||||
|
return "000000"
|
||||||
}()
|
}()
|
||||||
|
|
||||||
// ZkVersion is commit-id of common/libzkp/impl/cargo.lock/scroll-prover and halo2, concated by a "-"
|
// ZkVersion is commit-id of common/libzkp/impl/cargo.lock/scroll-prover and halo2, contacted by a "-"
|
||||||
var ZkVersion string
|
// The default `000000-000000` is set for integration test, and will be overwritten by coordinator's & prover's actual compilations (see their Makefiles).
|
||||||
|
var ZkVersion = "000000-000000"
|
||||||
|
|
||||||
// Version denote the version of scroll protocol, including the l2geth, relayer, coordinator, prover, contracts and etc.
|
// Version denote the version of scroll protocol, including the l2geth, relayer, coordinator, prover, contracts and etc.
|
||||||
var Version = fmt.Sprintf("%s-%s-%s", tag, commit, ZkVersion)
|
var Version = fmt.Sprintf("%s-%s-%s", tag, commit, ZkVersion)
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ func (bp *BatchProverTask) Assign(ctx *gin.Context, getTaskParameter *coordinato
|
|||||||
return nil, fmt.Errorf("get prover version from context failed")
|
return nil, fmt.Errorf("get prover version from context failed")
|
||||||
}
|
}
|
||||||
if !version.CheckScrollProverVersion(proverVersion.(string)) {
|
if !version.CheckScrollProverVersion(proverVersion.(string)) {
|
||||||
return nil, fmt.Errorf("incompatible prover version. please upgrade your prover")
|
return nil, fmt.Errorf("incompatible prover version. please upgrade your prover, expect version: %s, actual version: %s", proverVersion.(string), version.Version)
|
||||||
}
|
}
|
||||||
|
|
||||||
batchTasks, err := bp.batchOrm.UpdateUnassignedBatchReturning(ctx, 1)
|
batchTasks, err := bp.batchOrm.UpdateUnassignedBatchReturning(ctx, 1)
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ func (cp *ChunkProverTask) Assign(ctx *gin.Context, getTaskParameter *coordinato
|
|||||||
return nil, fmt.Errorf("get prover version from context failed")
|
return nil, fmt.Errorf("get prover version from context failed")
|
||||||
}
|
}
|
||||||
if !version.CheckScrollProverVersion(proverVersion.(string)) {
|
if !version.CheckScrollProverVersion(proverVersion.(string)) {
|
||||||
return nil, fmt.Errorf("incompatible prover version. please upgrade your prover")
|
return nil, fmt.Errorf("incompatible prover version. please upgrade your prover, expect version: %s, actual version: %s", version.Version, proverVersion.(string))
|
||||||
}
|
}
|
||||||
|
|
||||||
// load and send chunk tasks
|
// load and send chunk tasks
|
||||||
|
|||||||
@@ -31,7 +31,8 @@ func init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Register `prover-test` app for integration-test.
|
// Register `prover-test` app for integration-test.
|
||||||
utils.RegisterSimulation(app, utils.ProverApp)
|
utils.RegisterSimulation(app, utils.ChunkProverApp)
|
||||||
|
utils.RegisterSimulation(app, utils.BatchProverApp)
|
||||||
}
|
}
|
||||||
|
|
||||||
func action(ctx *cli.Context) error {
|
func action(ctx *cli.Context) error {
|
||||||
|
|||||||
@@ -6,11 +6,21 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"scroll-tech/common/cmd"
|
"scroll-tech/common/cmd"
|
||||||
|
"scroll-tech/common/utils"
|
||||||
"scroll-tech/common/version"
|
"scroll-tech/common/version"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestRunProver(t *testing.T) {
|
func TestRunChunkProver(t *testing.T) {
|
||||||
prover := cmd.NewCmd("prover-test", "--version")
|
prover := cmd.NewCmd(string(utils.ChunkProverApp), "--version")
|
||||||
|
defer prover.WaitExit()
|
||||||
|
|
||||||
|
// wait result
|
||||||
|
prover.ExpectWithTimeout(t, true, time.Second*3, fmt.Sprintf("prover version %s", version.Version))
|
||||||
|
prover.RunApp(nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestRunBatchProver(t *testing.T) {
|
||||||
|
prover := cmd.NewCmd(string(utils.BatchProverApp), "--version")
|
||||||
defer prover.WaitExit()
|
defer prover.WaitExit()
|
||||||
|
|
||||||
// wait result
|
// wait result
|
||||||
|
|||||||
@@ -4,15 +4,12 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"sync"
|
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/google/uuid"
|
|
||||||
"github.com/scroll-tech/go-ethereum/rpc"
|
"github.com/scroll-tech/go-ethereum/rpc"
|
||||||
"golang.org/x/sync/errgroup"
|
|
||||||
|
|
||||||
proverConfig "scroll-tech/prover/config"
|
"scroll-tech/prover/config"
|
||||||
|
|
||||||
"scroll-tech/common/cmd"
|
"scroll-tech/common/cmd"
|
||||||
"scroll-tech/common/docker"
|
"scroll-tech/common/docker"
|
||||||
@@ -31,7 +28,7 @@ func getIndex() int {
|
|||||||
|
|
||||||
// ProverApp prover-test client manager.
|
// ProverApp prover-test client manager.
|
||||||
type ProverApp struct {
|
type ProverApp struct {
|
||||||
Config *proverConfig.Config
|
Config *config.Config
|
||||||
|
|
||||||
base *docker.App
|
base *docker.App
|
||||||
|
|
||||||
@@ -41,23 +38,30 @@ type ProverApp struct {
|
|||||||
|
|
||||||
index int
|
index int
|
||||||
name string
|
name string
|
||||||
args []string
|
|
||||||
docker.AppAPI
|
docker.AppAPI
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewProverApp return a new proverApp manager.
|
// NewProverApp return a new proverApp manager.
|
||||||
func NewProverApp(base *docker.App, file string, httpURL string, proofType message.ProofType) *ProverApp {
|
func NewProverApp(base *docker.App, mockName utils.MockAppName, file string, httpURL string) *ProverApp {
|
||||||
uuid := uuid.New().String()
|
var proofType message.ProofType
|
||||||
|
switch mockName {
|
||||||
proverFile := fmt.Sprintf("/tmp/%s_%d_prover-config.json", uuid, base.Timestamp)
|
case utils.ChunkProverApp:
|
||||||
|
proofType = message.ProofTypeChunk
|
||||||
|
case utils.BatchProverApp:
|
||||||
|
proofType = message.ProofTypeBatch
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
name := string(mockName)
|
||||||
|
proverFile := fmt.Sprintf("/tmp/%d_%s-config.json", base.Timestamp, name)
|
||||||
proverApp := &ProverApp{
|
proverApp := &ProverApp{
|
||||||
base: base,
|
base: base,
|
||||||
originFile: file,
|
originFile: file,
|
||||||
proverFile: proverFile,
|
proverFile: proverFile,
|
||||||
bboltDB: fmt.Sprintf("/tmp/%s_%d_bbolt_db", uuid, base.Timestamp),
|
bboltDB: fmt.Sprintf("/tmp/%d_%s_bbolt_db", base.Timestamp, name),
|
||||||
index: getIndex(),
|
index: getIndex(),
|
||||||
name: string(utils.ProverApp),
|
name: name,
|
||||||
args: []string{"--log.debug", "--config", proverFile},
|
AppAPI: cmd.NewCmd(name, []string{"--log.debug", "--config", proverFile}...),
|
||||||
}
|
}
|
||||||
if err := proverApp.MockConfig(true, httpURL, proofType); err != nil {
|
if err := proverApp.MockConfig(true, httpURL, proofType); err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
@@ -66,18 +70,10 @@ func NewProverApp(base *docker.App, file string, httpURL string, proofType messa
|
|||||||
}
|
}
|
||||||
|
|
||||||
// RunApp run prover-test child process by multi parameters.
|
// RunApp run prover-test child process by multi parameters.
|
||||||
func (r *ProverApp) RunApp(t *testing.T, args ...string) {
|
func (r *ProverApp) RunApp(t *testing.T) {
|
||||||
r.AppAPI = cmd.NewCmd(r.name, append(r.args, args...)...)
|
|
||||||
r.AppAPI.RunApp(func() bool { return r.AppAPI.WaitResult(t, time.Second*40, "prover start successfully") })
|
r.AppAPI.RunApp(func() bool { return r.AppAPI.WaitResult(t, time.Second*40, "prover start successfully") })
|
||||||
}
|
}
|
||||||
|
|
||||||
// RunAppWithExpectedResult runs the prover-test child process with multiple parameters,
|
|
||||||
// and checks for a specific expected result in the output.
|
|
||||||
func (r *ProverApp) RunAppWithExpectedResult(t *testing.T, expectedResult string, args ...string) {
|
|
||||||
r.AppAPI = cmd.NewCmd(r.name, append(r.args, args...)...)
|
|
||||||
r.AppAPI.RunApp(func() bool { return r.AppAPI.WaitResult(t, time.Second*40, expectedResult) })
|
|
||||||
}
|
|
||||||
|
|
||||||
// Free stop and release prover-test.
|
// Free stop and release prover-test.
|
||||||
func (r *ProverApp) Free() {
|
func (r *ProverApp) Free() {
|
||||||
if !utils.IsNil(r.AppAPI) {
|
if !utils.IsNil(r.AppAPI) {
|
||||||
@@ -90,7 +86,7 @@ func (r *ProverApp) Free() {
|
|||||||
|
|
||||||
// MockConfig creates a new prover config.
|
// MockConfig creates a new prover config.
|
||||||
func (r *ProverApp) MockConfig(store bool, httpURL string, proofType message.ProofType) error {
|
func (r *ProverApp) MockConfig(store bool, httpURL string, proofType message.ProofType) error {
|
||||||
cfg, err := proverConfig.NewConfig(r.originFile)
|
cfg, err := config.NewConfig(r.originFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -123,47 +119,3 @@ func (r *ProverApp) MockConfig(store bool, httpURL string, proofType message.Pro
|
|||||||
}
|
}
|
||||||
return os.WriteFile(r.proverFile, data, 0600)
|
return os.WriteFile(r.proverFile, data, 0600)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ProverApps proverApp list.
|
|
||||||
type ProverApps []*ProverApp
|
|
||||||
|
|
||||||
// RunApps starts all the proverApps.
|
|
||||||
func (r ProverApps) RunApps(t *testing.T, args ...string) {
|
|
||||||
var eg errgroup.Group
|
|
||||||
for i := range r {
|
|
||||||
i := i
|
|
||||||
eg.Go(func() error {
|
|
||||||
r[i].RunApp(t, args...)
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
}
|
|
||||||
_ = eg.Wait()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Free releases proverApps.
|
|
||||||
func (r ProverApps) Free() {
|
|
||||||
var wg sync.WaitGroup
|
|
||||||
wg.Add(len(r))
|
|
||||||
for i := range r {
|
|
||||||
i := i
|
|
||||||
go func() {
|
|
||||||
r[i].Free()
|
|
||||||
wg.Done()
|
|
||||||
}()
|
|
||||||
}
|
|
||||||
wg.Wait()
|
|
||||||
}
|
|
||||||
|
|
||||||
// WaitExit wait proverApps stopped.
|
|
||||||
func (r ProverApps) WaitExit() {
|
|
||||||
var wg sync.WaitGroup
|
|
||||||
wg.Add(len(r))
|
|
||||||
for i := range r {
|
|
||||||
i := i
|
|
||||||
go func() {
|
|
||||||
r[i].WaitExit()
|
|
||||||
wg.Done()
|
|
||||||
}()
|
|
||||||
}
|
|
||||||
wg.Wait()
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -4,12 +4,10 @@ go 1.19
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/go-resty/resty/v2 v2.7.0
|
github.com/go-resty/resty/v2 v2.7.0
|
||||||
github.com/google/uuid v1.3.0
|
|
||||||
github.com/scroll-tech/go-ethereum v1.10.14-0.20230804022247-26eeb40ea3ca
|
github.com/scroll-tech/go-ethereum v1.10.14-0.20230804022247-26eeb40ea3ca
|
||||||
github.com/stretchr/testify v1.8.3
|
github.com/stretchr/testify v1.8.3
|
||||||
github.com/urfave/cli/v2 v2.25.7
|
github.com/urfave/cli/v2 v2.25.7
|
||||||
go.etcd.io/bbolt v1.3.7
|
go.etcd.io/bbolt v1.3.7
|
||||||
golang.org/x/sync v0.3.0
|
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
@@ -21,6 +19,7 @@ require (
|
|||||||
github.com/go-ole/go-ole v1.2.6 // indirect
|
github.com/go-ole/go-ole v1.2.6 // indirect
|
||||||
github.com/go-stack/stack v1.8.1 // indirect
|
github.com/go-stack/stack v1.8.1 // indirect
|
||||||
github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect
|
github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect
|
||||||
|
github.com/google/uuid v1.3.0 // indirect
|
||||||
github.com/gorilla/websocket v1.5.0 // indirect
|
github.com/gorilla/websocket v1.5.0 // indirect
|
||||||
github.com/holiman/uint256 v1.2.3 // indirect
|
github.com/holiman/uint256 v1.2.3 // indirect
|
||||||
github.com/huin/goupnp v1.0.3 // indirect
|
github.com/huin/goupnp v1.0.3 // indirect
|
||||||
@@ -45,6 +44,7 @@ require (
|
|||||||
github.com/yusufpapurcu/wmi v1.2.2 // indirect
|
github.com/yusufpapurcu/wmi v1.2.2 // indirect
|
||||||
golang.org/x/crypto v0.11.0 // indirect
|
golang.org/x/crypto v0.11.0 // indirect
|
||||||
golang.org/x/net v0.12.0 // indirect
|
golang.org/x/net v0.12.0 // indirect
|
||||||
|
golang.org/x/sync v0.3.0 // indirect
|
||||||
golang.org/x/sys v0.10.0 // indirect
|
golang.org/x/sys v0.10.0 // indirect
|
||||||
golang.org/x/time v0.3.0 // indirect
|
golang.org/x/time v0.3.0 // indirect
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ import (
|
|||||||
"scroll-tech/common/database"
|
"scroll-tech/common/database"
|
||||||
"scroll-tech/common/docker"
|
"scroll-tech/common/docker"
|
||||||
"scroll-tech/common/types"
|
"scroll-tech/common/types"
|
||||||
"scroll-tech/common/types/message"
|
|
||||||
"scroll-tech/common/utils"
|
"scroll-tech/common/utils"
|
||||||
"scroll-tech/common/version"
|
"scroll-tech/common/version"
|
||||||
|
|
||||||
@@ -38,13 +37,11 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TestMain(m *testing.M) {
|
func TestMain(m *testing.M) {
|
||||||
version.Version = "v1.2.3-aaa-bbb-ccc"
|
|
||||||
|
|
||||||
base = docker.NewDockerApp()
|
base = docker.NewDockerApp()
|
||||||
bridgeApp = bcmd.NewBridgeApp(base, "../../bridge/conf/config.json")
|
bridgeApp = bcmd.NewBridgeApp(base, "../../bridge/conf/config.json")
|
||||||
coordinatorApp = capp.NewCoordinatorApp(base, "../../coordinator/conf/config.json")
|
coordinatorApp = capp.NewCoordinatorApp(base, "../../coordinator/conf/config.json")
|
||||||
chunkProverApp = rapp.NewProverApp(base, "../../prover/config.json", coordinatorApp.HTTPEndpoint(), message.ProofTypeChunk)
|
chunkProverApp = rapp.NewProverApp(base, utils.ChunkProverApp, "../../prover/config.json", coordinatorApp.HTTPEndpoint())
|
||||||
batchProverApp = rapp.NewProverApp(base, "../../prover/config.json", coordinatorApp.HTTPEndpoint(), message.ProofTypeBatch)
|
batchProverApp = rapp.NewProverApp(base, utils.BatchProverApp, "../../prover/config.json", coordinatorApp.HTTPEndpoint())
|
||||||
m.Run()
|
m.Run()
|
||||||
bridgeApp.Free()
|
bridgeApp.Free()
|
||||||
coordinatorApp.Free()
|
coordinatorApp.Free()
|
||||||
@@ -115,17 +112,21 @@ func TestCoordinatorProverInteraction(t *testing.T) {
|
|||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
err = chunkOrm.UpdateBatchHashInRange(context.Background(), 0, 0, batch.Hash)
|
err = chunkOrm.UpdateBatchHashInRange(context.Background(), 0, 0, batch.Hash)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
t.Log(version.Version)
|
||||||
|
|
||||||
// Run coordinator app.
|
// Run coordinator app.
|
||||||
coordinatorApp.RunApp(t)
|
coordinatorApp.RunApp(t)
|
||||||
|
|
||||||
// Run prover app.
|
// Run prover app.
|
||||||
chunkProverApp.RunAppWithExpectedResult(t, "proof submitted successfully") // chunk prover login -> get task -> submit proof.
|
chunkProverApp.ExpectWithTimeout(t, true, time.Second*40, "proof submitted successfully") // chunk prover login -> get task -> submit proof.
|
||||||
batchProverApp.RunAppWithExpectedResult(t, "proof submitted successfully") // batch prover login -> get task -> submit proof.
|
batchProverApp.ExpectWithTimeout(t, true, time.Second*40, "proof submitted successfully") // batch prover login -> get task -> submit proof.
|
||||||
|
|
||||||
// All task has been proven, coordinator would not return any task.
|
// All task has been proven, coordinator would not return any task.
|
||||||
chunkProverApp.ExpectWithTimeout(t, false, 60*time.Second, "get empty prover task")
|
chunkProverApp.ExpectWithTimeout(t, true, 60*time.Second, "get empty prover task")
|
||||||
batchProverApp.ExpectWithTimeout(t, false, 60*time.Second, "get empty prover task")
|
batchProverApp.ExpectWithTimeout(t, true, 60*time.Second, "get empty prover task")
|
||||||
|
|
||||||
|
chunkProverApp.RunApp(t)
|
||||||
|
batchProverApp.RunApp(t)
|
||||||
|
|
||||||
// Free apps.
|
// Free apps.
|
||||||
chunkProverApp.WaitExit()
|
chunkProverApp.WaitExit()
|
||||||
@@ -142,10 +143,12 @@ func TestProverReLogin(t *testing.T) {
|
|||||||
|
|
||||||
// Run coordinator app.
|
// Run coordinator app.
|
||||||
coordinatorApp.RunApp(t) // login timeout: 1 sec
|
coordinatorApp.RunApp(t) // login timeout: 1 sec
|
||||||
|
chunkProverApp.RunApp(t)
|
||||||
|
batchProverApp.RunApp(t)
|
||||||
|
|
||||||
// Run prover app.
|
// Run prover app.
|
||||||
chunkProverApp.RunAppWithExpectedResult(t, "re-login success") // chunk prover login.
|
chunkProverApp.WaitResult(t, time.Second*40, "re-login success") // chunk prover login.
|
||||||
batchProverApp.RunAppWithExpectedResult(t, "re-login success") // batch prover login.
|
batchProverApp.WaitResult(t, time.Second*40, "re-login success") // batch prover login.
|
||||||
|
|
||||||
// Free apps.
|
// Free apps.
|
||||||
chunkProverApp.WaitExit()
|
chunkProverApp.WaitExit()
|
||||||
|
|||||||
Reference in New Issue
Block a user