Skip to content

Commit 79c21aa

Browse files
authored
N/bump v5 (#53)
* feat: v5 * build-elf * fix new vkey * rm rust toolchain * fix: wallet signers populator from field
1 parent c63998b commit 79c21aa

File tree

12 files changed

+797
-781
lines changed

12 files changed

+797
-781
lines changed

Cargo.lock

Lines changed: 721 additions & 641 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ resolver = "2"
66
# sp1-blobstream
77
sp1-blobstream-primitives = { path = "primitives" }
88

9-
alloy = { version = "0.9", default-features = false }
9+
alloy = { version = "1.0", default-features = false }
1010
tendermint = { version = "0.40.3", default-features = false }
1111
tendermint-light-client-verifier = { version = "0.40.3", default-features = false, features = [
1212
"rust-crypto",
@@ -28,10 +28,10 @@ csv = "1.3.1"
2828
sha2 = "0.10"
2929

3030
# sp1
31-
sp1-sdk = "4.1.7"
32-
sp1-zkvm = "4.1.7"
31+
sp1-sdk = "5.0.0"
32+
sp1-zkvm = "5.0.0"
3333

3434
[patch.crates-io]
3535
sha2-v0-9-9 = { git = "https://github.com/sp1-patches/RustCrypto-hashes", package = "sha2", tag = "patch-sha2-0.9.9-sp1-4.0.0" }
3636
sha2-v0-10-8 = { git = "https://github.com/sp1-patches/RustCrypto-hashes", package = "sha2", tag = "patch-sha2-0.10.8-sp1-4.0.0" }
37-
curve25519-dalek-ng = { git = "https://github.com/sp1-patches/curve25519-dalek-ng", tag = "patch-4.1.1-sp1-4.0.0" }
37+
curve25519-dalek-ng = { git = "https://github.com/sp1-patches/curve25519-dalek-ng", tag = "patch-4.1.1-sp1-5.0.0" }

contracts/foundry.toml

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,7 @@ arbitrum = "${RPC_ARBITRUM}"
2626
arbitrum_sepolia = "${RPC_ARBITRUM_SEPOLIA}"
2727
base = "${RPC_BASE}"
2828
base_sepolia = "${RPC_BASE_SEPOLIA}"
29+
optimism = "${RPC_OPTIMISM}"
30+
optimism_sepolia = "${RPC_OPTIMISM_SEPOLIA}"
2931
scroll = "${RPC_SCROLL}"
3032
scroll_sepolia = "${RPC_SCROLL_SEPOLIA}"
31-
32-
[etherscan]
33-
mainnet = { key = "${ETHERSCAN_API_KEY_MAINNET}", url = "${ETHERSCAN_API_URL_MAINNET}" }
34-
sepolia = { key = "${ETHERSCAN_API_KEY_SEPOLIA}", url = "${ETHERSCAN_API_URL_SEPOLIA}" }
35-
holesky = { key = "${ETHERSCAN_API_KEY_HOLESKY}", url = "${ETHERSCAN_API_URL_HOLESKY}" }
36-
arbitrum = { key = "${ETHERSCAN_API_KEY_ARBITRUM}", url = "${ETHERSCAN_API_URL_ARBITRUM}" }
37-
arbitrum_sepolia = { key = "${ETHERSCAN_API_KEY_ARBITRUM_SEPOLIA}", url = "${ETHERSCAN_API_URL_ARBITRUM_SEPOLIA}" }
38-
base = { key = "${ETHERSCAN_API_KEY_BASE}", url = "${ETHERSCAN_API_URL_BASE}" }
39-
base_sepolia = { key = "${ETHERSCAN_API_KEY_BASE_SEPOLIA}", url = "${ETHERSCAN_API_URL_BASE_SEPOLIA}", chain = 84532 }
40-
scroll = { key = "${ETHERSCAN_API_KEY_SCROLL}", url = "${ETHERSCAN_API_URL_SCROLL}" }
41-
scroll_sepolia = { key = "${ETHERSCAN_API_KEY_SCROLL_SEPOLIA}", url = "${ETHERSCAN_API_URL_SCROLL_SEPOLIA}" }

contracts/script/Deploy.s.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@ contract DeployScript is BaseScript {
2222

2323
string internal constant KEY = "SP1_BLOBSTREAM";
2424

25-
function run() external multichain(KEY) returns (address) {
25+
function run() external returns (address) {
2626
vm.startBroadcast();
2727

2828
SP1Blobstream lightClient;
2929
ISP1Verifier verifier = ISP1Verifier(
30-
vm.envOr("SP1_VERIFIER_ADDRESS", 0x3B6041173B80E77f038f3F2C0f9744f04837185e)
30+
vm.envOr("SP1_VERIFIER_ADDRESS", 0x9c4C79a08A5bEa1C4231311A75820320a5FFff79)
3131
);
3232

3333
// Deploy the SP1Blobstream contract.

contracts/script/UpdateVkey.s.sol

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,15 @@ contract UpdateVkeyScript is BaseScript {
1818

1919
/// Reads CONTRACT_ADDRESS_<CHAIN_ID> from the environment variables and updates the SP1 Verifier and program vkey.
2020
function run() external multichain(KEY) broadcaster {
21-
string memory contractAddressKey = string.concat("CONTRACT_ADDRESS_", vm.toString(block.chainid));
21+
string memory contractAddressKey =
22+
string.concat("CONTRACT_ADDRESS_", vm.toString(block.chainid));
2223
address existingProxyAddress = vm.envAddress(contractAddressKey);
2324

2425
SP1Blobstream sp1Blobstream = SP1Blobstream(address(existingProxyAddress));
2526

2627
// SP1 Blobstream 1.1.0 program verification key
27-
sp1Blobstream.updateProgramVkey(0x00eaf7d396acac046b54bc8d5ba17d3f1c7374d7158ac01c76dfeca6103163eb);
28+
sp1Blobstream.updateProgramVkey(
29+
0x00de39c136b88dfeacb832629e21a9667935bc0e74aaa21292e4f237d79d0bef
30+
);
2831
}
2932
}

elf/blobstream-elf

4.77 KB
Binary file not shown.

script/Cargo.toml

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,14 @@ path = "bin/costs.rs"
2525

2626
[dependencies]
2727
sp1-blobstream-primitives = { workspace = true }
28-
alloy = { workspace = true, default-features = true, features = ["full"] }
28+
alloy = { workspace = true, default-features = false, features = [
29+
"provider-http",
30+
"contract",
31+
"rpc-types",
32+
"signers",
33+
"signer-local",
34+
"reqwest",
35+
] }
2936
tendermint = { workspace = true }
3037
tendermint-light-client-verifier = { workspace = true, features = [
3138
"rust-crypto",
@@ -49,4 +56,4 @@ tracing = "0.1.41"
4956
tracing-subscriber = "0.3.19"
5057

5158
[build-dependencies]
52-
sp1-build = "4.1.7"
59+
sp1-build = "5.0.0"

script/bin/costs.rs

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,9 @@ use alloy::{
44
network::{primitives::HeaderResponse, BlockResponse},
55
primitives::{Address, B256},
66
providers::{Network, Provider, ProviderBuilder},
7-
rpc::types::{BlockTransactionsKind, Filter},
7+
rpc::types::Filter,
88
sol,
99
sol_types::SolEvent,
10-
transports::Transport,
1110
};
1211
use anyhow::Result;
1312
use chrono::{TimeZone, Utc};
@@ -74,7 +73,7 @@ async fn get_receipts_for_chain(
7473
month: u32,
7574
year: i32,
7675
) -> Result<Vec<RelayTransaction>> {
77-
let provider = ProviderBuilder::new().on_http(Url::parse(rpc_url).unwrap());
76+
let provider = ProviderBuilder::new().connect_http(Url::parse(rpc_url).unwrap());
7877
let chain_id = provider.get_chain_id().await?;
7978

8079
let to_addr = get_contract_address(chain_id).expect("Chain ID not supported");
@@ -229,18 +228,13 @@ async fn main() -> Result<()> {
229228
}
230229

231230
/// Finds the block at the provided timestamp, using the provided provider.
232-
async fn find_block_by_timestamp<P, T, N>(
233-
provider: &P,
234-
target_timestamp: u64,
235-
) -> Result<(B256, u64)>
231+
async fn find_block_by_timestamp<P, N>(provider: &P, target_timestamp: u64) -> Result<(B256, u64)>
236232
where
237-
P: Provider<T, N>,
238-
T: Transport + Clone,
233+
P: Provider<N>,
239234
N: Network,
240235
{
241-
let latest_block = provider
242-
.get_block(BlockId::latest(), BlockTransactionsKind::Hashes)
243-
.await?;
236+
let latest_block = provider.get_block(BlockId::latest()).await?;
237+
244238
let Some(latest_block) = latest_block else {
245239
return Err(anyhow::anyhow!("No latest block found"));
246240
};
@@ -249,9 +243,7 @@ where
249243

250244
while low <= high {
251245
let mid = (low + high) / 2;
252-
let block = provider
253-
.get_block(mid.into(), BlockTransactionsKind::Hashes)
254-
.await?;
246+
let block = provider.get_block(mid.into()).await?;
255247
let Some(block) = block else {
256248
return Err(anyhow::anyhow!("No block found"));
257249
};
@@ -267,9 +259,7 @@ where
267259
}
268260

269261
// Return the block hash of the closest block after the target timestamp
270-
let block = provider
271-
.get_block((low - 10).into(), BlockTransactionsKind::Hashes)
272-
.await?;
262+
let block = provider.get_block((low - 10).into()).await?;
273263
let Some(block) = block else {
274264
return Err(anyhow::anyhow!("No block found"));
275265
};

script/bin/operator.rs

Lines changed: 45 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
use alloy::{
2-
network::{EthereumWallet, Network, ReceiptResponse},
2+
network::{Network, ReceiptResponse},
33
primitives::{Address, B256},
44
providers::{Provider, ProviderBuilder},
55
signers::local::PrivateKeySigner,
66
sol,
7-
transports::Transport,
87
};
98
use anyhow::{Context, Result};
109
use reqwest::Url;
@@ -22,8 +21,6 @@ use tendermint_light_client_verifier::Verdict;
2221
use tracing::{error, info, Instrument};
2322
use tracing_subscriber::EnvFilter;
2423

25-
use sp1_blobstream_script::util::signer::MaybeWallet;
26-
2724
/////// Contract ///////
2825

2926
sol! {
@@ -84,21 +81,20 @@ impl std::str::FromStr for SignerMode {
8481

8582
/////// Operator ///////
8683

87-
struct SP1BlobstreamOperator<P, T, N> {
84+
struct SP1BlobstreamOperator<P, N> {
8885
pk: Arc<SP1ProvingKey>,
8986
vk: SP1VerifyingKey,
9087
client: TendermintRPCClient,
91-
contracts: HashMap<u64, SP1BlobstreamContract<T, P, N>>,
88+
contracts: HashMap<u64, SP1BlobstreamContract<P, N>>,
9289
network_prover: Arc<NetworkProver>,
9390
signer_mode: SignerMode,
9491
}
9592

9693
/////// Constructor ///////
9794

98-
impl<P, T, N> SP1BlobstreamOperator<P, T, N>
95+
impl<P, N> SP1BlobstreamOperator<P, N>
9996
where
100-
P: Provider<T, N> + 'static,
101-
T: Transport + Clone,
97+
P: Provider<N> + 'static,
10298
N: Network,
10399
{
104100
/// Create a new SP1 Blobstream operator.
@@ -142,10 +138,9 @@ where
142138

143139
/////// Control Flow ///////
144140

145-
impl<P, T, N> SP1BlobstreamOperator<P, T, N>
141+
impl<P, N> SP1BlobstreamOperator<P, N>
146142
where
147-
P: Provider<T, N> + 'static,
148-
T: Transport + Clone,
143+
P: Provider<N> + 'static,
149144
N: Network,
150145
{
151146
/// Create and relay a block range proof to multiple chains.
@@ -243,7 +238,7 @@ where
243238
let latest_blocks =
244239
futures::future::try_join_all(self.contracts.iter().map(|(id, contract)| async move {
245240
match contract.latestBlock().call().await {
246-
Ok(latest_block) => anyhow::Result::Ok((id, latest_block.latestBlock)),
241+
Ok(latest_block) => anyhow::Result::Ok((id, latest_block)),
247242
Err(e) => {
248243
error!("Failed to get latest block for chain {}: {}", id, e);
249244
anyhow::Result::Err(e)
@@ -388,10 +383,9 @@ where
388383

389384
///// Methods ///////
390385

391-
impl<P, T, N> SP1BlobstreamOperator<P, T, N>
386+
impl<P, N> SP1BlobstreamOperator<P, N>
392387
where
393-
P: Provider<T, N> + 'static,
394-
T: Transport + Clone,
388+
P: Provider<N> + 'static,
395389
N: Network,
396390
{
397391
/// Check the verifying key in the contract matches the verifying key in the prover.
@@ -400,13 +394,9 @@ where
400394
/// - If the verifying key in the operator does not match the verifying key in the contract.
401395
async fn check_vkey(&self, chain_id: u64) -> Result<()> {
402396
let contract = self.contracts.get(&chain_id).unwrap();
403-
let verifying_key = contract
404-
.blobstreamProgramVkey()
405-
.call()
406-
.await?
407-
.blobstreamProgramVkey;
397+
let verifying_key = contract.blobstreamProgramVkey().call().await?;
408398

409-
if verifying_key.0.to_vec()
399+
if verifying_key.to_vec()
410400
!= hex::decode(self.vk.bytes32().strip_prefix("0x").unwrap()).unwrap()
411401
{
412402
return Err(anyhow::anyhow!(
@@ -440,9 +430,7 @@ where
440430
let max_commits =
441431
futures::future::try_join_all(self.contracts.iter().map(|(id, contract)| async move {
442432
match contract.DATA_COMMITMENT_MAX().call().await {
443-
Ok(data_commitment_max) => {
444-
anyhow::Result::Ok(data_commitment_max.DATA_COMMITMENT_MAX)
445-
}
433+
Ok(data_commitment_max) => anyhow::Result::Ok(data_commitment_max),
446434
Err(e) => {
447435
error!("Failed to get data commitment max for chain {}: {}", id, e);
448436
anyhow::Result::Err(e)
@@ -631,40 +619,59 @@ async fn main() {
631619

632620
// Succinct deployments use the `CHAINS` environment variable.
633621
let config = ChainConfig::fetch().expect("Failed to fetch chain config");
634-
let maybe_private_key: Option<PrivateKeySigner> = env::var("PRIVATE_KEY")
635-
.ok()
636-
.map(|s| s.parse().expect("Failed to parse PRIVATE_KEY"));
637622

638623
// Set up the KMS relayer config.
639624
let signer_mode = env::var("SIGNER_MODE")
640625
.map(|s| s.parse().expect("SIGNER_MODE failed to parse"))
641626
.unwrap_or(SignerMode::Kms);
642627

643-
// Ensure a signer is set if KMS relayer is false.
644-
if matches!(signer_mode, SignerMode::Local) && maybe_private_key.is_none() {
645-
panic!("PRIVATE_KEY is not set but signer mode is local.");
628+
match signer_mode {
629+
SignerMode::Local => run_with_wallet(config).await,
630+
SignerMode::Kms => run_with_kms_relayer(config).await,
646631
}
632+
}
647633

648-
// Set up the signer.
649-
let signer = MaybeWallet::new(maybe_private_key.map(EthereumWallet::new));
634+
async fn run_with_wallet(config: Vec<ChainConfig>) {
635+
let key = env::var("PRIVATE_KEY").expect("PRIVATE_KEY not set");
636+
let signer: PrivateKeySigner = key.parse().expect("Failed to parse PRIVATE_KEY");
650637

651-
// Set up the prover and program keys.
652638
let prover = ProverClient::builder().network().build();
653639
let (pk, vk) = prover.setup(TENDERMINT_ELF);
654640

655641
let client = TendermintRPCClient::default();
656642

657-
let mut operator = SP1BlobstreamOperator::new(pk, vk, client, signer_mode, Arc::new(prover));
658-
643+
let mut operator =
644+
SP1BlobstreamOperator::new(pk, vk, client, SignerMode::Local, Arc::new(prover));
659645
for (i, c) in config.iter().enumerate() {
660646
let url: Url = c.rpc_url.parse().expect("Failed to parse RPC URL");
661647
tracing::info!("Adding chain {:?} to operator", url.domain());
662648
tracing::info!("Chain {} of {}", i + 1, config.len());
663649

664650
let provider = ProviderBuilder::new()
665-
.with_recommended_fillers()
666651
.wallet(signer.clone())
667-
.on_http(url);
652+
.connect_http(url);
653+
654+
operator = operator.with_chain(provider, c.blobstream_address).await;
655+
}
656+
657+
operator.run().await;
658+
}
659+
660+
async fn run_with_kms_relayer(config: Vec<ChainConfig>) {
661+
let prover = ProverClient::builder().network().build();
662+
let (pk, vk) = prover.setup(TENDERMINT_ELF);
663+
664+
let client = TendermintRPCClient::default();
665+
666+
let mut operator =
667+
SP1BlobstreamOperator::new(pk, vk, client, SignerMode::Kms, Arc::new(prover));
668+
669+
for (i, c) in config.iter().enumerate() {
670+
let url: Url = c.rpc_url.parse().expect("Failed to parse RPC URL");
671+
tracing::info!("Adding chain {:?} to operator", url.domain());
672+
tracing::info!("Chain {} of {}", i + 1, config.len());
673+
674+
let provider = ProviderBuilder::new().connect_http(url);
668675

669676
operator = operator.with_chain(provider, c.blobstream_address).await;
670677
}

script/build.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ fn main() {
88
// docker: true,
99
// elf_name: Some("blobstream-elf".to_string()),
1010
// output_directory: Some("../elf".to_string()),
11-
// tag: "v4.1.7".to_string(),
11+
// tag: "v5.0.0".to_string(),
1212
// ..Default::default()
1313
// },
1414
// )

0 commit comments

Comments
 (0)