Skip to content

Commit fb1a35a

Browse files
authored
[sui 12/x] - updates to pyth accumulator and merkle tree (#926)
* move test accumulator message details to above the definition * camel case to snake case * deserialize and check header inside of parse_and_verify_accumulator_message * factor out cleanup / destruction function for worm / pyth states and clock * take_wormhole_and_pyth_states to simplify 9 tests * update
1 parent 5e064b0 commit fb1a35a

File tree

3 files changed

+137
-159
lines changed

3 files changed

+137
-159
lines changed

target_chains/sui/contracts/sources/merkle_tree.move

Lines changed: 85 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -23,22 +23,22 @@ module pyth::merkle_tree {
2323
bytes20::from_bytes(bytes20)
2424
}
2525

26-
fun emptyLeafHash(): Bytes20 {
26+
fun empty_leaf_hash(): Bytes20 {
2727
let v = vector<u8>[MERKLE_EMPTY_LEAF_PREFIX];
2828
hash(&v)
2929
}
3030

31-
fun leafHash(data: &vector<u8>): Bytes20 {
31+
fun leaf_hash(data: &vector<u8>): Bytes20 {
3232
let v = vector<u8>[MERKLE_LEAF_PREFIX];
3333
vector::append(&mut v, *data);
3434
hash(&v)
3535
}
3636

37-
fun nodeHash(
37+
fun node_hash(
3838
childA: Bytes20,
3939
childB: Bytes20
4040
): Bytes20 {
41-
if (greaterThan(childA, childB)) {
41+
if (greater_than(childA, childB)) {
4242
(childA, childB) = (childB, childA);
4343
};
4444
// append data_B to data_A
@@ -53,9 +53,9 @@ module pyth::merkle_tree {
5353
hash(&v)
5454
}
5555

56-
// greaterThan returns whether a is strictly greater than b
57-
// note that data(&a) and data(&b) are both vectors of length 20
58-
fun greaterThan(a: Bytes20, b: Bytes20): bool{
56+
// greater_than returns whether a is strictly greater than b
57+
// note that data(&a) and data(&b) are both vector<u8>s of length 20
58+
fun greater_than(a: Bytes20, b: Bytes20): bool{
5959
// aa and bb both have length 20
6060
let aa = data(&a);
6161
let bb = data(&b);
@@ -72,38 +72,38 @@ module pyth::merkle_tree {
7272
}
7373

7474
// The Sui Move stdlb insert function shifts v[i] and subsequent elements to the right.
75-
// We don't want this behavior, so we define our own setElement function that instead replaces the ith element.
75+
// We don't want this behavior, so we define our own set_element function that instead replaces the ith element.
7676
// Reference: https://github.com/MystenLabs/sui/blob/main/crates/sui-framework/packages/move-stdlib/sources/vector.move
77-
fun setElement<T: drop>(a: &mut vector<T>, value: T, index: u64){
77+
fun set_element<T: drop>(a: &mut vector<T>, value: T, index: u64){
7878
vector::push_back<T>(a, value); // push value to end
7979
vector::swap_remove(a, index); // swap value to correct position and pop last value
8080
}
8181

82-
// isProofValid returns whether a merkle proof is valid
83-
public fun isProofValid(
84-
encodedProof: &mut Cursor<u8>,
82+
// is_proof_valid returns whether a merkle proof is valid
83+
public fun is_proof_valid(
84+
encoded_proof: &mut Cursor<u8>,
8585
root: Bytes20,
86-
leafData: vector<u8>,
86+
leaf_data: vector<u8>,
8787
): bool {
88-
let currentDigest: Bytes20 = leafHash(&leafData);
89-
let proofSize: u8 = deserialize::deserialize_u8(encodedProof);
88+
let current_digest: Bytes20 = leaf_hash(&leaf_data);
89+
let proofSize: u8 = deserialize::deserialize_u8(encoded_proof);
9090
while (proofSize > 0){
91-
let siblingDigest: Bytes20 = bytes20::new(
92-
deserialize::deserialize_vector(encodedProof, 20)
91+
let sibling_digest: Bytes20 = bytes20::new(
92+
deserialize::deserialize_vector(encoded_proof, 20)
9393
);
9494

95-
currentDigest = nodeHash(
96-
currentDigest,
97-
siblingDigest
95+
current_digest = node_hash(
96+
current_digest,
97+
sibling_digest
9898
);
9999
proofSize = proofSize - 1;
100100
};
101-
bytes20::data(&currentDigest) == bytes20::data(&root)
101+
bytes20::data(&current_digest) == bytes20::data(&root)
102102
}
103103

104-
// constructProofs constructs a merkle tree and returns the root of the tree as
104+
// construct_proofs constructs a merkle tree and returns the root of the tree as
105105
// a Bytes20 as well as the vector of encoded proofs
106-
public fun constructProofs(
106+
public fun construct_proofs(
107107
messages: &vector<vector<u8>>,
108108
depth: u8
109109
) : (Bytes20, vector<u8>) {
@@ -124,7 +124,7 @@ module pyth::merkle_tree {
124124
let tree = vector::empty<Bytes20>();
125125

126126
// empty leaf hash
127-
let cachedEmptyLeafHash: Bytes20 = emptyLeafHash();
127+
let cachedEmptyLeafHash: Bytes20 = empty_leaf_hash();
128128

129129
// Instantiate tree to be a full binary tree with the appropriate depth.
130130
// Add an entry at the end for swapping
@@ -137,7 +137,7 @@ module pyth::merkle_tree {
137137
// Fill in bottom row with leaf hashes
138138
let j: u64 = 0;
139139
while (j < vector::length(messages)){
140-
setElement<Bytes20>(&mut tree, leafHash(vector::borrow(messages, j)), (1 << depth) + j);
140+
set_element<Bytes20>(&mut tree, leaf_hash(vector::borrow(messages, j)), (1 << depth) + j);
141141
j = j + 1;
142142
};
143143

@@ -149,8 +149,8 @@ module pyth::merkle_tree {
149149
let i: u64 = 0;
150150
while (i < levelNumNodes ){
151151
let id = (1 << level) + i;
152-
let nodeHash = nodeHash(*vector::borrow(&tree, id * 2), *vector::borrow(&tree, id * 2 + 1));
153-
setElement<Bytes20>(&mut tree, nodeHash, id);
152+
let node_hash = node_hash(*vector::borrow(&tree, id * 2), *vector::borrow(&tree, id * 2 + 1));
153+
set_element<Bytes20>(&mut tree, node_hash, id);
154154
i = i + 1;
155155
};
156156
k = k - 1;
@@ -183,28 +183,28 @@ module pyth::merkle_tree {
183183
// test 1
184184
let x = bytes20::new(x"0000000000000000000000000000000000001000");
185185
let y = bytes20::new(x"0000000000000000000000000000000000000001");
186-
let res = greaterThan(x, y);
186+
let res = greater_than(x, y);
187187
assert!(res==true, 0);
188-
res = greaterThan(y, x);
188+
res = greater_than(y, x);
189189
assert!(res==false, 0);
190190

191191
// test 2
192192
x = bytes20::new(x"1100000000000000000000000000000000001000");
193193
y = bytes20::new(x"1100000000000000000000000000000000000001");
194-
res = greaterThan(x, y);
194+
res = greater_than(x, y);
195195
assert!(res==true, 0);
196196

197197
// equality case
198198
x = bytes20::new(x"1100000000000000000000000000000000001001");
199199
y = bytes20::new(x"1100000000000000000000000000000000001001");
200-
res = greaterThan(x, y);
200+
res = greater_than(x, y);
201201
assert!(res==false, 0);
202202
}
203203

204204
#[test]
205205
fun test_hash_leaf() {
206206
let data: vector<u8> = x"00640000000000000000000000000000000000000000000000000000000000000000000000000000640000000000000064000000640000000000000064000000000000006400000000000000640000000000000064";
207-
let hash = leafHash(&data);
207+
let hash = leaf_hash(&data);
208208
let expected = bytes20::new(x"afc6a8ac466430f35895055f8a4c951785dad5ce");
209209
assert!(hash == expected, 1);
210210
}
@@ -213,7 +213,7 @@ module pyth::merkle_tree {
213213
fun test_hash_node() {
214214
let h1 = bytes20::new(x"05c51b04b820c0f704e3fdd2e4fc1e70aff26dff");
215215
let h2 = bytes20::new(x"1e108841c8d21c7a5c4860c8c3499c918ea9e0ac");
216-
let hash = nodeHash(h1, h2);
216+
let hash = node_hash(h1, h2);
217217
let expected = bytes20::new(x"2d0e4fde68184c7ce8af426a0865bd41ef84dfa4");
218218
assert!(hash == expected, 1);
219219
}
@@ -223,14 +223,14 @@ module pyth::merkle_tree {
223223
let messages = vector::empty<vector<u8>>();
224224
vector::push_back(&mut messages, x"1234");
225225

226-
let (root, proofs) = constructProofs(&messages, 1);
226+
let (root, proofs) = construct_proofs(&messages, 1);
227227

228-
let proofsCursor = cursor::new(proofs);
229-
let valid = isProofValid(&mut proofsCursor, root, x"1234");
228+
let proofs_cursor = cursor::new(proofs);
229+
let valid = is_proof_valid(&mut proofs_cursor, root, x"1234");
230230
assert!(valid==true, 0);
231231

232232
// destroy cursor
233-
cursor::take_rest<u8>(proofsCursor);
233+
cursor::take_rest<u8>(proofs_cursor);
234234
}
235235

236236
#[test]
@@ -241,20 +241,20 @@ module pyth::merkle_tree {
241241
vector::push_back(&mut messages, x"11");
242242
vector::push_back(&mut messages, x"22");
243243

244-
let (root, proofs) = constructProofs(&messages, 2);
244+
let (root, proofs) = construct_proofs(&messages, 2);
245245

246-
let proofsCursor = cursor::new(proofs);
247-
assert!(isProofValid(&mut proofsCursor, root, x"1234")==true, 0);
248-
assert!(isProofValid(&mut proofsCursor, root, x"4321")==true, 0);
249-
assert!(isProofValid(&mut proofsCursor, root, x"11")==true, 0);
250-
assert!(isProofValid(&mut proofsCursor, root, x"22")==true, 0);
246+
let proofs_cursor = cursor::new(proofs);
247+
assert!(is_proof_valid(&mut proofs_cursor, root, x"1234")==true, 0);
248+
assert!(is_proof_valid(&mut proofs_cursor, root, x"4321")==true, 0);
249+
assert!(is_proof_valid(&mut proofs_cursor, root, x"11")==true, 0);
250+
assert!(is_proof_valid(&mut proofs_cursor, root, x"22")==true, 0);
251251

252252
// destroy cursor
253-
cursor::take_rest<u8>(proofsCursor);
253+
cursor::take_rest<u8>(proofs_cursor);
254254
}
255255

256256
#[test]
257-
fun testMerkleTreeDepth3(){
257+
fun test_merkle_tree_depth_3(){
258258
let messages = vector::empty<vector<u8>>();
259259
vector::push_back(&mut messages, x"00");
260260
vector::push_back(&mut messages, x"4321");
@@ -265,65 +265,65 @@ module pyth::merkle_tree {
265265
vector::push_back(&mut messages, x"100000");
266266
vector::push_back(&mut messages, x"eeeeee");
267267

268-
let (root, proofs) = constructProofs(&messages, 3);
268+
let (root, proofs) = construct_proofs(&messages, 3);
269269

270-
let proofsCursor = cursor::new(proofs);
271-
assert!(isProofValid(&mut proofsCursor, root, x"00")==true, 0);
272-
assert!(isProofValid(&mut proofsCursor, root, x"4321")==true, 0);
273-
assert!(isProofValid(&mut proofsCursor, root, x"444444")==true, 0);
274-
assert!(isProofValid(&mut proofsCursor, root, x"22222222")==true, 0);
275-
assert!(isProofValid(&mut proofsCursor, root, x"22")==true, 0);
276-
assert!(isProofValid(&mut proofsCursor, root, x"11")==true, 0);
277-
assert!(isProofValid(&mut proofsCursor, root, x"100000")==true, 0);
278-
assert!(isProofValid(&mut proofsCursor, root, x"eeeeee")==true, 0);
270+
let proofs_cursor = cursor::new(proofs);
271+
assert!(is_proof_valid(&mut proofs_cursor, root, x"00")==true, 0);
272+
assert!(is_proof_valid(&mut proofs_cursor, root, x"4321")==true, 0);
273+
assert!(is_proof_valid(&mut proofs_cursor, root, x"444444")==true, 0);
274+
assert!(is_proof_valid(&mut proofs_cursor, root, x"22222222")==true, 0);
275+
assert!(is_proof_valid(&mut proofs_cursor, root, x"22")==true, 0);
276+
assert!(is_proof_valid(&mut proofs_cursor, root, x"11")==true, 0);
277+
assert!(is_proof_valid(&mut proofs_cursor, root, x"100000")==true, 0);
278+
assert!(is_proof_valid(&mut proofs_cursor, root, x"eeeeee")==true, 0);
279279

280280
// destroy cursor
281-
cursor::take_rest<u8>(proofsCursor);
281+
cursor::take_rest<u8>(proofs_cursor);
282282
}
283283

284284
#[test]
285-
fun testMerkleTreeDepth1InvalidProofs(){
285+
fun test_merkle_tree_depth_1_invalid_proofs(){
286286
let messages = vector::empty<vector<u8>>();
287287
vector::push_back(&mut messages, x"1234");
288288

289-
let (root, proofs) = constructProofs(&messages, 1);
289+
let (root, proofs) = construct_proofs(&messages, 1);
290290

291-
let proofsCursor = cursor::new(proofs);
291+
let proofs_cursor = cursor::new(proofs);
292292

293293
// use wrong leaf data (it is not included in the tree)
294-
let valid = isProofValid(&mut proofsCursor, root, x"432222");
294+
let valid = is_proof_valid(&mut proofs_cursor, root, x"432222");
295295
assert!(valid==false, 0);
296296

297297
// destroy cursor
298-
cursor::take_rest<u8>(proofsCursor);
298+
cursor::take_rest<u8>(proofs_cursor);
299299
}
300300

301301
#[test]
302-
fun testMerkleTreeDepth2InvalidProofs(){
302+
fun test_merkle_tree_depth_2_invalid_proofs(){
303303
let messages = vector::empty<vector<u8>>();
304304
vector::push_back(&mut messages, x"1234");
305305
vector::push_back(&mut messages, x"4321");
306306
vector::push_back(&mut messages, x"11");
307307
vector::push_back(&mut messages, x"22");
308308

309-
let (root, proofs) = constructProofs(&messages, 2);
309+
let (root, proofs) = construct_proofs(&messages, 2);
310310

311-
let proofsCursor = cursor::new(proofs);
311+
let proofs_cursor = cursor::new(proofs);
312312
// proof fails because we used the proof of x"1234" to try to prove that x"4321" is in the tree
313-
assert!(isProofValid(&mut proofsCursor, root, x"4321")==false, 0);
313+
assert!(is_proof_valid(&mut proofs_cursor, root, x"4321")==false, 0);
314314
// proof succeeds
315-
assert!(isProofValid(&mut proofsCursor, root, x"4321")==true, 0);
315+
assert!(is_proof_valid(&mut proofs_cursor, root, x"4321")==true, 0);
316316
// proof fails because we used the proof of x"11" to try to prove that x"22" is in the tree
317-
assert!(isProofValid(&mut proofsCursor, root, x"22")==false, 0);
317+
assert!(is_proof_valid(&mut proofs_cursor, root, x"22")==false, 0);
318318
// proof succeeds
319-
assert!(isProofValid(&mut proofsCursor, root, x"22")==true, 0);
319+
assert!(is_proof_valid(&mut proofs_cursor, root, x"22")==true, 0);
320320

321321
// destroy cursor
322-
cursor::take_rest<u8>(proofsCursor);
322+
cursor::take_rest<u8>(proofs_cursor);
323323
}
324324

325325
#[test]
326-
fun testMerkleTreeDepth3InvalidProofs(){
326+
fun test_merkle_tree_depth_3_invalid_proofs(){
327327
let messages = vector::empty<vector<u8>>();
328328
vector::push_back(&mut messages, x"00");
329329
vector::push_back(&mut messages, x"4321");
@@ -334,46 +334,46 @@ module pyth::merkle_tree {
334334
vector::push_back(&mut messages, x"100000");
335335
vector::push_back(&mut messages, x"eeeeee");
336336

337-
let (root, proofs) = constructProofs(&messages, 3);
337+
let (root, proofs) = construct_proofs(&messages, 3);
338338

339-
let proofsCursor = cursor::new(proofs);
339+
let proofs_cursor = cursor::new(proofs);
340340

341341
// test various proof failure cases (because of mismatch between proof and leaf data)
342-
assert!(isProofValid(&mut proofsCursor, root, x"00")==true, 0);
343-
assert!(isProofValid(&mut proofsCursor, root, x"22")==false, 0);
344-
assert!(isProofValid(&mut proofsCursor, root, x"22222222")==false, 0);
345-
assert!(isProofValid(&mut proofsCursor, root, x"22222222")==true, 0);
346-
assert!(isProofValid(&mut proofsCursor, root, x"22")==true, 0);
347-
assert!(isProofValid(&mut proofsCursor, root, x"eeeeee")==false, 0);
348-
assert!(isProofValid(&mut proofsCursor, root, x"4321")==false, 0);
349-
assert!(isProofValid(&mut proofsCursor, root, x"eeeeee")==true, 0);
342+
assert!(is_proof_valid(&mut proofs_cursor, root, x"00")==true, 0);
343+
assert!(is_proof_valid(&mut proofs_cursor, root, x"22")==false, 0);
344+
assert!(is_proof_valid(&mut proofs_cursor, root, x"22222222")==false, 0);
345+
assert!(is_proof_valid(&mut proofs_cursor, root, x"22222222")==true, 0);
346+
assert!(is_proof_valid(&mut proofs_cursor, root, x"22")==true, 0);
347+
assert!(is_proof_valid(&mut proofs_cursor, root, x"eeeeee")==false, 0);
348+
assert!(is_proof_valid(&mut proofs_cursor, root, x"4321")==false, 0);
349+
assert!(is_proof_valid(&mut proofs_cursor, root, x"eeeeee")==true, 0);
350350

351351
// destroy cursor
352-
cursor::take_rest<u8>(proofsCursor);
352+
cursor::take_rest<u8>(proofs_cursor);
353353
}
354354

355355
#[test]
356356
#[expected_failure(abort_code = pyth::merkle_tree::E_DEPTH_NOT_LARGE_ENOUGH_FOR_MESSAGES)]
357-
fun testMerkleTreeDepthExceeded1(){
357+
fun test_merkle_tree_depth_exceeded_1(){
358358
let messages = vector::empty<vector<u8>>();
359359
vector::push_back(&mut messages, x"00");
360360
vector::push_back(&mut messages, x"4321");
361361
vector::push_back(&mut messages, x"444444");
362362

363-
constructProofs(&messages, 1); //depth 1
363+
construct_proofs(&messages, 1); //depth 1
364364
}
365365

366366
#[test]
367367
#[expected_failure(abort_code = pyth::merkle_tree::E_DEPTH_NOT_LARGE_ENOUGH_FOR_MESSAGES)]
368-
fun testMerkleTreeDepthExceeded2(){
368+
fun test_merkle_tree_depth_exceeded_2(){
369369
let messages = vector::empty<vector<u8>>();
370370
vector::push_back(&mut messages, x"00");
371371
vector::push_back(&mut messages, x"4321");
372372
vector::push_back(&mut messages, x"444444");
373373
vector::push_back(&mut messages, x"22222222");
374374
vector::push_back(&mut messages, x"22");
375375

376-
constructProofs(&messages, 2); // depth 2
376+
construct_proofs(&messages, 2); // depth 2
377377
}
378378

379379
}

0 commit comments

Comments
 (0)