Reference implementation for the Poseidon Snark-friendly Hash algorithm.

Overview

Build Status Repository Documentation

Dusk-Poseidon

Reference implementation for the Poseidon Hashing algorithm.

Reference

Starkad and Poseidon: New Hash Functions for Zero Knowledge Proof Systems

This repository has been created so there's a unique library that holds the tools & functions required to perform Poseidon Hashes.

This hashes heavily rely on the Hades permutation, which is one of the key parts that Poseidon needs in order to work. This library uses the reference implementation of Dusk-Hades which has been designed & build by the Dusk-Network team.

The library provides the two hashing techniques of Poseidon:

Sponge Hash

The Sponge techniqe in Poseidon allows to hash an unlimited ammount of data into a single Scalar. The sponge hash techniqe requires a padding to be applied before the data can be hashed.

This is done to avoid hash collitions as stated in the paper of the Poseidon Hash algorithm. See: https://eprint.iacr.org/2019/458.pdf. The inputs of the sponge_hash are always Scalar or need to be capable of being represented as it.

The module provides two sponge hash implementations:

  • Sponge hash using Scalar as backend. Which hashes the inputed Scalars and returns a single Scalar.

  • Sponge hash gadget using dusk_plonk::Variable as a backend. This techniqe is used/required when you want to proof pre-images of unconstrained data inside of Zero-Knowledge PLONK circuits.

Merkle Hash

The Merkle Level Hashing is a technique that Poseidon is optimized-by-design to perform. This technique allows us to perform hashes of an entire Merkle Tree using Dusk-Hades as backend.

The technique requires the computation of a bitflags element which is always positioned as the first item of the level when we hash it, and it basically generated in respect of the presence or absence of a leaf in the tree level. This allows to prevent hashing collitions.

At the moment, this library is designed and optimized to work only with trees of ARITY up to 4. That means that trees with a bigger ARITY SHOULD NEVER be used with this lib. The module contains the implementation of 4 variants of the same algorithm to support the majority of the configurations that the user may need:

  • Scalar backend for hashing Merkle Tree levels outside of ZK-Circuits whith two variants: One of them computes the bitflags item while the other assumes that it has already been computed and placed in the first Level position.

  • dusk_plonk::Variable backend for hashing Merkle Tree levels inside of ZK-Circuits, specifically, PLONK circuits. This implementation comes also whith two variants; One of them computes the bitflags item while the other assumes that it has already been computed and placed in the first Level position.

Zero Knowledge Merkle Opening Proof example:

#[cfg(feature = "canon")]
{
use canonical_derive::Canon;
use dusk_plonk::prelude::*;
use dusk_poseidon::tree::{PoseidonAnnotation, PoseidonLeaf, PoseidonTree, merkle_opening};
use rand_core::OsRng;

// Constant depth of the merkle tree
const DEPTH: usize = 17;

// Leaf representation
#[derive(Debug, Default, Clone, Copy, PartialOrd, Ord, PartialEq, Eq, Canon)]
struct DataLeaf {
    data: BlsScalar,
    pos: u64,
}

// Example helper
impl From<u64> for DataLeaf {
    fn from(n: u64) -> DataLeaf {
        DataLeaf {
            data: BlsScalar::from(n),
            pos: n,
        }
    }
}

// Any leaf of the poseidon tree must implement `PoseidonLeaf`
impl PoseidonLeaf for DataLeaf {
    // Cryptographic hash of the data leaf
    fn poseidon_hash(&self) -> BlsScalar {
        self.data
    }

    // Position on the tree
    fn pos(&self) -> &u64 {
        &self.pos
    }

    // Method used to set the position on the tree after the `PoseidonTree::push` call
    fn set_pos(&mut self, pos: u64) {
        self.pos = pos;
    }
}

fn main() -> Result<(), Error> {
    // Create the ZK keys
    let pub_params = PublicParameters::setup(1 << 15, &mut OsRng)?;
    let (ck, ok) = pub_params.trim(1 << 15)?;

    // Instantiate a new tree
    let mut tree: PoseidonTree<DataLeaf, PoseidonAnnotation, DEPTH> =
        PoseidonTree::new();

    // Append 1024 elements to the tree
    for i in 0..1024 {
        let l = DataLeaf::from(i as u64);
        tree.push(l).unwrap();
    }

    // Create a merkle opening tester gadget
    let gadget_tester =
        |composer: &mut StandardComposer,
         tree: &PoseidonTree<DataLeaf, PoseidonAnnotation, DEPTH>,
         n: usize| {
            let branch = tree.branch(n as u64).unwrap().unwrap();
            let root = tree.root().unwrap();

            let root_p = merkle_opening::<DEPTH>(composer, &branch);
            composer.constrain_to_constant(root_p, BlsScalar::zero(), Some(-root));
        };

    // Define the transcript initializer for the ZK backend
    let label = b"opening_gadget";
    let pos = 0;

    // Create a merkle opening ZK proof
    let mut prover = Prover::new(label);
    gadget_tester(prover.mut_cs(), &tree, pos);
    prover.preprocess(&ck)?;
    let proof = prover.prove(&ck)?;

    // Verify the merkle opening proof
    let mut verifier = Verifier::new(label);
    gadget_tester(verifier.mut_cs(), &tree, pos);
    verifier.preprocess(&ck)?;
    let pi = verifier.mut_cs().construct_dense_pi_vec();
    verifier.verify(&proof, &ok, &pi).unwrap();

    Ok(())
}

}

