Skip to content

Commit c96fd9b

Browse files
committed
updated
1 parent 48b0303 commit c96fd9b

File tree

7 files changed

+141
-126
lines changed

7 files changed

+141
-126
lines changed

karak_offchain/aggregator/src/contract.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,21 @@ use crate::TaskError;
1717
sol!(
1818
#[sol(rpc)]
1919
SquareNumberDSS,
20-
"/app/abi/SquareNumberDSS.json",
20+
"../abi/SquareNumberDSS.json",
2121
);
2222

23+
2324
sol!(
2425
#[sol(rpc)]
2526
TxnVerifier,
26-
"/app/abi/TxnVerifier.json",
27+
"../abi/TxnVerifier.json",
2728
);
2829

29-
30-
3130
sol!(
3231
#[sol(rpc)]
3332
#[allow(clippy::too_many_arguments)]
3433
VaultAbi,
35-
"/app/abi/Vault.json",
34+
"../abi/Vault.json",
3635
);
3736

3837
type RecommendedProvider = FillProvider<

karak_offchain/aggregator/src/lib.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -65,17 +65,17 @@ pub enum TaskError {
6565
}
6666

6767
impl Config {
68-
pub fn load_block_number(&self) -> Result<u64, TaskError> {
69-
let file_content = fs::read_to_string(&self.block_number_store)
70-
.map_err(|e| TaskError::LoadContractJsonError(e.to_string()))?;
68+
// pub fn load_block_number(&self) -> Result<u64, TaskError> {
69+
// let file_content = fs::read_to_string(&self.block_number_store)
70+
// .map_err(|e| TaskError::LoadContractJsonError(e.to_string()))?;
7171

72-
info!("file_content {:?}",file_content);
72+
// info!("file_content {:?}",file_content);
7373

74-
let block_number_data: BlockNumberData = serde_json::from_str(&file_content)
75-
.map_err(|e| TaskError::LoadContractJsonError(e.to_string()))?;
76-
// info!("block_number_data {:?}",block_number_data);
77-
Ok(block_number_data.block_number)
78-
}
74+
// let block_number_data: BlockNumberData = serde_json::from_str(&file_content)
75+
// .map_err(|e| TaskError::LoadContractJsonError(e.to_string()))?;
76+
// // info!("block_number_data {:?}",block_number_data);
77+
// Ok(block_number_data.block_number)
78+
// }
7979

8080
pub fn get_rpc_url(&self) -> Result<Url> {
8181
Ok(Url::parse(&self.rpc_url)?)

karak_offchain/aggregator/src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ async fn main() -> eyre::Result<()> {
2727

2828
let governor_config = Arc::new(GovernorConfig::default());
2929
let operator_state = Arc::new(OperatorState::new());
30+
info!("operator_state_operator_state {:?}",operator_state);
3031
let aggregator_app = square_number_dss_aggregator::routes(operator_state.clone());
3132
let app = aggregator_app
3233
.layer(

karak_offchain/aggregator/src/task.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,10 @@ impl TaskService {
9494
let square_number_address = config.txn_verifier_address;
9595
let dss_address = config.txn_verifier_address;
9696
let block_number_store = config.block_number_store.clone();
97-
info!("aggregato_config {:?}",config);
97+
info!("operator_state {:?}",operator_state.operators);
9898

99-
let block_number: u64 = config.load_block_number()?;
99+
// let block_number: u64 = config.load_block_number()?;
100+
let block_number:u64=3446144;
100101
let rpc_url = config.get_rpc_url()?;
101102
let private_key = config.get_private_key()?;
102103
let txn_verifier_address=config.txn_verifier_address;
@@ -291,7 +292,7 @@ impl TaskService {
291292

292293

293294
let square_number_address = self.square_number_address;
294-
info!("verify_address {:?}",square_number_address);
295+
info!("Verify_address {:?}",square_number_address);
295296
let next_block_to_check: u64 = self.block_number;
296297

297298
// Get current block number
@@ -400,9 +401,9 @@ impl TaskService {
400401
start_block = end_block + 1;
401402
}
402403

403-
let _ = self
404-
.write_block_number_to_file(&self.block_number_store, new_last_checked_block)
405-
.await;
404+
// let _ = self
405+
// .write_block_number_to_file(&self.block_number_store, new_last_checked_block)
406+
// .await;
406407

407408
Ok(())
408409
}
@@ -573,9 +574,13 @@ impl TaskService {
573574
// Store any error to return if no operator succeeds
574575
let mut last_error: Option<TaskError> = None;
575576
info!("send_task_to_all_operators {:?}",task);
577+
578+
576579

577580
for operator in operators.iter() {
578581
let operator = operator.clone();
582+
583+
info!("operator_url {:?}",operator.url());
579584

580585
match self
581586
.client

karak_offchain/operator/src/contract.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ use alloy::sol;
33
sol!(
44
#[sol(rpc)]
55
SquareNumberDSS,
6-
"/app/abi/SquareNumberDSS.json",
6+
"../abi/SquareNumberDSS.json",
77
);
88

99
sol!(
1010
#[sol(rpc)]
1111
TxnVerifier,
12-
"/app/abi/TxnVerifier.json",
12+
"../abi/TxnVerifier.json",
1313
);
1414

karak_offchain/operator/src/operator.rs

Lines changed: 96 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -71,32 +71,97 @@ impl AppState {
7171
}
7272

7373
// Transaction verification functions
74+
7475
async fn is_transaction_in_block(
7576
provider: &Provider<Http>,
7677
tx_hash: &str,
7778
block_number: &str,
7879
) -> Result<bool> {
7980
let tx_hash = tx_hash.parse::<H256>()?;
8081

81-
let tx = provider
82-
.get_transaction(tx_hash)
83-
.await?;
84-
info!("tx {:?}",tx);
85-
info!("block_number {:?}",block_number);
86-
info!("tx_hash {:?}",tx_hash);
87-
88-
82+
// Define retry parameters
83+
let max_retries = 5;
84+
let initial_delay_ms = 1000; // 1 second
85+
let mut retry_count = 0;
86+
let mut tx = None;
87+
88+
// Retry loop
89+
while retry_count < max_retries {
90+
info!("Attempt {} to retrieve transaction {:?}", retry_count + 1, tx_hash);
91+
92+
// Try to get the transaction
93+
match provider.get_transaction(tx_hash).await {
94+
Ok(Some(transaction)) => {
95+
// Success - transaction found
96+
tx = Some(transaction);
97+
break;
98+
},
99+
Ok(None) => {
100+
// Transaction not found, let's retry after delay
101+
info!("Transaction not found, retrying...");
102+
retry_count += 1;
103+
104+
// Exponential backoff
105+
let delay_ms = initial_delay_ms * 2_u64.pow(retry_count as u32);
106+
tokio::time::sleep(tokio::time::Duration::from_millis(delay_ms)).await;
107+
},
108+
Err(e) => {
109+
// RPC error, log and retry
110+
info!("RPC error: {:?}, retrying...", e);
111+
retry_count += 1;
112+
113+
// Exponential backoff
114+
let delay_ms = initial_delay_ms * 2_u64.pow(retry_count as u32);
115+
tokio::time::sleep(tokio::time::Duration::from_millis(delay_ms)).await;
116+
}
117+
}
118+
}
119+
120+
info!("tx {:?}", tx);
121+
info!("block_number {:?}", block_number);
122+
info!("tx_hash {:?}", tx_hash);
123+
89124
match tx {
90125
Some(tx) => {
91126
let tx_block_number = tx.block_number.unwrap_or_default();
92127
let expected_block = U256::from_dec_str(block_number)?;
93-
info!("expected_block {:?}",expected_block);
94-
info!("tx_block_number {:?}",tx_block_number);
128+
info!("expected_block {:?}", expected_block);
129+
info!("tx_block_number {:?}", tx_block_number);
95130
Ok(tx_block_number.as_u64() == expected_block.as_u64())
96131
}
97-
None => Ok(false),
132+
None => {
133+
info!("Transaction not found after {} retries", max_retries);
134+
Ok(false)
135+
}
98136
}
99137
}
138+
// async fn is_transaction_in_block(
139+
// provider: &Provider<Http>,
140+
// tx_hash: &str,
141+
// block_number: &str,
142+
// ) -> Result<bool> {
143+
// let tx_hash = tx_hash.parse::<H256>()?;
144+
145+
// let tx = provider
146+
// .get_transaction(tx_hash)
147+
// .await?;
148+
149+
// info!("tx {:?}",tx);
150+
// info!("block_number {:?}",block_number);
151+
// info!("tx_hash {:?}",tx_hash);
152+
153+
154+
// match tx {
155+
// Some(tx) => {
156+
// let tx_block_number = tx.block_number.unwrap_or_default();
157+
// let expected_block = U256::from_dec_str(block_number)?;
158+
// info!("expected_block {:?}",expected_block);
159+
// info!("tx_block_number {:?}",tx_block_number);
160+
// Ok(tx_block_number.as_u64() == expected_block.as_u64())
161+
// }
162+
// None => Ok(false),
163+
// }
164+
// }
100165

101166
async fn get_block_proposer(
102167
client: &reqwest::Client,
@@ -146,15 +211,25 @@ async fn verify_transaction(
146211
State(state): State<AppState>,
147212
Json(request): Json<VerificationRequest>,
148213
) -> Result<Json<VerificationResponse>, String> {
149-
let is_included = is_transaction_in_block(
150-
&state.provider,
151-
&request.transaction_hash,
152-
&request.block_number,
153-
)
154-
.await
155-
.map_err(|e| e.to_string())?;
156-
157214

215+
info!("provider_verify_transaction {:?}",state.provider);
216+
let verification_task = tokio::time::timeout(
217+
std::time::Duration::from_secs(15), // 15 second timeout
218+
is_transaction_in_block(
219+
&state.provider,
220+
&request.transaction_hash,
221+
&request.block_number,
222+
)
223+
);
224+
225+
// Handle timeout and results
226+
let is_included = match verification_task.await {
227+
Ok(result) => result.map_err(|e| e.to_string())?,
228+
Err(_) => {
229+
info!("Transaction verification timed out after 15 seconds");
230+
false // Consider transaction not included if verification times out
231+
}
232+
};
158233
info!("is_included {:?}",is_included);
159234

160235
let proposer_index = if is_included {
@@ -187,8 +262,8 @@ async fn health_check() -> &'static str {
187262

188263
// Router setup
189264
pub fn operator_router(wallet: PrivateKeySigner) -> Router {
190-
let state = AppState::new("https://eth.llamarpc.com")
191-
.expect("Failed to create app state");
265+
let state = AppState::new("https://ethereum-holesky.publicnode.com")
266+
.expect("Failed to create app state");
192267

193268
Router::new()
194269
.route("/verify", post(verify_transaction))

karak_offchain/operator/src/register.rs

Lines changed: 18 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -147,92 +147,27 @@ impl RegistrationService {
147147
}
148148

149149
async fn is_registered_in_dss(&self) -> Result<bool> {
150+
info!("self.operator_address, {:?}", self.operator_address);
151+
info!("dss_instance {:?}", self.dss_instance);
152+
153+
let result = self
154+
.dss_instance
155+
.isOperatorRegistered(self.operator_address)
156+
.call()
157+
.await?;
158+
159+
// Extract the boolean value from the custom return type
160+
// The exact field name depends on how isOperatorRegisteredReturn is defined
161+
// It might be _0, is_registered, registered, or something else
162+
// Try one of these options:
163+
164+
// Option 1: If the struct has a field named _0
150165

151-
info!("self.operator_address, {:?}",self.operator_address);
152-
info!(",dss_instance {:?}",self.dss_instance);
153-
154-
Ok(self
155-
.dss_instance
156-
.isOperatorRegistered(self.operator_address)
157-
.call()
158-
.await?
159-
._0)
166+
info!("result {:?}", result._0);
167+
Ok(result._0)
160168
}
161169

162170

163-
// async fn is_registered_in_dss(&self) -> Result<bool> {
164-
// // Add retry mechanism and better error handling
165-
// const MAX_RETRIES: u32 = 3;
166-
// const RETRY_DELAY: Duration = Duration::from_secs(2);
167-
168-
// for attempt in 0..MAX_RETRIES {
169-
// match self.dss_instance.isOperatorRegistered(self.operator_address).call().await {
170-
// Ok(result) => {
171-
// // Handle the raw response
172-
// return Ok(result.into());
173-
// }
174-
// Err(e) => {
175-
// error!(
176-
// "Registration check failed (attempt {}/{}): {}",
177-
// attempt + 1,
178-
// MAX_RETRIES,
179-
// e
180-
// );
181-
182-
// if attempt < MAX_RETRIES - 1 {
183-
// time::sleep(RETRY_DELAY).await;
184-
// continue;
185-
// }
186-
// return Err(e.into());
187-
// }
188-
// }
189-
// }
190-
191-
// Err(eyre::eyre!("Failed to check registration status after {} attempts", MAX_RETRIES))
192-
// }
193-
194-
// async fn register_in_dss(&self) -> Result<TransactionReceipt> {
195-
// const MAX_RETRIES: u32 = 3;
196-
// const RETRY_DELAY: Duration = Duration::from_secs(2);
197-
198-
// for attempt in 0..MAX_RETRIES {
199-
// match self.core_instance
200-
// .registerOperatorToDSS(*self.dss_instance.address(), "0x".into())
201-
// .send()
202-
// .await
203-
// {
204-
// Ok(tx) => {
205-
// info!("Registration transaction sent, waiting for receipt...");
206-
// match tx.get_receipt().await {
207-
// Ok(receipt) => return Ok(receipt),
208-
// Err(e) => {
209-
// error!("Failed to get transaction receipt: {}", e);
210-
// if attempt < MAX_RETRIES - 1 {
211-
// time::sleep(RETRY_DELAY).await;
212-
// continue;
213-
// }
214-
// return Err(e.into());
215-
// }
216-
// }
217-
// }
218-
// Err(e) => {
219-
// error!(
220-
// "Failed to send registration transaction (attempt {}/{}): {}",
221-
// attempt + 1,
222-
// MAX_RETRIES,
223-
// e
224-
// );
225-
// if attempt < MAX_RETRIES - 1 {
226-
// time::sleep(RETRY_DELAY).await;
227-
// continue;
228-
// }
229-
// return Err(e.into());
230-
// }
231-
// }
232-
// }
233-
234-
// Err(eyre::eyre!("Failed to register operator after {} attempts", MAX_RETRIES))
235-
// }
236171

237172
async fn register_in_dss(&self) -> Result<TransactionReceipt> {
238173

@@ -282,7 +217,7 @@ info!("Sending JSON payload: {}", json_payload);
282217

283218
pub async fn register_operator_with_aggregator(&self) -> Result<()> {
284219

285-
info!("register_operator_with_aggregator");
220+
info!("register_operator_with_aggregator_working");
286221

287222
let url = self.aggregator_url.join("aggregator/registerOperator")?;
288223
let operator = AddressPayload {

0 commit comments

Comments
 (0)