#ifndef SLEEP_PROOF_H #define SLEEP_PROOF_H #include #include #include "sleep_feed.h" #define SLEEP_PROOF_HASH_BYTES 32u #define SLEEP_PROOF_MAX_NODES 64u typedef struct sleep_proof_node { uint64_t index; uint64_t length; uint8_t hash[SLEEP_PROOF_HASH_BYTES]; } sleep_proof_node_t; typedef struct sleep_proof { uint64_t block; uint64_t block_length; uint8_t block_hash[SLEEP_PROOF_HASH_BYTES]; sleep_proof_node_t nodes[SLEEP_PROOF_MAX_NODES]; size_t node_count; sleep_proof_node_t roots[SLEEP_PROOF_MAX_NODES]; size_t root_count; uint8_t signature[64]; int has_signature; } sleep_proof_t; void sleep_proof_init(sleep_proof_t *proof, uint64_t block); int sleep_proof_add_node(sleep_proof_t *proof, uint64_t index, uint64_t length, const uint8_t hash[32]); int sleep_proof_add_root(sleep_proof_t *proof, uint64_t index, uint64_t length, const uint8_t hash[32]); int sleep_proof_create(const sleep_feed_t *feed, uint64_t block, sleep_proof_t *proof); int sleep_proof_from_nodes(uint64_t block, const uint8_t *value, size_t value_len, const sleep_proof_node_t *nodes, size_t node_count, const uint8_t signature[64], uint64_t feed_length, sleep_proof_t *proof); int sleep_proof_encode(const sleep_proof_t *proof, uint8_t *out, size_t capacity, size_t *written); int sleep_proof_decode(sleep_proof_t *proof, const uint8_t *input, size_t input_len); int sleep_proof_verify(const sleep_proof_t *proof, const uint8_t *block, size_t block_len, const uint8_t public_key[32]); #endif