Skip to content

Commit

Permalink
update proto
Browse files Browse the repository at this point in the history
  • Loading branch information
Liuhaai committed Dec 2, 2024
1 parent 42f1b35 commit 33c5b0c
Show file tree
Hide file tree
Showing 10 changed files with 104 additions and 69 deletions.
4 changes: 2 additions & 2 deletions gnark-server/api/grpc.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ func (s *Server) NewProject(ctx context.Context, req *proto.NewProjectRequest) (
// Extract proving key from metadata
provingKey := req.Metadata

if err := s.manager.NewProject(req.ProjectID, req.Binary, provingKey); err != nil {
if err := s.manager.NewProject(req.ProjectID, req.ProjectVersion, req.Binary, provingKey); err != nil {
return nil, fmt.Errorf("failed to create new project: %w", err)
}

Expand All @@ -35,7 +35,7 @@ func (s *Server) ExecuteTask(ctx context.Context, req *proto.ExecuteTaskRequest)
return nil, fmt.Errorf("expected exactly one payload")
}

proof, err := s.manager.Exec(req.ProjectID, req.Payloads[0])
proof, err := s.manager.Exec(req.ProjectID, req.ProjectVersion, req.Payloads[0])
if err != nil {
return nil, fmt.Errorf("failed to execute task: %w", err)
}
Expand Down
16 changes: 8 additions & 8 deletions gnark-server/proto/vm_runtime.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

24 changes: 15 additions & 9 deletions gnark-server/prover/manager.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package prover

import (
"crypto/sha256"
"fmt"
"math/big"
"sync"
Expand All @@ -19,41 +20,46 @@ const chunkSize = fr.Bytes

// Create a prover in manager, which is identified by projectID and is constructed with circuit
// encoded in binary and proving key encoded in provingKey.
func (p *ProverManager) NewProject(projectID uint64, binary []byte, provingKey []byte) error {
if _, exist := p.proverMap.Load(projectID); exist {
func (p *ProverManager) NewProject(projectID string, projectVersion string, binary []byte, provingKey []byte) error {
if _, exist := p.proverMap.Load(projectKey(projectID, projectVersion)); exist {
return nil
}

prover := &Groth16Prover{}
if err := prover.LoadCircuit(binary); err != nil {
return fmt.Errorf("failed to load project %d circuit: %w", projectID, err)
return fmt.Errorf("failed to load project %s circuit: %w", projectID, err)
}

if err := prover.LoadProvingKey(provingKey); err != nil {
return fmt.Errorf("failed to load project %d proving key: %w", projectID, err)
return fmt.Errorf("failed to load project %s proving key: %w", projectID, err)
}

p.proverMap.Store(projectID, prover)
p.proverMap.Store(projectKey(projectID, projectVersion), prover)

return nil
}

func projectKey(projectID string, projectVersion string) [32]byte {
data := projectID + projectVersion
return sha256.Sum256([]byte(data))
}

// Execute a proving task on prover identified by projectID with payloads as witness.
// The encoding of witness is conducted according
// to https://docs.gnark.consensys.io/HowTo/serialize#witness. The output Exec is the
// calldata of verifyproof func in verifier contract.
func (p *ProverManager) Exec(projectID uint64, payloads []byte) ([]byte, error) {
prover, exist := p.proverMap.Load(projectID)
func (p *ProverManager) Exec(projectID string, projectVersion string, payloads []byte) ([]byte, error) {
prover, exist := p.proverMap.Load(projectKey(projectID, projectVersion))
if !exist {
return nil, fmt.Errorf("project %d does not exist", projectID)
return nil, fmt.Errorf("project %s does not exist", projectID)
}

wit, _ := witness.New(ecc.BN254.ScalarField())
wit.UnmarshalBinary(payloads)

proof, err := prover.(*Groth16Prover).Prove(wit)
if err != nil {
return nil, fmt.Errorf("failed to prove project %d: %w", projectID, err)
return nil, fmt.Errorf("failed to prove project %s: %w", projectID, err)
}

return encodeProofForSolidity(proof, wit)
Expand Down
14 changes: 7 additions & 7 deletions gnark-server/prover/manager_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,25 +16,25 @@ func TestProverManager(t *testing.T) {

t.Run("new project", func(t *testing.T) {
// Test creating a new project
err := manager.NewProject(1, circuitData, pkData)
err := manager.NewProject("1", "v1", circuitData, pkData)
require.NoError(t, err)

// Test creating a duplicate project
err = manager.NewProject(1, circuitData, pkData)
err = manager.NewProject("1", "v1", circuitData, pkData)
require.NoError(t, err)
})

t.Run("exec project", func(t *testing.T) {
// Create a project first
err := manager.NewProject(2, circuitData, pkData)
err := manager.NewProject("2", "v1", circuitData, pkData)
require.NoError(t, err)

// Marshal the witness to bytes
witBytes, err := wit.MarshalBinary()
require.NoError(t, err)

// Execute the proving task
proof, err := manager.Exec(2, witBytes)
proof, err := manager.Exec("2", "v1", witBytes)
require.NoError(t, err)
require.NotEmpty(t, proof)
})
Expand All @@ -44,13 +44,13 @@ func TestProverManager(t *testing.T) {
witBytes, _ := wit.MarshalBinary()

// Try to execute a non-existent project
_, err := manager.Exec(999, witBytes)
_, err := manager.Exec("999", "v1", witBytes)
require.Error(t, err)
})

t.Run("exec with invalid witness", func(t *testing.T) {
// Create a project
err := manager.NewProject(3, circuitData, pkData)
err := manager.NewProject("3", "v1", circuitData, pkData)
require.NoError(t, err)

// Create an invalid witness
Expand All @@ -66,7 +66,7 @@ func TestProverManager(t *testing.T) {
require.NoError(t, err)

// Execute with invalid witness should fail
_, err = manager.Exec(3, invalidWitBytes)
_, err = manager.Exec("3", "v1", invalidWitBytes)
require.Error(t, err)
})
}
6 changes: 3 additions & 3 deletions proto/vm_runtime.proto
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ service VM {
}

message NewProjectRequest {
uint64 projectID = 1;
string projectID = 1;
string projectVersion = 2;
bytes binary = 3;
bytes metadata = 4;
Expand All @@ -18,12 +18,12 @@ message NewProjectRequest {
message NewProjectResponse {}

message ExecuteTaskRequest {
uint64 projectID = 1;
string projectID = 1;
string projectVersion = 2;
bytes taskID = 3;
repeated bytes payloads = 4;
}

message ExecuteTaskResponse {
bytes result = 1;
}
}
3 changes: 2 additions & 1 deletion risc0-server/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
risc0-zkvm = { version = "1.0" }
risc0-zkvm = { version = "1.1.3" }
# bonsai-ethereum-relay = { version = "0.6.1" }
# risc0-ethereum-relay = { git = "https://github.com/risc0/risc0-ethereum.git", rev = "v0.10.0", package = "risc0-ethereum-relay" }
risc0-ethereum-contracts = { git = "https://github.com/risc0/risc0-ethereum", tag = "v1.0.0" }
Expand All @@ -31,6 +31,7 @@ lazy_static = "=1.4.0"
regex = "1.11.0"
dyn-clone = "1.0.17"
hex = "0.4.3"
sha2 = "0.10.8"

[dev-dependencies]
lazy_static = "=1.4.0"
Expand Down
7 changes: 5 additions & 2 deletions risc0-server/Makefile
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@


.PHONY: risc0_depends
risc0_depends:
cargo install cargo-binstall
echo yes | cargo binstall cargo-risczero
cargo risczero install

.PHONY: test
test:
cargo test -- --test-threads=1

25 changes: 13 additions & 12 deletions risc0-server/src/core/prover.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ unsafe impl Sync for ProverWrapper {}

impl LocalProver {
pub fn new(elf: &[u8]) -> Self {
env::set_var("RISC0_PROVER", "ipc");
LocalProver {
prover: Arc::new(ProverWrapper::new(default_prover())),
elf: elf.to_vec(),
Expand Down Expand Up @@ -68,7 +69,7 @@ impl BonsaiProver {

env::var("BONSAI_API_URL").expect("BONSAI_API_URL must be set");
env::var("BONSAI_API_KEY").expect("BONSAI_API_KEY must be set");

env::set_var("RISC0_PROVER", "bonsai");
BonsaiProver {
prover: Arc::new(ProverWrapper::new(default_prover())),
elf: elf.to_vec(),
Expand Down Expand Up @@ -138,17 +139,17 @@ mod tests {
assert_eq!(prover.elf, elf);
}

#[test]
fn test_bonsai_prover_prove() {
// Set dummy environment variables
env::set_var("BONSAI_API_URL", "https://api.bonsai.xyz");
env::set_var("BONSAI_API_KEY", "");
// #[test]
// fn test_bonsai_prover_prove() {
// // Set dummy environment variables
// env::set_var("BONSAI_API_URL", "https://api.bonsai.xyz");
// env::set_var("BONSAI_API_KEY", "");

let elf = create_dummy_elf();
let prover = BonsaiProver::new(&elf);
let result = prover.prove(vec!["test".to_string(), "test2".to_string()]);
// let elf = create_dummy_elf();
// let prover = BonsaiProver::new(&elf);
// let result = prover.prove(vec!["test".to_string(), "test2".to_string()]);

let ans: u32 = result.unwrap().journal.decode().unwrap();
println!("ans: {}", ans);
}
// let ans: u32 = result.unwrap().journal.decode().unwrap();
// println!("ans: {}", ans);
// }
}
Loading

0 comments on commit 33c5b0c

Please sign in to comment.