Skip to content
Merged
1 change: 1 addition & 0 deletions roller/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ type Config struct {
type ProverConfig struct {
ParamsPath string `json:"params_path"`
SeedPath string `json:"seed_path"`
DumpDir string `json:"dump_dir,omitempty"`
}

// NewConfig returns a new instance of Config.
Expand Down
4 changes: 1 addition & 3 deletions roller/prover/mock.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@
package prover

import (
"github.com/scroll-tech/go-ethereum/core/types"

"scroll-tech/common/message"

"scroll-tech/roller/config"
Expand All @@ -21,7 +19,7 @@ func NewProver(cfg *config.ProverConfig) (*Prover, error) {
}

// Prove call rust ffi to generate proof, if first failed, try again.
func (p *Prover) Prove(_ []*types.BlockTrace) (*message.AggProof, error) {
func (p *Prover) Prove(_ *message.TaskMsg) (*message.AggProof, error) {
return &message.AggProof{
Proof: []byte{},
Instance: []byte{},
Expand Down
52 changes: 42 additions & 10 deletions roller/prover/prover.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,10 @@ import "C" //nolint:typecheck

import (
"encoding/json"
"os"
"path/filepath"
"unsafe"

"github.com/scroll-tech/go-ethereum/core/types"
"github.com/scroll-tech/go-ethereum/log"

"scroll-tech/common/message"
Expand All @@ -37,19 +38,38 @@ func NewProver(cfg *config.ProverConfig) (*Prover, error) {
}()
C.init_prover(paramsPathStr, seedPathStr)

if cfg.DumpDir != "" {
err := os.MkdirAll(cfg.DumpDir, os.ModePerm)
if err != nil {
return nil, err
}
log.Info("Enabled dump_proof", "dir", cfg.DumpDir)
}

return &Prover{cfg: cfg}, nil
}

// Prove call rust ffi to generate proof, if first failed, try again.
func (p *Prover) Prove(traces []*types.BlockTrace) (*message.AggProof, error) {
return p.prove(traces)
}

func (p *Prover) prove(traces []*types.BlockTrace) (*message.AggProof, error) {
tracesByt, err := json.Marshal(traces)
func (p *Prover) Prove(task *message.TaskMsg) (*message.AggProof, error) {
tracesByt, err := json.Marshal(task.Traces)
if err != nil {
return nil, err
}

proofByt := p.prove(tracesByt)

// dump proof
err = p.dumpProof(task.ID, proofByt)
if err != nil {
log.Error("Dump proof failed", "task-id", task.ID, "error", err)
}

zkProof := &message.AggProof{}
return zkProof, json.Unmarshal(proofByt, zkProof)
}

// Call cgo to generate proof.
func (p *Prover) prove(tracesByt []byte) []byte {
tracesStr := C.CString(string(tracesByt))

defer func() {
Expand All @@ -61,7 +81,19 @@ func (p *Prover) prove(traces []*types.BlockTrace) (*message.AggProof, error) {
log.Info("Finish creating agg proof!")

proof := C.GoString(cProof)
zkProof := &message.AggProof{}
err = json.Unmarshal([]byte(proof), zkProof)
return zkProof, err
return []byte(proof)
}

func (p *Prover) dumpProof(id string, proofByt []byte) error {
if p.cfg.DumpDir == "" {
return nil
}
path := filepath.Join(p.cfg.DumpDir, id)
f, err := os.Create(path)
if err != nil {
return err
}
log.Info("Saving proof", "task-id", id)
_, err = f.Write(proofByt)
return err
}
5 changes: 4 additions & 1 deletion roller/prover/prover_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ import (
"github.com/scroll-tech/go-ethereum/core/types"
"github.com/stretchr/testify/assert"

"scroll-tech/common/message"

"scroll-tech/roller/config"
"scroll-tech/roller/prover"
)
Expand Down Expand Up @@ -49,7 +51,8 @@ func TestFFI(t *testing.T) {
as.NoError(json.Unmarshal(byt, trace))
traces = append(traces, trace)
}
proof, err := prover.Prove(traces)
task := &message.TaskMsg{ID: "test", Traces: traces}
proof, err := prover.Prove(task)
as.NoError(err)
t.Log("prove success")

Expand Down
2 changes: 1 addition & 1 deletion roller/roller.go
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@ func (r *Roller) prove() error {
// If FFI panic during Prove, the roller will restart and re-enter prove() function,
// the proof will not be submitted.
var proof *message.AggProof
proof, err = r.prover.Prove(traces)
proof, err = r.prover.Prove(task.Task)
if err != nil {
proofMsg = &message.ProofDetail{
Status: message.StatusProofError,
Expand Down