Skip to content

Commit 804fe24

Browse files
uri-99taturosatientropidelic
authored
feat: Require signatures for batcher to charge the users (yetanotherco#632)
Co-authored-by: Santos Rosati <rosatisantos@gmail.com> Co-authored-by: Tatu <65305492+srosati@users.noreply.github.com> Co-authored-by: Mariano Nicolini <mariano.nicolini.91@gmail.com>
1 parent 81e1ae4 commit 804fe24

32 files changed

Lines changed: 1057 additions & 204 deletions

Makefile

Lines changed: 46 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ user_fund_payment_service:
187187
./batcher/aligned-batcher/.env:
188188
@echo "To start the Batcher ./batcher/aligned-batcher/.env needs to be manually set"; false;
189189

190-
batcher_start: ./batcher/aligned-batcher/.env user_fund_payment_service
190+
batcher_start: ./batcher/aligned-batcher/.env user_fund_payment_service
191191
@echo "Starting Batcher..."
192192
@cargo +nightly-2024-04-17 run --manifest-path ./batcher/aligned-batcher/Cargo.toml --release -- --config ./config-files/config-batcher.yaml --env-file ./batcher/aligned-batcher/.env
193193

@@ -209,13 +209,19 @@ build_batcher_client:
209209
batcher/target/release/aligned:
210210
@cd batcher/aligned && cargo b --release
211211

212+
213+
RPC_URL=http://localhost:8545
214+
BATCHER_CONTRACT_ADDRESS=0x7969c5eD335650692Bc04293B07F5BF2e7A673C0
215+
212216
batcher_send_sp1_task:
213217
@echo "Sending SP1 fibonacci task to Batcher..."
214218
@cd batcher/aligned/ && cargo run --release -- submit \
215219
--proving_system SP1 \
216220
--proof ../../scripts/test_files/sp1/sp1_fibonacci.proof \
217221
--vm_program ../../scripts/test_files/sp1/sp1_fibonacci.elf \
218-
--proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657
222+
--proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657 \
223+
--rpc $(RPC_URL) \
224+
--batcher_addr $(BATCHER_CONTRACT_ADDRESS)
219225

220226
batcher_send_sp1_burst:
221227
@echo "Sending SP1 fibonacci task to Batcher..."
@@ -224,7 +230,10 @@ batcher_send_sp1_burst:
224230
--proof ../../scripts/test_files/sp1/sp1_fibonacci.proof \
225231
--vm_program ../../scripts/test_files/sp1/sp1_fibonacci.elf \
226232
--repetitions 15 \
227-
--proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657
233+
--proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657 \
234+
--rpc $(RPC_URL) \
235+
--batcher_addr $(BATCHER_CONTRACT_ADDRESS)
236+
228237

229238
batcher_send_infinite_sp1:
230239
@echo "Sending infinite SP1 fibonacci task to Batcher..."
@@ -237,7 +246,9 @@ batcher_send_risc0_task:
237246
--proof ../../scripts/test_files/risc_zero/fibonacci_proof_generator/risc_zero_fibonacci.proof \
238247
--vm_program ../../scripts/test_files/risc_zero/fibonacci_proof_generator/fibonacci_id.bin \
239248
--public_input ../../scripts/test_files/risc_zero/fibonacci_proof_generator/risc_zero_fibonacci.pub \
240-
--proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657
249+
--proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657 \
250+
--rpc $(RPC_URL) \
251+
--batcher_addr $(BATCHER_CONTRACT_ADDRESS)
241252

242253
batcher_send_risc0_burst:
243254
@echo "Sending Risc0 fibonacci task to Batcher..."
@@ -247,7 +258,9 @@ batcher_send_risc0_burst:
247258
--vm_program ../../scripts/test_files/risc_zero/fibonacci_proof_generator/fibonacci_id.bin \
248259
--public_input ../../scripts/test_files/risc_zero/fibonacci_proof_generator/risc_zero_fibonacci.pub \
249260
--repetitions 15 \
250-
--proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657
261+
--proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657 \
262+
--rpc $(RPC_URL) \
263+
--batcher_addr $(BATCHER_CONTRACT_ADDRESS)
251264

252265
batcher_send_plonk_bn254_task: batcher/target/release/aligned
253266
@echo "Sending Groth16Bn254 1!=0 task to Batcher..."
@@ -256,7 +269,9 @@ batcher_send_plonk_bn254_task: batcher/target/release/aligned
256269
--proof ../../scripts/test_files/gnark_plonk_bn254_script/plonk.proof \
257270
--public_input ../../scripts/test_files/gnark_plonk_bn254_script/plonk_pub_input.pub \
258271
--vk ../../scripts/test_files/gnark_plonk_bn254_script/plonk.vk \
259-
--proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657
272+
--proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657 \
273+
--rpc $(RPC_URL) \
274+
--batcher_addr $(BATCHER_CONTRACT_ADDRESS)
260275

261276
batcher_send_plonk_bn254_burst: batcher/target/release/aligned
262277
@echo "Sending Groth16Bn254 1!=0 task to Batcher..."
@@ -266,7 +281,8 @@ batcher_send_plonk_bn254_burst: batcher/target/release/aligned
266281
--public_input ../../scripts/test_files/gnark_plonk_bn254_script/plonk_pub_input.pub \
267282
--vk ../../scripts/test_files/gnark_plonk_bn254_script/plonk.vk \
268283
--proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657 \
269-
--repetitions 15
284+
--rpc $(RPC_URL) \
285+
--batcher_addr $(BATCHER_CONTRACT_ADDRESS)
270286

271287
batcher_send_plonk_bls12_381_task: batcher/target/release/aligned
272288
@echo "Sending Groth16 BLS12-381 1!=0 task to Batcher..."
@@ -275,7 +291,9 @@ batcher_send_plonk_bls12_381_task: batcher/target/release/aligned
275291
--proof ../../scripts/test_files/gnark_plonk_bls12_381_script/plonk.proof \
276292
--public_input ../../scripts/test_files/gnark_plonk_bls12_381_script/plonk_pub_input.pub \
277293
--vk ../../scripts/test_files/gnark_plonk_bls12_381_script/plonk.vk \
278-
--proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657
294+
--proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657 \
295+
--rpc $(RPC_URL) \
296+
--batcher_addr $(BATCHER_CONTRACT_ADDRESS)
279297

280298
batcher_send_plonk_bls12_381_burst: batcher/target/release/aligned
281299
@echo "Sending Groth16 BLS12-381 1!=0 task to Batcher..."
@@ -285,7 +303,9 @@ batcher_send_plonk_bls12_381_burst: batcher/target/release/aligned
285303
--public_input ../../scripts/test_files/gnark_plonk_bls12_381_script/plonk_pub_input.pub \
286304
--vk ../../scripts/test_files/gnark_plonk_bls12_381_script/plonk.vk \
287305
--proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657 \
288-
--repetitions 15
306+
--repetitions 15 \
307+
--rpc $(RPC_URL) \
308+
--batcher_addr $(BATCHER_CONTRACT_ADDRESS)
289309

290310

291311
batcher_send_groth16_bn254_task: batcher/target/release/aligned
@@ -295,7 +315,9 @@ batcher_send_groth16_bn254_task: batcher/target/release/aligned
295315
--proof ../../scripts/test_files/gnark_groth16_bn254_infinite_script/infinite_proofs/ineq_1_groth16.proof \
296316
--public_input ../../scripts/test_files/gnark_groth16_bn254_infinite_script/infinite_proofs/ineq_1_groth16.pub \
297317
--vk ../../scripts/test_files/gnark_groth16_bn254_infinite_script/infinite_proofs/ineq_1_groth16.vk \
298-
--proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657
318+
--proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657 \
319+
--rpc $(RPC_URL) \
320+
--batcher_addr $(BATCHER_CONTRACT_ADDRESS)
299321

300322
batcher_send_groth16_burst: batcher/target/release/aligned
301323
@echo "Sending Groth16Bn254 1!=0 task to Batcher..."
@@ -305,7 +327,9 @@ batcher_send_groth16_burst: batcher/target/release/aligned
305327
--public_input ../../scripts/test_files/gnark_groth16_bn254_infinite_script/infinite_proofs/ineq_1_groth16.pub \
306328
--vk ../../scripts/test_files/gnark_groth16_bn254_infinite_script/infinite_proofs/ineq_1_groth16.vk \
307329
--repetitions 15 \
308-
--proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657
330+
--proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657 \
331+
--rpc $(RPC_URL) \
332+
--batcher_addr $(BATCHER_CONTRACT_ADDRESS)
309333

310334
batcher_send_infinite_groth16: batcher/target/release/aligned ## Send a different Groth16 BN254 proof using the client every 3 seconds
311335
@mkdir -p scripts/test_files/gnark_groth16_bn254_infinite_script/infinite_proofs
@@ -324,6 +348,8 @@ batcher_send_halo2_ipa_task: batcher/target/release/aligned
324348
--proof ../../scripts/test_files/halo2_ipa/proof.bin \
325349
--public_input ../../scripts/test_files/halo2_ipa/pub_input.bin \
326350
--vk ../../scripts/test_files/halo2_ipa/params.bin \
351+
--rpc $(RPC_URL) \
352+
--batcher_addr $(BATCHER_CONTRACT_ADDRESS)
327353

328354
batcher_send_halo2_ipa_task_burst_5: batcher/target/release/aligned
329355
@echo "Sending Halo2 IPA 1!=0 task to Batcher..."
@@ -332,7 +358,9 @@ batcher_send_halo2_ipa_task_burst_5: batcher/target/release/aligned
332358
--proof ../../scripts/test_files/halo2_ipa/proof.bin \
333359
--public_input ../../scripts/test_files/halo2_ipa/pub_input.bin \
334360
--vk ../../scripts/test_files/halo2_ipa/params.bin \
335-
--repetitions 5
361+
--repetitions 5 \
362+
--rpc $(RPC_URL) \
363+
--batcher_addr $(BATCHER_CONTRACT_ADDRESS)
336364

337365
batcher_send_halo2_kzg_task: batcher/target/release/aligned
338366
@echo "Sending Halo2 KZG 1!=0 task to Batcher..."
@@ -341,7 +369,9 @@ batcher_send_halo2_kzg_task: batcher/target/release/aligned
341369
--proof ../../scripts/test_files/halo2_kzg/proof.bin \
342370
--public_input ../../scripts/test_files/halo2_kzg/pub_input.bin \
343371
--vk ../../scripts/test_files/halo2_kzg/params.bin \
344-
--proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657
372+
--proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657 \
373+
--rpc $(RPC_URL) \
374+
--batcher_addr $(BATCHER_CONTRACT_ADDRESS)
345375

346376
batcher_send_halo2_kzg_task_burst_5: batcher/target/release/aligned
347377
@echo "Sending Halo2 KZG 1!=0 task to Batcher..."
@@ -351,7 +381,9 @@ batcher_send_halo2_kzg_task_burst_5: batcher/target/release/aligned
351381
--public_input ../../scripts/test_files/halo2_kzg/pub_input.bin \
352382
--vk ../../scripts/test_files/halo2_kzg/params.bin \
353383
--repetitions 5 \
354-
--proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657
384+
--proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657 \
385+
--rpc $(RPC_URL) \
386+
--batcher_addr $(BATCHER_CONTRACT_ADDRESS)
355387

356388
__GENERATE_PROOFS__:
357389
# TODO add a default proving system

batcher/aligned-batcher/src/config/mod.rs

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,59 @@
1-
use ethers::types::Address;
1+
use std::sync::Arc;
2+
3+
use ethers::{
4+
core::k256::ecdsa::SigningKey,
5+
signers::{Signer, Wallet},
6+
types::{Address, U256},
7+
};
28
use serde::Deserialize;
9+
use tokio::sync::Mutex;
10+
11+
use crate::eth::BatcherPaymentService;
312

413
#[derive(Clone, Debug, Deserialize)]
514
pub struct ECDSAConfig {
615
pub private_key_store_path: String,
716
pub private_key_store_password: String,
817
}
918

10-
#[derive(Debug, Deserialize)]
19+
#[derive(Debug)]
1120
pub struct NonPayingConfig {
1221
pub address: Address,
13-
pub replacement: Address,
22+
pub replacement: Wallet<SigningKey>,
23+
pub nonce: Arc<Mutex<U256>>,
24+
}
25+
26+
#[derive(Debug, Deserialize)]
27+
pub struct NonPayingConfigFromYaml {
28+
pub address: Address,
29+
pub replacement_private_key: String,
30+
}
31+
32+
impl NonPayingConfig {
33+
pub async fn from_yaml_config(
34+
config: NonPayingConfigFromYaml,
35+
batcher_payments_contract: &BatcherPaymentService,
36+
) -> Self {
37+
let replacement = Wallet::from_bytes(
38+
hex::decode(config.replacement_private_key)
39+
.expect("Failed to decode replacement private key")
40+
.as_slice(),
41+
)
42+
.expect("Failed to create replacement wallet");
43+
44+
let nonce = batcher_payments_contract
45+
.user_nonces(replacement.address())
46+
.await
47+
.expect("Failed to get nonce");
48+
49+
let nonce = Arc::new(Mutex::new(nonce));
50+
51+
NonPayingConfig {
52+
address: config.address,
53+
replacement,
54+
nonce,
55+
}
56+
}
1457
}
1558

1659
#[derive(Debug, Deserialize)]
@@ -21,7 +64,7 @@ pub struct BatcherConfigFromYaml {
2164
pub max_batch_size: usize,
2265
pub eth_ws_reconnects: usize,
2366
pub pre_verification_is_enabled: bool,
24-
pub non_paying: Option<NonPayingConfig>,
67+
pub non_paying: Option<NonPayingConfigFromYaml>,
2568
}
2669

2770
#[derive(Debug, Deserialize)]

batcher/aligned-batcher/src/eth/abi/AlignedLayerServiceManager.json

Lines changed: 0 additions & 1 deletion
This file was deleted.

batcher/aligned-batcher/src/eth/abi/BatcherPaymentService.json

Lines changed: 0 additions & 1 deletion
This file was deleted.

batcher/aligned-batcher/src/eth/mod.rs

Lines changed: 39 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,18 @@
1+
use std::iter::repeat;
12
use std::str::FromStr;
23
use std::sync::Arc;
4+
use std::time::Duration;
35

6+
use aligned_sdk::eth::batcher_payment_service::{BatcherPaymentServiceContract, SignatureData};
47
use ethers::prelude::k256::ecdsa::SigningKey;
58
use ethers::prelude::*;
9+
use log::debug;
10+
use tokio::time::sleep;
611

7-
use crate::config::ECDSAConfig;
8-
9-
abigen!(
10-
AlignedLayerServiceManagerContract,
11-
"./src/eth/abi/AlignedLayerServiceManager.json",
12-
);
12+
const CREATE_NEW_TASK_MAX_RETRIES: usize = 100;
13+
const CREATE_NEW_TASK_MILLISECS_BETWEEN_RETRIES: u64 = 100;
1314

14-
abigen!(
15-
BatcherPaymentServiceContract,
16-
"./src/eth/abi/BatcherPaymentService.json",
17-
);
15+
use crate::config::ECDSAConfig;
1816

1917
#[derive(Debug, Clone, EthEvent)]
2018
pub struct BatchVerified {
@@ -32,23 +30,48 @@ pub async fn create_new_task(
3230
payment_service: &BatcherPaymentService,
3331
batch_merkle_root: [u8; 32],
3432
batch_data_pointer: String,
35-
proof_submitters: Vec<Address>,
33+
leaves: Vec<[u8; 32]>,
34+
signatures: Vec<SignatureData>,
3635
gas_for_aggregator: U256,
3736
gas_per_proof: U256,
3837
) -> Result<TransactionReceipt, anyhow::Error> {
38+
// pad leaves to next power of 2
39+
let leaves_len = leaves.len();
40+
let last_leaf = leaves[leaves_len - 1];
41+
let leaves = leaves
42+
.into_iter()
43+
.chain(repeat(last_leaf).take(leaves_len.next_power_of_two() - leaves_len))
44+
.collect::<Vec<[u8; 32]>>();
45+
3946
let call = payment_service.create_new_task(
4047
batch_merkle_root,
4148
batch_data_pointer,
42-
proof_submitters,
49+
leaves,
50+
signatures,
4351
gas_for_aggregator,
4452
gas_per_proof,
4553
);
46-
let pending_tx = call.send().await?;
4754

48-
match pending_tx.await? {
49-
Some(receipt) => Ok(receipt),
50-
None => Err(anyhow::anyhow!("Receipt not found")),
55+
// If there was a pending transaction from a previously sent batch, the `call.send()` will
56+
// fail because of the nonce not being updated. We should retry sending and not returning an error
57+
// immediatly.
58+
for _ in 0..CREATE_NEW_TASK_MAX_RETRIES {
59+
if let Ok(pending_tx) = call.send().await {
60+
match pending_tx.await? {
61+
Some(receipt) => return Ok(receipt),
62+
None => return Err(anyhow::anyhow!("Receipt not found")),
63+
}
64+
}
65+
debug!("createNewTask transaction not sent, retrying in {CREATE_NEW_TASK_MILLISECS_BETWEEN_RETRIES} milliseconds...");
66+
sleep(Duration::from_millis(
67+
CREATE_NEW_TASK_MILLISECS_BETWEEN_RETRIES,
68+
))
69+
.await;
5170
}
71+
72+
Err(anyhow::anyhow!(
73+
"Maximum tries reached. Could not send createNewTask call"
74+
))
5275
}
5376

5477
pub async fn get_batcher_payment_service(

0 commit comments

Comments
 (0)