npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

sparse-merkle-tree

v1.0.0

Published

TypeScript and Solidity implementation of Sparse Merkle Trees, taken from the Pigi project by Plasma Group.

Downloads

207

Readme

This repository was forked from Pigi, which was published under the MIT license.

TODO Finish README, add function definitions & use guide

Sparse Merkle Trees

Original paper describing how to implemenet a sparse merkle tree efficiently.

A sparse merkle tree is a merkle tree of intractable size, i.e. a tree which is so large that it would be impossible to actually store all of its leaf nodes.

The essential idea which makes a sparse merkle tree possible is the pre-calculation of a default node for each level in the tree: if the default value of a leaf node is D1 = 0, then the default value for the second level is D2 = h(h(0) ++ h(0)), the default value for the third level is D3 = h(D1 ++ D1), etc. This allows you to efficiently calculate the root hash without actually having to hash every node in the tree.

Sparse merkle trees make it possible to have a merkle tree with a leaf node for every possible output value a hash algorithm can produce. It also makes it very simple to produce append-only merkle trees where a node for every possible index in some integer range is initialized with a default value.

TypeScript

This repo has a typescript implementation of a sparse merkle tree which can be found in src/merkle-tree.ts.

SparseMerkleTree uses memdown for its database.

Modifications

The modifications to the code from Pigi were primarily to minimize dependencies on non-essential libraries, since the Pigi code was part of a large monorepo.

TODO

  • [ ] Add checkpoint functionality to the tree
  • [ ] Add bitfield for missing default hashes in proof function.

Contracts

This repo has a Solidity implementation of a sparse merkle tree, including verification and storage/production.

Modifications

Addition of verifyAndUpate function This is a pure function which takes a standard merkle proof (rootHash, leafValue, leafIndex, siblings) and an additional parameter newValue. It calculates the merkle root from the provided leaf, index and siblings, and calculates a second root newRootHash through the same process but using newValue instead of leafValue. It returns a tuple of (valid, newRootHash) where valid is a boolean stating whether the calculated root hash (using leafValue) matches the rootHash parameter that was provided for comparison.

TODO

  • [ ] Add bitfield for missing default hashes in proof verification function.