Skip to content

Commit 416f1af

Browse files
committed
feat: handle decryption key and validium chunk task
1 parent e8e0472 commit 416f1af

File tree

10 files changed

+91
-22
lines changed

10 files changed

+91
-22
lines changed

coordinator/internal/logic/libzkp/lib.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,8 @@ func fromMessageTaskType(taskType int) int {
9393
}
9494

9595
// Generate a universal task
96-
func GenerateUniversalTask(taskType int, taskJSON, forkName string, expectedVk []byte) (bool, string, string, []byte) {
97-
return generateUniversalTask(fromMessageTaskType(taskType), taskJSON, strings.ToLower(forkName), expectedVk)
96+
func GenerateUniversalTask(taskType int, taskJSON, forkName string, expectedVk []byte, decryptionKey []byte) (bool, string, string, []byte) {
97+
return generateUniversalTask(fromMessageTaskType(taskType), taskJSON, strings.ToLower(forkName), expectedVk, decryptionKey)
9898
}
9999

100100
// Generate wrapped proof

coordinator/internal/logic/libzkp/libzkp.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@ HandlingResult gen_universal_task(
4040
char* task,
4141
char* fork_name,
4242
const unsigned char* expected_vk,
43-
size_t expected_vk_len
43+
size_t expected_vk_len,
44+
const unsigned char* decryption_key,
45+
size_t decryption_key_len
4446
);
4547

4648
// Release memory allocated for a HandlingResult returned by gen_universal_task

coordinator/internal/logic/libzkp/mock_universal_task.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import (
1414
func InitL2geth(configJSON string) {
1515
}
1616

17-
func generateUniversalTask(taskType int, taskJSON, forkName string, expectedVk []byte) (bool, string, string, []byte) {
17+
func generateUniversalTask(taskType int, taskJSON, forkName string, expectedVk []byte, decryptionKey []byte) (bool, string, string, []byte) {
1818

1919
fmt.Printf("call mocked generate universal task %d, taskJson %s\n", taskType, taskJSON)
2020
var metadata interface{}

coordinator/internal/logic/libzkp/universal_task.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ func InitL2geth(configJSON string) {
1717
C.init_l2geth(cConfig)
1818
}
1919

20-
func generateUniversalTask(taskType int, taskJSON, forkName string, expectedVk []byte) (bool, string, string, []byte) {
20+
func generateUniversalTask(taskType int, taskJSON, forkName string, expectedVk []byte, decryptionKey []byte) (bool, string, string, []byte) {
2121
cTask := goToCString(taskJSON)
2222
cForkName := goToCString(forkName)
2323
defer freeCString(cTask)
@@ -29,7 +29,13 @@ func generateUniversalTask(taskType int, taskJSON, forkName string, expectedVk [
2929
cVk = (*C.uchar)(unsafe.Pointer(&expectedVk[0]))
3030
}
3131

32-
result := C.gen_universal_task(C.int(taskType), cTask, cForkName, cVk, C.size_t(len(expectedVk)))
32+
// Create a C array from Go slice
33+
var cDk *C.uchar
34+
if len(decryptionKey) > 0 {
35+
cDk = (*C.uchar)(unsafe.Pointer(&decryptionKey[0]))
36+
}
37+
38+
result := C.gen_universal_task(C.int(taskType), cTask, cForkName, cVk, C.size_t(len(expectedVk)), cDk, C.size_t(len(decryptionKey)))
3339
defer C.release_task_result(result)
3440

3541
// Check if the operation was successful

coordinator/internal/logic/provertask/prover_task.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package provertask
22

33
import (
4+
"encoding/hex"
45
"errors"
56
"fmt"
67
"strings"
@@ -212,7 +213,12 @@ func (b *BaseProverTask) applyUniversal(schema *coordinatorType.GetTaskSchema) (
212213
return nil, nil, fmt.Errorf("no expectedVk found from hardfork %s", schema.HardForkName)
213214
}
214215

215-
ok, uTaskData, metadata, _ := libzkp.GenerateUniversalTask(schema.TaskType, schema.TaskData, schema.HardForkName, expectedVk)
216+
decryptionKey, err := hex.DecodeString(b.cfg.Sequencer.DecryptionKey)
217+
if err != nil {
218+
return nil, nil, fmt.Errorf("sequencer decryption key hex-decoding failed")
219+
}
220+
221+
ok, uTaskData, metadata, _ := libzkp.GenerateUniversalTask(schema.TaskType, schema.TaskData, schema.HardForkName, expectedVk, decryptionKey)
216222
if !ok {
217223
return nil, nil, fmt.Errorf("can not generate universal task, see coordinator log for the reason")
218224
}

crates/l2geth/src/rpc_client.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use alloy::{
55
};
66
use eyre::Result;
77
use libzkp::tasks::ChunkInterpreter;
8-
use sbv_primitives::types::Network;
8+
use sbv_primitives::types::{consensus::TxL1Message, Network};
99
use serde::{Deserialize, Serialize};
1010

1111
fn default_max_retry() -> u32 {
@@ -168,6 +168,22 @@ impl<T: Provider<Network>> ChunkInterpreter for RpcClient<'_, T> {
168168
self.handle
169169
.block_on(fetch_storage_node_async(&self.provider, node_hash))
170170
}
171+
172+
fn try_fetch_l1_msgs(&self, block_number: u64) -> Result<Vec<TxL1Message>> {
173+
async fn fetch_l1_msgs(
174+
provider: impl Provider<Network>,
175+
block_number: u64,
176+
) -> Result<Vec<TxL1Message>> {
177+
Ok(provider
178+
.client()
179+
.request::<_, Vec<TxL1Message>>("scroll_getL1MessagesInBlock", (block_number,))
180+
.await?)
181+
}
182+
183+
tracing::debug!("fetch L1 msgs for {block_number}");
184+
self.handle
185+
.block_on(fetch_l1_msgs(&self.provider, block_number))
186+
}
171187
}
172188

173189
#[cfg(test)]

crates/libzkp/src/lib.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,13 @@ pub fn set_dynamic_feature(feats: &str) {
3939
/// task (with full witnesses)
4040
pub fn checkout_chunk_task(
4141
task_json: &str,
42+
decryption_key: Option<&[u8]>,
4243
interpreter: impl ChunkInterpreter,
4344
) -> eyre::Result<String> {
4445
let chunk_task = serde_json::from_str::<tasks::ChunkTask>(task_json)?;
45-
let ret = serde_json::to_string(&tasks::ChunkProvingTask::try_from_with_interpret(
46-
chunk_task,
47-
interpreter,
48-
)?)?;
49-
Ok(ret)
46+
Ok(serde_json::to_string(
47+
&tasks::ChunkProvingTask::try_from_with_interpret(chunk_task, decryption_key, interpreter)?,
48+
)?)
5049
}
5150

5251
/// Generate required staff for proving tasks

crates/libzkp/src/tasks/chunk.rs

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use eyre::Result;
22
use sbv_core::BlockWitness;
3-
use sbv_primitives::B256;
3+
use sbv_primitives::{types::consensus::BlockHeader, B256};
44
use scroll_zkvm_types::{
5-
chunk::{execute, ChunkInfo, ChunkWitness, LegacyChunkWitness, SecretKey},
5+
chunk::{execute, ChunkInfo, ChunkWitness, LegacyChunkWitness, ValidiumInputs},
66
task::ProvingTask,
77
utils::{to_rkyv_bytes, RancorError},
88
version::Version,
@@ -14,7 +14,7 @@ use super::chunk_interpreter::*;
1414
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
1515
pub struct ChunkTask {
1616
/// The version for the chunk, as per [`Version`].
17-
pub version: Version,
17+
pub version: u8,
1818
/// block hashes for a series of block
1919
pub block_hashes: Vec<B256>,
2020
/// The on-chain L1 msg queue hash before applying L1 msg txs from the chunk.
@@ -26,6 +26,7 @@ pub struct ChunkTask {
2626
impl TryFromWithInterpreter<ChunkTask> for ChunkProvingTask {
2727
fn try_from_with_interpret(
2828
value: ChunkTask,
29+
decryption_key: Option<&[u8]>,
2930
interpreter: impl ChunkInterpreter,
3031
) -> Result<Self> {
3132
let mut block_witnesses = Vec::new();
@@ -35,11 +36,27 @@ impl TryFromWithInterpreter<ChunkTask> for ChunkProvingTask {
3536
block_witnesses.push(witness);
3637
}
3738

39+
let validium_txs = if Version::from(value.version).is_validium() {
40+
let mut validium_txs = Vec::new();
41+
for block_number in block_witnesses.iter().map(|w| w.header.number()) {
42+
validium_txs.push(interpreter.try_fetch_l1_msgs(block_number)?);
43+
}
44+
validium_txs
45+
} else {
46+
vec![]
47+
};
48+
49+
let validium_inputs = decryption_key.map(|secret_key| ValidiumInputs {
50+
validium_txs,
51+
secret_key: secret_key.into(),
52+
});
53+
3854
Ok(Self {
3955
version: value.version,
4056
block_witnesses,
4157
prev_msg_queue_hash: value.prev_msg_queue_hash,
4258
fork_name: value.fork_name,
59+
validium_inputs,
4360
})
4461
}
4562
}
@@ -61,6 +78,8 @@ pub struct ChunkProvingTask {
6178
pub prev_msg_queue_hash: B256,
6279
/// Fork name specify
6380
pub fork_name: String,
81+
/// Optional inputs in case of domain=validium.
82+
pub validium_inputs: Option<ValidiumInputs>,
6483
}
6584

6685
#[derive(Clone, Debug)]
@@ -134,14 +153,15 @@ impl ChunkProvingTask {
134153

135154
fn build_guest_input(&self) -> ChunkWitness {
136155
let version = Version::from(self.version);
156+
137157
if version.is_validium() {
138-
ChunkWitness::new_validium(
158+
assert!(self.validium_inputs.is_some());
159+
ChunkWitness::new(
139160
version.as_version_byte(),
140161
&self.block_witnesses,
141162
self.prev_msg_queue_hash,
142163
version.fork,
143-
vec![], // TODO: validium txs
144-
SecretKey::try_from_bytes(vec![0; 32]).expect("should be ok"), // TODO: secret key
164+
self.validium_inputs.clone(),
145165
)
146166
} else {
147167
ChunkWitness::new_scroll(

crates/libzkp/src/tasks/chunk_interpreter.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use eyre::Result;
22
use sbv_core::BlockWitness;
3-
use sbv_primitives::{Bytes, B256};
3+
use sbv_primitives::{types::consensus::TxL1Message, Bytes, B256};
44

55
/// An interpreter which is cirtical in translating chunk data
66
/// since we need to grep block witness and storage node data
@@ -13,13 +13,22 @@ pub trait ChunkInterpreter {
1313
) -> Result<BlockWitness> {
1414
Err(eyre::eyre!("no implement"))
1515
}
16+
1617
fn try_fetch_storage_node(&self, _node_hash: B256) -> Result<Bytes> {
1718
Err(eyre::eyre!("no implement"))
1819
}
20+
21+
fn try_fetch_l1_msgs(&self, _block_number: u64) -> Result<Vec<TxL1Message>> {
22+
Err(eyre::eyre!("no implement"))
23+
}
1924
}
2025

2126
pub trait TryFromWithInterpreter<T>: Sized {
22-
fn try_from_with_interpret(value: T, intepreter: impl ChunkInterpreter) -> Result<Self>;
27+
fn try_from_with_interpret(
28+
value: T,
29+
decryption_key: Option<&[u8]>,
30+
intepreter: impl ChunkInterpreter,
31+
) -> Result<Self>;
2332
}
2433

2534
pub struct DummyInterpreter {}

crates/libzkp_c/src/lib.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,11 +152,22 @@ pub unsafe extern "C" fn gen_universal_task(
152152
fork_name: *const c_char,
153153
expected_vk: *const u8,
154154
expected_vk_len: usize,
155+
decryption_key: *const u8,
156+
decryption_key_len: usize,
155157
) -> HandlingResult {
156158
let task_json = if task_type == TaskType::Chunk as i32 {
157159
let pre_task_str = c_char_to_str(task);
158160
let cli = l2geth::get_client();
159-
match libzkp::checkout_chunk_task(pre_task_str, cli) {
161+
let decryption_key = if decryption_key_len > 0 {
162+
assert_eq!(decryption_key_len, 32, "len(decryption_key) != 32");
163+
Some(std::slice::from_raw_parts(
164+
decryption_key,
165+
decryption_key_len,
166+
))
167+
} else {
168+
None
169+
};
170+
match libzkp::checkout_chunk_task(pre_task_str, decryption_key, cli) {
160171
Ok(str) => str,
161172
Err(e) => {
162173
tracing::error!("gen_universal_task failed at pre interpret step, error: {e}");

0 commit comments

Comments
 (0)