Skip to content

Commit d75fab8

Browse files
authored
Merge pull request #116 from ComposableFi/rustninja/zk-prover-requested-changes
Rustninja/zk prover requested changes after pr review
2 parents 4320226 + af375c7 commit d75fab8

File tree

10 files changed

+38
-315
lines changed

10 files changed

+38
-315
lines changed

hyperspace/core/src/lib.rs

+3-52
Original file line numberDiff line numberDiff line change
@@ -276,13 +276,10 @@ async fn process_updates<A: Chain, B: Chain>(
276276
updates: Vec<(Any, Height, Vec<IbcEvent>, UpdateType)>,
277277
msgs: &mut Vec<Any>,
278278
) -> anyhow::Result<()> {
279-
let sink_recvs = sink.has_undelivered_sequences(UndeliveredType::Recvs);
280-
let sink_acks = sink.has_undelivered_sequences(UndeliveredType::Acks);
281-
let sink_timeouts = sink.has_undelivered_sequences(UndeliveredType::Timeouts);
282279
// for timeouts we need both chains to be up to date
283-
let sink_has_undelivered_acks = sink_recvs ||
284-
sink_acks ||
285-
sink_timeouts;
280+
let sink_has_undelivered_acks = sink.has_undelivered_sequences(UndeliveredType::Recvs) ||
281+
sink.has_undelivered_sequences(UndeliveredType::Acks) ||
282+
sink.has_undelivered_sequences(UndeliveredType::Timeouts);
286283

287284
let need_to_update = sink_has_undelivered_acks;
288285
log::error!(target: "hyperspace", "Received {} client updates from {}", updates.len(), source.name(),);
@@ -346,57 +343,11 @@ async fn process_updates<A: Chain, B: Chain>(
346343
)
347344
});
348345

349-
//filter of instance event . filter(match from prev statement^ | )
350-
//filter iclude any of the following:
351-
/*
352-
SendPacket,
353-
ReceivePacket,
354-
WriteAck,
355-
Timeout,
356-
TimeoutOnClose,
357-
*/
358-
//max_event_height
359346

