Skip to content

Commit 7926588

Browse files
authored
Tests : proving client tests (#85)
* feat : added test boilerplate * feat : updated sharp prover client and added certificate feature * feat : updated sharp prover client and added certificate feature * feat : added certificates for testing * feat : added tests for proving client and fixed fact calculation logic * fix : linter fixes * feat : revamp code * feat : test fix * refactor : resolved comments #1 * refactor : removed redundant code * fix : lint * refactor : updated code as per comments (0xevolve) * markdown lint fix * feat : resolved comment
1 parent fa59cdf commit 7926588

File tree

18 files changed

+328
-49
lines changed

18 files changed

+328
-49
lines changed

.env.example

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,10 @@ SQS_JOB_VERIFICATION_QUEUE_URL=
3333
# S3
3434
AWS_S3_BUCKET_NAME=
3535
AWS_S3_BUCKET_REGION=
36+
37+
# Sharp Services
38+
SHARP_CUSTOMER_ID=
39+
SHARP_USER_CRT=
40+
SHARP_USER_KEY=
41+
SHARP_SERVER_CRT=
42+
SHARP_PROOF_LAYOUT=

.env.test

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,12 @@ PROVER_SERVICE="sharp"
2525
SETTLEMENT_LAYER="ethereum"
2626
DATA_STORAGE="s3"
2727
MONGODB_CONNECTION_STRING="mongodb://localhost:27017"
28+
29+
# Sharp Services
30+
SHARP_CUSTOMER_ID="sharp_consumer_id"
31+
SHARP_URL="http://127.0.0.1:5000"
32+
# [IMP!!!] These are test certificates (they don't work)
33+
SHARP_USER_CRT="LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR4ekNDQXErZ0F3SUJBZ0lVTjBSK0xpb1MzL2ZadUZsK291RjZNNFk2RnRZd0RRWUpLb1pJaHZjTkFRRUwKQlFBd2N6RUxNQWtHQTFVRUJoTUNTVTR4RXpBUkJnTlZCQWdNQ2xOdmJXVXRVM1JoZEdVeElUQWZCZ05WQkFvTQpHRWx1ZEdWeWJtVjBJRmRwWkdkcGRITWdVSFI1SUV4MFpERU5NQXNHQTFVRUF3d0VVMVJTU3pFZE1Cc0dDU3FHClNJYjNEUUVKQVJZT1lXSmpRR3RoY201dmRDNTRlWG93SGhjTk1qUXdPREV6TVRNd05UTTBXaGNOTWpVd09ERXoKTVRNd05UTTBXakJ6TVFzd0NRWURWUVFHRXdKSlRqRVRNQkVHQTFVRUNBd0tVMjl0WlMxVGRHRjBaVEVoTUI4RwpBMVVFQ2d3WVNXNTBaWEp1WlhRZ1YybGtaMmwwY3lCUWRIa2dUSFJrTVEwd0N3WURWUVFEREFSVFZGSkxNUjB3Ckd3WUpLb1pJaHZjTkFRa0JGZzVoWW1OQWEyRnlibTkwTG5oNWVqQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQUQKZ2dFUEFEQ0NBUW9DZ2dFQkFOSEtaUGRqWSs4QWo4ZFV2V0xReEl5NTNrK1BHY001T2FlYnpTV3FER0xGSlBOdgpkVzJvWjFCSnNEb2hobWZFSCt5ZEFoQXEvbzc4NDljblg2VDJTOVhta25wdnNud2dRckU5Z3lqSmV3MUxBRzNHCm10U0lOMWJJSm9peWJ3QUR5NGxPd0xrVzUzdFdueHBSazVVVmZUU1hLYVRRTnlHd2o3Q2xMSGthcnlZYVk3OVkKOXlHMFJ2RkFkb1IzczBveWthNkFLV0d1WjhOdWd4NTY2bysyWllRenJteWVNU1NGYkhNdW1aUkxYb0hpazhBSgpLZXJ0bnNBRC9LMVJRYm80Y21ubHFoTVRhQktiTEFVVjVteFVvMlpveFBJVU9tREE5N3IyMmRTYkRkRlVjeC9kCjhQcDB6VXNycXdQckJlcW5SMXdLOE80MUlHajUzRnUzVmxDeS94MENBd0VBQWFOVE1GRXdIUVlEVlIwT0JCWUUKRkc0T0lvKzcvckJyZlR4S2FFMGx2L1dwRDJ3UE1COEdBMVVkSXdRWU1CYUFGRzRPSW8rNy9yQnJmVHhLYUUwbAp2L1dwRDJ3UE1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFEMURDZkR3CnpoSXRGMWd5YVdhWURZRHErZjJSUHBFRWVaWk1BSDdJV0ZTajRrTzhmVHN1RnN6bFoyNXNlR3ZHYW4xQ3F4alQKYnJ3MXliVlJQeGZMUWgxRlZMMGhFeDZWYXhGditxMmtqUmlCQmZURFBxWGxYcmpaaUYrZTNPS3lKSVhnNkpIUAppbVpBV0dyRFBHNkorQi90bHRaQ3VLZVhLK1FUcnRSOVVCL29hOWVaQWc5RXNkOVJsZDRNeVo5b0NtdUNPU1hmCnk1THFkVlgrNENpTnJXQ3BwM1B2M2MyL28rZ0RMQjUzZ252R056RjR6Q1FIZ0RtN0RNZnpmZlY1TUMwV1MvWXkKVnpyUG11Sys0Y0tSK3dMOFZITVNEeC9ybTFhYnh0dEN2VW92MUw5dVZ1QUNGc29yNmdsR0N1RDNNQ0dIa0pNNgpxaS8rM1haeHhxeGw1Rzg9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K"
34+
SHARP_USER_KEY="LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2UUlCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktjd2dnU2pBZ0VBQW9JQkFRRFJ5bVQzWTJQdkFJL0gKVkwxaTBNU011ZDVQanhuRE9UbW5tODBscWd4aXhTVHpiM1Z0cUdkUVNiQTZJWVpueEIvc25RSVFLdjZPL09QWApKMStrOWt2VjVwSjZiN0o4SUVLeFBZTW95WHNOU3dCdHhwclVpRGRXeUNhSXNtOEFBOHVKVHNDNUZ1ZDdWcDhhClVaT1ZGWDAwbHltazBEY2hzSSt3cFN4NUdxOG1HbU8vV1BjaHRFYnhRSGFFZDdOS01wR3VnQ2xocm1mRGJvTWUKZXVxUHRtV0VNNjVzbmpFa2hXeHpMcG1VUzE2QjRwUEFDU25xN1o3QUEveXRVVUc2T0hKcDVhb1RFMmdTbXl3RgpGZVpzVktObWFNVHlGRHBnd1BlNjl0blVtdzNSVkhNZjNmRDZkTTFMSzZzRDZ3WHFwMGRjQ3ZEdU5TQm8rZHhiCnQxWlFzdjhkQWdNQkFBRUNnZ0VBQU9mcDFiT2xLOVFKeXVlUHhjeDIvTkNVcUMxTEJDL01FdkEyUzVKWGFWbkcKbGhLR0pFb1U0Q0RoVk83dUlLYVZLTFZvMjk4RHFHUnBLM1d0RVE1TE40bytXYTcveTA5c1drMlVzbWxrVWFOZwpSaGtVZEJSK2dLNXVsQ3FKRml2dUJoTEQvRWlnQ1VWUGZKS2JtNG96TnpYcjVSMU5ENlV1aWFtODdtenlFcTBLCmZsVXlhR0RZNGdIdFNBOVBENVBFYlUveFpKeitKaHk5T2l3aVRXV0MrSHoyb2c3UWRDRDE2RlhGcit2VHpQN0MKb2tFb0VDZFNPRWlMalVENjBhS2ZxRmFCVm5MTkVudC9QSytmY1RBM05mNGtSMnFDNk9ZWjVFb09zYm1ka29ZTgpyU3NJZW9XblMxOEhvekZud2w3Z05wTUtjNmRzQzRBTldOVDFsTkhCb1FLQmdRRHlaUDFJSlppZUh6NlExaUVTCm5zd2tnblZCQUQ0SlVLR1ZDMHA3dk4yclNDZXh4c05ZZXFPTEEyZGZCUGpOVjd3blFKcUgxT05XellOMUJVSUUKeThLTCtFZVl6Q3RZa21LL21wSGJIMzNjd2tJODBuMHJROU1BalZMTlJ2YVVEOWp1NFBsRzFqaEFZUVVyTkViZQpKRlVpSk83aDVQa1llZG50SitqSHFpQnRoUUtCZ1FEZGtPbndmL0szYk4xenR0bXZQd0VicjhkVWJjRVh5NDFOCkl5VWwrZW1WSlgzYktKM0duNDZnQ2RsTTdkYmpwS3JVZ3oxL2JsZTgvMkVFckJvSEFRNkMrU2pEaGhvL01CbnIKekZheTBoK3YxbjBnZnNNVzRoOEF4cEFwc25OYnh6K2g1Wm5uSnRTd0srUjB3U0VJVVEzRjAxL2hMWWhLQ2l5OApwbW5HQi9hU3VRS0JnRzdxd1cvVExGd214ZlYyMXBsenFzeUdHZXVObGRXalhOMGIxcEI2b3lDdW11TmhwYUFHCk5uSDFNOGNxT2tPVWd4ZWZHMWRPbGx6eEc5ZGZlWTlDUWhyVW1NYVZucndmK0NuZkxDRU43d1VtcXpLenl1MFMKVXlwc2dOaElRYXNNK1dLTjllTnhRVHBNYXhZVERONjMxM0VSWDNKazJZdFdydDh6cFBSQXFDZ1ZBb0dCQU54egpUa0NMbmJ6aFphbTNlZm9DenlCMEVma3dSdHBkSGxkc3E0NlFqTmRuK1VSd3NpTXBLR2lWeEE3bDZsU1B4NlV3CmU2VHA3Z1JQZUlHRWwxVDJ1VENacGZSODNtcVdlb1FCeVJXZE9nZmplcFkxYWZpL3ZhY3c2Y21ERTRKeXloNVUKYTMveFE5ZVJwSHFDbWxKREMxZ1V5eVlwL3B2a2FjUytNeW5sVEhHSkFvR0FQekdTSzdXOHBUYldSVEFoaTVrSQpwZk5kWk1tcnRodUxNT3F6TGhyRjZublpldk9OdTBoYXVhZktlVElFd2w0clhYZHFKQlJBaWZKMFFsLzZKWFFkCmd1VzFrZWk1Ui8rUFZ5eUhab042c3NXSTNWYklwUUloUmt6UENnTDZhbHEwSzFpT1dlV1lIOHdORGRRdlB1T2UKRkZPOEovSzNxV0NtWjU0ODBBbTNhT0U9Ci0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0K"
35+
SHARP_SERVER_CRT="LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURhekNDQWxPZ0F3SUJBZ0lVRUR0Rjd0YVNTUnVQQTJ6Uk1aNWNzY2JCRm5jd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1JURUxNQWtHQTFVRUJoTUNTVTR4RXpBUkJnTlZCQWdNQ2xOdmJXVXRVM1JoZEdVeElUQWZCZ05WQkFvTQpHRWx1ZEdWeWJtVjBJRmRwWkdkcGRITWdVSFI1SUV4MFpEQWVGdzB5TkRBNE1UTXhNekEzTVROYUZ3MHlOVEE0Ck1UTXhNekEzTVROYU1FVXhDekFKQmdOVkJBWVRBa2xPTVJNd0VRWURWUVFJREFwVGIyMWxMVk4wWVhSbE1TRXcKSHdZRFZRUUtEQmhKYm5SbGNtNWxkQ0JYYVdSbmFYUnpJRkIwZVNCTWRHUXdnZ0VpTUEwR0NTcUdTSWIzRFFFQgpBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRFRHcEEwNEZ1QlNFaE5PNVYvMGxTaDkvSEgxeVRZT2dRVFdoOG43eDlRCnZGMHpvZFZueVFIdjE5elU5eVdia2xvOEkvOXFBVm9lRzdXTnpUVFg2Q295ZlNjb1YvazN0Q2UwVnVWMlFJTVQKdW82SzJSU05CVHB1TlNqNTlzUiszVTQ2OFRBQnY0YVpsYjU4TU5CRXM3MVRieVpLRHBGRVRkMkg3T0ZKajg4QQpNRi9MaXJkeDZPOFdZL0tDeisxd1ZXL1JRdytYYjRJSWx4bXJFOC9UZ3FNSEo4dFUxYkZiOWJNcTEvOTN5YWtJClU1V2J2NVhXKzFwZFVyTUFNcTFFaC9vZThMN2pFaFdvZXZrNzgyU0kwUk0xeG5MaEtrUUVBYXd6Zkg2ODZiR2YKUHQ3RkFIQ1pGaWJ4KzZzSkg0R1M3S25iK0x5bk9ud3phMWZPUXZEZmcvRm5BZ01CQUFHalV6QlJNQjBHQTFVZApEZ1FXQkJUYlFUdmlUTW1xNXlNK2ZJRVI4VjdTZk1pK3B6QWZCZ05WSFNNRUdEQVdnQlRiUVR2aVRNbXE1eU0rCmZJRVI4VjdTZk1pK3B6QVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRREYKTllyRnpBa2RIVkhjUkd5SUNsTi9IVGswaldOcTVSdTB1RUpDQ21Dbm9ZY1pRSTlDQlcwTkl3dGpZUkpTKzR1UwordWh4VWpSYTA5YXdOWDhvYmU0dDZjK25HRnhZMGZqamk0cGZnbU1kMWNJeGdsM3E3Nlp0ZkllRGR6alRLRXN1CjRFUTVadnEwMnJvTEZ0ZjEvL3dRVG0xNkNKdFpGWnhNZ1phYnNxc2JRc3M2dWdMUGtTTmdBWjI1L2VhcWhnQ20KTjFUV2FxL0xJMVBLSkxPK085NFlMa2FsNVpyOTJCOXk4Q0VKVUVuSTA1R1N1MmJUOFM2a0ZBMEpadEszTW9SbwpqRWZWV1lQVHR5TFR4amNvRndCcDlHaXZYSDdSdHBxMDlmSmFhU1pNekxmNGlyNHpBdXprbExBNWZvampPNXlKCllnYlVaQUU2aS81N1NFWjR3VmxTCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K"
36+
SHARP_PROOF_LAYOUT="small"

.github/workflows/coverage.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ jobs:
4646
- name: Install nextest
4747
uses: taiki-e/install-action@nextest
4848

49+
- name: Getting neccesary files for testing
50+
run: |
51+
wget -P ./crates/prover-services/sharp-service/tests/artifacts https://madara-orchestrator-sharp-pie.s3.amazonaws.com/238996-SN.zip
52+
4953
- name: Clean workspace
5054
run: |
5155
cargo clean --doc

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,6 @@
66
*.code-workspace
77
.vscode
88

9-
lcov.info
9+
lcov.info
10+
11+
**/*-SN.zip

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
66

77
## Added
88

9+
- Tests for prover client.
910
- Added Rust Cache for Coverage Test CI.
1011
- support for fetching PIE file from storage client in proving job.
1112
- added coveralls support
@@ -39,4 +40,5 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
3940

4041
## Fixed
4142

43+
- Get Fact Info logic.
4244
- Fixed state update worker logic as per the new implementation.

Cargo.lock

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

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ dotenvy = "0.15.7"
3434
futures = "0.3.30"
3535
mongodb = { version = "2.8.1" }
3636
omniqueue = { version = "0.2.0" }
37-
reqwest = { version = "0.11.24" }
37+
reqwest = { version = "0.11.24", features = ["rustls-tls", "native-tls"] }
3838
rstest = "0.18.2"
3939
serde = { version = "1.0.197" }
4040
serde_json = "1.0.114"
@@ -48,7 +48,7 @@ tracing = "0.1.40"
4848
tracing-subscriber = { version = "0.3.18" }
4949
url = { version = "2.5.0", features = ["serde"] }
5050
uuid = { version = "1.7.0", features = ["v4", "serde"] }
51-
httpmock = { version = "0.7.0" }
51+
httpmock = { version = "0.7.0", features = ["remote"] }
5252
num-bigint = { version = "0.4.4" }
5353
arc-swap = { version = "1.7.1" }
5454
num-traits = "0.2"

README.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,17 @@ The tentative flow of the orchestrator looks like this but this is subject to
1111
change as we learn more about external systems and the constraints involved.
1212

1313
![orchestrator_da_sequencer_diagram](./docs/orchestrator_da_sequencer_diagram.png)
14+
15+
## Testing
16+
17+
- Files needed for tests can be fetched through s3 :
18+
19+
```shell
20+
wget -P ./crates/prover-services/sharp-service/tests/artifacts https://madara-orchestrator-sharp-pie.s3.amazonaws.com/238996-SN.zip
21+
```
22+
23+
- To run all the tests :
24+
25+
```shell
26+
cargo llvm-cov nextest --release --lcov --output-path lcov.info --test-threads=1
27+
```

crates/prover-services/gps-fact-checker/src/error.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,6 @@ pub enum FactCheckerError {
5050
TreeStructureEndOffsetInvalid(usize, usize),
5151
#[error("Tree structure: root offset {0} does not match the output length {1}")]
5252
TreeStructureRootOffsetInvalid(usize, usize),
53+
#[error("Program output doesn't match the segment size.")]
54+
InvalidSegment,
5355
}

crates/prover-services/gps-fact-checker/src/fact_info.rs

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ use cairo_vm::types::relocatable::MaybeRelocatable;
99
use cairo_vm::vm::runners::cairo_pie::CairoPie;
1010
use cairo_vm::Felt252;
1111
use starknet::core::types::FieldElement;
12-
use utils::ensure;
1312

1413
use super::error::FactCheckerError;
1514
use super::fact_node::generate_merkle_root;
@@ -45,33 +44,26 @@ pub fn get_program_output(cairo_pie: &CairoPie) -> Result<Vec<Felt252>, FactChec
4544
.get(&BuiltinName::output)
4645
.ok_or(FactCheckerError::OutputBuiltinNoSegmentInfo)?;
4746

48-
let segment_start = cairo_pie
49-
.memory
50-
.0
51-
.iter()
52-
.enumerate()
53-
.find_map(|(ptr, ((index, _), _))| if *index == segment_info.index as usize { Some(ptr) } else { None })
54-
.ok_or(FactCheckerError::OutputSegmentNotFound)?;
55-
56-
let mut output = Vec::with_capacity(segment_info.size);
57-
let mut expected_offset = 0;
58-
59-
#[allow(clippy::explicit_counter_loop)]
60-
for i in segment_start..segment_start + segment_info.size {
61-
let ((_, offset), value) = cairo_pie.memory.0.get(i).ok_or(FactCheckerError::OutputSegmentInvalidRange)?;
62-
63-
ensure!(
64-
*offset == expected_offset,
65-
FactCheckerError::OutputSegmentInconsistentOffset(*offset, expected_offset)
66-
);
67-
match value {
68-
MaybeRelocatable::Int(felt) => output.push(*felt),
69-
MaybeRelocatable::RelocatableValue(_) => {
70-
return Err(FactCheckerError::OutputSegmentUnexpectedRelocatable(*offset));
47+
let mut output = vec![Felt252::from(0); segment_info.size];
48+
let mut insertion_count = 0;
49+
let cairo_program_memory = &cairo_pie.memory.0;
50+
51+
for ((index, offset), value) in cairo_program_memory.iter() {
52+
if *index == segment_info.index as usize {
53+
match value {
54+
MaybeRelocatable::Int(felt) => {
55+
output[*offset] = *felt;
56+
insertion_count += 1;
57+
}
58+
MaybeRelocatable::RelocatableValue(_) => {
59+
return Err(FactCheckerError::OutputSegmentUnexpectedRelocatable(*offset));
60+
}
7161
}
7262
}
63+
}
7364

74-
expected_offset += 1;
65+
if insertion_count != segment_info.size {
66+
return Err(FactCheckerError::InvalidSegment);
7567
}
7668

7769
Ok(output)

crates/prover-services/sharp-service/Cargo.toml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,26 @@ edition.workspace = true
66
[dependencies]
77
alloy.workspace = true
88
async-trait.workspace = true
9+
base64 = "0.22.1"
910
cairo-vm.workspace = true
11+
dotenvy.workspace = true
1012
gps-fact-checker.workspace = true
1113
hex.workspace = true
14+
httpmock.workspace = true
15+
lazy_static.workspace = true
1216
prover-client-interface.workspace = true
1317
reqwest.workspace = true
18+
rstest.workspace = true
1419
serde.workspace = true
1520
serde_json.workspace = true
1621
snos.workspace = true
1722
thiserror.workspace = true
23+
tokio.workspace = true
1824
tracing.workspace = true
1925
url.workspace = true
2026
utils.workspace = true
2127
uuid.workspace = true
2228

2329
[dev-dependencies]
2430
tokio.workspace = true
31+
httpmock.workspace = true

crates/prover-services/sharp-service/src/client.rs

Lines changed: 84 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
1-
use serde_json::json;
2-
use snos::sharp::{CairoJobResponse, CairoStatusResponse};
1+
use base64::engine::general_purpose;
2+
use base64::Engine;
3+
use reqwest::{Certificate, ClientBuilder, Identity};
4+
use std::clone::Clone;
35
use url::Url;
6+
use utils::env_utils::get_env_var_or_panic;
47
use uuid::Uuid;
58

69
use crate::error::SharpError;
10+
use crate::types::{SharpAddJobResponse, SharpGetStatusResponse};
711

812
/// SHARP endpoint for Sepolia testnet
9-
pub const DEFAULT_SHARP_URL: &str = "https://testnet.provingservice.io";
13+
pub const DEFAULT_SHARP_URL: &str = "https://sepolia-recursive.public-testnet.provingservice.io/v1/gateway";
1014

1115
/// SHARP API async wrapper
1216
pub struct SharpClient {
@@ -15,25 +19,85 @@ pub struct SharpClient {
1519
}
1620

1721
impl SharpClient {
22+
/// We need to set up the client with the provided certificates.
23+
/// We need to have three secrets :
24+
/// - base64(SHARP_USER_CRT)
25+
/// - base64(SHARP_USER_KEY)
26+
/// - base64(SHARP_SERVER_CRT)
27+
///
28+
/// You can run this command in terminal to convert a file output into base64
29+
/// and then copy it and paste it into .env file :
30+
///
31+
/// `cat <file_name> | base64`
1832
pub fn new(url: Url) -> Self {
19-
Self { base_url: url, client: reqwest::Client::new() }
33+
// Getting the cert files from the .env and then decoding it from base64
34+
let cert = general_purpose::STANDARD.decode(get_env_var_or_panic("SHARP_USER_CRT")).unwrap();
35+
let key = general_purpose::STANDARD.decode(get_env_var_or_panic("SHARP_USER_KEY")).unwrap();
36+
let server_cert = general_purpose::STANDARD.decode(get_env_var_or_panic("SHARP_SERVER_CRT")).unwrap();
37+
38+
// Adding Customer ID to the url
39+
let mut url_mut = url.clone();
40+
let customer_id = get_env_var_or_panic("SHARP_CUSTOMER_ID");
41+
url_mut.query_pairs_mut().append_pair("customer_id", customer_id.as_str());
42+
43+
Self {
44+
base_url: url_mut,
45+
client: ClientBuilder::new()
46+
.identity(Identity::from_pkcs8_pem(&cert, &key).unwrap())
47+
.add_root_certificate(Certificate::from_pem(server_cert.as_slice()).unwrap())
48+
.build()
49+
.unwrap(),
50+
}
2051
}
2152

22-
pub async fn add_job(&self, encoded_pie: &str) -> Result<CairoJobResponse, SharpError> {
23-
let data = json!({ "action": "add_job", "request": { "cairo_pie": encoded_pie } });
24-
let url = self.base_url.join("add_job").unwrap();
25-
let res = self.client.post(url).json(&data).send().await.map_err(SharpError::AddJobFailure)?;
53+
pub async fn add_job(&self, encoded_pie: &str) -> Result<(SharpAddJobResponse, Uuid), SharpError> {
54+
let mut base_url = self.base_url.clone();
55+
56+
base_url.path_segments_mut().map_err(|_| SharpError::PathSegmentMutFailOnUrl)?.push("add_job");
57+
58+
let cairo_key = Uuid::new_v4();
59+
let cairo_key_string = cairo_key.to_string();
60+
let proof_layout = get_env_var_or_panic("SHARP_PROOF_LAYOUT");
61+
62+
// Params for sending the PIE file to the prover
63+
// for temporary reference you can check this doc :
64+
// https://docs.google.com/document/d/1-9ggQoYmjqAtLBGNNR2Z5eLreBmlckGYjbVl0khtpU0
65+
let params = vec![
66+
("cairo_job_key", cairo_key_string.as_str()),
67+
("offchain_proof", "true"),
68+
("proof_layout", proof_layout.as_str()),
69+
];
70+
71+
// Adding params to the URL
72+
add_params_to_url(&mut base_url, params);
73+
74+
let res =
75+
self.client.post(base_url).body(encoded_pie.to_string()).send().await.map_err(SharpError::AddJobFailure)?;
2676

2777
match res.status() {
28-
reqwest::StatusCode::OK => res.json().await.map_err(SharpError::AddJobFailure),
78+
reqwest::StatusCode::OK => {
79+
let result: SharpAddJobResponse = res.json().await.map_err(SharpError::AddJobFailure)?;
80+
Ok((result, cairo_key))
81+
}
2982
code => Err(SharpError::SharpService(code)),
3083
}
3184
}
3285

33-
pub async fn get_job_status(&self, job_key: &Uuid) -> Result<CairoStatusResponse, SharpError> {
34-
let data = json!({ "action": "get_status", "request": { "cairo_job_key": job_key } });
35-
let url = self.base_url.join("get_status").unwrap();
36-
let res = self.client.post(url).json(&data).send().await.map_err(SharpError::GetJobStatusFailure)?;
86+
pub async fn get_job_status(&self, job_key: &Uuid) -> Result<SharpGetStatusResponse, SharpError> {
87+
let mut base_url = self.base_url.clone();
88+
89+
base_url.path_segments_mut().map_err(|_| SharpError::PathSegmentMutFailOnUrl)?.push("get_status");
90+
let cairo_key_string = job_key.to_string();
91+
92+
// Params for getting the prover job status
93+
// for temporary reference you can check this doc :
94+
// https://docs.google.com/document/d/1-9ggQoYmjqAtLBGNNR2Z5eLreBmlckGYjbVl0khtpU0
95+
let params = vec![("cairo_job_key", cairo_key_string.as_str())];
96+
97+
// Adding params to the url
98+
add_params_to_url(&mut base_url, params);
99+
100+
let res = self.client.post(base_url).send().await.map_err(SharpError::GetJobStatusFailure)?;
37101

38102
match res.status() {
39103
reqwest::StatusCode::OK => res.json().await.map_err(SharpError::GetJobStatusFailure),
@@ -42,6 +106,13 @@ impl SharpClient {
42106
}
43107
}
44108

109+
fn add_params_to_url(url: &mut Url, params: Vec<(&str, &str)>) {
110+
let mut pairs = url.query_pairs_mut();
111+
for (key, value) in params {
112+
pairs.append_pair(key, value);
113+
}
114+
}
115+
45116
impl Default for SharpClient {
46117
fn default() -> Self {
47118
Self::new(DEFAULT_SHARP_URL.parse().unwrap())

crates/prover-services/sharp-service/src/config.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ impl Default for SharpConfig {
2020
fn default() -> Self {
2121
Self {
2222
service_url: DEFAULT_SHARP_URL.parse().unwrap(),
23-
rpc_node_url: "https://sepolia.drpc.org".parse().unwrap(),
23+
rpc_node_url: "https://ethereum-sepolia-rpc.publicnode.com".parse().unwrap(),
2424
verifier_address: "0x07ec0D28e50322Eb0C159B9090ecF3aeA8346DFe".parse().unwrap(),
2525
}
2626
}

crates/prover-services/sharp-service/src/error.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ pub enum SharpError {
2121
TaskIdSplit,
2222
#[error("Failed to encode PIE")]
2323
PieEncode(#[source] snos::error::SnOsError),
24+
#[error("Failed to get url as path segment mut. URL is cannot-be-a-base.")]
25+
PathSegmentMutFailOnUrl,
2426
}
2527

2628
impl From<SharpError> for ProverClientError {

0 commit comments

Comments
 (0)