Skip to content

Commit

Permalink
make merkle fully featured
Browse files Browse the repository at this point in the history
  • Loading branch information
kolodny committed Oct 7, 2015
1 parent e8219e2 commit c35e76e
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 14 deletions.
13 changes: 11 additions & 2 deletions merkle/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,17 @@ var hasher = function(str) {
}
return hash.toString();
};
var merkleRoot = merkle(['This', 'is', 'a', 'test'], hasher);
console.log(merkleRoot); // -1427219841
var myMerkle = merkle(['This', 'is', 'a', 'test'], hasher);
console.log(myMerkle.root); // -1427219841
myMerkle.getVerification('not in tree'); // false

// this is an object that the server would return
var verificationObject = myMerkle.getVerification('test'); // { index: 3, breadcrumbs: [ 'a', '-1790830488' ] }

// this is how the client would verify that the contact exists (the client somehow already knows the root)
var root = myMerkle.root;
merkle.verify('test', root, obj, simpleHasher); // true
merkle.verify('testing', root, obj, simpleHasher); // false
```

More info: https://en.wikipedia.org/wiki/Merkle_tree
68 changes: 56 additions & 12 deletions merkle/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,29 +5,73 @@ var crypto = require('crypto');

describe('merkle', function() {

it('works with power a two elements', function() {
var merkleRoot = merkle(['This', 'is', 'a', 'test'], simpleHasher);
assert.equal(merkleRoot, -1427219841, 'hashes match')
});
describe('has a root property correctly set when', function() {

it('has a power of two elements', function() {
var myMerkle = merkle(['This', 'is', 'a', 'test'], simpleHasher);
var verificationObject = myMerkle.getVerification('test')
assert.equal(myMerkle.root, -1427219841, 'hashes match')
});

it('has a power of two elements with dupes', function() {
var myMerkle = merkle(['This', 'is', 'cool', 'cool'], simpleHasher);
assert.equal(myMerkle.root, 678075951, 'hashes match')
});

it('has a an odd number of elements', function() {
var myMerkle = merkle(['This', 'is', 'cool'], simpleHasher);
assert.equal(myMerkle.root, 678075951, 'hashes match')
});

it('has a large number of elements', function() {
var arr = 'here is a test to see if we can find all the cool words in this list'.split(' ');
var myMerkle = merkle(arr, simpleHasher);
assert.equal(myMerkle.root, -721821363)
});

it('works with power a two elements with dupes', function() {
var merkleRoot = merkle(['This', 'is', 'cool', 'cool'], simpleHasher);
assert.equal(merkleRoot, 678075951, 'hashes match')
});

it('works with an odd number of elements', function() {
var merkleRoot = merkle(['This', 'is', 'cool'], simpleHasher);
assert.equal(merkleRoot, 678075951, 'hashes match')
describe('can verify an element is in a tree when', function() {

it('has a power of two elements', function() {
var myMerkle = merkle(['This', 'is', 'a', 'test'], simpleHasher);
var obj = myMerkle.getVerification('is')
assert(merkle.verify('is', myMerkle.root, obj, simpleHasher))
});

it('has a power of two elements with dupes', function() {
var myMerkle = merkle(['This', 'is', 'cool', 'cool'], simpleHasher);
var obj = myMerkle.getVerification('cool')
assert(merkle.verify('cool', myMerkle.root, obj, simpleHasher))
});

it('has a an odd number of elements', function() {
var myMerkle = merkle(['This', 'is', 'cool'], simpleHasher);
var obj = myMerkle.getVerification('cool')
assert(merkle.verify('cool', myMerkle.root, obj, simpleHasher))
});

it('has a large number of elements', function() {
var arr = 'here is a test to see if we can find all the cool words in this list'.split(' ');
var myMerkle = merkle(arr, simpleHasher);
var obj = myMerkle.getVerification('cool')
assert(merkle.verify('cool', myMerkle.root, obj, simpleHasher))
});

});


it('works just like bitcoin!', function() {
var seeder = doublesha256('some seed');
var values = [];
for (var i = 0; i < 10000; i++) {
values.push('value' + i + ' ' + doublesha256(seeder + i));
}
var merkleRoot = merkle(values, doublesha256);
assert.equal(merkleRoot, 'e213bb72c8975346d44abc5bfc917ef2e28ef8277007e9c3346f238c6a0d68d1')
var myMerkle = merkle(values, doublesha256);
var lookFor = values[4567];
var obj = myMerkle.getVerification(lookFor);
assert.equal(myMerkle.root, 'e213bb72c8975346d44abc5bfc917ef2e28ef8277007e9c3346f238c6a0d68d1')
assert(merkle.verify(lookFor, myMerkle.root, obj, doublesha256))
});

});
Expand Down

0 comments on commit c35e76e

Please sign in to comment.