360-
361-
log::error!(target: "hyperspace", "Received'' {}, has_instant_events = {has_instant_events}, update_delay_passed = {update_delay_passed}, need_to_update = {need_to_update}, sink_recvs = {sink_recvs}, sink_acks = {sink_acks}, sink_timeouts = {sink_timeouts}", mandatory_updates.len(), );
362-
363347
if !updates.is_empty() &&
364348
(mandatory_updates.is_empty() && update_delay_passed && need_to_update) ||
365349
has_instant_events
366350
{
367-
//replace updates.last() -> max_event_height
368-
//replace mandatory_updates.last() -> max_event_height
369-
// let max_event_height =
370-
// ibc_events.iter().map(|ev| ev.height()).max().unwrap_or_else(|| Height::zero());
371-
//max_event_height never should be ZERO!!!
372-
//panic unreachable
373-
374-
// let max_event_height = ibc_events.iter().filter(|ev| {
375-
// matches!(
376-
// &ev.event_type(),
377-
// &IbcEventType::OpenInitConnection |
378-
// &IbcEventType::OpenInitChannel |
379-
// &IbcEventType::OpenTryConnection |
380-
// &IbcEventType::OpenTryChannel |
381-
// &IbcEventType::OpenAckChannel |
382-
// &IbcEventType::OpenAckConnection |
383-
// &IbcEventType::CloseInitChannel |
384-
385-
// &IbcEventType::SendPacket |
386-
// &IbcEventType::ReceivePacket |
387-
// &IbcEventType::WriteAck |
388-
// &IbcEventType::Timeout |
389-
// &IbcEventType::TimeoutOnClose
390-
// )
391-
// }).map(|ev| ev.height()).max().unwrap_or_else(|| Height::zero());
392-
// log::error!(target: "hyperspace", "max_event_height is : {:#?}", max_event_height);
393-
394-
// if max_event_height == Height::zero() {
395-
// log::error!(target: "hyperspace", "max_event_height is ZERO");
396-
// return Ok(())
397-
// }
398-
399-
// .filter(|e| e.1 == max_event_height)
400351
let (forced_update, height) = updates.last().map(|(msg, h, ..)| (msg.clone(), h)).unwrap();
401352
if !mandatory_updates.is_empty() {
402353
let (_, last_height) =

hyperspace/cosmos/src/client.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -202,10 +202,10 @@ impl ZkProofRequest{
202202
bitmask,
203203
}
204204
}
205-
pub fn is_waiting_for_proof_too_long(&self) -> bool {
205+
pub fn is_waiting_for_proof_too_long(&self, possible_delay_secs: u64 ) -> bool {
206206
let t = std::time::SystemTime::now();
207207
let diff = t.duration_since(self.request_time.clone()).unwrap();
208-
if diff.as_secs() > 30 {
208+
if diff.as_secs() > possible_delay_secs {
209209
return true;
210210
}
211211
return false;
@@ -387,7 +387,7 @@ where
387387
mock_zk_prover: Arc::new(Mutex::new(MockZkProover::new())),
388388
zk_proof_requests: Arc::new(Mutex::new(HashMap::new())),
389389
//todo need to read from config
390-
zk_prover_api: ZKProver::new("http://127.0.0.1:8000".to_string(), Duration::from_secs(60)),
390+
zk_prover_api: ZKProver::new("http://127.0.0.1:8000".to_string(), Duration::from_secs(30).as_secs()),
391391
})
392392
}
393393

hyperspace/cosmos/src/eth_zk_utils.rs

+3-4
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use ureq;
88
#[derive(Debug, Clone)]
99
pub struct ZKProver {
1010
pub prover_url: String,
11+
pub delay_secs: u64
1112
}
1213

1314
#[derive(Debug, serde::Deserialize)]
@@ -35,12 +36,11 @@ impl CreateProofInput{
3536
}
3637

3738
impl ZKProver {
38-
pub fn new(prover_url: String, proof_timeout: Duration) -> Self {
39-
Self { prover_url, /* proof_timeout */}
39+
pub fn new(prover_url: String, delay_secs: u64) -> Self {
40+
Self { prover_url, delay_secs: delay_secs }
4041
}
4142

4243
pub fn status(&self) -> Result<String, Error> {
43-
//concat prover_url and create_proof
4444
let url = format!("{}{}", self.prover_url, "/status");
4545
let result= ureq::get(url.as_str())
4646
.call()?
@@ -52,7 +52,6 @@ impl ZKProver {
5252

5353

5454
pub fn create_proof(&self, proof_input: CreateProofInput) -> Result<Response, Error> {
55-
//concat prover_url and create_proof
5655
let url = format!("{}{}", self.prover_url, "/create_proof");
5756
let result= ureq::post(url.as_str())
5857
.send_json(ureq::json!(proof_input))?

hyperspace/cosmos/src/provider.rs

+22-53
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ use ibc::{
1515
ics02_client::{
1616
client_state::ClientType, events as ClientEvents,
1717
msgs::update_client::MsgUpdateAnyClient,
18-
msgs::update_client_zk::MsgUpdateAnyClientProof,
1918
trust_threshold::TrustThreshold,
2019
},
2120
ics04_channel::packet::Sequence,
@@ -66,10 +65,7 @@ use std::{collections::HashSet, f32::consts::E, pin::Pin, str::FromStr, time::Du
6665
use tendermint::block::Height as TmHeight;
6766
pub use tendermint::Hash;
6867
use tendermint_rpc::{
69-
endpoint::tx::Response,
70-
event::{Event, EventData},
71-
query::{EventType, Query},
72-
Client, Error as RpcError, Order, SubscriptionClient,
68+
endpoint::tx::Response, event::{Event, EventData}, query::{EventType, Query}, request, Client, Error as RpcError, Order, SubscriptionClient
7369
};
7470
use tokio::{task::JoinSet, time::sleep};
7571

@@ -130,14 +126,10 @@ where
130126
log::info!(target: "hyperspace_cosmos", "Getting blocks {}..{}", from, to);
131127
let to2 = to.clone();
132128

133-
// query (exclusively) up to `to`, because the proof for the event at `to - 1` will be
134-
// contained at `to` and will be fetched below by `msg_update_client_header`
135129
let update_headers =
136130
self.msg_update_client_header(from, to, client_state.latest_height).await?;
137131
let mut block_events = Vec::new();
138-
// block_events.push((0, Vec::new()));
139132
let mut join_set: JoinSet<Result<_, anyhow::Error>> = JoinSet::new();
140-
// let range = (from.value()..to.value()).collect::<Vec<_>>();
141133
let range = (from.value()..to.value()).collect::<Vec<_>>();
142134
let delay_to = self.rpc_call_delay().as_millis();
143135
for heights in range.chunks(100) {
@@ -163,8 +155,6 @@ where
163155
}
164156
}
165157

166-
// block_events.push((to.increment().value(), Vec::new()));
167-
168158
if block_events.len() != update_headers.len() {
169159
return Err(anyhow::anyhow!(
170160
"block events and updates must match, got {} and {}",
@@ -174,9 +164,6 @@ where
174164
}
175165
block_events.sort_by_key(|(height, _)| *height);
176166

177-
//replace updates.last() -> max_event_height
178-
//replace mandatory_updates.last() -> max_event_height
179-
//use the filter from prev fn in process_updates()
180167
let all_ibc_events =
181168
block_events.iter().map(|ev| ev.1.clone()).flatten().collect::<Vec<_>>();
182169

@@ -201,18 +188,6 @@ where
201188
log::error!(target: "hyperspace", "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
202189
log::error!(target: "hyperspace_cosmos", "max_event_height blocks {}..{}. h :{}", from, to2, max_event_height);
203190

204-
//we can leave max_event_height as a zero in for inside if statement will be ignore all height if it is not max_event_height or mandatory
205-
206-
// .max().unwrap_or_else(|| Height::zero());
207-
208-
// .map(|(_, _, events, ..)| events.clone())
209-
// .flatten()
210-
// .collect::<Vec<_>>();
211-
//max_event_height never should be ZERO!!!
212-
//panic unreachable
213-
//fi let. max_event_height could be zero
214-
// if let some max_event_height => ask zk proof from remote api service!!!
215-
216191
let mut updates = Vec::new();
217192
let mut continew = false;
218193
let mut exist_at_least_one_proof = false;
@@ -222,7 +197,6 @@ where
222197
.zip(update_headers)
223198
.enumerate()
224199
{
225-
//todo check the that we do not have mandatory updates and only then add this one as a mandatory
226200
if i == NUMBER_OF_BLOCKS_TO_PROCESS_PER_ITER as usize - 1 /* -2 */ {
227201
update_type = UpdateType::Mandatory;
228202
}
@@ -233,17 +207,6 @@ where
233207
let mut zk_bitmask = 0;
234208

235209
if update_type == UpdateType::Mandatory || height == max_event_height {
236-
//h1, h2, h3, h4, h5, h6, h7, h8, h9, h10
237-
//?- ? + ?
238-
//ask generate the proof or poll the proof from remote api service
239-
240-
//ask about proof from remote api service or poll resp from remote api service
241-
//if prove does not exist then break the for loop
242-
243-
//if proof does not exsits then continue the loop.
244-
// let zk_input = update_header.get_zk_input(1).unwrap();
245-
246-
247210
let mock_zk_prover = false;
248211
if mock_zk_prover{
249212
let mut zk_proover = self.mock_zk_prover.lock().unwrap();
@@ -253,13 +216,29 @@ where
253216
log::error!(target: "hyperspace_cosmos", "requested proof: {:?}, {:?}, {}", update_type, height, is_request_ready);
254217
println!("requested proof: {:?}", height);
255218

219+
if true{
220+
zk_proof = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; //mock proof
221+
/*
222+
let expected_validators = vec![1]; all validators included in the proof
223+
let mut zk_bitmask: u64 = 0;
224+
for (index, &validator) in expected_validators.iter().enumerate() {
225+
if validator == 1 {
226+
zk_bitmask |= 1 << index;
227+
}
228+
}
229+
*/
230+
zk_bitmask = 1; //it is real bitmask for local tests with 1 validator [1]
231+
is_request_ready = true;
232+
exist_at_least_one_proof = true;
233+
}
256234
if !is_request_ready{
257235
continew = true;
258236
}
259237
}
260238
else{
261239
let mut zk_height_proof_id_map = self.zk_proof_requests.lock().unwrap();
262240
let zk_prover = self.zk_prover_api.clone();
241+
let delay_secs = self.zk_prover_api.delay_secs;
263242
let proof_id = zk_height_proof_id_map.get(&height);
264243
if let Some(proof_request) = proof_id{
265244
let proof_request = proof_request.clone();
@@ -276,7 +255,7 @@ where
276255
}
277256
else{
278257
log::info!(target: "hyperspace", "proof not ready Yet. proof is None. proof_id: {:?}, height: {:?}", proof_request, height);
279-
if proof_request.is_waiting_for_proof_too_long(){
258+
if proof_request.is_waiting_for_proof_too_long(delay_secs){
280259
log::error!(target: "hyperspace", "Proof not ready too long. proof_id: {:?}, height: {:?}, requested proof at : {:?}", proof_request, height, proof_request.request_time);
281260
}
282261

@@ -288,8 +267,7 @@ where
288267
}
289268
}
290269
else{
291-
// //todo get input. uncomment
292-
// //todo size should be 32 for prodauction
270+
// //todo size should be 32 for mainnets. 1 is only for local testing.
293271
let size = 1;
294272
let zk_input = update_header.get_zk_input(size);
295273

@@ -328,28 +306,19 @@ where
328306
continue;
329307
}
330308

331-
//push will into updates updates
332-
/*
333-
non mumdatary #1 updates -> push.
334-
mundatary #5 push but not metter if other next mandatory without proof #6
335-
336-
*/
337-
338309
let zk_update_header = ics07_tendermint_zk::client_message::ZkHeader{
339310
signed_header: update_header.signed_header.clone(),
340311
validator_set: update_header.validator_set.clone(),
341312
trusted_height: update_header.trusted_height.clone(),
342313
trusted_validator_set: update_header.trusted_validator_set.clone(),
343-
zk_proof: zk_proof, //todo put the proof here
344-
zk_bitmask: zk_bitmask, //todo put the bitmask here
314+
zk_proof: zk_proof,
315+
zk_bitmask: zk_bitmask,
345316
};
346317

347318
let update_client_header = {
348-
let msg = MsgUpdateAnyClientProof::<LocalClientTypes> {
319+
let msg = MsgUpdateAnyClient::<LocalClientTypes> {
349320
client_id: client_id.clone(),
350-
// client_message: AnyClientMessage::Tendermint(ClientMessage::Header(
351321
client_message: AnyClientMessage::TendermintZk(ics07_tendermint_zk::client_message::ZkClientMessage::Header(
352-
// update_header, //todo use another tipe that will be able to hold the proof as well
353322
zk_update_header,
354323
)),
355324
signer: counterparty.account_id(),

hyperspace/ethereum/src/chain.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ use ibc::{
3030
ics02_client::{
3131
client_state::ClientState as _,
3232
events::UpdateClient,
33-
msgs::{create_client::MsgCreateAnyClient, update_client::MsgUpdateAnyClient, update_client_zk::MsgUpdateAnyClientProof},
33+
msgs::{create_client::MsgCreateAnyClient, update_client::MsgUpdateAnyClient},
3434
trust_threshold::TrustThreshold,
3535
},
3636
ics03_connection::msgs::{
@@ -1472,8 +1472,8 @@ impl EthereumClient {
14721472
let bytes = self.yui.create_client_calldata(token).await;
14731473

14741474
calls.push(bytes);
1475-
} else if msg.type_url == ibc::core::ics02_client::msgs::update_client_zk::TYPE_URL {
1476-
let msg = MsgUpdateAnyClientProof::<LocalClientTypes>::decode_vec(&msg.value).map_err(
1475+
} else if msg.type_url == ibc::core::ics02_client::msgs::update_client::TYPE_URL {
1476+
let msg = MsgUpdateAnyClient::<LocalClientTypes>::decode_vec(&msg.value).map_err(
14771477
|_| ClientError::Other("update_client: failed to decode_vec".into()),
14781478
)?;
14791479

0 commit comments

Comments
 (0)