Canonical

The canonical implementations aim to make available a single representation of the Merkle tree to constrained (referred to as "hosted") and unconstrained (referred to as "host") environments.

For that, we rely on the feature canon.

canon feature will require all the crates needed for the Merkle tree to function.

Documentation

This crate contains info about all of the functions that the library provides as well as the documentation regarding the data structures that it exports. To check it, please feel free to go to the documentation page

Licensing

This code is licensed under Mozilla Public License Version 2.0 (MPL-2.0). Please see LICENSE for further info.

About

Implementation designed by the dusk team.

Contributing

  • If you want to contribute to this repository/project please, check CONTRIBUTING.md
  • If you want to report a bug or request a new feature addition, please open an issue on this repository.
Comments
  • Encrypt implementation for 2bits with l5

    Encrypt implementation for 2bits with l5

    Implements: #29 #32

    The implementation is optimized for 2 inputs and width 5. Further reference can be found on: https://github.com/dusk-network/documentation/issues/26

    opened by vlopes11 7
  • Create general datastructure PoseidonTree, for storing general zk-friendly datastructures

    Create general datastructure PoseidonTree, for storing general zk-friendly datastructures

    In order to generalize over different tree types, we need a structure that generalize over different entities that we want to store, and the length of the proof branches.

    The goal is to be able to write PoseidonTree<Note>, PoseidonTree<Nullifier> and specify the branch depth.

    PoseidonTree<T> needs T to implement the trait AsScalar, which calculates a scalar based on the type.

    area:architecture area:cryptography 
    opened by krl 6
  • Merkle hashing for Poseidon & Opening proof gadget implementations

    Merkle hashing for Poseidon & Opening proof gadget implementations

    This PR includes work to close the following issues:

    • [x] Refactor actual lib to work with plonk including the sponge hash. Closes #5
    • [x] Add merkle tree hashing logic for Scalar and Variable as a gadget. Closes #9
    • [x] Implement the merkle-tree proof generator as a gadget to use in the rest of libs where we need to perform merkle openning proofs. Closes #10
    • [x] Implement needed Kelvin-related Traits. Closes #12
    • [x] Implement From<Branch> forPoseidonBranch`. Close #13
    • [x] Create a wrapping type over Scalar to define the Content trait over it. Closes #14
    • [x] Finnish up documentation of the library. Closes #3
    • [x] Refactor auto-doc uploads to gh-pages. Closes #15
    opened by CPerezz 4
  • Poseidon252 doesn't build using

    Poseidon252 doesn't build using "canon" as feature

    Current master is broken since Poseidon cannot be build using "canon" as feature.

    Most likely it has to do with some breaking change in the dependencies that weren't using proper semver.

    team:Core 
    opened by ZER0 3
  • Port Poseidon repo to be Canon-compatible

    Port Poseidon repo to be Canon-compatible

    We need to be able to implement/derive Canon for the trees that we use in our Smart Contracts. Therefore this crate needed a refactor so that the Annotations and Tree structures that it exports carry the Canon traits implemented propperly.

    • Removed legacy trait implementations such as kelvin::Content , ByteHash & others which have been deprecated.
    • Enforce that PoseidonTree and PoseidonBranch store types which implement Canon<canonical::Store>
    • Refactor all of the trait implementations to have Canon implemented.
    • Fixed & refactored the extend_storage_scalar macro so that it derives Canon.
    • Refactored the error handling to use correctly the Store::InvalidEncoding cannonical error type.
    • Removed the Associative trait bound for PoseidonTree & PoseidonBranch & PoseidonIterator.
    • Remove Blake2b in favor of canon_host::MemStore.

    Closes #79

    IMPORTANT

    This PR can not be merged until:

    • kelvin integration with canonical/port to no_std gets released. See this
    • kelvin being no_std. See this

    Will replace the paths by the crates.io versions once we start the bumping cascade which is blocked by the issues mentioned above.

    area:architecture 
    opened by CPerezz 3
  • Refactor Poseidon's API module path

    Refactor Poseidon's API module path

    We should move to Rust 2018 module definition also in Poseidon.

    Most importantly, we have to fix the module path of the sponge_hash function. Currently we have:

    use poseidon252::sponge::sponge::sponge_hash;
    

    Where sponge is written three time, that's ridiculous. It's starting to spread in all our repos since we're using a lot the sponge's hash function; that's why we need to refactor as soon is doable.

    The idea would be having something like:

    use poseidon252::sponge::hash;
    

    The same is applying for the gadget, so instead of:

    use poseidon252::sponge::sponge::sponge_hash_gadget
    

    it should be:

    use poseidon252::sponge::gadgets::hash
    

    The module path would be more clear, and we'll still have no naming conflict since we can import just sponge, so we'll have a code that instead of:

    // here we're typing `sponge` four times
    use poseidon252::sponge::sponge::{sponge_hash, sponge_hash_gadget};
    
    sponge_hash(&[…]);
    sponge_hash_gadget(&[…])
    

    We'll have:

    use poseidon252::sponge;
    
    sponge::hash(&[…]);
    sponge::gadgets::hash(&[…])
    

    Of course you can always import directly the gadget or the hash if there is no conflict.

    status:minor team:Core need:feedback 
    opened by ZER0 3
  • Check wether the size obtention during pushes is the most optimal

    Check wether the size obtention during pushes is the most optimal

    While I was working withthe PoseidonTree I took a look to the internals of the push() function. https://github.com/dusk-network/Poseidon252/blob/master/src/tree/tree.rs#L85-L96

    And I realized that in order to collect the size to set the idx of the new entry we do a lot of computation, when we maybe could store the last used idx and just increase it on each iteration. At the end, the tree is append only so we don't even need to worry about decreasing the number in the deletions since the tree is append-only.

    team:R&D 
    opened by CPerezz 2
  • Normalize the Poseidon's versions

    Normalize the Poseidon's versions

    The Poseidon's version tag in github starts from v1.0.0 then goes to v0.1.0 and jump directly to v5.0.0.

    We should probably normalize them, adding the tags for version v0.2.0, v0.3.0 and v0.4.0 to the proper commits – assuming the versions bump was correctly made in Cargo.toml, and maybe rename the tag of v1.0.0 to legacy or something like that, but not a version number: given a different version would clash with Cargo.toml content, but it might be worth to keep a reference to that commit.

    status:invalid 
    opened by ZER0 2
  • Implement Non-Sparse Merkle tree structures

    Implement Non-Sparse Merkle tree structures

    Once https://github.com/dusk-network/kelvin/issues/37 is closed, we should implement this new types of Merkle Trees within this library and replace the actual Sparse Merkle Trees that we're using now.

    On this way, we can have fixed-size branches (height is always the same) so the Proofs can always be obtained using the same PreProcessedCircuit.

    area:block-generation type:feature 
    opened by CPerezz 2
  • Add benchmark for merkle opening

    Add benchmark for merkle opening

    Summary

    Add benchmarks for the merkle-opening circuit

    • Circuit compilation
    • Proof creation
    • Proof verification We need benchmarks in order to track performance throughout the development.

    Possible solution design or implementation

    In this issue we will add the benchmark to measure the proof creation and verification of one poseidon zk merkle opening circuit. Running multiple merkle openings in the same circuit is left for future implementation.

    Additional context

    First mentioned in #81

    team:research 
    opened by moCello 1
  • Bump version to `0.26.1`

    Bump version to `0.26.1`

    Added

    • Add support for rkyv-impl under no_std
    • Add ranno version 0.1 to dependencies [#180]

    Changed

    • Change PoseidonBranch to have two fields - root and path. The path is now a fixed length array. [#189]
    • Change PoseidonTree to build only with the alloc feature [#180]
    • Change PoseidonTree to take a generic Keyed over the leaf type instead of a PoseidonAnnotation [#180]
    • Make PoseidonTree::new const [#180]
    • Update microkelvin from 0.15 to 0.17 [#180]
    • Update nstack from 0.14.0-rc to 0.16 [#180]

    Removed

    • Remove PoseidonBranch Default implementation [#189]
    • Remove std feature [#180]
    • Remove canon and persistence features [#180]
    • Remove Error struct [#180]
    • Remove canonical and canonical-derive from dependencies [#180]
    • Remove PoseidonMaxAnnotation [#180]

    Fixed

    • Fix merkle opening circuit [#181]
    • Fix CHANGELOG version links [#191]
    opened by ureeves 1
  • Introduce `Hash` traits

    Introduce `Hash` traits

    Summary

    I would like us to introduce Hash traits, for allowing for generic implementations of hashes producing BlsScalars.

    Possible solution design or implementation

    At least one trait, here with working name Hasher, should be implemented, taking the type and a Hasher to "feed" itself to the hasher.

    trait Hash {
        fn hash<H: Hasher>(&self, hasher: &mut H);
    }
    
    trait Hasher {
        fn finish(&self) -> BlsScalar;
        fn write(&mut self, bytes: &[u8]);
        fn write_scalars(&mut self, bytes: &[BlsScalar]);
    }
    

    This structure is very similar to std::hash::Hash.

    Additional context

    This would significantly reduce the footprint of the code downstream, and allow us to structure the ad-hoc to_hash_inputs functions - implemented almost everywhere in downstream code - a little better than currently.

    It is debatable whether this functionality fully belongs in this crate, as opposed to a fully-fledged dusk-crypto crate, but lets leave it for the future.

    type:feature team:Core 
    opened by ureeves 0
  • Make `PoseidonBranch` `Copy`

    Make `PoseidonBranch` `Copy`

    Summary

    I would like that PoseidonBranch be made Copy, such that structures made including branches can also be made Copy. This is necessary to have proper default implementations of the dusk_plonk::Circuit trait for structures including arrays of branches.

    Possible solution design or implementation

    Derive Copy trait.

    Additional context

    In an effort to make generating the transfer circuits' keys and proofs less tricky, we're refactoring them to be on the stack using const generics.

    type:feature team:Core team:research 
    opened by ureeves 0
  • Add benchmarks for PoseidonCipher ZK and non-ZK

    Add benchmarks for PoseidonCipher ZK and non-ZK

    Summary

    We need benchmarks in order to track performance throughout the development.

    Possible solution design or implementation

    In this issue we will add the benchmark to measure the native poseidon cipher and the proof creation and verification of the poseidon cipher circuit.

    Additional context

    First mentioned in #81

    team:research 
    opened by moCello 0
  • Use `component_boolean` in the our merkle opening circuit

    Use `component_boolean` in the our merkle opening circuit

    Describe what you want implemented Use component_boolean to check for the index bits in our merkle opening circuit.

    Describe "Why" this is needed Reduce gate count.

    Describe alternatives you've considered N/A

    Additional context Originally posted by @vlopes11 in https://github.com/dusk-network/Poseidon252/pull/182#discussion_r974735025: The original purpose of this block was to validate that we have only zeroes/ones, and that we have one, and only one 1; the rest being 0.

    It was written before we had component_boolean available, which now completely supersede this implementation. What we need is to run the boolean component for every of these bits (so we guarantee they are either 0 or 1, and check that they add to 1 (so we guarantee that we have one, and only one 1).

    team:research 
    opened by moCello 0
  • Restructure crate features

    Restructure crate features

    Describe what you want implemented The features of a crate should be named accordingly to the features they enable, and not the names or technicalities of its dependencies. I propose a restructuring of the features of this crate.

    Describe "Why" this is needed Currently the features included with this crate are:

    default
    alloc
    rkyv-impl
    

    Almost the entire crate sits behind the alloc feature with following exceptions:

    cipher::PoseidonCipher                                                                                   
    perm_uses::two_outputs                                                                                   
    sponge::hash                                                                                             
    sponge::truncated::hash 
    

    I propose that this is terribly confusing, and as such we should rethink the features of the crate.

    status:minor team:Core type:enhancement 
    opened by ureeves 0
Releases(v0.28.0)
  • v0.28.0(Nov 10, 2022)

  • v0.27.0(Oct 19, 2022)

    0.27.0 - 2022-10-19

    Added

    • Add support for rkyv-impl under no_std
    • Add ranno version 0.1 to dependencies #180

    Changed

    • Change PoseidonBranch to have two fields - root and path. The path is now a fixed length array. #189
    • Change PoseidonTree to build only with the alloc feature #180
    • Change PoseidonTree to take a generic Keyed over the leaf type instead of a PoseidonAnnotation #180
    • Make PoseidonTree::new const #180
    • Update microkelvin from 0.15 to 0.17 #180
    • Update nstack from 0.14.0-rc to 0.16 #180

    Removed

    • Remove PoseidonBranch Default implementation #189
    • Remove std feature #180
    • Remove canon and persistence features #180
    • Remove Error struct #180
    • Remove canonical and canonical-derive from dependencies #180
    • Remove PoseidonMaxAnnotation #180

    Fixed

    • Fix merkle opening circuit #181
    • Fix CHANGELOG version links #191
    Source code(tar.gz)
    Source code(zip)
  • v0.26.0(Aug 17, 2022)

    0.26.0 - 2022-08-17

    Added

    • Add rkyv implementation behind feature gate #175

    Changed

    • Update dusk-bls12_381 from 0.8 to 0.11
    • Update dusk-jubjub from 0.10 to 0.12
    • Update dusk-hades from 0.17.0-rc to 0.19
    • Update canonical from 0.6 to 0.7
    • Update canonical_derive from 0.6 to 0.7
    • Update microkelvin from 0.14 to 0.15
    • Update nstack from 0.13 to 0.14.0-rc
    • Update dusk-plonk from 0.9 to 0.12
    • Change merkle opening to constrain leaf #162
    • Export sponge::truncated::hash regardless of alloc feature #167
    • Remove useless let in sponge::truncated

    Fixed

    • Fix module injection for tree and cipher modules
    Source code(tar.gz)
    Source code(zip)
  • v0.22.0(Jul 27, 2021)

  • v0.21.0(Jul 5, 2021)

    [0.21.0] - 2021-07-05

    Added

    • Add integration tests with examples of custom walker iterators #134
    • Add persistance feature to the crate #151
    • Add truncated module in sponge to deal with scalar conversions #153

    Changed

    • Change the tree logic to be compatible with microkelvin v0.9 #151
    • Changed toolchain-file version to nightly-2021-06-06 #149
    • Change featureset config for the crate #138
    • Update error module to be no_std compatible #132
    • Update to latest dusk-poseidon, dusk-bls12_381 and dusk-jubjub #126
    • Update to latest microkelvin v0.9, nstack v0.9 and canonical v0.6 #125
    • Update randomness provider to rand_core #127
    • Change trait bound system for PoseidonTree #125
    • Update PoseidonTreeAnnotation to be an autotrait #125
    • Update feature system for the crate #138
    • Change PoseidonLeaf getter methods to return refs #143

    Removed

    • Remove anyhow and thiserror from deps #132
    • Remove PoseidonWalkableIterator and PoseidonWalkableAnnotation #125
    • Remove canon_host feature checks from CI #136
    • Remove anyhow and thiserror usage #132
    • Remove microkelvin requirements from Tree #146

    Fixed

    • Fix Readme.md import from lib.rs #148
    Source code(tar.gz)
    Source code(zip)
  • v0.20.0(Apr 6, 2021)

    [0.20.0] - 2021-04-06

    Changed

    • Update dusk-plonk from 0.6 to 0.7 #119
    • Update dusk-hades from 0.14 to 0.15 #119

    Fixed

    • Merkle Opening constant circuit description [#122]
    Source code(tar.gz)
    Source code(zip)
  • v0.19.0(Mar 12, 2021)

  • v0.18.0(Feb 11, 2021)

  • v0.17.0(Feb 1, 2021)

  • v0.15.0(Dec 4, 2020)

  • v0.14.1(Nov 26, 2020)

  • v0.14.0(Nov 17, 2020)

  • v0.13.2(Nov 11, 2020)

  • v0.13.1(Nov 6, 2020)

    [0.13.1] - 06-11-20

    Changed

    • Feature split between canon and canon_host for constrained and unconstrained environments.
    • Canon implementation for PoseidonTree.
    Source code(tar.gz)
    Source code(zip)
  • v0.13.0(Nov 4, 2020)

  • v0.12.0(Nov 3, 2020)

  • v0.11.0(Nov 2, 2020)

    [0.11.0] - 30-10-20

    Changed

    • Bump hades252 to v0.10.0
    • Major refactor on the poseidon tree to comply with the simplifications provided by microkelvin
    Source code(tar.gz)
    Source code(zip)
  • v0.10.0(Oct 5, 2020)

  • v0.9.0(Oct 5, 2020)

    [0.9.0] - 04-10-20

    Added

    • root() fn for PoseidonBranch.

    Changed

    • Padding implementation for PoseidonBranch with opening gadgets.

    Removed

    • Extension fn's from the crate.
    Source code(tar.gz)
    Source code(zip)
  • v0.8.1(Oct 1, 2020)

  • v0.8.0(Sep 29, 2020)

  • v0.7.0(Sep 23, 2020)

  • v0.6.4(Sep 7, 2020)

  • v0.6.3(Sep 2, 2020)

  • v0.6.2(Aug 28, 2020)

  • v0.6.1(Aug 13, 2020)

    [0.6.1] - 13-08-20

    Changed

    • add_constant_witness method replacement by add_witness_to_circuit_description.
    • Make tests return an anyhow::Result and remove expect and unwrap usage.
    • Changed dusk-plonk version to v0.2.7.
    • Changed Hades252 version to v0.7.0.
    Source code(tar.gz)
    Source code(zip)
  • v0.6.0(Aug 7, 2020)

    [0.6.0] - 07-08-20

    Changed

    • Use dusk-plonk v0.2.0 as dependency.
    • Refactor the tests related to Proof generation to work with the Prover&Verifier abstraction.

    Fixed

    • Constrain eom in sponge_hash function.

    Added

    • Poseidon cipher encryption, decryption and plonk gadget for zk prove of encryption with a key.
    Source code(tar.gz)
    Source code(zip)
  • v0.6.0-alpha(Aug 3, 2020)

  • v0.5.0(Jun 15, 2020)

Owner
Dusk Network
Dusk Network is a privacy-oriented blockchain protocol, that anyone can use to create zero-knowledge dApps.
Dusk Network
An implementation of Jakobsson's Fractal Hash Sequence Traversal algorithm

fractal-hash-traversal An implementation of Jakobsson's Fractal Hash Sequence Traversal algorithm. There is at least one hash traversal algorithm that

Dan Cline 1 Jan 12, 2022
zk-SNARK library

bellperson This is a fork of the great bellman library. bellman is a crate for building zk-SNARK circuits. It provides circuit traits and primitive st

Filecoin 131 Jan 3, 2023
STARK - SNARK recursive zero knowledge proofs, combinaison of the Winterfell library and the Circom language

STARK - SNARK recursive proofs The point of this library is to combine the SNARK and STARK computation arguments of knowledge, namely the Winterfell l

Victor Colomb 68 Dec 5, 2022
Blazing fast Pedersen hash implementation for Node.JS

pedersen-fast Blazing fast Pedersen hash implementation for Node.JS Exposes starknet-crypto's implementation written in Rust as WASM package. Usage np

L2BEAT 7 Mar 10, 2023
Highly modular & configurable hash & crypto library

Octavo Highly modular & configurable hash & crypto library written in pure Rust. Installation [dependencies] octavo = { git = "https://github.com/libO

Octavo Developers 139 Dec 29, 2022
Collection of cryptographic hash functions written in pure Rust

RustCrypto: hashes Collection of cryptographic hash functions written in pure Rust. All algorithms reside in the separate crates and implemented using

Rust Crypto 1.2k Jan 8, 2023
A rust binding for nodejs to generate md5 hash value

Hasher A rust binding for creating node module to generate md5 hash value This project was bootstrapped by create-neon. Installing hasher Installing h

Md. Al-Amin 0 Nov 7, 2021
the official Rust and C implementations of the BLAKE3 cryptographic hash function

BLAKE3 is a cryptographic hash function that is: Much faster than MD5, SHA-1, SHA-2, SHA-3, and BLAKE2. Secure, unlike MD5 and SHA-1. And secure again

BLAKE3 team 3.7k Jan 6, 2023
paq files to hash.

paq paq files to hash. Hash a single file or all files in directory recursively. Installation Requires cargo. Run cargo install paq. Usage Run paq [sr

gregory langlais 3 Oct 10, 2022
Fastmurmur3 - Fast non-cryptographic hash, with the benchmarks to prove it.

Fastmurmur3 Murmur3 is a fast, non-cryptographic hash function. fastmurmur3 is, in my testing, the fastest implementation of Murmur3. Usage let bytes:

Kurt Wolf 13 Dec 2, 2022
computed data's hash by webAssembly

wasm-hasher computed data's hash by webAssembly support md5,sha1,sha2-224,sha2-356,sha2-384,sha2-512,sha3-224,sha3-256,sha3-384,sha3-512,china-sm3 typ

fuyoo 2 Oct 13, 2022
Generates a unique hash/identifier for a system given a set of parameters.

uniqueid ?? Generates a unique hash/identifier for a system given a set of parameters. Example usage use uniqueid; pub fn main() { let data = vec

Checksum 2 Aug 19, 2022
Left To My Own Devices - NT hash tools

ntcrack Left To My Own Devices - NT cracker A full writeup of how it works is available at the SensePost blog Invocation ./ntcrack <input hashlist> <w

SensePost 24 Nov 24, 2022
MD5/SHA256 HASH ATTACK IN RUST

hashraccoon Installation Install cargo curl https://sh.rustup.rs -sSf | sh Install the hashraccoon crate cargo install hashraccoon Download the rockyo

null 3 Nov 5, 2022
Hash trait that is object-safe

Hash trait that is object-safe This crate provides a DynHash trait that can be used in trait objects. Types that implement the standard library's std:

David Tolnay 19 Nov 12, 2023
Reference client for NEAR Protocol

Reference implementation of NEAR Protocol About NEAR NEAR's purpose is to enable community-driven innovation to benefit people around the world. To ac

NEAR 2k Jan 3, 2023
Reference client for NEAR Protocol

Reference implementation of NEAR Protocol About NEAR NEAR's purpose is to enable community-driven innovation to benefit people around the world. To ac

NEAR 2k Jan 4, 2023
A reference NFT Staking Program & Client for Solana NFTs

This is a reference NFT Staking Program & Client for Solana NFTs. This program is compatible with both Candy Machine v1 and Candy Machine v2 NFTs.

Tracy Adams 73 Dec 19, 2022
Reference library that implements all the necessary functionality for developing a client that is compatible with TAPLE's DLT network.

⚠️ TAPLE is in early development and should not be used in production ⚠️ TAPLE Core TAPLE (pronounced T+ ?? ['tapəl]) stands for Tracking (Autonomous)

Open Canarias 6 Jan 25, 2023