multiformats / multiformats/js-multiformats
Proposal: Update MultihashHasher interface so it could support multiple hashing algorithms
Nobody has claimed this yet.
- Dominant language
- TypeScript
- Stars
- 268
- Forks
- 57
- PR merge metrics
- No merged PRs in 30d
Description
Goal
As per https://github.com/ipld/js-car/issues/123 we do need a solution for verifying hashes in CAR files without shipping all the MultihashHasher-s with the CAR library.
Proposal
- Introduce backwards compatible change to the
MultihashHasherby introducing second OPTIONALcodeargument to thedigestmethod.- If omitted it would default to own
code. - If different code is passed it would error.
- If omitted it would default to own
- Rename
MultihashHasherinterface toMultihashHasherCaseand repurpose it for single algorithm use cases. - Introduce multi algorithm
MultihashHasherVariantinterface with the samedigestmethod and a method that returns map ofMultihashHasherCaseit's comprised of. - Define
MultihashHasheras union type discriminated bycodefield.
Here is the the sketch:
interface MultihashHasherCase<Code extends number = number> {
code: Code
digest(bytes: Uint8Array, code?: Code): Digest<Code>
}
interface MultihashHasherVariant<Code extends number = number> {
// We define `code` as optional which can never have a value. This will allow
// us to `code` as a discriminant in the union
code?: never
cases(): Record<Code, MultihashHasherCase<Code>>
digest <CodeCase extends Code> (bytes: Uint8Array, code?: CodeCase): Digest<CodeCase>
or <Case extends number> (hasher: MultihashHasher<Case>): MultihashHasherVariant<Code|Case>
}
type MultihashHasher<Code extends number = number> =
| MultihashHasherCase<Code>
| MultihashHasherVariant<Code>
Note that above makes current MultihashHasher-s compatible with proposed MultihashHasher type that is to say code that will require new type will accept all existing hashers without changes to them.
- With such a type in place
js-carlibrary would be able to requireMultihashHasherparameter in order to be able to verify digests. - Added
MultihashHasherVariantwould allow composing many hashers into one.
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by locating the MultihashHasher interface and its usages in the TypeScript source, then review the linked js-car issue for the verification requirement. Compare existing tests and type checks before defining the compatibility and composition behavior described here. Done means the proposed interfaces and union type are implemented without breaking existing hashers, with coverage for single- and multi-algorithm use cases.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- backend-api-design
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 25/100