Skip to content

Commit

Permalink
Get header impl (#85) (#89)
Browse files Browse the repository at this point in the history
* Split get_header and verify_header

* Add test for get_header

* Update example.proof

* Leave unused variable warning in main.nr
  • Loading branch information
akonior authored Feb 16, 2024
1 parent 4a65e16 commit 01edb1d
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 32 deletions.
24 changes: 14 additions & 10 deletions ethereum_history_api/circuits/lib/src/get_header.nr
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,12 @@ struct BlockHeaderPartial {
receipts_root: Bytes32,
}

pub fn get_header(block_number: Field) -> BlockHeaderPartial {
let (block_header_partial, block_header_rlp) = get_header_unconstrained(block_number);
verify_header(block_header_partial, block_header_rlp);
block_header_partial
}

struct BlockHeaderRlp {
length: Field,
data: [u8; MAX_HEADER_RLP_SIZE]
Expand All @@ -33,9 +39,15 @@ unconstrained fn get_header_unconstrained(block_no: Field) -> (BlockHeaderPartia
get_header_oracle(block_no)
}

pub(crate) fn verify_header(block_no: Field) -> BlockHeaderPartial {
let (block_header_partial, block_header_rlp) = get_header_unconstrained(block_no);
pub(crate) fn verify_header(block_header_partial: BlockHeaderPartial, block_header_rlp: BlockHeaderRlp) {
let rlp_list:RLP_List<HEADER_FIELDS_COUNT> = decode1(block_header_rlp.data);
assert(
sub_array_equals(
keccak256(block_header_rlp.data, block_header_rlp.length as u32),
block_header_partial.hash,
0
), "block hash does not match"
);
assert(
sub_array_equals(
block_header_partial.state_root,
Expand All @@ -57,12 +69,4 @@ pub(crate) fn verify_header(block_no: Field) -> BlockHeaderPartial {
rlp_list.offset[RECEIPTS_ROOT_INDEX]
), "receipts_root does not match"
);
assert(
sub_array_equals(
keccak256(block_header_rlp.data, block_header_rlp.length as u32),
block_header_partial.hash,
0
), "block hash does not match"
);
block_header_partial
}
44 changes: 25 additions & 19 deletions ethereum_history_api/circuits/lib/src/get_header_test.nr
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
use dep::std::test::OracleMock;
use crate::get_header::{verify_header, BlockHeaderPartial, BlockHeaderRlp};
use crate::get_header::{get_header, verify_header, BlockHeaderPartial, BlockHeaderRlp};
use crate::arrays::alter_array;

global number: Field = 7;
Expand Down Expand Up @@ -35,37 +35,43 @@ global block_header_rlp = BlockHeaderRlp { length: encoded_length, data: encoded
#[test]
fn test_get_header_success() {
let _ = OracleMock::mock("get_header").returns((block_header_partial, block_header_rlp));
assert(verify_header(0).state_root == state_root);
let header = get_header(0);
assert_eq(block_header_partial.number, header.number);
assert_eq(block_header_partial.hash, header.hash);
assert_eq(block_header_partial.state_root, header.state_root);
assert_eq(block_header_partial.transactions_root, header.transactions_root);
assert_eq(block_header_partial.receipts_root, header.receipts_root);
}

#[test]
fn test_verify_header_success() {
verify_header(block_header_partial, block_header_rlp);
}

#[test(should_fail_with = "block hash does not match")]
fn test_verify_header_invalid_hash() {
let hash = alter_array(hash);
let block_header_partial = BlockHeaderPartial { number, hash, state_root, transactions_root, receipts_root };
verify_header(block_header_partial, block_header_rlp);
}

#[test(should_fail_with = "state_root does not match")]
fn test_get_header_invalid_state_root() {
fn test_verify_header_invalid_state_root() {
let state_root = alter_array(state_root);
let block_header_partial = BlockHeaderPartial { number, hash, state_root, transactions_root, receipts_root };
let _ = OracleMock::mock("get_header").returns((block_header_partial, block_header_rlp));
assert(verify_header(0).state_root == state_root);
verify_header(block_header_partial, block_header_rlp);
}

#[test(should_fail_with = "transactions_root does not match")]
fn test_get_header_invalid_transactions_root() {
fn test_verify_header_invalid_transactions_root() {
let transactions_root = alter_array(transactions_root);
let block_header_partial = BlockHeaderPartial { number, hash, state_root, transactions_root, receipts_root };
let _ = OracleMock::mock("get_header").returns((block_header_partial, block_header_rlp));
assert(verify_header(0).state_root == state_root);
verify_header(block_header_partial, block_header_rlp);
}

#[test(should_fail_with = "receipts_root does not match")]
fn test_get_header_invalid_receipt_root() {
fn test_verify_header_invalid_receipt_root() {
let receipts_root = alter_array(receipts_root);
let block_header_partial = BlockHeaderPartial { number, hash, state_root, transactions_root, receipts_root };
let _ = OracleMock::mock("get_header").returns((block_header_partial, block_header_rlp));
assert(verify_header(0).state_root == state_root);
}

#[test(should_fail_with = "block hash does not match")]
fn test_get_header_invalid_hash() {
let hash = alter_array(hash);
let block_header_partial = BlockHeaderPartial { number, hash, state_root, transactions_root, receipts_root };
let _ = OracleMock::mock("get_header").returns((block_header_partial, block_header_rlp));
assert(verify_header(0).state_root == state_root);
verify_header(block_header_partial, block_header_rlp);
}
4 changes: 2 additions & 2 deletions ethereum_history_api/circuits/lib/src/main.nr
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ mod types;

use dep::proof;
use crate::get_account::{verify_account, Account};
use crate::get_header::{verify_header, BlockHeaderPartial};
use crate::get_header::{get_header, BlockHeaderPartial};

global HASH_LENGTH = 32;

Expand All @@ -19,6 +19,6 @@ fn main(
state_root: pub [u8; HASH_LENGTH]
) -> pub Account {
let account = verify_account(block_no, address, state_root);
verify_header(block_no);
get_header(block_no);
account
}
2 changes: 1 addition & 1 deletion ethereum_history_api/contracts/test/fixtures/example.proof
Original file line number Diff line number Diff line change
@@ -1 +1 @@
19ebd77cb8d0ae2c4b0a21349632c9a780270e563320ebb4b53109407e17d87e1981c362fb3f42f221e90fcfcbff14763475675bc44d26118c21f0244130de582dff7a063b0a6e66316b0304a0b2dd9adecb658afce797c144ed93463f25edf20c54e46f6d33c90d75f090abc299d893c6c3d0245b2655bd8816f18dd1587adc2d55d2239fa4a414646e55ced34a81a908bd2bd97c6c7640bf5ae3c62b52d01a29a65f1627cb63cd34e9a3c9f2b89da7e22f83a0b2c797c01a3b8b5a45d8a2cc2bf5082aa392bd43488d0bb81e9ddb9c2e07bc3c25a17058fd05369f633705ad22f9855f93cac75d36cddf729aed4b5b040224e16d780f69f3d5b7b0bf00f9c216b95725e74bd7ba6ce06309acc02bb67c240d4f9dad9a33330d27a89d82440929ad8b87e5d089b99ed0f3e1815a51b3f8e544ab182c3a9d8e7c764a5edd79e301f22e9fe616646f13d409e73cbb578c7468cc14f8c7f26fb3b83d101e5f644e02ac99f32d625e9fd570b1dac33d8038a8143fb874bbd7403015ff62201057e71a439087c48b6a1c88e47dbac01a48268eaab4cc3038065325425849df7a97db2115bd44d465285c577aaa3c4e4f6c80ab4679e9c84675acdac2ab906f9d59b3226d6509091cbe4fc7ee73f15f0ab2dab92fd496dacf2415b233cfe12af87a7619026e8f40a25c340dff2461a02ac4787b9e7d49458e60a21e00bbc2632103ec1272b2ee385d4e50343a33be1f86b845cd51873d7aed18a8332f008ce3c9ad0329b656a8ef2c1a35dc037f6dbbbbfbefe094f70894078d8670c67c06e845a9481c4ed79f2bccf51da6b4080c180627a74d798329f541fa0940f9884c9a0b4ffc131227b281145ea666f021dbbdab6334ad8702d583ba14bd614e0b6bcfc26f430bec8310539bfecd1ca03f495e48d84c589b95de02384829ad74dbe90204156b0a326359bff4f4a618e4343aed6fcd375be750dbc3bcb8530e25ce49ebf27b7f0abbefcbba09871f0c39efad9f5ee668e032db3bbe1252cdcdb69edef60d51c70112d2c8df58bd2ac9282b5e12163de31c304f0eaae9a3c1c1975cced1b6faa9287d80f7fde08343962d35c44e24555cf398dc49363722b71de053b3024f23e90fa56c5305d069dbac7573fc81aa8f8f2091040d9631306905e90f45abac8833202715be8280d89fd3575a92eee3ecb80257eb68cfbee1335764e182edb714d619ebc6cb96c5fdfe9c69837df855617a9635b3648b19d163400496e84057d80b0278cd3411e89d8aedd125fbe3758c1b3c5c37d5993496f6581bc252433fecf30edb9e5aeeed3c69a16bea17d0a9632296974a9fa9f8e115ec7da805809163b419fdf4e1ec4f0b531457b216b530669f5184f97da847a19fb4ed10238fad3f43180cdc5ef9634e9be727eac80617bcb29fae8e9540d9d7c7807b492a6e72e0d606c641a43e356b451c03e6f66d9c637f0abcb2a8c9a233582807510a28c66cd81044531c921cde2c704978771614673fb72d4aca8c02d18f291a7c0201d89de2213a8710ddb04b149de35bf1245ee13a30d90d4e34d31c32f6ede3cf76c042521f6eb0515a6f36b4f0928277f735eda8274ecf84496b37e6e9db618834ced75323c55a7e00c73ea1b403e12b267f4001b570f958218b3b9801a2fc7ffd92f67b291b1b09c62089d91b5c5a1f9a6a0cf43a21af317935328586a00530326f82cc2991879d886cb95709c1a8b9e38405262dbd025c06214828bbfce828db32c61105d94fe16bbb6e998566c37f1fb9368bec2ff0e8f71103876383899886fbe48f24a21cab7ac998e8191ecccbc5e17d2f0c8f6033fd84f694521e27d0adfdd9d92571292ac2f5143312ebc1322f62eb832683a163114158609b51791f13da610f2f2cadd94e1f56ec950220db00f085ee45a8afb4c239f9492ae21276e00ad4ef2007335ef5696c250361007b9e4763a323a3a4e82f0cc2dd272f5ac56adc7bba1480a8e70d8b459173d4271c678128334a64d1b224bc53be5a54189a4dc471ee260927ba288b9fd0e175ebef571226719e9721433486f4550171388b0182ad822c9c24dfe13e1449ae612c5621755a7a72e36640d905bb22f9aeef81cf05c3050abdbe6ec127b2b049d39d594e3a2540c0a2e07733801085eeb7a884224e160620450b8922dc8c8c4cb5ad5602471645c0466e06eef5d6d9d8ca447089b9070f243e6f7fd90f982f7792d23d890c6623e31c00a7807a82cfc3a78d244d3d5fbc2022dec769af035127cd1f92a21dd7667f4cdf0a42708d45b3d8c165368169d51e21c3a212e3447ea5980a9f5b5c661adaadbcbc41b6f1078518bb560c767f7f29400a5b212e715865da13a1c63491cde446b469c8768140e2e722352d6e7a630fd8907a0c112f6d2a092528d14870aa8a190e77844e6f5f6a1e437b3c332d5d23ee4612ae8685b53a20f518fa48c2bca080fec08ff875e4e46f0bc38aa47e6d10773218e61e5d45024919c810141c785ac51b4d4f64566653fd31987791186223fb01058abb5afe3615710f31b3623a0db3f80986b249f5d4672545680a274d13fecab76ab7d050ae4759dee4c4f600a31d5cdbc94fd99c61e2ec0bf7f4f827043612ceb13c6ba5a120a2928d58d76a296d3dd4d30a0f57f6ac5078327ea3481314bc2c41341be59077cc8d0af21c6b317eedf2406db72bfdc208bf5835998e14840f089ec055781126c366d62ed70ed17fb3b63bae863539a301625b7b2340002994be3b3e731d75cdf15cc32fb86da2aedf74c1d5701fdd02e7f5d41be5ea17198d2341d08ce3c669a9bc34f7927ac80d39216e8f0aa83538ba7f9fed607b2d469844208bf9daa7ba640fb33f41b0a4690fef209d69840663944090a75c3e1375960789cfd181c14821d8c0a383f025b3cd87241ea87d2edbefa84c1751e10bcf155cff859a00ab812855e1baab75df2febd511799b30e60a5112faabbb291df5d8bbcac82f7f98013f1bb3dfa1ff06f14c3f62edb43248b9253adc42deaf
1cddde926be1a2617cc2f8523c2f0ed4ef347d755f5a6f06a06dc47675ed54c51543a18b35087c45cdfd4edd946f87f7861443dde14781262857d132813974442b25831618b716ecb7008b3d0341147ad3f44d968d1c64bed9241532061bf8d00b8bd2aa87de18317442f501333e3b8de6b575e76d4fbc2e26719f32823d828e1c1c17b5b20291e636ef34b880241a5e58b269fb19f632baa640f06b548119ae0e6af98afa589d53474034493115f0439b02fa24f21fc59c21e5d16a4bbb353b15678b2ddb9e799af84e5b40936515381c4aee2dd373fe31aaecca8616aa2bc21fc952bc69c6d99f8bbbba1fefefeb42c93b8ac003371b32d7ca5a09360f86ed05323030fd1e7a80dc31bf59d69415401946b549b7d50070db8db3515da450aa0c529184ac91439af0eb540ab610d06220394b238f90da8fb2adda87c8065b190cabc7432f9c9ea132bdb236a396c62e3e0a1c4e197f2e2fdbe967bf01493ef21c5ff502d5705449c6dbc6fbd5fe6faddd90f26bab4cacae0d20fb5d3722fbda005c11c8d00f1bcd61ef526ddc0f01dd3c4ad2684018e4bf9ca7e4084ed27f9023575ee3f5c8d3499567aaa65a678b6826c46e92358b8a504b0e988488acc67630353c92dd42672d64ee06cb740567b09a12fa42ba17dbe5ed76f470692c72b8267e158bdf8fd7ae18a8de25cac26b6f860914d41cd62a1dabd9cbf9b5b3bebc18c922887fb6d2f7c41361a072312a55e8aa57ce393d3a668e4fa82f294477d5245a9532e4e4f97b6c4b302e412e1b0a5ef85ff2f6c40b60b8adef79ff00a0b40e2bd0397c47d4f1faa261d75dab728a5a4d9678b2f088f3e636ab1316b88b64221b5d055fc3f75ae61dbc0046c07587b40c69762b9998e72297cade5824234f03378da1ab7e91df55fbdc4393a504f3eb3cc8429d68a2de2dff1c8779af28e52a60165b3d8d233618499105c22cdf42083004f76945de5fa39c242fda36cae61c7496d56bd25aa249c0e7d435d054a9372dc469bc63189fae6782d6204eec7b242d9687bc9f3fc7103ea9f5aa6b2ffeb540450ce0cc7f63c3ac75f374165b19266462dfcdfd2672b0bcbc14c7c44c899ccb24ebf61118f93e254799fc8f193e04803ad2b091b4087a3082b869bcd9b362ec3f7474b02a7bb2a5db0aaf12af5e0165876d6f350eb8b0757e19c7bd7f7923a719e7b7012c0d81575724da168a142f7840f8c2597c31bbf40e28affee1509718886c1b576ffdadce41f0dec2d76d25dbff2d24f1007cc8eebdef9e16c4c1f59d959da6a56393b7bbee556fd3cc14256ed543d229a03d9be10edb6236d994d63f2bb19805db909bae07311aaa3e760fd7e09718695e5119c89634e593ef6d6485347509a7f0da1e7713af14a930f704ded4c1adef8cc1dfc05c1a5dbceabdec1f9904a7421969c5a5d3ebc009b81925bb8f3f29002da4851f2bf22592ca5a009b47895abc008fa0e2c49f80e933230c4c37a437f5bc0a977e045b1781317e76d5f44cd82f6f4ec97fe6dc7684e88c1e91f6871c990aa73296e483f6331389d230fae55f46c17e652fe8a997867217022b82a6b4dd1c8a9123651bdc816c9df07f07b8cf46ba837ae588a0fc347f3e2b0335529503c2c774c602cac1b0a7b81205f2f9ff5166f5587b4be4d07b9822286636cd2f84b86aa4258a6fff242b53ae1b877badd4ae19f3042d5e7eb828811de95e82779d67d49ff52dc9b27156656ec3a7801bce2cb46f0e6d7aaab11aae12960f167ac5ccee0caeb0a1093e617393ea4aa3fb14c3322a68f3b6d374e93a0a5d1f210984d33a08747e0ac47caa5fae84960ce98fbb48c7e7b7a43400f30e2eaa59c84536abf3870cd529290efb29cb980c9d0991659ca20c3cfe6d708cfe0e6dea3923a62d60962184e492007dbc62bc629f6c5e8a939d07b7e6bb46119b27e39ea183532b854147ebe4f21a02f4012cde38e6d37ea970b645e005ad85272b749a8ca99b23243c5d16d953c5100c442f4075ce26dfc978dbf638d3650d2529211044de6006e9dcf6f7cfca3f964358e732be41c07558940a84c15de2152b06316e8c69aa31ead29e50804cda5158a52fca32c598c30c09ea2542edd09cc928102093d9d8f3e44cdf1807c62fdb25a66f7de6f91459330f82bdaad82b2ff72ee484c58961428ecd4df15c4d482b3c5fe8cd223c7a77bb7989dfe997e2855d177659da0ccb7b7173e6f7ce73927753688fb6d118e89966142d49f71bd53ba82d8cf7970f11fb1d510a19a1c79d9167e3382199ff2216707b6aa182fb1514b018c4780f9c15cc0155631efce3ee6c508b1e2a838330b5e5c14bdac8afb9f69f17c10dec55a5e882257950abd7286e5829bdd7966f8edbaed72c1684ea9c34130667e8548fd4610539ab934331558b30e3abbeb3637bbdb2f2fac0bfa8efd517138256d301fc85e423f89f073ce1079fa35128b473b12f7adcd9b2287b09baaf298b11fa645666f9ec166a9af4aafd1fb17476009b8eff5955a930d24c338e531b174d263fb97bafa685c7e764bfd324628af72d5cc39607fda0ecf84cf0e9162a5554fd56418a1c0505c26b95fc4c8568a4d8c4fec84a0bdb153ff25bcd2a4114fa81469fc62404445dcf0c21eda16608b2a9794033c00ccbf2a25c52c2c37a2fab044dd50571a35af015e2611d0702206e3cd4ffd03cd9894e484342b2be5c186809f860564f18f5f2c1697c3f7c2e8a51197f4b8eb01663403a1a1f3811a30afc0300f7edf067ec3914f20f0c68076f559e4fce0cf0de25bd84af2aed2bb625d04bb4d6740039edbb01229e5f7977ac757c6c48f51ead7cfb9c4bd0a635000206d9fd73b5a90a68e7c2862bb7034acafa1341a7b3cf1646d6606372366c5224a4dfd01881362e20780edb0d06c07d57e8f7fe2bd354b2b82e67779e8894f02a2ea4c5eb37f991a3772f794c5356b0937010db938666b5ce0b02fdbe3a4ebb07bedbf4125b0aa39d4b855a7c26355243eeee17e39c4f6a52e6f356e4106fc6

0 comments on commit 01edb1d

Please sign in to comment.