43 lines
1.5 KiB
C
43 lines
1.5 KiB
C
#ifndef SLEEP_PROOF_H
|
|||
|
|
#define SLEEP_PROOF_H
|
||
|
|
#include <stddef.h>
|
||
|
|
#include <stdint.h>
|
||
|
|
#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
|