Device Methods#
cuHash Hashing Device Methods#
In the following method descriptions, HASH
is used as a placeholder for the cuHash descriptor object that is instantiated with a specific hash algorithm.
reset#
update#
- __device__ void HASH::update(
- const uint8_t *message,
- const size_t message_length
Append a message into the hash state. This may be called multiple times to incrementally update a single message. This is for non-Poseidon2 hash functions.
- Parameters:
message – Buffer containing the message.
message_length – Length of the
message
buffer.
- __device__ void HASH::update(
- const uint32_t *message,
- const size_t message_length
Append a message into the hash state. This may be called multiple times to incrementally update a single message. This is only available for Poseidon2 hash functions.
- Parameters:
message – Buffer containing the message.
message_length – Length of the
message
buffer.
finalize#
digest#
- __device__ void HASH::digest(
- uint8_t *digest,
- const size_t digest_length
Extract the hash state into a digest. This may be called multiple times to incrementally digest a single message.
- Parameters:
digest – Buffer to which the digest will be written. Must be of length
digest_length
, and 8-byte aligned.digest_length – Length of the
digest
buffer.
- __device__ void HASH::digest(
- uint32_t *digest,
- const size_t digest_length
Extract the hash state into a digest. This may be called multiple times to incrementally digest a single message. This is only available for Poseidon2 hash functions.
- Parameters:
digest – Buffer to which the digest will be written. Must be of length
digest_length
, and 8-byte aligned.digest_length – Length of the
digest
buffer.
cuHash Merkle Tree Objects#
-
template<>
class tree<N, HASH, Precision># A Merkle Tree object. This object is a convenience container for the Merkle Tree Data.
Parameters: -
N
: The number of leaves in the base of the tree. -HASH
: The hash function used to generate the Merkle Tree. This will be a cuHash hash object. -Precision
: The data type of the leaves of the Merkle Tree.Members: -
size
: The size of the Merkle Tree Data. This is2 * N - 1
whereN
is the number of leaves in the base of the tree. -digest_size
: The digest size of the hash function used to generate the Merkle Tree. This is the length of thePrecision
array that each node is. -nodes
: A pointer to the Merkle Tree Data. This is a global memory array containing2 * N - 1
nodes, whereN
is the number of leaves in the base of the tree. Each node is of typePrecision
, with lengthdigest_size
wheredigest_size
is the digest size of the hash function used to generate the Merkle Tree. Note that for Hash functions that do not have a digest size, a hash output size is fixed and can be accessed via thedigest_size
member. -root
: A pointer to the root of the Merkle Tree. This is a global memory array of typePrecision
, with lengthdigest_size
.Functions: -
allocate_tree
: Allocates the Merkle Tree Data to global memory. This is a host function, and is not available on the device. -free_tree
: Frees the Merkle Tree Data from global memory. This is a host function, and is not available on the device.
-
template<>
class proof<N, HASH, Precision># A Proof object generated from a Merkle Tree, used to verify a leaf in the Merkle Tree. This object is a convenience container for the Proof Data.
Parameters: -
N
: The number of leaves in the base of the tree. -HASH
: The hash function used to generate the Merkle Tree. This is the same as the hash function used to generate the Merkle Tree Data. -Precision
: The data type of the leaves of the Merkle Tree. This is the same as the data type of the leaves of the Merkle Tree Data.Members: -
size
: The size of the Merkle Tree Data. This islog2(N)
whereN
is the number of leaves in the base of the tree. -digest_size
: The digest size of the hash function used to generate the Merkle Tree. This is the length of thePrecision
array that each node is. -nodes
: A pointer to the Merkle Tree Proof Data. This is a global memory array containinglog2(N)
nodes, whereN
is the number of leaves in the base of the tree that the proof is generated from. Each node is of typePrecision
, with lengthdigest_size
wheredigest_size
is the digest size of the hash function used to generate the Merkle Tree. Note that for Hash functions that do not have a digest size, a hash output size is fixed and can be accessed via thedigest_size
member. -indices
: A global memory array of 32-bit unsigned integers containinglog2(N)
indices, these indices are the locations of the proof nodes in the original tree.Functions: -
allocate_proof
: Allocates the Proof Data to global memory. This is a host function, and is not available on the device. -free_proof
: Frees the Proof Data from global memory. This is a host function, and is not available on the device.
cuHash Merkle Tree Device Methods#
In the following method descriptions, MERKLE
is used as a placeholder for the cuHash Merkle Tree descriptor object that is instantiated with a specific Merkle Tree size and precision.
create_leaf#
generate_tree#
-
template<>
__device__ void MERKLE::generate_tree<HASH, Precision>(
)# Generate a Merkle Tree. This should be called after the last call to
update()
, and before the first call todigest()
.- Parameters:
tree – Buffer to which the tree will be written. Must be of length
tree_length
, and 8-byte aligned.tree_length – Length of the
tree
buffer.
generate_proof#
-
template<>
__device__ void MERKLE::generate_proof<HASH, Precision>( - proof<N, HASH, Precision> &proof,
- const Precision *leaf,
- const uint32_t leaf_index,
- const tree<N, HASH, Precision> &merkle_tree
Generate a proof for a leaf in the Merkle Tree.
- Parameters:
proof – The proof object to generate.
leaf – The leaf to generate a proof for.
leaf_index – The index of the leaf to generate a proof for.
verify_proof#
-
template<>
__device__ bool MERKLE::verify_proof<HASH, Precision>( - const proof<N, HASH, Precision> &proof,
- const Precision *leaf,
- const uint32_t leaf_index,
- const Precision *root,
- HASH &hash
Verify a proof for a leaf in the Merkle Tree.
- Parameters:
proof – The proof object to verify.
leaf – The leaf to verify a proof for.
leaf_index – The index of the leaf to verify a proof for.