-
Notifications
You must be signed in to change notification settings - Fork 76
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Hashing trait #109
Comments
Your preferred style might seem more verbose as the traits are otherwise quite similar, but these seem to be different use-cases and it might make sense to treat them seperately. Two observations, the arkworks trait, i.e. the second design, seems to hide the In general I like the generic nature of arkworks and unless it comes at huge costs, either in performance or complicated code, it might be good to stay close to their design. This is likely a much wider discussion than this issue. A side note, in fact this is the trait for the gadget, while what you pointed to might just be for native hash functions. |
Thanks for the comments. You are right, I missed the correct link. Edited with the one of the gadget now 👍 Regarding the composer, my first thought would be that the hash gadgets take a mutable reference to the standard composer. But I guess this question depends on how we decide to design gadgets in general, and not only hashing. Regarding the different traits to be similar, yes. I'm not completely convinced of that design choice, but I do feel that having that level of granularity does make sense in some contexts. |
Does |
I recommend the following pattern for hash functions which know their arity at compile-time: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=cc008c861ad5c5455d1ca26622284a4b For denoting the security level, like collision resistance, PRF, preimage resistance etc, I recommend something like the CryptoRng trait which is just marker which is implemented whenever a random number generator is known to be cryptographically secure. This way, you separate the security guarantees from the usage API. |
Actually, it would be better to use
Yes! I was thinking of doing something like that. So basically have some hashing trait, that defines whatever interface we want for hash functions, and then simply have markers for the other properties. |
With the progress of the Poseidon implementation #104 , it would be nice to begin a discussion on how we could implement the hash trait(s). Hopefully, this will also steer the discussion towards the gadgets design. I will eventually draft a PR.
My idea is to break the hashing family functionality into different traits:
CollisionResistantHashing
PseudoRandomFunction
PreImageResistantHashing
(and 2nd-pre image)This would allow us to use hash functions which might only require collision resistance (certain use cases of merkle trees), cryptographically safe hash functions (collision + preimage + 2nd preimage resistance), or pseudo random functionality.
Was discussing with @CPerezz that it might make sense to also separate prime field hash functions and those that operate over binary fields. I agree with that, and in what concerns the prime field hash functions I would also make explicit trait distinctions for the capacity of the functions, as these might require different parametrisation. So rather than going with this type of trait definition (with
hash
andhash_two
part of the same trait), I would rather follow this style (making an explicit distinction).Any thoughts and comments welcome 👍
The text was updated successfully, but these errors were encountered: