diff --git a/README.md b/README.md index c4b9a52..1aa6c38 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # SYNOPSIS [![NPM Package](https://img.shields.io/npm/v/merkle-patricia-tree)](https://www.npmjs.org/package/merkle-patricia-tree) -[![Actions Status](https://github.com/ethereumjs/ethereumjs-util/workflows/Build/badge.svg)](https://github.com/ethereumjs/merkle-patricia-tree/actions) +[![Actions Status](https://github.com/ethereumjs/merkle-patricia-tree/workflows/Build/badge.svg)](https://github.com/ethereumjs/merkle-patricia-tree/actions) [![Coverage Status](https://img.shields.io/coveralls/ethereumjs/merkle-patricia-tree.svg)](https://coveralls.io/r/ethereumjs/merkle-patricia-tree) [![Gitter](https://img.shields.io/gitter/room/ethereum/ethereumjs.svg)](https://gitter.im/ethereum/ethereumjs) @@ -23,95 +23,84 @@ There are 3 variants of the tree implemented in this library, namely: `BaseTrie` ## Initialization and Basic Usage -```javascript -const Trie = require('merkle-patricia-tree').BaseTrie, - level = require('level'), - db = level('./testdb'), - trie = new Trie(db) +```typescript +import level from 'level' +import { BaseTrie as Trie } from 'merkle-patricia-tree' -trie.put(Buffer.from('test'), Buffer.from('one'), function () { - trie.get(Buffer.from('test'), function (err, value) { - if (value) console.log(value.toString()) - }) -}) +const db = level('./testdb') +const trie = new Trie(db) + +await trie.put(Buffer.from('test'), Buffer.from('one')) +const value = await trie.get(Buffer.from('test')) +console.log(value.toString()) ``` ## Merkle Proofs -```javascript -Trie.prove(trie, Buffer.from('test'), function (err, prove) { - if (err) return cb(err) - Trie.verifyProof(trie.root, Buffer.from('test'), prove, function (err, value) { - if (err) return cb(err) - console.log(value.toString()) - cb() - }) -}) +```typescript +const prove = await Trie.prove(trie, Buffer.from('test')) +const value = await Trie.verifyProof(trie.root, Buffer.from('test'), prove) +console.log(value.toString()) ``` ## Read stream on Geth DB -```javascript -var level = require('level') -var Trie = require('merkle-patricia-tree').SecureTrie - -var stateRoot = '0xd7f8974fb5ac78d9ac099b9ad5018bedc2ce0a72dad1827a1709da30580f0544' // Block #222 +```typescript +import level from 'level' +import { SecureTrie as Trie } from 'merkle-patricia-tree' -var db = level('YOUR_PATH_TO_THE_GETH_CHAIN_DB') -var trie = new Trie(db, stateRoot) +const db = level('YOUR_PATH_TO_THE_GETH_CHAIN_DB') +// Set stateRoot to block #222 +const stateRoot = '0xd7f8974fb5ac78d9ac099b9ad5018bedc2ce0a72dad1827a1709da30580f0544' +// Initialize trie +const trie = new Trie(db, stateRoot) trie .createReadStream() - .on('data', function (data) { - console.log(data) - }) - .on('end', function () { + .on('data', console.log) + .on('end', () => { console.log('End.') }) ``` ## Read Account State including Storage from Geth DB -```javascript -var level = require('level') -var rlp = require('rlp') -var ethutil = require('ethereumjs-util') - -var Trie = require('merkle-patricia-tree').SecureTrie -var Account = require('ethereumjs-account').default -var BN = ethutil.BN - -var stateRoot = 'STATE_ROOT_OF_A_BLOCK' - -var db = level('YOUR_PATH_TO_THE_GETH_CHAINDATA_FOLDER') -var trie = new Trie(db, stateRoot) - -var address = 'AN_ETHEREUM_ACCOUNT_ADDRESS' - -trie.get(address, function (err, data) { - if (err) return cb(err) - - var acc = new Account(data) - console.log('-------State-------') - console.log(`nonce: ${new BN(acc.nonce)}`) - console.log(`balance in wei: ${new BN(acc.balance)}`) - console.log(`storageRoot: ${ethutil.bufferToHex(acc.stateRoot)}`) - console.log(`codeHash: ${ethutil.bufferToHex(acc.codeHash)}`) - - var storageTrie = trie.copy() - storageTrie.root = acc.stateRoot - - console.log('------Storage------') - var stream = storageTrie.createReadStream() - stream - .on('data', function (data) { - console.log(`key: ${ethutil.bufferToHex(data.key)}`) - console.log(`Value: ${ethutil.bufferToHex(rlp.decode(data.value))}`) - }) - .on('end', function () { - console.log('Finished reading storage.') - }) -}) +```typescript +import level from 'level' +import rlp from 'rlp' +import { BN, bufferToHex } from 'ethereumjs-util' +import Account from 'ethereumjs-account' +import { SecureTrie as Trie } from 'merkle-patricia-tree' + +const stateRoot = 'STATE_ROOT_OF_A_BLOCK' + +const db = level('YOUR_PATH_TO_THE_GETH_CHAINDATA_FOLDER') +const trie = new Trie(db, stateRoot) + +const address = 'AN_ETHEREUM_ACCOUNT_ADDRESS' + +const data = await trie.get(address) +const acc = new Account(data) + +console.log('-------State-------') +console.log(`nonce: ${new BN(acc.nonce)}`) +console.log(`balance in wei: ${new BN(acc.balance)}`) +console.log(`storageRoot: ${bufferToHex(acc.stateRoot)}`) +console.log(`codeHash: ${bufferToHex(acc.codeHash)}`) + +let storageTrie = trie.copy() +storageTrie.root = acc.stateRoot + +console.log('------Storage------') +const stream = storageTrie.createReadStream() +stream + .on('data', (data) => { + console.log(`key: ${bufferToHex(data.key)}`) + console.log(`Value: ${bufferToHex(rlp.decode(data.value))}`) + }) + .on('end', () => { + console.log('Finished reading storage.') + }) ``` # API @@ -124,11 +113,14 @@ trie.get(address, function (err, data) { # REFERENCES -- ["Exploring Ethereum's state trie with Node.js"](https://wanderer.github.io/ethereum/nodejs/code/2014/05/21/using-ethereums-tries-with-node/) blog post -- ["Merkling in Ethereum"](https://blog.ethereum.org/2015/11/15/merkling-in-ethereum/) blog post -- [Ethereum Trie Specification](https://github.com/ethereum/wiki/wiki/Patricia-Tree) Wiki -- ["Understanding the ethereum trie"](https://easythereentropy.wordpress.com/2014/06/04/understanding-the-ethereum-trie/) blog post -- ["Trie and Patricia Trie Overview"](https://www.youtube.com/watch?v=jXAHLqQthKw&t=26s) Video Talk on Youtube +- Wiki + - [Ethereum Trie Specification](https://github.com/ethereum/wiki/wiki/Patricia-Tree) +- Blog posts + - [Exploring Ethereum's State Trie with Node.js](https://wanderer.github.io/ethereum/nodejs/code/2014/05/21/using-ethereums-tries-with-node/) + - [Merkling in Ethereum](https://blog.ethereum.org/2015/11/15/merkling-in-ethereum/) + - [Understanding the Ethereum Trie](https://easythereentropy.wordpress.com/2014/06/04/understanding-the-ethereum-trie/) +- Videos + - [Trie and Patricia Trie Overview](https://www.youtube.com/watch?v=jXAHLqQthKw&t=26s) # EthereumJS diff --git a/benchmarks/checkpointing.ts b/benchmarks/checkpointing.ts index 39c8b41..ac7a32a 100644 --- a/benchmarks/checkpointing.ts +++ b/benchmarks/checkpointing.ts @@ -1,60 +1,52 @@ -import * as async from 'async' -import * as crypto from 'crypto' -const Trie = require('../dist/index.js').CheckpointTrie +import { pseudoRandomBytes } from 'crypto' +import { CheckpointTrie } from '../dist' -let iterations = 500 -let samples = 20 -let i = 0 +const iterations = 500 +const samples = 20 -function iterTest(numOfIter: number, cb: Function) { - let vals = [] as any - let keys = [] as any +const iterTest = async (numOfIter: number): Promise> => { + return new Promise(async (resolve) => { + let vals = [] as any + let keys = [] as any - for (i = 0; i <= numOfIter; i++) { - vals.push(crypto.pseudoRandomBytes(32)) - keys.push(crypto.pseudoRandomBytes(32)) - } + for (let i = 0; i <= numOfIter; i++) { + vals.push(pseudoRandomBytes(32)) + keys.push(pseudoRandomBytes(32)) + } - let hrstart = process.hrtime() - let numOfOps = 0 - let trie = new Trie() + let hrstart = process.hrtime() + let numOfOps = 0 + let trie = new CheckpointTrie() - for (i = 0; i < numOfIter; i++) { - trie.put(vals[i], keys[i], function () { + for (let i = 0; i < numOfIter; i++) { + await trie.put(vals[i], keys[i]) trie.checkpoint() - trie.get(Buffer.from('test'), function () { - numOfOps++ - if (numOfOps === numOfIter) { - const hrend = process.hrtime(hrstart) - cb(hrend) - } - }) - }) - } + await trie.get(Buffer.from('test')) + numOfOps++ + if (numOfOps === numOfIter) { + const hrend = process.hrtime(hrstart) + resolve(hrend) + } + } + }) } -i = 0 -let avg = [0, 0] +const go = async () => { + let i = 0 + let avg = [0, 0] -async.whilst( - function () { + while (i <= samples) { + const hrend = await iterTest(iterations) + avg[0] += hrend[0] + avg[1] += hrend[1] + // console.log('benchmarks/checkpointing.ts | execution time: %ds %dms', hrend[0], (hrend[1] / 1000000).toFixed(3)) i++ - return i <= samples - }, - function (done) { - iterTest(iterations, function (hrend: Array) { - avg[0] += hrend[0] - avg[1] += hrend[1] - - console.info('Execution time (hr): %ds %dms', hrend[0], hrend[1] / 1000000) - done() - }) - }, - function () { - console.info( - 'Average Execution time (hr): %ds %dms', - avg[0] / samples, - avg[1] / 1000000 / samples, - ) - }, -) + } + console.log( + 'benchmarks/checkpointing.ts | average execution time: %ds %dms', + avg[0] / samples, + (avg[1] / 1000000 / samples).toFixed(3), + ) +} + +go() diff --git a/benchmarks/random.ts b/benchmarks/random.ts index 7c3f749..9f5ab6f 100644 --- a/benchmarks/random.ts +++ b/benchmarks/random.ts @@ -1,45 +1,46 @@ // https://github.com/ethereum/wiki/wiki/Benchmarks 'use strict' -import * as async from 'async' -import * as ethUtil from 'ethereumjs-util' -const Trie = require('../dist/index.js').BaseTrie +import { keccak256 } from 'ethereumjs-util' +import { BaseTrie } from '../dist' const ROUNDS = 1000 const SYMMETRIC = true const ERA_SIZE = 1000 -let trie = new Trie() +const trie = new BaseTrie() let seed = Buffer.alloc(32).fill(0) -let testName = 'rounds ' + ROUNDS + ' ' + ERA_SIZE + ' ' + SYMMETRIC ? 'sys' : 'rand' -console.time(testName) -run(() => { - console.timeEnd(testName) -}) - -function run(cb: any) { +const run = async (): Promise => { let i = 0 - async.whilst( - () => { - i++ - return i <= ROUNDS - }, - function (done) { - seed = ethUtil.keccak256(seed) - if (SYMMETRIC) { - trie.put(seed, seed, genRoot) - } else { - let val = ethUtil.keccak256(seed) - trie.put(seed, val, genRoot) - } + while (i <= ROUNDS) { + seed = keccak256(seed) - function genRoot() { - if (i % ERA_SIZE === 0) { - seed = trie.root - } - done() + const genRoot = () => { + if (i % ERA_SIZE === 0) { + seed = trie.root } - }, - cb, - ) + } + + if (SYMMETRIC) { + await trie.put(seed, seed) + genRoot() + } else { + const val = keccak256(seed) + await trie.put(seed, val) + genRoot() + } + + i++ + } } + +const go = async () => { + const testName = `benchmarks/random.ts | rounds: ${ROUNDS}, ERA_SIZE: ${ERA_SIZE}, ${ + SYMMETRIC ? 'sys' : 'rand' + }` + console.time(testName) + await run() + console.timeEnd(testName) +} + +go() diff --git a/docs/classes/_basetrie_.trie.md b/docs/classes/_basetrie_.trie.md index c0fc583..ab26256 100644 --- a/docs/classes/_basetrie_.trie.md +++ b/docs/classes/_basetrie_.trie.md @@ -2,18 +2,18 @@ # Class: Trie -Use `require('merkel-patricia-tree').BaseTrie` for the base interface. In Ethereum applications -stick with the Secure Trie Overlay `require('merkel-patricia-tree').SecureTrie`. -The API for the raw and the secure interface are about the same. +Use `import { BaseTrie as Trie } from 'merkle-patricia-tree'` for the base interface. +In Ethereum applications stick with the Secure Trie Overlay `import { SecureTrie } from 'merkle-patricia-tree'`. +The API for the base and the secure interface are about the same. **`param`** A [levelup](https://github.com/Level/levelup) instance. By default creates an in-memory [memdown](https://github.com/Level/memdown) instance. If the db is `null` or left undefined, then the trie will be stored in memory via [memdown](https://github.com/Level/memdown) -**`param`** A hex `String` or `Buffer` for the root of a previously stored trie +**`param`** A `Buffer` for the root of a previously stored trie -**`prop`** {Buffer} root The current root of the `trie` +**`prop`** {Buffer} root - The current root of the `trie` -**`prop`** {Buffer} EMPTY_TRIE_ROOT the Root for an empty trie +**`prop`** {Buffer} EMPTY_TRIE_ROOT - The root for an empty trie ## Hierarchy @@ -53,12 +53,9 @@ If the db is `null` or left undefined, then the trie will be stored in memory vi * [copy](_basetrie_.trie.md#copy) * [createReadStream](_basetrie_.trie.md#createreadstream) * [del](_basetrie_.trie.md#del) -* [delRaw](_basetrie_.trie.md#delraw) * [findPath](_basetrie_.trie.md#findpath) * [get](_basetrie_.trie.md#get) -* [getRaw](_basetrie_.trie.md#getraw) * [put](_basetrie_.trie.md#put) -* [putRaw](_basetrie_.trie.md#putraw) * [setRoot](_basetrie_.trie.md#setroot) * [fromProof](_basetrie_.trie.md#static-fromproof) * [prove](_basetrie_.trie.md#static-prove) @@ -70,7 +67,7 @@ If the db is `null` or left undefined, then the trie will be stored in memory vi \+ **new Trie**(`db?`: LevelUp | null, `root?`: Buffer): *[Trie](_basetrie_.trie.md)* -*Defined in [baseTrie.ts:38](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L38)* +*Defined in [baseTrie.ts:42](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L42)* **Parameters:** @@ -87,7 +84,7 @@ Name | Type | • **EMPTY_TRIE_ROOT**: *Buffer* -*Defined in [baseTrie.ts:35](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L35)* +*Defined in [baseTrie.ts:39](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L39)* ___ @@ -95,7 +92,7 @@ ___ • **db**: *DB* -*Defined in [baseTrie.ts:36](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L36)* +*Defined in [baseTrie.ts:40](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L40)* ## Accessors @@ -103,13 +100,13 @@ ___ • **get root**(): *Buffer* -*Defined in [baseTrie.ts:105](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L105)* +*Defined in [baseTrie.ts:100](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L100)* **Returns:** *Buffer* • **set root**(`value`: Buffer): *void* -*Defined in [baseTrie.ts:101](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L101)* +*Defined in [baseTrie.ts:96](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L96)* **Parameters:** @@ -123,9 +120,9 @@ Name | Type | ### _createInitialNode -▸ **_createInitialNode**(`key`: Buffer, `value`: Buffer, `cb`: ErrorCallback): *void* +▸ **_createInitialNode**(`key`: Buffer, `value`: Buffer): *Promise‹void›* -*Defined in [baseTrie.ts:737](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L737)* +*Defined in [baseTrie.ts:651](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L651)* **Parameters:** @@ -133,17 +130,16 @@ Name | Type | ------ | ------ | `key` | Buffer | `value` | Buffer | -`cb` | ErrorCallback | -**Returns:** *void* +**Returns:** *Promise‹void›* ___ ### _deleteNode -▸ **_deleteNode**(`k`: Buffer, `stack`: TrieNode[], `cb`: Function): *any* +▸ **_deleteNode**(`k`: Buffer, `stack`: TrieNode[]): *Promise‹void›* -*Defined in [baseTrie.ts:619](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L619)* +*Defined in [baseTrie.ts:529](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L529)* **Parameters:** @@ -151,43 +147,40 @@ Name | Type | ------ | ------ | `k` | Buffer | `stack` | TrieNode[] | -`cb` | Function | -**Returns:** *any* +**Returns:** *Promise‹void›* ___ ### _findDbNodes -▸ **_findDbNodes**(`onFound`: Function, `cb`: Function): *void* +▸ **_findDbNodes**(`onFound`: FoundNode): *Promise‹void›* -*Defined in [baseTrie.ts:348](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L348)* +*Defined in [baseTrie.ts:279](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L279)* **Parameters:** Name | Type | ------ | ------ | -`onFound` | Function | -`cb` | Function | +`onFound` | FoundNode | -**Returns:** *void* +**Returns:** *Promise‹void›* ___ ### _findValueNodes -▸ **_findValueNodes**(`onFound`: Function, `cb`: Function): *void* +▸ **_findValueNodes**(`onFound`: FoundNode): *Promise‹void›* -*Defined in [baseTrie.ts:322](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L322)* +*Defined in [baseTrie.ts:257](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L257)* **Parameters:** Name | Type | ------ | ------ | -`onFound` | Function | -`cb` | Function | +`onFound` | FoundNode | -**Returns:** *void* +**Returns:** *Promise‹void›* ___ @@ -195,7 +188,7 @@ ___ ▸ **_formatNode**(`node`: TrieNode, `topLevel`: boolean, `opStack`: BatchDBOp[], `remove`: boolean): *Buffer | null | Buffer‹› | Buffer‹›[][]* -*Defined in [baseTrie.ts:745](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L745)* +*Defined in [baseTrie.ts:659](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L659)* **Parameters:** @@ -212,43 +205,41 @@ ___ ### _lookupNode -▸ **_lookupNode**(`node`: Buffer | Buffer[], `cb`: Function): *void* +▸ **_lookupNode**(`node`: Buffer | Buffer[]): *Promise‹TrieNode | null›* -*Defined in [baseTrie.ts:232](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L232)* +*Defined in [baseTrie.ts:172](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L172)* **Parameters:** Name | Type | ------ | ------ | `node` | Buffer | Buffer[] | -`cb` | Function | -**Returns:** *void* +**Returns:** *Promise‹TrieNode | null›* ___ ### _putNode -▸ **_putNode**(`node`: TrieNode, `cb`: ErrorCallback): *void* +▸ **_putNode**(`node`: TrieNode): *Promise‹void›* -*Defined in [baseTrie.ts:249](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L249)* +*Defined in [baseTrie.ts:190](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L190)* **Parameters:** Name | Type | ------ | ------ | `node` | TrieNode | -`cb` | ErrorCallback | -**Returns:** *void* +**Returns:** *Promise‹void›* ___ ### `Private` _saveStack -▸ **_saveStack**(`key`: number[], `stack`: TrieNode[], `opStack`: BatchDBOp[], `cb`: ErrorCallback): *void* +▸ **_saveStack**(`key`: number[], `stack`: TrieNode[], `opStack`: BatchDBOp[]): *Promise‹void›* -*Defined in [baseTrie.ts:590](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L590)* +*Defined in [baseTrie.ts:500](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L500)* saves a stack @@ -261,17 +252,16 @@ Name | Type | Description | `key` | number[] | the key. Should follow the stack | `stack` | TrieNode[] | a stack of nodes to the value given by the key | `opStack` | BatchDBOp[] | a stack of levelup operations to commit at the end of this funciton | -`cb` | ErrorCallback | | -**Returns:** *void* +**Returns:** *Promise‹void›* ___ ### `Private` _updateNode -▸ **_updateNode**(`k`: Buffer, `value`: Buffer, `keyRemainder`: number[], `stack`: TrieNode[], `cb`: ErrorCallback): *void* +▸ **_updateNode**(`k`: Buffer, `value`: Buffer, `keyRemainder`: number[], `stack`: TrieNode[]): *Promise‹void›* -*Defined in [baseTrie.ts:372](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L372)* +*Defined in [baseTrie.ts:299](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L299)* Updates a node @@ -279,41 +269,39 @@ Updates a node **Parameters:** -Name | Type | Description | ------- | ------ | ------ | -`k` | Buffer | - | -`value` | Buffer | - | -`keyRemainder` | number[] | - | -`stack` | TrieNode[] | - | -`cb` | ErrorCallback | the callback | +Name | Type | +------ | ------ | +`k` | Buffer | +`value` | Buffer | +`keyRemainder` | number[] | +`stack` | TrieNode[] | -**Returns:** *void* +**Returns:** *Promise‹void›* ___ ### _walkTrie -▸ **_walkTrie**(`root`: Buffer, `onNode`: Function, `onDone`: Function): *any* +▸ **_walkTrie**(`root`: Buffer, `onNode`: FoundNode): *Promise‹void›* -*Defined in [baseTrie.ts:475](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L475)* +*Defined in [baseTrie.ts:399](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L399)* **Parameters:** Name | Type | ------ | ------ | `root` | Buffer | -`onNode` | Function | -`onDone` | Function | +`onNode` | FoundNode | -**Returns:** *any* +**Returns:** *Promise‹void›* ___ ### batch -▸ **batch**(`ops`: BatchDBOp[], `cb`: ErrorCallback): *void* +▸ **batch**(`ops`: BatchDBOp[]): *Promise‹void›* -*Defined in [baseTrie.ts:801](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L801)* +*Defined in [baseTrie.ts:713](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L713)* The given hash of operations (key additions or deletions) are executed on the DB @@ -322,42 +310,40 @@ The given hash of operations (key additions or deletions) are executed on the DB **`memberof`** Trie **`example`** -var ops = [ +const ops = [ { type: 'del', key: Buffer.from('father') } , { type: 'put', key: Buffer.from('name'), value: Buffer.from('Yuri Irsenovich Kim') } , { type: 'put', key: Buffer.from('dob'), value: Buffer.from('16 February 1941') } , { type: 'put', key: Buffer.from('spouse'), value: Buffer.from('Kim Young-sook') } , { type: 'put', key: Buffer.from('occupation'), value: Buffer.from('Clown') } ] -trie.batch(ops) +await trie.batch(ops) **Parameters:** -Name | Type | Description | ------- | ------ | ------ | -`ops` | BatchDBOp[] | - | -`cb` | ErrorCallback | | +Name | Type | +------ | ------ | +`ops` | BatchDBOp[] | -**Returns:** *void* +**Returns:** *Promise‹void›* ___ ### checkRoot -▸ **checkRoot**(`root`: Buffer, `cb`: Function): *void* +▸ **checkRoot**(`root`: Buffer): *Promise‹boolean›* -*Defined in [baseTrie.ts:821](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L821)* +*Defined in [baseTrie.ts:729](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L729)* -Checks if a given root exists +Checks if a given root exists. **Parameters:** Name | Type | ------ | ------ | `root` | Buffer | -`cb` | Function | -**Returns:** *void* +**Returns:** *Promise‹boolean›* ___ @@ -365,7 +351,7 @@ ___ ▸ **copy**(): *[Trie](_basetrie_.trie.md)* -*Defined in [baseTrie.ts:780](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L780)* +*Defined in [baseTrie.ts:692](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L692)* **Returns:** *[Trie](_basetrie_.trie.md)* @@ -375,9 +361,9 @@ ___ ▸ **createReadStream**(): *ReadStream* -*Defined in [baseTrie.ts:774](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L774)* +*Defined in [baseTrie.ts:686](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L686)* -The `data` event is given an `Object` hat has two properties; the `key` and the `value`. Both should be Buffers. +The `data` event is given an `Object` that has two properties; the `key` and the `value`. Both should be Buffers. **`method`** createReadStream @@ -391,9 +377,9 @@ ___ ### del -▸ **del**(`key`: Buffer, `cb`: ErrorCallback): *void* +▸ **del**(`key`: Buffer): *Promise‹void›* -*Defined in [baseTrie.ts:185](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L185)* +*Defined in [baseTrie.ts:162](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L162)* deletes a value given a `key` @@ -406,41 +392,19 @@ deletes a value given a `key` Name | Type | ------ | ------ | `key` | Buffer | -`cb` | ErrorCallback | - -**Returns:** *void* - -___ - -### delRaw - -▸ **delRaw**(`key`: Buffer, `cb`: ErrorCallback): *void* - -*Defined in [baseTrie.ts:227](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L227)* - -Deletes key directly from underlying key/value db. - -**`deprecated`** - -**Parameters:** - -Name | Type | ------- | ------ | -`key` | Buffer | -`cb` | ErrorCallback | -**Returns:** *void* +**Returns:** *Promise‹void›* ___ ### findPath -▸ **findPath**(`key`: Buffer, `cb`: Function): *void* +▸ **findPath**(`key`: Buffer): *Promise‹Path›* -*Defined in [baseTrie.ts:268](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L268)* +*Defined in [baseTrie.ts:204](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L204)* -Tries to find a path to the node for the given key -It returns a `stack` of nodes to the closet node +Tries to find a path to the node for the given key. +It returns a `stack` of nodes to the closet node. **`method`** findPath @@ -448,20 +412,19 @@ It returns a `stack` of nodes to the closet node **Parameters:** -Name | Type | ------- | ------ | -`key` | Buffer | -`cb` | Function | +Name | Type | Description | +------ | ------ | ------ | +`key` | Buffer | the search key | -**Returns:** *void* +**Returns:** *Promise‹Path›* ___ ### get -▸ **get**(`key`: Buffer, `cb`: BufferCallback): *void* +▸ **get**(`key`: Buffer): *Promise‹Buffer | null›* -*Defined in [baseTrie.ts:127](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L127)* +*Defined in [baseTrie.ts:119](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L119)* Gets a value given a `key` @@ -474,38 +437,18 @@ Gets a value given a `key` Name | Type | Description | ------ | ------ | ------ | `key` | Buffer | the key to search for | -`cb` | BufferCallback | A callback `Function` which is given the arguments `err` - for errors that may have occured and `value` - the found value in a `Buffer` or if no value was found `null` | - -**Returns:** *void* - -___ -### getRaw - -▸ **getRaw**(`key`: Buffer, `cb`: BufferCallback): *void* - -*Defined in [baseTrie.ts:210](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L210)* - -Retrieves a value directly from key/value db. - -**`deprecated`** - -**Parameters:** - -Name | Type | ------- | ------ | -`key` | Buffer | -`cb` | BufferCallback | +**Returns:** *Promise‹Buffer | null›* -**Returns:** *void* +- Returns a promise that resolves to `Buffer` if a value was found or `null` if no value was found. ___ ### put -▸ **put**(`key`: Buffer, `value`: Buffer, `cb`: ErrorCallback): *void* +▸ **put**(`key`: Buffer, `value`: Buffer): *Promise‹void›* -*Defined in [baseTrie.ts:149](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L149)* +*Defined in [baseTrie.ts:136](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L136)* Stores a given `value` at the given `key` @@ -515,36 +458,12 @@ Stores a given `value` at the given `key` **Parameters:** -Name | Type | Description | ------- | ------ | ------ | -`key` | Buffer | - | -`value` | Buffer | - | -`cb` | ErrorCallback | A callback `Function` which is given the argument `err` - for errors that may have occured | - -**Returns:** *void* - -___ - -### putRaw - -▸ **putRaw**(`key`: Buffer, `value`: Buffer, `cb`: ErrorCallback): *void* - -*Defined in [baseTrie.ts:219](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L219)* - -Writes a value under given key directly to the -key/value db. - -**`deprecated`** - -**Parameters:** - Name | Type | ------ | ------ | `key` | Buffer | `value` | Buffer | -`cb` | ErrorCallback | -**Returns:** *void* +**Returns:** *Promise‹void›* ___ @@ -552,7 +471,7 @@ ___ ▸ **setRoot**(`value?`: Buffer): *void* -*Defined in [baseTrie.ts:109](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L109)* +*Defined in [baseTrie.ts:104](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L104)* **Parameters:** @@ -568,7 +487,7 @@ ___ ▸ **fromProof**(`proofNodes`: Buffer[], `proofTrie?`: [Trie](_basetrie_.trie.md)): *Promise‹[Trie](_basetrie_.trie.md)›* -*Defined in [baseTrie.ts:50](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L50)* +*Defined in [baseTrie.ts:54](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L54)* **Parameters:** @@ -585,7 +504,7 @@ ___ ▸ **prove**(`trie`: [Trie](_basetrie_.trie.md), `key`: Buffer): *Promise‹Buffer[]›* -*Defined in [baseTrie.ts:70](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L70)* +*Defined in [baseTrie.ts:74](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L74)* **Parameters:** @@ -602,7 +521,7 @@ ___ ▸ **verifyProof**(`rootHash`: Buffer, `key`: Buffer, `proofNodes`: Buffer[]): *Promise‹Buffer | null›* -*Defined in [baseTrie.ts:87](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L87)* +*Defined in [baseTrie.ts:82](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L82)* **Parameters:** diff --git a/docs/classes/_checkpointtrie_.checkpointtrie.md b/docs/classes/_checkpointtrie_.checkpointtrie.md index 96fcca2..c2532c7 100644 --- a/docs/classes/_checkpointtrie_.checkpointtrie.md +++ b/docs/classes/_checkpointtrie_.checkpointtrie.md @@ -51,12 +51,9 @@ * [copy](_checkpointtrie_.checkpointtrie.md#copy) * [createReadStream](_checkpointtrie_.checkpointtrie.md#createreadstream) * [del](_checkpointtrie_.checkpointtrie.md#del) -* [delRaw](_checkpointtrie_.checkpointtrie.md#delraw) * [findPath](_checkpointtrie_.checkpointtrie.md#findpath) * [get](_checkpointtrie_.checkpointtrie.md#get) -* [getRaw](_checkpointtrie_.checkpointtrie.md#getraw) * [put](_checkpointtrie_.checkpointtrie.md#put) -* [putRaw](_checkpointtrie_.checkpointtrie.md#putraw) * [revert](_checkpointtrie_.checkpointtrie.md#revert) * [setRoot](_checkpointtrie_.checkpointtrie.md#setroot) * [fromProof](_checkpointtrie_.checkpointtrie.md#static-fromproof) @@ -71,7 +68,7 @@ *Overrides [Trie](_basetrie_.trie.md).[constructor](_basetrie_.trie.md#constructor)* -*Defined in [checkpointTrie.ts:14](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L14)* +*Defined in [checkpointTrie.ts:11](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L11)* **Parameters:** @@ -89,7 +86,7 @@ Name | Type | *Inherited from [Trie](_basetrie_.trie.md).[EMPTY_TRIE_ROOT](_basetrie_.trie.md#empty_trie_root)* -*Defined in [baseTrie.ts:35](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L35)* +*Defined in [baseTrie.ts:39](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L39)* ___ @@ -97,7 +94,7 @@ ___ • **_checkpoints**: *Buffer[]* -*Defined in [checkpointTrie.ts:14](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L14)* +*Defined in [checkpointTrie.ts:11](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L11)* ___ @@ -105,7 +102,7 @@ ___ • **_mainDB**: *DB* -*Defined in [checkpointTrie.ts:12](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L12)* +*Defined in [checkpointTrie.ts:9](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L9)* ___ @@ -113,7 +110,7 @@ ___ • **_scratch**: *ScratchDB | null* -*Defined in [checkpointTrie.ts:13](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L13)* +*Defined in [checkpointTrie.ts:10](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L10)* ___ @@ -123,7 +120,7 @@ ___ *Inherited from [Trie](_basetrie_.trie.md).[db](_basetrie_.trie.md#db)* -*Defined in [baseTrie.ts:36](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L36)* +*Defined in [baseTrie.ts:40](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L40)* ## Accessors @@ -131,7 +128,7 @@ ___ • **get isCheckpoint**(): *boolean* -*Defined in [checkpointTrie.ts:29](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L29)* +*Defined in [checkpointTrie.ts:26](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L26)* Is the trie during a checkpoint phase? @@ -145,7 +142,7 @@ ___ *Inherited from [Trie](_basetrie_.trie.md).[root](_basetrie_.trie.md#root)* -*Defined in [baseTrie.ts:105](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L105)* +*Defined in [baseTrie.ts:100](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L100)* **Returns:** *Buffer* @@ -153,7 +150,7 @@ ___ *Inherited from [Trie](_basetrie_.trie.md).[root](_basetrie_.trie.md#root)* -*Defined in [baseTrie.ts:101](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L101)* +*Defined in [baseTrie.ts:96](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L96)* **Parameters:** @@ -167,11 +164,11 @@ Name | Type | ### _createInitialNode -▸ **_createInitialNode**(`key`: Buffer, `value`: Buffer, `cb`: ErrorCallback): *void* +▸ **_createInitialNode**(`key`: Buffer, `value`: Buffer): *Promise‹void›* *Inherited from [Trie](_basetrie_.trie.md).[_createInitialNode](_basetrie_.trie.md#_createinitialnode)* -*Defined in [baseTrie.ts:737](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L737)* +*Defined in [baseTrie.ts:651](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L651)* **Parameters:** @@ -179,17 +176,16 @@ Name | Type | ------ | ------ | `key` | Buffer | `value` | Buffer | -`cb` | ErrorCallback | -**Returns:** *void* +**Returns:** *Promise‹void›* ___ ### `Private` _createScratchReadStream -▸ **_createScratchReadStream**(`scratch`: ScratchDB): *ScratchReadStream‹›* +▸ **_createScratchReadStream**(`scratchDb?`: ScratchDB): *ScratchReadStream‹›* -*Defined in [checkpointTrie.ts:152](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L152)* +*Defined in [checkpointTrie.ts:137](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L137)* Returns a `ScratchReadStream` based on the state updates since checkpoint. @@ -200,7 +196,7 @@ since checkpoint. Name | Type | ------ | ------ | -`scratch` | ScratchDB | +`scratchDb?` | ScratchDB | **Returns:** *ScratchReadStream‹›* @@ -208,11 +204,11 @@ ___ ### _deleteNode -▸ **_deleteNode**(`k`: Buffer, `stack`: TrieNode[], `cb`: Function): *any* +▸ **_deleteNode**(`k`: Buffer, `stack`: TrieNode[]): *Promise‹void›* *Inherited from [Trie](_basetrie_.trie.md).[_deleteNode](_basetrie_.trie.md#_deletenode)* -*Defined in [baseTrie.ts:619](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L619)* +*Defined in [baseTrie.ts:529](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L529)* **Parameters:** @@ -220,9 +216,8 @@ Name | Type | ------ | ------ | `k` | Buffer | `stack` | TrieNode[] | -`cb` | Function | -**Returns:** *any* +**Returns:** *Promise‹void›* ___ @@ -230,7 +225,7 @@ ___ ▸ **_enterCpMode**(): *void* -*Defined in [checkpointTrie.ts:125](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L125)* +*Defined in [checkpointTrie.ts:106](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L106)* Enter into checkpoint mode. @@ -240,9 +235,9 @@ ___ ### `Private` _exitCpMode -▸ **_exitCpMode**(`commitState`: boolean, `cb`: Function): *void* +▸ **_exitCpMode**(`commitState`: boolean): *Promise‹void›* -*Defined in [checkpointTrie.ts:134](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L134)* +*Defined in [checkpointTrie.ts:115](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L115)* Exit from checkpoint mode. @@ -251,47 +246,44 @@ Exit from checkpoint mode. Name | Type | ------ | ------ | `commitState` | boolean | -`cb` | Function | -**Returns:** *void* +**Returns:** *Promise‹void›* ___ ### _findDbNodes -▸ **_findDbNodes**(`onFound`: Function, `cb`: Function): *void* +▸ **_findDbNodes**(`onFound`: FoundNode): *Promise‹void›* *Inherited from [Trie](_basetrie_.trie.md).[_findDbNodes](_basetrie_.trie.md#_finddbnodes)* -*Defined in [baseTrie.ts:348](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L348)* +*Defined in [baseTrie.ts:279](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L279)* **Parameters:** Name | Type | ------ | ------ | -`onFound` | Function | -`cb` | Function | +`onFound` | FoundNode | -**Returns:** *void* +**Returns:** *Promise‹void›* ___ ### _findValueNodes -▸ **_findValueNodes**(`onFound`: Function, `cb`: Function): *void* +▸ **_findValueNodes**(`onFound`: FoundNode): *Promise‹void›* *Inherited from [Trie](_basetrie_.trie.md).[_findValueNodes](_basetrie_.trie.md#_findvaluenodes)* -*Defined in [baseTrie.ts:322](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L322)* +*Defined in [baseTrie.ts:257](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L257)* **Parameters:** Name | Type | ------ | ------ | -`onFound` | Function | -`cb` | Function | +`onFound` | FoundNode | -**Returns:** *void* +**Returns:** *Promise‹void›* ___ @@ -301,7 +293,7 @@ ___ *Overrides [Trie](_basetrie_.trie.md).[_formatNode](_basetrie_.trie.md#_formatnode)* -*Defined in [checkpointTrie.ts:161](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L161)* +*Defined in [checkpointTrie.ts:149](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L149)* **Parameters:** @@ -318,49 +310,47 @@ ___ ### _lookupNode -▸ **_lookupNode**(`node`: Buffer | Buffer[], `cb`: Function): *void* +▸ **_lookupNode**(`node`: Buffer | Buffer[]): *Promise‹TrieNode | null›* *Inherited from [Trie](_basetrie_.trie.md).[_lookupNode](_basetrie_.trie.md#_lookupnode)* -*Defined in [baseTrie.ts:232](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L232)* +*Defined in [baseTrie.ts:172](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L172)* **Parameters:** Name | Type | ------ | ------ | `node` | Buffer | Buffer[] | -`cb` | Function | -**Returns:** *void* +**Returns:** *Promise‹TrieNode | null›* ___ ### _putNode -▸ **_putNode**(`node`: TrieNode, `cb`: ErrorCallback): *void* +▸ **_putNode**(`node`: TrieNode): *Promise‹void›* *Inherited from [Trie](_basetrie_.trie.md).[_putNode](_basetrie_.trie.md#_putnode)* -*Defined in [baseTrie.ts:249](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L249)* +*Defined in [baseTrie.ts:190](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L190)* **Parameters:** Name | Type | ------ | ------ | `node` | TrieNode | -`cb` | ErrorCallback | -**Returns:** *void* +**Returns:** *Promise‹void›* ___ ### `Private` _saveStack -▸ **_saveStack**(`key`: number[], `stack`: TrieNode[], `opStack`: BatchDBOp[], `cb`: ErrorCallback): *void* +▸ **_saveStack**(`key`: number[], `stack`: TrieNode[], `opStack`: BatchDBOp[]): *Promise‹void›* *Inherited from [Trie](_basetrie_.trie.md).[_saveStack](_basetrie_.trie.md#private-_savestack)* -*Defined in [baseTrie.ts:590](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L590)* +*Defined in [baseTrie.ts:500](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L500)* saves a stack @@ -373,19 +363,18 @@ Name | Type | Description | `key` | number[] | the key. Should follow the stack | `stack` | TrieNode[] | a stack of nodes to the value given by the key | `opStack` | BatchDBOp[] | a stack of levelup operations to commit at the end of this funciton | -`cb` | ErrorCallback | | -**Returns:** *void* +**Returns:** *Promise‹void›* ___ ### `Private` _updateNode -▸ **_updateNode**(`k`: Buffer, `value`: Buffer, `keyRemainder`: number[], `stack`: TrieNode[], `cb`: ErrorCallback): *void* +▸ **_updateNode**(`k`: Buffer, `value`: Buffer, `keyRemainder`: number[], `stack`: TrieNode[]): *Promise‹void›* *Inherited from [Trie](_basetrie_.trie.md).[_updateNode](_basetrie_.trie.md#private-_updatenode)* -*Defined in [baseTrie.ts:372](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L372)* +*Defined in [baseTrie.ts:299](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L299)* Updates a node @@ -393,45 +382,43 @@ Updates a node **Parameters:** -Name | Type | Description | ------- | ------ | ------ | -`k` | Buffer | - | -`value` | Buffer | - | -`keyRemainder` | number[] | - | -`stack` | TrieNode[] | - | -`cb` | ErrorCallback | the callback | +Name | Type | +------ | ------ | +`k` | Buffer | +`value` | Buffer | +`keyRemainder` | number[] | +`stack` | TrieNode[] | -**Returns:** *void* +**Returns:** *Promise‹void›* ___ ### _walkTrie -▸ **_walkTrie**(`root`: Buffer, `onNode`: Function, `onDone`: Function): *any* +▸ **_walkTrie**(`root`: Buffer, `onNode`: FoundNode): *Promise‹void›* *Inherited from [Trie](_basetrie_.trie.md).[_walkTrie](_basetrie_.trie.md#_walktrie)* -*Defined in [baseTrie.ts:475](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L475)* +*Defined in [baseTrie.ts:399](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L399)* **Parameters:** Name | Type | ------ | ------ | `root` | Buffer | -`onNode` | Function | -`onDone` | Function | +`onNode` | FoundNode | -**Returns:** *any* +**Returns:** *Promise‹void›* ___ ### batch -▸ **batch**(`ops`: BatchDBOp[], `cb`: ErrorCallback): *void* +▸ **batch**(`ops`: BatchDBOp[]): *Promise‹void›* *Inherited from [Trie](_basetrie_.trie.md).[batch](_basetrie_.trie.md#batch)* -*Defined in [baseTrie.ts:801](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L801)* +*Defined in [baseTrie.ts:713](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L713)* The given hash of operations (key additions or deletions) are executed on the DB @@ -440,44 +427,42 @@ The given hash of operations (key additions or deletions) are executed on the DB **`memberof`** Trie **`example`** -var ops = [ +const ops = [ { type: 'del', key: Buffer.from('father') } , { type: 'put', key: Buffer.from('name'), value: Buffer.from('Yuri Irsenovich Kim') } , { type: 'put', key: Buffer.from('dob'), value: Buffer.from('16 February 1941') } , { type: 'put', key: Buffer.from('spouse'), value: Buffer.from('Kim Young-sook') } , { type: 'put', key: Buffer.from('occupation'), value: Buffer.from('Clown') } ] -trie.batch(ops) +await trie.batch(ops) **Parameters:** -Name | Type | Description | ------- | ------ | ------ | -`ops` | BatchDBOp[] | - | -`cb` | ErrorCallback | | +Name | Type | +------ | ------ | +`ops` | BatchDBOp[] | -**Returns:** *void* +**Returns:** *Promise‹void›* ___ ### checkRoot -▸ **checkRoot**(`root`: Buffer, `cb`: Function): *void* +▸ **checkRoot**(`root`: Buffer): *Promise‹boolean›* *Inherited from [Trie](_basetrie_.trie.md).[checkRoot](_basetrie_.trie.md#checkroot)* -*Defined in [baseTrie.ts:821](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L821)* +*Defined in [baseTrie.ts:729](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L729)* -Checks if a given root exists +Checks if a given root exists. **Parameters:** Name | Type | ------ | ------ | `root` | Buffer | -`cb` | Function | -**Returns:** *void* +**Returns:** *Promise‹boolean›* ___ @@ -485,7 +470,7 @@ ___ ▸ **checkpoint**(): *void* -*Defined in [checkpointTrie.ts:39](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L39)* +*Defined in [checkpointTrie.ts:36](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L36)* Creates a checkpoint that can later be reverted to or committed. After this is called, no changes to the trie will be permanently saved @@ -498,9 +483,9 @@ ___ ### commit -▸ **commit**(`cb`: Function): *void* +▸ **commit**(): *Promise‹void›* -*Defined in [checkpointTrie.ts:56](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L56)* +*Defined in [checkpointTrie.ts:53](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L53)* Commits a checkpoint to disk, if current checkpoint is not nested. If nested, only sets the parent checkpoint as current checkpoint. @@ -509,13 +494,7 @@ nested, only sets the parent checkpoint as current checkpoint. **`throws`** If not during a checkpoint phase -**Parameters:** - -Name | Type | Description | ------- | ------ | ------ | -`cb` | Function | the callback | - -**Returns:** *void* +**Returns:** *Promise‹void›* ___ @@ -525,7 +504,7 @@ ___ *Overrides [Trie](_basetrie_.trie.md).[copy](_basetrie_.trie.md#copy)* -*Defined in [checkpointTrie.ts:101](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L101)* +*Defined in [checkpointTrie.ts:91](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L91)* Returns a copy of the underlying trie with the interface of CheckpointTrie. If during a checkpoint, the copy will @@ -547,9 +526,9 @@ ___ *Inherited from [Trie](_basetrie_.trie.md).[createReadStream](_basetrie_.trie.md#createreadstream)* -*Defined in [baseTrie.ts:774](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L774)* +*Defined in [baseTrie.ts:686](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L686)* -The `data` event is given an `Object` hat has two properties; the `key` and the `value`. Both should be Buffers. +The `data` event is given an `Object` that has two properties; the `key` and the `value`. Both should be Buffers. **`method`** createReadStream @@ -563,11 +542,11 @@ ___ ### del -▸ **del**(`key`: Buffer, `cb`: ErrorCallback): *void* +▸ **del**(`key`: Buffer): *Promise‹void›* *Inherited from [Trie](_basetrie_.trie.md).[del](_basetrie_.trie.md#del)* -*Defined in [baseTrie.ts:185](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L185)* +*Defined in [baseTrie.ts:162](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L162)* deletes a value given a `key` @@ -580,45 +559,21 @@ deletes a value given a `key` Name | Type | ------ | ------ | `key` | Buffer | -`cb` | ErrorCallback | - -**Returns:** *void* - -___ - -### delRaw - -▸ **delRaw**(`key`: Buffer, `cb`: ErrorCallback): *void* - -*Inherited from [Trie](_basetrie_.trie.md).[delRaw](_basetrie_.trie.md#delraw)* - -*Defined in [baseTrie.ts:227](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L227)* - -Deletes key directly from underlying key/value db. - -**`deprecated`** - -**Parameters:** - -Name | Type | ------- | ------ | -`key` | Buffer | -`cb` | ErrorCallback | -**Returns:** *void* +**Returns:** *Promise‹void›* ___ ### findPath -▸ **findPath**(`key`: Buffer, `cb`: Function): *void* +▸ **findPath**(`key`: Buffer): *Promise‹Path›* *Inherited from [Trie](_basetrie_.trie.md).[findPath](_basetrie_.trie.md#findpath)* -*Defined in [baseTrie.ts:268](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L268)* +*Defined in [baseTrie.ts:204](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L204)* -Tries to find a path to the node for the given key -It returns a `stack` of nodes to the closet node +Tries to find a path to the node for the given key. +It returns a `stack` of nodes to the closet node. **`method`** findPath @@ -626,22 +581,21 @@ It returns a `stack` of nodes to the closet node **Parameters:** -Name | Type | ------- | ------ | -`key` | Buffer | -`cb` | Function | +Name | Type | Description | +------ | ------ | ------ | +`key` | Buffer | the search key | -**Returns:** *void* +**Returns:** *Promise‹Path›* ___ ### get -▸ **get**(`key`: Buffer, `cb`: BufferCallback): *void* +▸ **get**(`key`: Buffer): *Promise‹Buffer | null›* *Inherited from [Trie](_basetrie_.trie.md).[get](_basetrie_.trie.md#get)* -*Defined in [baseTrie.ts:127](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L127)* +*Defined in [baseTrie.ts:119](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L119)* Gets a value given a `key` @@ -654,42 +608,20 @@ Gets a value given a `key` Name | Type | Description | ------ | ------ | ------ | `key` | Buffer | the key to search for | -`cb` | BufferCallback | A callback `Function` which is given the arguments `err` - for errors that may have occured and `value` - the found value in a `Buffer` or if no value was found `null` | - -**Returns:** *void* - -___ - -### getRaw - -▸ **getRaw**(`key`: Buffer, `cb`: BufferCallback): *void* -*Inherited from [Trie](_basetrie_.trie.md).[getRaw](_basetrie_.trie.md#getraw)* - -*Defined in [baseTrie.ts:210](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L210)* - -Retrieves a value directly from key/value db. - -**`deprecated`** - -**Parameters:** - -Name | Type | ------- | ------ | -`key` | Buffer | -`cb` | BufferCallback | +**Returns:** *Promise‹Buffer | null›* -**Returns:** *void* +- Returns a promise that resolves to `Buffer` if a value was found or `null` if no value was found. ___ ### put -▸ **put**(`key`: Buffer, `value`: Buffer, `cb`: ErrorCallback): *void* +▸ **put**(`key`: Buffer, `value`: Buffer): *Promise‹void›* *Inherited from [Trie](_basetrie_.trie.md).[put](_basetrie_.trie.md#put)* -*Defined in [baseTrie.ts:149](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L149)* +*Defined in [baseTrie.ts:136](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L136)* Stores a given `value` at the given `key` @@ -699,58 +631,26 @@ Stores a given `value` at the given `key` **Parameters:** -Name | Type | Description | ------- | ------ | ------ | -`key` | Buffer | - | -`value` | Buffer | - | -`cb` | ErrorCallback | A callback `Function` which is given the argument `err` - for errors that may have occured | - -**Returns:** *void* - -___ - -### putRaw - -▸ **putRaw**(`key`: Buffer, `value`: Buffer, `cb`: ErrorCallback): *void* - -*Overrides [Trie](_basetrie_.trie.md).[putRaw](_basetrie_.trie.md#putraw)* - -*Defined in [checkpointTrie.ts:117](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L117)* - -Writes a value under given key directly to the -key/value db, disregarding checkpoints. - -**`deprecated`** - -**Parameters:** - Name | Type | ------ | ------ | `key` | Buffer | `value` | Buffer | -`cb` | ErrorCallback | -**Returns:** *void* +**Returns:** *Promise‹void›* ___ ### revert -▸ **revert**(`cb`: Function): *void* +▸ **revert**(): *Promise‹void›* -*Defined in [checkpointTrie.ts:78](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L78)* +*Defined in [checkpointTrie.ts:73](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L73)* Reverts the trie to the state it was at when `checkpoint` was first called. If during a nested checkpoint, sets root to most recent checkpoint, and sets parent checkpoint as current. -**Parameters:** - -Name | Type | ------- | ------ | -`cb` | Function | - -**Returns:** *void* +**Returns:** *Promise‹void›* ___ @@ -760,7 +660,7 @@ ___ *Inherited from [Trie](_basetrie_.trie.md).[setRoot](_basetrie_.trie.md#setroot)* -*Defined in [baseTrie.ts:109](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L109)* +*Defined in [baseTrie.ts:104](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L104)* **Parameters:** @@ -778,7 +678,7 @@ ___ *Inherited from [Trie](_basetrie_.trie.md).[fromProof](_basetrie_.trie.md#static-fromproof)* -*Defined in [baseTrie.ts:50](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L50)* +*Defined in [baseTrie.ts:54](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L54)* **Parameters:** @@ -797,7 +697,7 @@ ___ *Inherited from [Trie](_basetrie_.trie.md).[prove](_basetrie_.trie.md#static-prove)* -*Defined in [baseTrie.ts:70](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L70)* +*Defined in [baseTrie.ts:74](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L74)* **Parameters:** @@ -816,7 +716,7 @@ ___ *Inherited from [Trie](_basetrie_.trie.md).[verifyProof](_basetrie_.trie.md#static-verifyproof)* -*Defined in [baseTrie.ts:87](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L87)* +*Defined in [baseTrie.ts:82](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L82)* **Parameters:** diff --git a/docs/classes/_secure_.securetrie.md b/docs/classes/_secure_.securetrie.md index a359c14..4a61cdf 100644 --- a/docs/classes/_secure_.securetrie.md +++ b/docs/classes/_secure_.securetrie.md @@ -57,12 +57,9 @@ It has the same methods and constructor as `Trie`. * [copy](_secure_.securetrie.md#copy) * [createReadStream](_secure_.securetrie.md#createreadstream) * [del](_secure_.securetrie.md#del) -* [delRaw](_secure_.securetrie.md#delraw) * [findPath](_secure_.securetrie.md#findpath) * [get](_secure_.securetrie.md#get) -* [getRaw](_secure_.securetrie.md#getraw) * [put](_secure_.securetrie.md#put) -* [putRaw](_secure_.securetrie.md#putraw) * [revert](_secure_.securetrie.md#revert) * [setRoot](_secure_.securetrie.md#setroot) * [fromProof](_secure_.securetrie.md#static-fromproof) @@ -77,7 +74,7 @@ It has the same methods and constructor as `Trie`. *Overrides [CheckpointTrie](_checkpointtrie_.checkpointtrie.md).[constructor](_checkpointtrie_.checkpointtrie.md#constructor)* -*Defined in [secure.ts:13](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/secure.ts#L13)* +*Defined in [secure.ts:12](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/secure.ts#L12)* **Parameters:** @@ -95,7 +92,7 @@ Name | Type | *Inherited from [Trie](_basetrie_.trie.md).[EMPTY_TRIE_ROOT](_basetrie_.trie.md#empty_trie_root)* -*Defined in [baseTrie.ts:35](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L35)* +*Defined in [baseTrie.ts:39](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L39)* ___ @@ -105,7 +102,7 @@ ___ *Inherited from [CheckpointTrie](_checkpointtrie_.checkpointtrie.md).[_checkpoints](_checkpointtrie_.checkpointtrie.md#_checkpoints)* -*Defined in [checkpointTrie.ts:14](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L14)* +*Defined in [checkpointTrie.ts:11](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L11)* ___ @@ -115,7 +112,7 @@ ___ *Inherited from [CheckpointTrie](_checkpointtrie_.checkpointtrie.md).[_mainDB](_checkpointtrie_.checkpointtrie.md#_maindb)* -*Defined in [checkpointTrie.ts:12](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L12)* +*Defined in [checkpointTrie.ts:9](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L9)* ___ @@ -125,7 +122,7 @@ ___ *Inherited from [CheckpointTrie](_checkpointtrie_.checkpointtrie.md).[_scratch](_checkpointtrie_.checkpointtrie.md#_scratch)* -*Defined in [checkpointTrie.ts:13](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L13)* +*Defined in [checkpointTrie.ts:10](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L10)* ___ @@ -135,7 +132,7 @@ ___ *Inherited from [Trie](_basetrie_.trie.md).[db](_basetrie_.trie.md#db)* -*Defined in [baseTrie.ts:36](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L36)* +*Defined in [baseTrie.ts:40](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L40)* ## Accessors @@ -145,7 +142,7 @@ ___ *Inherited from [CheckpointTrie](_checkpointtrie_.checkpointtrie.md).[isCheckpoint](_checkpointtrie_.checkpointtrie.md#ischeckpoint)* -*Defined in [checkpointTrie.ts:29](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L29)* +*Defined in [checkpointTrie.ts:26](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L26)* Is the trie during a checkpoint phase? @@ -159,7 +156,7 @@ ___ *Inherited from [Trie](_basetrie_.trie.md).[root](_basetrie_.trie.md#root)* -*Defined in [baseTrie.ts:105](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L105)* +*Defined in [baseTrie.ts:100](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L100)* **Returns:** *Buffer* @@ -167,7 +164,7 @@ ___ *Inherited from [Trie](_basetrie_.trie.md).[root](_basetrie_.trie.md#root)* -*Defined in [baseTrie.ts:101](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L101)* +*Defined in [baseTrie.ts:96](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L96)* **Parameters:** @@ -181,11 +178,11 @@ Name | Type | ### _createInitialNode -▸ **_createInitialNode**(`key`: Buffer, `value`: Buffer, `cb`: ErrorCallback): *void* +▸ **_createInitialNode**(`key`: Buffer, `value`: Buffer): *Promise‹void›* *Inherited from [Trie](_basetrie_.trie.md).[_createInitialNode](_basetrie_.trie.md#_createinitialnode)* -*Defined in [baseTrie.ts:737](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L737)* +*Defined in [baseTrie.ts:651](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L651)* **Parameters:** @@ -193,19 +190,18 @@ Name | Type | ------ | ------ | `key` | Buffer | `value` | Buffer | -`cb` | ErrorCallback | -**Returns:** *void* +**Returns:** *Promise‹void›* ___ ### `Private` _createScratchReadStream -▸ **_createScratchReadStream**(`scratch`: ScratchDB): *ScratchReadStream‹›* +▸ **_createScratchReadStream**(`scratchDb?`: ScratchDB): *ScratchReadStream‹›* *Inherited from [CheckpointTrie](_checkpointtrie_.checkpointtrie.md).[_createScratchReadStream](_checkpointtrie_.checkpointtrie.md#private-_createscratchreadstream)* -*Defined in [checkpointTrie.ts:152](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L152)* +*Defined in [checkpointTrie.ts:137](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L137)* Returns a `ScratchReadStream` based on the state updates since checkpoint. @@ -216,7 +212,7 @@ since checkpoint. Name | Type | ------ | ------ | -`scratch` | ScratchDB | +`scratchDb?` | ScratchDB | **Returns:** *ScratchReadStream‹›* @@ -224,11 +220,11 @@ ___ ### _deleteNode -▸ **_deleteNode**(`k`: Buffer, `stack`: TrieNode[], `cb`: Function): *any* +▸ **_deleteNode**(`k`: Buffer, `stack`: TrieNode[]): *Promise‹void›* *Inherited from [Trie](_basetrie_.trie.md).[_deleteNode](_basetrie_.trie.md#_deletenode)* -*Defined in [baseTrie.ts:619](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L619)* +*Defined in [baseTrie.ts:529](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L529)* **Parameters:** @@ -236,9 +232,8 @@ Name | Type | ------ | ------ | `k` | Buffer | `stack` | TrieNode[] | -`cb` | Function | -**Returns:** *any* +**Returns:** *Promise‹void›* ___ @@ -248,7 +243,7 @@ ___ *Inherited from [CheckpointTrie](_checkpointtrie_.checkpointtrie.md).[_enterCpMode](_checkpointtrie_.checkpointtrie.md#private-_entercpmode)* -*Defined in [checkpointTrie.ts:125](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L125)* +*Defined in [checkpointTrie.ts:106](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L106)* Enter into checkpoint mode. @@ -258,11 +253,11 @@ ___ ### `Private` _exitCpMode -▸ **_exitCpMode**(`commitState`: boolean, `cb`: Function): *void* +▸ **_exitCpMode**(`commitState`: boolean): *Promise‹void›* *Inherited from [CheckpointTrie](_checkpointtrie_.checkpointtrie.md).[_exitCpMode](_checkpointtrie_.checkpointtrie.md#private-_exitcpmode)* -*Defined in [checkpointTrie.ts:134](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L134)* +*Defined in [checkpointTrie.ts:115](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L115)* Exit from checkpoint mode. @@ -271,47 +266,44 @@ Exit from checkpoint mode. Name | Type | ------ | ------ | `commitState` | boolean | -`cb` | Function | -**Returns:** *void* +**Returns:** *Promise‹void›* ___ ### _findDbNodes -▸ **_findDbNodes**(`onFound`: Function, `cb`: Function): *void* +▸ **_findDbNodes**(`onFound`: FoundNode): *Promise‹void›* *Inherited from [Trie](_basetrie_.trie.md).[_findDbNodes](_basetrie_.trie.md#_finddbnodes)* -*Defined in [baseTrie.ts:348](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L348)* +*Defined in [baseTrie.ts:279](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L279)* **Parameters:** Name | Type | ------ | ------ | -`onFound` | Function | -`cb` | Function | +`onFound` | FoundNode | -**Returns:** *void* +**Returns:** *Promise‹void›* ___ ### _findValueNodes -▸ **_findValueNodes**(`onFound`: Function, `cb`: Function): *void* +▸ **_findValueNodes**(`onFound`: FoundNode): *Promise‹void›* *Inherited from [Trie](_basetrie_.trie.md).[_findValueNodes](_basetrie_.trie.md#_findvaluenodes)* -*Defined in [baseTrie.ts:322](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L322)* +*Defined in [baseTrie.ts:257](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L257)* **Parameters:** Name | Type | ------ | ------ | -`onFound` | Function | -`cb` | Function | +`onFound` | FoundNode | -**Returns:** *void* +**Returns:** *Promise‹void›* ___ @@ -323,7 +315,7 @@ ___ *Overrides [Trie](_basetrie_.trie.md).[_formatNode](_basetrie_.trie.md#_formatnode)* -*Defined in [checkpointTrie.ts:161](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L161)* +*Defined in [checkpointTrie.ts:149](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L149)* **Parameters:** @@ -340,49 +332,47 @@ ___ ### _lookupNode -▸ **_lookupNode**(`node`: Buffer | Buffer[], `cb`: Function): *void* +▸ **_lookupNode**(`node`: Buffer | Buffer[]): *Promise‹TrieNode | null›* *Inherited from [Trie](_basetrie_.trie.md).[_lookupNode](_basetrie_.trie.md#_lookupnode)* -*Defined in [baseTrie.ts:232](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L232)* +*Defined in [baseTrie.ts:172](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L172)* **Parameters:** Name | Type | ------ | ------ | `node` | Buffer | Buffer[] | -`cb` | Function | -**Returns:** *void* +**Returns:** *Promise‹TrieNode | null›* ___ ### _putNode -▸ **_putNode**(`node`: TrieNode, `cb`: ErrorCallback): *void* +▸ **_putNode**(`node`: TrieNode): *Promise‹void›* *Inherited from [Trie](_basetrie_.trie.md).[_putNode](_basetrie_.trie.md#_putnode)* -*Defined in [baseTrie.ts:249](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L249)* +*Defined in [baseTrie.ts:190](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L190)* **Parameters:** Name | Type | ------ | ------ | `node` | TrieNode | -`cb` | ErrorCallback | -**Returns:** *void* +**Returns:** *Promise‹void›* ___ ### `Private` _saveStack -▸ **_saveStack**(`key`: number[], `stack`: TrieNode[], `opStack`: BatchDBOp[], `cb`: ErrorCallback): *void* +▸ **_saveStack**(`key`: number[], `stack`: TrieNode[], `opStack`: BatchDBOp[]): *Promise‹void›* *Inherited from [Trie](_basetrie_.trie.md).[_saveStack](_basetrie_.trie.md#private-_savestack)* -*Defined in [baseTrie.ts:590](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L590)* +*Defined in [baseTrie.ts:500](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L500)* saves a stack @@ -395,19 +385,18 @@ Name | Type | Description | `key` | number[] | the key. Should follow the stack | `stack` | TrieNode[] | a stack of nodes to the value given by the key | `opStack` | BatchDBOp[] | a stack of levelup operations to commit at the end of this funciton | -`cb` | ErrorCallback | | -**Returns:** *void* +**Returns:** *Promise‹void›* ___ ### `Private` _updateNode -▸ **_updateNode**(`k`: Buffer, `value`: Buffer, `keyRemainder`: number[], `stack`: TrieNode[], `cb`: ErrorCallback): *void* +▸ **_updateNode**(`k`: Buffer, `value`: Buffer, `keyRemainder`: number[], `stack`: TrieNode[]): *Promise‹void›* *Inherited from [Trie](_basetrie_.trie.md).[_updateNode](_basetrie_.trie.md#private-_updatenode)* -*Defined in [baseTrie.ts:372](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L372)* +*Defined in [baseTrie.ts:299](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L299)* Updates a node @@ -415,45 +404,43 @@ Updates a node **Parameters:** -Name | Type | Description | ------- | ------ | ------ | -`k` | Buffer | - | -`value` | Buffer | - | -`keyRemainder` | number[] | - | -`stack` | TrieNode[] | - | -`cb` | ErrorCallback | the callback | +Name | Type | +------ | ------ | +`k` | Buffer | +`value` | Buffer | +`keyRemainder` | number[] | +`stack` | TrieNode[] | -**Returns:** *void* +**Returns:** *Promise‹void›* ___ ### _walkTrie -▸ **_walkTrie**(`root`: Buffer, `onNode`: Function, `onDone`: Function): *any* +▸ **_walkTrie**(`root`: Buffer, `onNode`: FoundNode): *Promise‹void›* *Inherited from [Trie](_basetrie_.trie.md).[_walkTrie](_basetrie_.trie.md#_walktrie)* -*Defined in [baseTrie.ts:475](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L475)* +*Defined in [baseTrie.ts:399](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L399)* **Parameters:** Name | Type | ------ | ------ | `root` | Buffer | -`onNode` | Function | -`onDone` | Function | +`onNode` | FoundNode | -**Returns:** *any* +**Returns:** *Promise‹void›* ___ ### batch -▸ **batch**(`ops`: BatchDBOp[], `cb`: ErrorCallback): *void* +▸ **batch**(`ops`: BatchDBOp[]): *Promise‹void›* *Inherited from [Trie](_basetrie_.trie.md).[batch](_basetrie_.trie.md#batch)* -*Defined in [baseTrie.ts:801](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L801)* +*Defined in [baseTrie.ts:713](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L713)* The given hash of operations (key additions or deletions) are executed on the DB @@ -462,44 +449,42 @@ The given hash of operations (key additions or deletions) are executed on the DB **`memberof`** Trie **`example`** -var ops = [ +const ops = [ { type: 'del', key: Buffer.from('father') } , { type: 'put', key: Buffer.from('name'), value: Buffer.from('Yuri Irsenovich Kim') } , { type: 'put', key: Buffer.from('dob'), value: Buffer.from('16 February 1941') } , { type: 'put', key: Buffer.from('spouse'), value: Buffer.from('Kim Young-sook') } , { type: 'put', key: Buffer.from('occupation'), value: Buffer.from('Clown') } ] -trie.batch(ops) +await trie.batch(ops) **Parameters:** -Name | Type | Description | ------- | ------ | ------ | -`ops` | BatchDBOp[] | - | -`cb` | ErrorCallback | | +Name | Type | +------ | ------ | +`ops` | BatchDBOp[] | -**Returns:** *void* +**Returns:** *Promise‹void›* ___ ### checkRoot -▸ **checkRoot**(`root`: Buffer, `cb`: Function): *void* +▸ **checkRoot**(`root`: Buffer): *Promise‹boolean›* *Inherited from [Trie](_basetrie_.trie.md).[checkRoot](_basetrie_.trie.md#checkroot)* -*Defined in [baseTrie.ts:821](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L821)* +*Defined in [baseTrie.ts:729](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L729)* -Checks if a given root exists +Checks if a given root exists. **Parameters:** Name | Type | ------ | ------ | `root` | Buffer | -`cb` | Function | -**Returns:** *void* +**Returns:** *Promise‹boolean›* ___ @@ -509,7 +494,7 @@ ___ *Inherited from [CheckpointTrie](_checkpointtrie_.checkpointtrie.md).[checkpoint](_checkpointtrie_.checkpointtrie.md#checkpoint)* -*Defined in [checkpointTrie.ts:39](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L39)* +*Defined in [checkpointTrie.ts:36](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L36)* Creates a checkpoint that can later be reverted to or committed. After this is called, no changes to the trie will be permanently saved @@ -522,11 +507,11 @@ ___ ### commit -▸ **commit**(`cb`: Function): *void* +▸ **commit**(): *Promise‹void›* *Inherited from [CheckpointTrie](_checkpointtrie_.checkpointtrie.md).[commit](_checkpointtrie_.checkpointtrie.md#commit)* -*Defined in [checkpointTrie.ts:56](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L56)* +*Defined in [checkpointTrie.ts:53](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L53)* Commits a checkpoint to disk, if current checkpoint is not nested. If nested, only sets the parent checkpoint as current checkpoint. @@ -535,13 +520,7 @@ nested, only sets the parent checkpoint as current checkpoint. **`throws`** If not during a checkpoint phase -**Parameters:** - -Name | Type | Description | ------- | ------ | ------ | -`cb` | Function | the callback | - -**Returns:** *void* +**Returns:** *Promise‹void›* ___ @@ -551,7 +530,7 @@ ___ *Overrides [CheckpointTrie](_checkpointtrie_.checkpointtrie.md).[copy](_checkpointtrie_.checkpointtrie.md#copy)* -*Defined in [secure.ts:28](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/secure.ts#L28)* +*Defined in [secure.ts:27](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/secure.ts#L27)* **Returns:** *[SecureTrie](_secure_.securetrie.md)* @@ -563,9 +542,9 @@ ___ *Inherited from [Trie](_basetrie_.trie.md).[createReadStream](_basetrie_.trie.md#createreadstream)* -*Defined in [baseTrie.ts:774](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L774)* +*Defined in [baseTrie.ts:686](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L686)* -The `data` event is given an `Object` hat has two properties; the `key` and the `value`. Both should be Buffers. +The `data` event is given an `Object` that has two properties; the `key` and the `value`. Both should be Buffers. **`method`** createReadStream @@ -579,7 +558,7 @@ ___ ### del -▸ **del**(`key`: Buffer, `cb`: ErrorCallback): *void* +▸ **del**(`key`: Buffer): *Promise‹void›* *Overrides [Trie](_basetrie_.trie.md).[del](_basetrie_.trie.md#del)* @@ -590,45 +569,21 @@ ___ Name | Type | ------ | ------ | `key` | Buffer | -`cb` | ErrorCallback | -**Returns:** *void* - -___ - -### delRaw - -▸ **delRaw**(`key`: Buffer, `cb`: ErrorCallback): *void* - -*Inherited from [Trie](_basetrie_.trie.md).[delRaw](_basetrie_.trie.md#delraw)* - -*Defined in [baseTrie.ts:227](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L227)* - -Deletes key directly from underlying key/value db. - -**`deprecated`** - -**Parameters:** - -Name | Type | ------- | ------ | -`key` | Buffer | -`cb` | ErrorCallback | - -**Returns:** *void* +**Returns:** *Promise‹void›* ___ ### findPath -▸ **findPath**(`key`: Buffer, `cb`: Function): *void* +▸ **findPath**(`key`: Buffer): *Promise‹Path›* *Inherited from [Trie](_basetrie_.trie.md).[findPath](_basetrie_.trie.md#findpath)* -*Defined in [baseTrie.ts:268](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L268)* +*Defined in [baseTrie.ts:204](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L204)* -Tries to find a path to the node for the given key -It returns a `stack` of nodes to the closet node +Tries to find a path to the node for the given key. +It returns a `stack` of nodes to the closet node. **`method`** findPath @@ -636,60 +591,35 @@ It returns a `stack` of nodes to the closet node **Parameters:** -Name | Type | ------- | ------ | -`key` | Buffer | -`cb` | Function | +Name | Type | Description | +------ | ------ | ------ | +`key` | Buffer | the search key | -**Returns:** *void* +**Returns:** *Promise‹Path›* ___ ### get -▸ **get**(`key`: Buffer, `cb`: BufferCallback): *void* +▸ **get**(`key`: Buffer): *Promise‹Buffer | null›* *Overrides [Trie](_basetrie_.trie.md).[get](_basetrie_.trie.md#get)* -*Defined in [secure.ts:34](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/secure.ts#L34)* +*Defined in [secure.ts:33](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/secure.ts#L33)* **Parameters:** Name | Type | ------ | ------ | `key` | Buffer | -`cb` | BufferCallback | - -**Returns:** *void* - -___ - -### getRaw - -▸ **getRaw**(`key`: Buffer, `cb`: BufferCallback): *void* - -*Inherited from [Trie](_basetrie_.trie.md).[getRaw](_basetrie_.trie.md#getraw)* - -*Defined in [baseTrie.ts:210](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L210)* - -Retrieves a value directly from key/value db. -**`deprecated`** - -**Parameters:** - -Name | Type | ------- | ------ | -`key` | Buffer | -`cb` | BufferCallback | - -**Returns:** *void* +**Returns:** *Promise‹Buffer | null›* ___ ### put -▸ **put**(`key`: Buffer, `val`: Buffer, `cb`: ErrorCallback): *void* +▸ **put**(`key`: Buffer, `val`: Buffer): *Promise‹void›* *Overrides [Trie](_basetrie_.trie.md).[put](_basetrie_.trie.md#put)* @@ -704,58 +634,24 @@ Name | Type | ------ | ------ | `key` | Buffer | `val` | Buffer | -`cb` | ErrorCallback | - -**Returns:** *void* -___ - -### putRaw - -▸ **putRaw**(`key`: Buffer, `value`: Buffer, `cb`: ErrorCallback): *void* - -*Inherited from [CheckpointTrie](_checkpointtrie_.checkpointtrie.md).[putRaw](_checkpointtrie_.checkpointtrie.md#putraw)* - -*Overrides [Trie](_basetrie_.trie.md).[putRaw](_basetrie_.trie.md#putraw)* - -*Defined in [checkpointTrie.ts:117](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L117)* - -Writes a value under given key directly to the -key/value db, disregarding checkpoints. - -**`deprecated`** - -**Parameters:** - -Name | Type | ------- | ------ | -`key` | Buffer | -`value` | Buffer | -`cb` | ErrorCallback | - -**Returns:** *void* +**Returns:** *Promise‹void›* ___ ### revert -▸ **revert**(`cb`: Function): *void* +▸ **revert**(): *Promise‹void›* *Inherited from [CheckpointTrie](_checkpointtrie_.checkpointtrie.md).[revert](_checkpointtrie_.checkpointtrie.md#revert)* -*Defined in [checkpointTrie.ts:78](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L78)* +*Defined in [checkpointTrie.ts:73](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/checkpointTrie.ts#L73)* Reverts the trie to the state it was at when `checkpoint` was first called. If during a nested checkpoint, sets root to most recent checkpoint, and sets parent checkpoint as current. -**Parameters:** - -Name | Type | ------- | ------ | -`cb` | Function | - -**Returns:** *void* +**Returns:** *Promise‹void›* ___ @@ -765,7 +661,7 @@ ___ *Inherited from [Trie](_basetrie_.trie.md).[setRoot](_basetrie_.trie.md#setroot)* -*Defined in [baseTrie.ts:109](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L109)* +*Defined in [baseTrie.ts:104](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L104)* **Parameters:** @@ -783,7 +679,7 @@ ___ *Inherited from [Trie](_basetrie_.trie.md).[fromProof](_basetrie_.trie.md#static-fromproof)* -*Defined in [baseTrie.ts:50](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L50)* +*Defined in [baseTrie.ts:54](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/baseTrie.ts#L54)* **Parameters:** @@ -802,7 +698,7 @@ ___ *Overrides [Trie](_basetrie_.trie.md).[prove](_basetrie_.trie.md#static-prove)* -*Defined in [secure.ts:18](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/secure.ts#L18)* +*Defined in [secure.ts:17](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/secure.ts#L17)* **Parameters:** @@ -821,7 +717,7 @@ ___ *Overrides [Trie](_basetrie_.trie.md).[verifyProof](_basetrie_.trie.md#static-verifyproof)* -*Defined in [secure.ts:23](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/secure.ts#L23)* +*Defined in [secure.ts:22](https://github.com/ethereumjs/merkle-patricia-tree/blob/master/src/secure.ts#L22)* **Parameters:** diff --git a/package.json b/package.json index f219c46..99ce2f2 100644 --- a/package.json +++ b/package.json @@ -13,8 +13,6 @@ "prepublishOnly": "npm run test && npm run build", "coverage": "nyc --reporter=lcov npm run test:node", "docs:build": "npx typedoc", - "tslint": "ethereumjs-config-tslint", - "tslint:fix": "ethereumjs-config-tslint-fix", "lint": "ethereumjs-config-lint", "lint:fix": "ethereumjs-config-lint-fix", "format": "ethereumjs-config-format", @@ -49,24 +47,21 @@ ], "license": "MPL-2.0", "dependencies": { - "async": "^2.6.1", "ethereumjs-util": "^6.1.0", "level-mem": "^3.0.1", - "level-ws": "^1.0.0", - "readable-stream": "^3.0.6", + "level-ws": "^2.0.0", + "readable-stream": "^3.6.0", "rlp": "^2.2.3", - "semaphore": ">=1.0.1" + "semaphore-async-await": "^1.5.1" }, "devDependencies": { "@ethereumjs/config-nyc": "^1.1.1", "@ethereumjs/config-prettier": "^1.1.1", "@ethereumjs/config-tsc": "^1.1.1", "@ethereumjs/config-tslint": "^1.1.1", - "@types/async": "^3.0.8", "@types/bn.js": "^4.11.5", "@types/levelup": "^3.1.1", "@types/tape": "^4.2.34", - "browserify": "^16.5.0", "husky": "^4.2.3", "karma": "^4.4.1", "karma-chrome-launcher": "^3.1.0", diff --git a/src/baseTrie.ts b/src/baseTrie.ts index ae33241..e433036 100644 --- a/src/baseTrie.ts +++ b/src/baseTrie.ts @@ -1,11 +1,10 @@ +import Semaphore from 'semaphore-async-await' import { LevelUp } from 'levelup' -import * as ethUtil from 'ethereumjs-util' +import { keccak, KECCAK256_RLP } from 'ethereumjs-util' import { DB, BatchDBOp, PutBatch } from './db' import { TrieReadStream as ReadStream } from './readStream' import { PrioritizedTaskExecutor } from './prioritizedTaskExecutor' -import { callTogether } from './util/async' -import { stringToNibbles, matchingNibbleLength, doKeysMatch } from './util/nibbles' -import { BufferCallback, ErrorCallback } from './types' +import { bufferToNibbles, matchingNibbleLength, doKeysMatch } from './util/nibbles' import { TrieNode, decodeNode, @@ -17,29 +16,34 @@ import { EmbeddedNode, } from './trieNode' const assert = require('assert') -const async = require('async') -const semaphore = require('semaphore') -const { promisify } = require('util') + +interface Path { + node: TrieNode | null + remaining: number[] + stack: TrieNode[] +} + +type FoundNode = (nodeRef: Buffer, node: TrieNode, key: number[], walkController: any) => void /** - * Use `require('merkel-patricia-tree').BaseTrie` for the base interface. In Ethereum applications - * stick with the Secure Trie Overlay `require('merkel-patricia-tree').SecureTrie`. - * The API for the raw and the secure interface are about the same. - * @param {Object} [db] A [levelup](https://github.com/Level/levelup) instance. By default creates an in-memory [memdown](https://github.com/Level/memdown) instance. + * Use `import { BaseTrie as Trie } from 'merkle-patricia-tree'` for the base interface. + * In Ethereum applications stick with the Secure Trie Overlay `import { SecureTrie } from 'merkle-patricia-tree'`. + * The API for the base and the secure interface are about the same. + * @param {Object} [db] - A [levelup](https://github.com/Level/levelup) instance. By default creates an in-memory [memdown](https://github.com/Level/memdown) instance. * If the db is `null` or left undefined, then the trie will be stored in memory via [memdown](https://github.com/Level/memdown) - * @param {Buffer|String} [root] A hex `String` or `Buffer` for the root of a previously stored trie - * @prop {Buffer} root The current root of the `trie` - * @prop {Buffer} EMPTY_TRIE_ROOT the Root for an empty trie + * @param {Buffer} [root] - A `Buffer` for the root of a previously stored trie + * @prop {Buffer} root - The current root of the `trie` + * @prop {Buffer} EMPTY_TRIE_ROOT - The root for an empty trie */ export class Trie { EMPTY_TRIE_ROOT: Buffer db: DB - protected sem: any + protected lock: Semaphore private _root: Buffer constructor(db?: LevelUp | null, root?: Buffer) { - this.EMPTY_TRIE_ROOT = ethUtil.KECCAK256_RLP - this.sem = semaphore(1) + this.EMPTY_TRIE_ROOT = KECCAK256_RLP + this.lock = new Semaphore(1) this.db = db ? new DB(db) : new DB() this._root = this.EMPTY_TRIE_ROOT if (root) { @@ -51,8 +55,8 @@ export class Trie { let opStack = proofNodes.map((nodeValue) => { return { type: 'put', - key: ethUtil.keccak(nodeValue), - value: ethUtil.toBuffer(nodeValue), + key: keccak(nodeValue), + value: nodeValue, } as PutBatch }) @@ -63,25 +67,16 @@ export class Trie { } } - await promisify(proofTrie.db.batch.bind(proofTrie.db))(opStack) + await proofTrie.db.batch(opStack) return proofTrie } static async prove(trie: Trie, key: Buffer): Promise { - return new Promise((resolve, reject) => { - trie.findPath(key, function ( - err: Error, - node: TrieNode, - remaining: number[], - stack: TrieNode[], - ) { - if (err) return reject(err) - let p = stack.map((stackElem) => { - return stackElem.serialize() - }) - resolve(p) - }) + const { stack } = await trie.findPath(key) + const p = stack.map((stackElem) => { + return stackElem.serialize() }) + return p } static async verifyProof( @@ -95,7 +90,7 @@ export class Trie { } catch (e) { throw new Error('Invalid proof nodes given') } - return promisify(proofTrie.get.bind(proofTrie))(key) + return proofTrie.get(key) } set root(value: Buffer) { @@ -107,13 +102,10 @@ export class Trie { } setRoot(value?: Buffer) { - if (value) { - value = ethUtil.toBuffer(value) - assert(value.length === 32, 'Invalid root length. Roots are 32 bytes') - } else { + if (!value) { value = this.EMPTY_TRIE_ROOT } - + assert(value.length === 32, 'Invalid root length. Roots are 32 bytes') this._root = value } @@ -122,20 +114,15 @@ export class Trie { * @method get * @memberof Trie * @param {Buffer} key - the key to search for - * @param {Function} cb A callback `Function` which is given the arguments `err` - for errors that may have occured and `value` - the found value in a `Buffer` or if no value was found `null` + * @returns {Promise} - Returns a promise that resolves to `Buffer` if a value was found or `null` if no value was found. */ - get(key: Buffer, cb: BufferCallback) { - key = ethUtil.toBuffer(key) - - this.findPath(key, (err: Error, node: TrieNode, remainder: number[], stack: TrieNode[]) => { - let value = null - - if (node && remainder.length === 0) { - value = node.value - } - - cb(err, value) - }) + async get(key: Buffer): Promise { + const { node, remaining } = await this.findPath(key) + let value = null + if (node && remaining.length === 0) { + value = node.value + } + return value } /** @@ -143,36 +130,26 @@ export class Trie { * @method put * @memberof Trie * @param {Buffer} key - * @param {Buffer} Value - * @param {Function} cb A callback `Function` which is given the argument `err` - for errors that may have occured + * @param {Buffer} value + * @returns {Promise} */ - put(key: Buffer, value: Buffer, cb: ErrorCallback) { - key = ethUtil.toBuffer(key) - value = ethUtil.toBuffer(value) - + async put(key: Buffer, value: Buffer): Promise { + // If value is empty, delete if (!value || value.toString() === '') { - this.del(key, cb) + return await this.del(key) + } + + await this.lock.wait() + if (this.root.equals(KECCAK256_RLP)) { + // If no root, initialize this trie + await this._createInitialNode(key, value) } else { - cb = callTogether(cb, this.sem.leave) - - this.sem.take(() => { - if (this.root.toString('hex') !== ethUtil.KECCAK256_RLP.toString('hex')) { - // first try to find the give key or its nearst node - this.findPath( - key, - (err: Error, foundValue: TrieNode, keyRemainder: number[], stack: TrieNode[]) => { - if (err) { - return cb(err) - } - // then update - this._updateNode(key, value, keyRemainder, stack, cb) - }, - ) - } else { - this._createInitialNode(key, value, cb) // if no root initialize this trie - } - }) + // First try to find the given key or its nearest node + const { remaining, stack } = await this.findPath(key) + // then update + await this._updateNode(key, value, remaining, stack) } + this.lock.signal() } /** @@ -180,183 +157,133 @@ export class Trie { * @method del * @memberof Trie * @param {Buffer} key - * @param {Function} callback the callback `Function` + * @returns {Promise} */ - del(key: Buffer, cb: ErrorCallback) { - key = ethUtil.toBuffer(key) - cb = callTogether(cb, this.sem.leave) - - this.sem.take(() => { - this.findPath( - key, - (err: Error, foundValue: TrieNode, keyRemainder: number[], stack: TrieNode[]) => { - if (err) { - return cb(err) - } - if (foundValue) { - this._deleteNode(key, stack, cb) - } else { - cb() - } - }, - ) - }) + async del(key: Buffer): Promise { + await this.lock.wait() + const { node, stack } = await this.findPath(key) + if (node) { + await this._deleteNode(key, stack) + } + this.lock.signal() } - /** - * Retrieves a value directly from key/value db. - * @deprecated - */ - getRaw(key: Buffer, cb: BufferCallback) { - this.db.get(key, cb) - } + // retrieves a node from dbs by hash + async _lookupNode(node: Buffer | Buffer[]): Promise { + if (isRawNode(node)) { + return decodeRawNode(node as Buffer[]) + } - /** - * Writes a value under given key directly to the - * key/value db. - * @deprecated - */ - putRaw(key: Buffer, value: Buffer, cb: ErrorCallback) { - this.db.put(key, value, cb) - } + let value = null + let foundNode = null - /** - * Deletes key directly from underlying key/value db. - * @deprecated - */ - delRaw(key: Buffer, cb: ErrorCallback) { - this.db.del(key, cb) - } + value = await this.db.get(node as Buffer) - // retrieves a node from dbs by hash - _lookupNode(node: Buffer | Buffer[], cb: Function) { - if (isRawNode(node)) { - cb(null, decodeRawNode(node as Buffer[])) - } else { - this.db.get(node as Buffer, (err, value) => { - let node = null as any - if (value) { - node = decodeNode(value) - } else { - err = new Error('Missing node in DB') - } - cb(err, node) - }) + if (value) { + foundNode = decodeNode(value) } + + return foundNode } // writes a single node to dbs - _putNode(node: TrieNode, cb: ErrorCallback) { + async _putNode(node: TrieNode): Promise { const hash = node.hash() const serialized = node.serialize() - this.db.put(hash, serialized, cb) + await this.db.put(hash, serialized) } /** - * Tries to find a path to the node for the given key - * It returns a `stack` of nodes to the closet node + * Tries to find a path to the node for the given key. + * It returns a `stack` of nodes to the closet node. * @method findPath * @memberof Trie - * @param {String|Buffer} - key - the search key - * @param {Function} - cb - the callback function. Its is given the following - * arguments - * - err - any errors encontered - * - node - the last node found - * - keyRemainder - the remaining key nibbles not accounted for - * - stack - an array of nodes that forms the path to node we are searching for + * @param {Buffer} key - the search key + * @returns {Promise} */ - findPath(key: Buffer, cb: Function) { - const stack: TrieNode[] = [] - let targetKey = stringToNibbles(key) - - this._walkTrie(this.root, processNode, cb) - - function processNode( - nodeRef: Buffer, - node: TrieNode, - keyProgress: number[], - walkController: any, - ) { - const keyRemainder = targetKey.slice(matchingNibbleLength(keyProgress, targetKey)) - stack.push(node) - - if (node instanceof BranchNode) { - if (keyRemainder.length === 0) { - walkController.return(null, node, [], stack) - // we exhausted the key without finding a node - } else { - const branchIndex = keyRemainder[0] - const branchNode = node.getBranch(branchIndex) - if (!branchNode) { - // there are no more nodes to find and we didn't find the key - walkController.return(null, null, keyRemainder, stack) + async findPath(key: Buffer): Promise { + return new Promise(async (resolve) => { + let stack: TrieNode[] = [] + let targetKey = bufferToNibbles(key) + + // walk trie and process nodes + await this._walkTrie(this.root, async (nodeRef, node, keyProgress, walkController) => { + const keyRemainder = targetKey.slice(matchingNibbleLength(keyProgress, targetKey)) + stack.push(node) + + if (node instanceof BranchNode) { + if (keyRemainder.length === 0) { + // we exhausted the key without finding a node + resolve({ node, remaining: [], stack }) } else { - // node found, continuing search - walkController.only(branchIndex) + const branchIndex = keyRemainder[0] + const branchNode = node.getBranch(branchIndex) + if (!branchNode) { + // there are no more nodes to find and we didn't find the key + resolve({ node: null, remaining: keyRemainder, stack }) + } else { + // node found, continuing search + await walkController.only(branchIndex) + } + } + } else if (node instanceof LeafNode) { + if (doKeysMatch(keyRemainder, node.key)) { + // keys match, return node with empty key + resolve({ node, remaining: [], stack }) + } else { + // reached leaf but keys dont match + resolve({ node: null, remaining: keyRemainder, stack }) + } + } else if (node instanceof ExtensionNode) { + const matchingLen = matchingNibbleLength(keyRemainder, node.key) + if (matchingLen !== node.key.length) { + // keys don't match, fail + resolve({ node: null, remaining: keyRemainder, stack }) + } else { + // keys match, continue search + await walkController.next() } } - } else if (node instanceof LeafNode) { - if (doKeysMatch(keyRemainder, node.key)) { - // keys match, return node with empty key - walkController.return(null, node, [], stack) - } else { - // reached leaf but keys dont match - walkController.return(null, null, keyRemainder, stack) - } - } else if (node instanceof ExtensionNode) { - const matchingLen = matchingNibbleLength(keyRemainder, node.key) - if (matchingLen !== node.key.length) { - // keys dont match, fail - walkController.return(null, null, keyRemainder, stack) - } else { - // keys match, continue search - walkController.next() - } - } - } + }) + + // Resolve if _walkTrie finishes without finding any nodes + resolve({ node: null, remaining: [], stack }) + }) } /* * Finds all nodes that store k,v values */ - _findValueNodes(onFound: Function, cb: Function) { - this._walkTrie( - this.root, - (nodeRef: Buffer, node: TrieNode, key: number[], walkController: any) => { - let fullKey = key - - if (node instanceof LeafNode) { - fullKey = key.concat(node.key) - // found leaf node! - onFound(nodeRef, node, fullKey, walkController.next) - } else if (node instanceof BranchNode && node.value) { - // found branch with value - onFound(nodeRef, node, fullKey, walkController.next) - } else { - // keep looking for value nodes - walkController.next() - } - }, - cb, - ) + async _findValueNodes(onFound: FoundNode): Promise { + await this._walkTrie(this.root, async (nodeRef, node, key, walkController) => { + let fullKey = key + + if (node instanceof LeafNode) { + fullKey = key.concat(node.key) + // found leaf node! + onFound(nodeRef, node, fullKey, walkController) + } else if (node instanceof BranchNode && node.value) { + // found branch with value + onFound(nodeRef, node, fullKey, walkController) + } else { + // keep looking for value nodes + await walkController.next() + } + }) } /* * Finds all nodes that are stored directly in the db * (some nodes are stored raw inside other nodes) */ - _findDbNodes(onFound: Function, cb: Function) { - this._walkTrie( - this.root, - (nodeRef: Buffer, node: TrieNode, key: number[], walkController: any) => { - if (isRawNode(nodeRef)) { - walkController.next() - } else { - onFound(nodeRef, node, key, walkController.next) - } - }, - cb, - ) + async _findDbNodes(onFound: FoundNode): Promise { + await this._walkTrie(this.root, async (nodeRef, node, key, walkController) => { + if (isRawNode(nodeRef)) { + await walkController.next() + } else { + onFound(nodeRef, node, key, walkController) + } + }) } /** @@ -364,18 +291,17 @@ export class Trie { * @method _updateNode * @private * @param {Buffer} key - * @param {Buffer| String} value - * @param {Array} keyRemainder - * @param {Array} stack - - * @param {Function} cb - the callback + * @param {Buffer} value + * @param {number[]} keyRemainder + * @param {TrieNode[]} stack + * @returns {Promise} */ - _updateNode( + async _updateNode( k: Buffer, value: Buffer, keyRemainder: number[], stack: TrieNode[], - cb: ErrorCallback, - ) { + ): Promise { const toSave: BatchDBOp[] = [] const lastNode = stack.pop() if (!lastNode) { @@ -383,17 +309,15 @@ export class Trie { } // add the new nodes - let key = stringToNibbles(k) + let key = bufferToNibbles(k) // Check if the last node is a leaf and the key matches to this let matchLeaf = false if (lastNode instanceof LeafNode) { let l = 0 - for (let i = 0; i < stack.length; i++) { const n = stack[i] - if (n instanceof BranchNode) { l++ } else { @@ -412,7 +336,7 @@ export class Trie { if (matchLeaf) { // just updating a found value lastNode.value = value - stack.push(lastNode) + stack.push(lastNode as TrieNode) } else if (lastNode instanceof BranchNode) { stack.push(lastNode) if (keyRemainder.length !== 0) { @@ -468,114 +392,100 @@ export class Trie { } } - this._saveStack(key, stack, toSave, cb) + await this._saveStack(key, stack, toSave) } // walk tree - _walkTrie(root: Buffer, onNode: Function, onDone: Function) { - const self = this - root = root || this.root - onDone = onDone || function () {} - let aborted = false - let returnValues: any = [] - - if (root.toString('hex') === ethUtil.KECCAK256_RLP.toString('hex')) { - return onDone() - } + async _walkTrie(root: Buffer, onNode: FoundNode): Promise { + return new Promise(async (resolve) => { + const self = this + root = root || this.root - this._lookupNode(root, (e: Error, node: TrieNode) => { - if (e) { - return onDone(e, node) + if (root.equals(KECCAK256_RLP)) { + return resolve() } - processNode(root, node, [], (err: Error) => { - if (err) { - return onDone(err) - } - onDone.apply(null, returnValues) - }) - }) - - // the maximum pool size should be high enough to utilise the parallelizability of reading nodes from disk and - // low enough to utilize the prioritisation of node lookup. - const maxPoolSize = 500 - const taskExecutor = new PrioritizedTaskExecutor(maxPoolSize) - - function processNode(nodeRef: Buffer, node: TrieNode, key: number[] = [], cb: Function) { - if (!node || aborted) { - return cb() - } - - let stopped = false - - const walkController = { - stop: function () { - stopped = true - cb() - }, - // end all traversal and return values to the onDone cb - return: function (...args: any) { - aborted = true - returnValues = args - cb() - }, - next: function () { - if (aborted || stopped) { - return cb() - } + // The maximum pool size should be high enough to utilize + // the parallelizability of reading nodes from disk and + // low enough to utilize the prioritisation of node lookup. + const maxPoolSize = 500 + const taskExecutor = new PrioritizedTaskExecutor(maxPoolSize) - if (node instanceof LeafNode) { - return cb() - } - - let children - if (node instanceof ExtensionNode) { - children = [[node.key, node.value]] - } else if (node instanceof BranchNode) { - children = node.getChildren().map((b) => [[b[0]], b[1]]) - } - async.forEachOf( - children, - (childData: (Buffer | number[])[], index: number, cb: Function) => { - const keyExtension = childData[0] as number[] - const childRef = childData[1] as Buffer + const processNode = async ( + nodeRef: Buffer, + node: TrieNode, + key: number[] = [], + ): Promise => { + const walkController = { + next: async () => { + if (node instanceof LeafNode) { + if (taskExecutor.finished()) { + resolve() + } + return + } + let children + if (node instanceof ExtensionNode) { + children = [[node.key, node.value]] + } else if (node instanceof BranchNode) { + children = node.getChildren().map((b) => [[b[0]], b[1]]) + } + if (!children) { + // Node has no children + return resolve() + } + for (const child of children) { + const keyExtension = child[0] as number[] + const childRef = child[1] as Buffer const childKey = key.concat(keyExtension) const priority = childKey.length - taskExecutor.execute(priority, (taskCallback: Function) => { - self._lookupNode(childRef, (e: Error, childNode: TrieNode) => { - if (e) { - return cb(e, node) - } - taskCallback() - processNode(childRef, childNode, childKey, cb) - }) + taskExecutor.execute(priority, async (taskCallback: Function) => { + const childNode = await self._lookupNode(childRef) + taskCallback() + if (childNode) { + processNode(childRef, childNode as TrieNode, childKey) + } }) - }, - cb, - ) - }, - only: function (childIndex: number) { - if (!(node instanceof BranchNode)) { - return cb(new Error('Expected branch node')) - } - const childRef = node.getBranch(childIndex) - const childKey = key.slice() - childKey.push(childIndex) - const priority = childKey.length - taskExecutor.execute(priority, (taskCallback: Function) => { - self._lookupNode(childRef as Buffer, (e: Error, childNode: TrieNode) => { - if (e) { - return cb(e, node) - } + } + }, + only: async (childIndex: number) => { + if (!(node instanceof BranchNode)) { + throw new Error('Expected branch node') + } + const childRef = node.getBranch(childIndex) + if (!childRef) { + throw new Error('Could not get branch of childIndex') + } + const childKey = key.slice() + childKey.push(childIndex) + const priority = childKey.length + taskExecutor.execute(priority, async (taskCallback: Function) => { + const childNode = await self._lookupNode(childRef) taskCallback() - processNode(childRef as Buffer, childNode, childKey, cb) + if (childNode) { + await processNode(childRef as Buffer, childNode, childKey) + } else { + // could not find child node + resolve() + } }) - }) - }, + }, + } + + if (node) { + onNode(nodeRef, node, key, walkController) + } else { + resolve() + } } - onNode(nodeRef, node, key, walkController) - } + const node = await this._lookupNode(root) + if (node) { + await processNode(root, node as TrieNode, []) + } else { + resolve() + } + }) } /** @@ -585,9 +495,9 @@ export class Trie { * @param {Array} key - the key. Should follow the stack * @param {Array} stack - a stack of nodes to the value given by the key * @param {Array} opStack - a stack of levelup operations to commit at the end of this funciton - * @param {Function} cb + * @returns {Promise} */ - _saveStack(key: number[], stack: TrieNode[], opStack: BatchDBOp[], cb: ErrorCallback) { + async _saveStack(key: number[], stack: TrieNode[], opStack: BatchDBOp[]): Promise { let lastRoot // update nodes @@ -613,17 +523,17 @@ export class Trie { this.root = lastRoot } - this.db.batch(opStack, cb) + await this.db.batch(opStack) } - _deleteNode(k: Buffer, stack: TrieNode[], cb: Function) { - function processBranchNode( + async _deleteNode(k: Buffer, stack: TrieNode[]): Promise { + const processBranchNode = ( key: number[], branchKey: number, branchNode: TrieNode, parentNode: TrieNode, stack: TrieNode[], - ) { + ) => { // branchNode is the node ON the branch node not THE branch node if (!parentNode || parentNode instanceof BranchNode) { // branch->? @@ -648,7 +558,7 @@ export class Trie { } stack.push(branchNode) } else { - // parent is a extention + // parent is an extention let parentKey = parentNode.key if (branchNode instanceof BranchNode) { @@ -679,65 +589,69 @@ export class Trie { let parentNode = stack.pop() const opStack: BatchDBOp[] = [] - let key = stringToNibbles(k) + let key = bufferToNibbles(k) if (!parentNode) { // the root here has to be a leaf. this.root = this.EMPTY_TRIE_ROOT - cb() + return + } + + if (lastNode instanceof BranchNode) { + lastNode.value = null } else { - if (lastNode instanceof BranchNode) { - lastNode.value = null - } else { - // the lastNode has to be a leaf if its not a branch. And a leaf's parent - // if it has one must be a branch. - if (!(parentNode instanceof BranchNode)) { - return cb(new Error('Expected branch node')) - } - const lastNodeKey = lastNode.key - key.splice(key.length - lastNodeKey.length) - // delete the value - this._formatNode(lastNode, false, opStack, true) - parentNode.setBranch(key.pop() as number, null) - lastNode = parentNode - parentNode = stack.pop() + // the lastNode has to be a leaf if it's not a branch. + // And a leaf's parent, if it has one, must be a branch. + if (!(parentNode instanceof BranchNode)) { + throw new Error('Expected branch node') } + const lastNodeKey = lastNode.key + key.splice(key.length - lastNodeKey.length) + // delete the value + this._formatNode(lastNode, false, opStack, true) + parentNode.setBranch(key.pop() as number, null) + lastNode = parentNode + parentNode = stack.pop() + } - // nodes on the branch - // count the number of nodes on the branch - const branchNodes: [number, EmbeddedNode][] = lastNode.getChildren() - - // if there is only one branch node left, collapse the branch node - if (branchNodes.length === 1) { - // add the one remaing branch node to node above it - const branchNode = branchNodes[0][1] - const branchNodeKey = branchNodes[0][0] - - // look up node - this._lookupNode(branchNode, (e: Error, foundNode: TrieNode) => { - if (e) { - return cb(e, foundNode) - } - key = processBranchNode(key, branchNodeKey, foundNode, parentNode as TrieNode, stack) - this._saveStack(key, stack, opStack, cb as ErrorCallback) - }) - } else { - // simple removing a leaf and recaluclation the stack - if (parentNode) { - stack.push(parentNode) - } - - stack.push(lastNode) - this._saveStack(key, stack, opStack, cb as ErrorCallback) + // nodes on the branch + // count the number of nodes on the branch + const branchNodes: [number, EmbeddedNode][] = lastNode.getChildren() + + // if there is only one branch node left, collapse the branch node + if (branchNodes.length === 1) { + // add the one remaing branch node to node above it + const branchNode = branchNodes[0][1] + const branchNodeKey = branchNodes[0][0] + + // look up node + const foundNode = await this._lookupNode(branchNode) + if (foundNode) { + key = processBranchNode( + key, + branchNodeKey, + foundNode as TrieNode, + parentNode as TrieNode, + stack, + ) + await this._saveStack(key, stack, opStack) + } + } else { + // simple removing a leaf and recaluclation the stack + if (parentNode) { + stack.push(parentNode) } + + stack.push(lastNode) + await this._saveStack(key, stack, opStack) } } // Creates the initial node from an empty tree - _createInitialNode(key: Buffer, value: Buffer, cb: ErrorCallback) { - const newNode = new LeafNode(stringToNibbles(key), value) + async _createInitialNode(key: Buffer, value: Buffer): Promise { + const newNode = new LeafNode(bufferToNibbles(key), value) this.root = newNode.hash() - this._putNode(newNode, cb) + await this._putNode(newNode) } // formats node to be saved by levelup.batch. @@ -752,13 +666,11 @@ export class Trie { if (rlpNode.length >= 32 || topLevel) { const hashRoot = node.hash() - opStack.push({ type: 'put', key: hashRoot, value: rlpNode, }) - return hashRoot } @@ -766,7 +678,7 @@ export class Trie { } /** - * The `data` event is given an `Object` hat has two properties; the `key` and the `value`. Both should be Buffers. + * The `data` event is given an `Object` that has two properties; the `key` and the `value`. Both should be Buffers. * @method createReadStream * @memberof Trie * @return {stream.Readable} Returns a [stream](https://nodejs.org/dist/latest-v5.x/docs/api/stream.html#stream_class_stream_readable) of the contents of the `trie` @@ -787,41 +699,35 @@ export class Trie { * @method batch * @memberof Trie * @example - * var ops = [ + * const ops = [ * { type: 'del', key: Buffer.from('father') } * , { type: 'put', key: Buffer.from('name'), value: Buffer.from('Yuri Irsenovich Kim') } * , { type: 'put', key: Buffer.from('dob'), value: Buffer.from('16 February 1941') } * , { type: 'put', key: Buffer.from('spouse'), value: Buffer.from('Kim Young-sook') } * , { type: 'put', key: Buffer.from('occupation'), value: Buffer.from('Clown') } * ] - * trie.batch(ops) + * await trie.batch(ops) * @param {Array} ops - * @param {Function} cb + * @returns {Promise} */ - batch(ops: BatchDBOp[], cb: ErrorCallback) { - async.eachSeries( - ops, - (op: BatchDBOp, cb2: ErrorCallback) => { - if (op.type === 'put') { - if (!op.value) throw new Error('Invalid batch db operation') - this.put(op.key, op.value, cb2) - } else if (op.type === 'del') { - this.del(op.key, cb2) - } else { - cb2() + async batch(ops: BatchDBOp[]): Promise { + for await (const op of ops) { + if (op.type === 'put') { + if (!op.value) { + throw new Error('Invalid batch db operation') } - }, - cb, - ) + await this.put(op.key, op.value) + } else if (op.type === 'del') { + await this.del(op.key) + } + } } /** - * Checks if a given root exists + * Checks if a given root exists. */ - checkRoot(root: Buffer, cb: Function) { - root = ethUtil.toBuffer(root) - this._lookupNode(root, (e: Error, value: TrieNode) => { - cb(null, !!value) - }) + async checkRoot(root: Buffer): Promise { + const value = await this._lookupNode(root) + return !!value } } diff --git a/src/checkpointTrie.ts b/src/checkpointTrie.ts index c4a3f67..8c7bde2 100644 --- a/src/checkpointTrie.ts +++ b/src/checkpointTrie.ts @@ -1,11 +1,8 @@ import { Trie as BaseTrie } from './baseTrie' import { ScratchReadStream } from './scratchReadStream' import { ScratchDB } from './scratch' -import { callTogether } from './util/async' import { DB, BatchDBOp } from './db' import { TrieNode } from './trieNode' -import { ErrorCallback } from './types' -const async = require('async') const WriteStream = require('level-ws') export class CheckpointTrie extends BaseTrie { @@ -50,24 +47,22 @@ export class CheckpointTrie extends BaseTrie { * Commits a checkpoint to disk, if current checkpoint is not nested. If * nested, only sets the parent checkpoint as current checkpoint. * @method commit - * @param {Function} cb the callback + * @returns {Promise} * @throws If not during a checkpoint phase */ - commit(cb: Function) { - cb = callTogether(cb, this.sem.leave) - - this.sem.take(() => { - if (this.isCheckpoint) { - this._checkpoints.pop() - if (!this.isCheckpoint) { - this._exitCpMode(true, cb) - } else { - cb() - } - } else { - throw new Error('trying to commit when not checkpointed') - } - }) + async commit(): Promise { + if (!this.isCheckpoint) { + throw new Error('trying to commit when not checkpointed') + } + + await this.lock.wait() + + this._checkpoints.pop() + if (!this.isCheckpoint) { + await this._exitCpMode(true) + } + + this.lock.signal() } /** @@ -75,20 +70,15 @@ export class CheckpointTrie extends BaseTrie { * If during a nested checkpoint, sets root to most recent checkpoint, and sets * parent checkpoint as current. */ - revert(cb: Function) { - cb = callTogether(cb, this.sem.leave) - - this.sem.take(() => { - if (this.isCheckpoint) { - this.root = this._checkpoints.pop()! - if (!this.isCheckpoint) { - this._exitCpMode(false, cb) - return - } + async revert(): Promise { + await this.lock.wait() + if (this.isCheckpoint) { + this.root = this._checkpoints.pop()! + if (!this.isCheckpoint) { + await this._exitCpMode(false) } - - cb() - }) + } + this.lock.signal() } /** @@ -109,15 +99,6 @@ export class CheckpointTrie extends BaseTrie { return trie } - /** - * Writes a value under given key directly to the - * key/value db, disregarding checkpoints. - * @deprecated - */ - putRaw(key: Buffer, value: Buffer, cb: ErrorCallback) { - this._mainDB.put(key, value, cb) - } - /** * Enter into checkpoint mode. * @private @@ -131,16 +112,20 @@ export class CheckpointTrie extends BaseTrie { * Exit from checkpoint mode. * @private */ - _exitCpMode(commitState: boolean, cb: Function) { - const scratch = this._scratch as ScratchDB - this._scratch = null - this.db = this._mainDB - - if (commitState) { - this._createScratchReadStream(scratch).pipe(WriteStream(this.db._leveldb)).on('close', cb) - } else { - async.nextTick(cb) - } + async _exitCpMode(commitState: boolean): Promise { + return new Promise(async (resolve) => { + const scratch = this._scratch as ScratchDB + this._scratch = null + this.db = this._mainDB + + if (commitState) { + this._createScratchReadStream(scratch) + .pipe(WriteStream(this.db._leveldb)) + .on('close', resolve) + } else { + process.nextTick(resolve) + } + }) } /** @@ -149,8 +134,11 @@ export class CheckpointTrie extends BaseTrie { * @method createScratchReadStream * @private */ - _createScratchReadStream(scratch: ScratchDB) { - scratch = scratch || this._scratch + _createScratchReadStream(scratchDb?: ScratchDB) { + let scratch = scratchDb || this._scratch + if (!scratch) { + throw new Error('No scratch found to use') + } const trie = new BaseTrie(scratch._leveldb, this.root) trie.db = scratch return new ScratchReadStream(trie) diff --git a/src/db.ts b/src/db.ts index 52c55cd..659cc32 100644 --- a/src/db.ts +++ b/src/db.ts @@ -1,5 +1,4 @@ import { LevelUp } from 'levelup' -import { ErrorCallback, BufferCallback } from './types' const level = require('level-mem') export const ENCODING_OPTS = { keyEncoding: 'binary', valueEncoding: 'binary' } @@ -34,58 +33,49 @@ export class DB { /** * Retrieves a raw value from leveldb. * @param {Buffer} key - * @param {Function} cb A callback `Function`, which is given the arguments - * `err` - for errors that may have occured - * and `value` - the found value in a `Buffer` or if no value was found `null`. + * @returns {Promise} - Promise resolves with `Buffer` if a value is found or `null` if no value is found. */ - get(key: Buffer, cb: BufferCallback) { - if (!Buffer.isBuffer(key)) throw new Error('Invalid input: expected buffer') - - this._leveldb.get(key, ENCODING_OPTS, (err?: Error, v?: Buffer) => { - if (err || !v) { - cb(null, null) + async get(key: Buffer): Promise { + let value = null + try { + value = await this._leveldb.get(key, ENCODING_OPTS) + } catch (error) { + if (error.notFound) { + // not found, returning null } else { - cb(null, v) + throw error } - }) + } finally { + return value + } } /** * Writes a value directly to leveldb. - * @param {Buffer} key The key as a `Buffer` or `String` + * @param {Buffer} key The key as a `Buffer` * @param {Buffer} value The value to be stored - * @param {Function} cb A callback `Function`, which is given the argument - * `err` - for errors that may have occured + * @returns {Promise} */ - put(key: Buffer, val: Buffer, cb: ErrorCallback) { - if (!Buffer.isBuffer(key)) throw new Error('Invalid input: expected buffer') - if (!Buffer.isBuffer(val)) throw new Error('Invalid input: expected buffer') - - this._leveldb.put(key, val, ENCODING_OPTS, cb) + async put(key: Buffer, val: Buffer): Promise { + await this._leveldb.put(key, val, ENCODING_OPTS) } /** * Removes a raw value in the underlying leveldb. * @param {Buffer} key - * @param {Function} cb A callback `Function`, which is given the argument - * `err` - for errors that may have occured + * @returns {Promise} */ - del(key: Buffer, cb: ErrorCallback) { - if (!Buffer.isBuffer(key)) throw new Error('Invalid input: expected buffer') - - this._leveldb.del(key, ENCODING_OPTS, cb) + async del(key: Buffer): Promise { + await this._leveldb.del(key, ENCODING_OPTS) } /** * Performs a batch operation on db. * @param {Array} opStack A stack of levelup operations - * @param {Function} cb A callback `Function`, which is given the argument - * `err` - for errors that may have occured + * @returns {Promise} */ - batch(opStack: BatchDBOp[], cb: ErrorCallback) { - if (!Array.isArray(opStack)) throw new Error('Invalid input: expected buffer') - - this._leveldb.batch(opStack, ENCODING_OPTS, cb) + async batch(opStack: BatchDBOp[]): Promise { + await this._leveldb.batch(opStack, ENCODING_OPTS) } /** diff --git a/src/prioritizedTaskExecutor.ts b/src/prioritizedTaskExecutor.ts index 4ed0075..47bcb58 100644 --- a/src/prioritizedTaskExecutor.ts +++ b/src/prioritizedTaskExecutor.ts @@ -41,10 +41,16 @@ export class PrioritizedTaskExecutor { } }) } else { - this.queue.push({ - priority: priority, - fn: fn, - }) + this.queue.push({ priority, fn }) } } + + /** + * Checks if the taskExecutor is finished. + * @private + * @returns {Boolean} - Returns `true` if the taskExecutor is finished, otherwise returns `false`. + */ + finished(): boolean { + return this.currentPoolSize === 0 + } } diff --git a/src/readStream.ts b/src/readStream.ts index 01e0f1d..8ee3c78 100644 --- a/src/readStream.ts +++ b/src/readStream.ts @@ -1,6 +1,5 @@ import { nibblesToBuffer } from './util/nibbles' import { Trie as BaseTrie } from './baseTrie' -import { TrieNode } from './trieNode' const Readable = require('readable-stream').Readable export class TrieReadStream extends Readable { @@ -14,23 +13,18 @@ export class TrieReadStream extends Readable { this._started = false } - _read() { - if (!this._started) { - this._started = true - this.trie._findValueNodes( - (nodeRef: Buffer, node: TrieNode, key: number[], next: Function) => { - this.push({ - key: nibblesToBuffer(key), - value: node.value, - }) - - next() - }, - () => { - // close stream - this.push(null) - }, - ) + async _read() { + if (this._started) { + return } + this._started = true + await this.trie._findValueNodes(async (nodeRef, node, key, walkController) => { + this.push({ + key: nibblesToBuffer(key), + value: node.value, + }) + await walkController.next() + }) + this.push(null) } } diff --git a/src/scratch.ts b/src/scratch.ts index 3ba4697..88dbe42 100644 --- a/src/scratch.ts +++ b/src/scratch.ts @@ -1,6 +1,4 @@ import { DB, ENCODING_OPTS } from './db' -import { asyncFirstSeries } from './util/async' -import { BufferCallback } from './types' /** * An in-memory wrap over `DB` with an upstream DB @@ -20,21 +18,33 @@ export class ScratchDB extends DB { * Similar to `DB.get`, but first searches in-memory * scratch DB, if key not found, searches upstream DB. */ - get(key: Buffer, cb: BufferCallback) { - const getDBs = this._upstream._leveldb - ? [this._leveldb, this._upstream._leveldb] - : [this._leveldb] - const dbGet = (db: any, cb2: Function) => { - db.get(key, ENCODING_OPTS, (err: Error, v: Buffer | null) => { - if (err || !v) { - cb2(null, null) + async get(key: Buffer): Promise { + let value = null + // First, search in-memory db + try { + value = await this._leveldb.get(key, ENCODING_OPTS) + } catch (error) { + if (error.notFound) { + // not found, returning null + } else { + throw error + } + } + + // If not found, try searching upstream db + if (!value && this._upstream._leveldb) { + try { + value = await this._upstream._leveldb.get(key, ENCODING_OPTS) + } catch (error) { + if (error.notFound) { + // not found, returning null } else { - cb2(null, v) + throw error } - }) + } } - asyncFirstSeries(getDBs, dbGet, cb) + return value } copy(): ScratchDB { diff --git a/src/scratchReadStream.ts b/src/scratchReadStream.ts index d28e4fb..9bc736d 100644 --- a/src/scratchReadStream.ts +++ b/src/scratchReadStream.ts @@ -1,5 +1,4 @@ import { Trie as BaseTrie } from './baseTrie' -import { TrieNode } from './trieNode' const Readable = require('readable-stream').Readable /* @@ -16,23 +15,18 @@ export class ScratchReadStream extends Readable { this._started = false } - _read() { - if (!this._started) { - this._started = true - this.trie._findDbNodes( - (nodeRef: Buffer, node: TrieNode, key: number[], next: Function) => { - this.push({ - key: nodeRef, - value: node.serialize(), - }) - - next() - }, - () => { - // close stream - this.push(null) - }, - ) + async _read() { + if (this._started) { + return } + this._started = true + await this.trie._findDbNodes(async (nodeRef, node, key, walkController) => { + this.push({ + key: nodeRef, + value: node.serialize(), + }) + await walkController.next() + }) + this.push(null) } } diff --git a/src/secure.ts b/src/secure.ts index 375b644..3a6c22f 100644 --- a/src/secure.ts +++ b/src/secure.ts @@ -1,6 +1,5 @@ import { keccak256 } from 'ethereumjs-util' import { CheckpointTrie } from './checkpointTrie' -import { BufferCallback, ErrorCallback } from './types' /** * You can create a secure Trie where the keys are automatically hashed @@ -31,26 +30,27 @@ export class SecureTrie extends CheckpointTrie { return new SecureTrie(db._leveldb, this.root) } - get(key: Buffer, cb: BufferCallback) { + async get(key: Buffer): Promise { const hash = keccak256(key) - super.get(hash, cb) + const value = await super.get(hash) + return value } /** * For a falsey value, use the original key * to avoid double hashing the key. */ - put(key: Buffer, val: Buffer, cb: ErrorCallback) { - if (!val) { - this.del(key, cb) + async put(key: Buffer, val: Buffer): Promise { + if (!val || val.toString() === '') { + await this.del(key) } else { const hash = keccak256(key) - super.put(hash, val, cb) + await super.put(hash, val) } } - del(key: Buffer, cb: ErrorCallback) { + async del(key: Buffer): Promise { const hash = keccak256(key) - super.del(hash, cb) + await super.del(hash) } } diff --git a/src/trieNode.ts b/src/trieNode.ts index ac4b4e2..103bca3 100644 --- a/src/trieNode.ts +++ b/src/trieNode.ts @@ -1,6 +1,6 @@ import * as rlp from 'rlp' import { keccak256 } from 'ethereumjs-util' -import { stringToNibbles, nibblesToBuffer } from './util/nibbles' +import { bufferToNibbles, nibblesToBuffer } from './util/nibbles' import { isTerminator, addHexPrefix, removeHexPrefix } from './util/hex' export type TrieNode = BranchNode | ExtensionNode | LeafNode @@ -21,7 +21,7 @@ export function decodeRawNode(raw: Buffer[]): TrieNode { if (raw.length === 17) { return BranchNode.fromArray(raw) } else if (raw.length === 2) { - const nibbles = stringToNibbles(raw[0]) + const nibbles = bufferToNibbles(raw[0]) if (isTerminator(nibbles)) { return new LeafNode(LeafNode.decodeKey(nibbles), raw[1]) } diff --git a/src/types.ts b/src/types.ts deleted file mode 100644 index 6178f04..0000000 --- a/src/types.ts +++ /dev/null @@ -1,2 +0,0 @@ -export type BufferCallback = (err?: Error | null, value?: Buffer | null) => void -export type ErrorCallback = (err?: Error | null) => void diff --git a/src/util/async.ts b/src/util/async.ts deleted file mode 100644 index 3a7ddc4..0000000 --- a/src/util/async.ts +++ /dev/null @@ -1,52 +0,0 @@ -const async = require('async') - -/** - * Take two or more functions and returns a function that will execute all of - * the given functions - */ -export function callTogether(...funcs: Function[]) { - let length = funcs.length - const index = length - - if (!length) { - return function () {} - } - - return function (this: any, ...args: any) { - length = index - - while (length--) { - const fn = funcs[length] - if (typeof fn === 'function') { - var result = funcs[length].apply(this, args) - } - } - return result - } -} - -/** - * Take a collection of async fns, call the cb on the first to return a truthy value. - * If all run without a truthy result, return undefined - */ -export function asyncFirstSeries(array: any[], iterator: Function, cb: Function) { - var didComplete = false - async.eachSeries( - array, - function (item: any, next: Function) { - if (didComplete) return next - iterator(item, function (err: Error, result: any) { - if (result) { - didComplete = true - process.nextTick(cb.bind(null, null, result)) - } - next(err) - }) - }, - function () { - if (!didComplete) { - cb() - } - }, - ) -} diff --git a/src/util/nibbles.ts b/src/util/nibbles.ts index 3f1778d..c5723d0 100644 --- a/src/util/nibbles.ts +++ b/src/util/nibbles.ts @@ -1,10 +1,10 @@ /** - * Converts a string OR a buffer to a nibble array. - * @method stringToNibbles - * @param {Buffer| String} key + * Converts a buffer to a nibble array. + * @method bufferToNibbles + * @param {Buffer} key * @private */ -export function stringToNibbles(key: Buffer): number[] { +export function bufferToNibbles(key: Buffer): number[] { const bkey = Buffer.from(key) let nibbles = [] as any diff --git a/test/checkpoint.spec.ts b/test/checkpoint.spec.ts index eb7ad6f..61dc410 100644 --- a/test/checkpoint.spec.ts +++ b/test/checkpoint.spec.ts @@ -1,6 +1,5 @@ import * as tape from 'tape' -const Trie = require('../dist/checkpointTrie').CheckpointTrie -import { CheckpointTrie } from '../dist/checkpointTrie' +import { CheckpointTrie } from '../src' tape('testing checkpoints', function (tester) { const it = tester.test @@ -10,124 +9,100 @@ tape('testing checkpoints', function (tester) { let preRoot: String let postRoot: String - it('setup', function (t) { - trie = new Trie() - trie.put(Buffer.from('do'), Buffer.from('verb'), function () { - trie.put(Buffer.from('doge'), Buffer.from('coin'), function () { - preRoot = trie.root.toString('hex') - t.end() - }) - }) + it('setup', async function (t) { + trie = new CheckpointTrie() + await trie.put(Buffer.from('do'), Buffer.from('verb')) + await trie.put(Buffer.from('doge'), Buffer.from('coin')) + preRoot = trie.root.toString('hex') + t.end() }) - it('should copy trie and get value before checkpoint', function (t) { + it('should copy trie and get value before checkpoint', async function (t) { trieCopy = trie.copy() t.equal(trieCopy.root.toString('hex'), preRoot) - trieCopy.get(Buffer.from('do'), function (err, res) { - t.error(err) - t.ok(Buffer.from('verb').equals(Buffer.from(res!))) - t.end() - }) + const res = await trieCopy.get(Buffer.from('do')) + t.ok(Buffer.from('verb').equals(Buffer.from(res!))) + t.end() }) it('should create a checkpoint', function (t) { trie.checkpoint() + t.ok(trie.isCheckpoint) t.end() }) - it('should save to the cache', function (t) { - trie.put(Buffer.from('test'), Buffer.from('something'), function () { - trie.put(Buffer.from('love'), Buffer.from('emotion'), function () { - postRoot = trie.root.toString('hex') - t.end() - }) - }) + it('should save to the cache', async function (t) { + await trie.put(Buffer.from('test'), Buffer.from('something')) + await trie.put(Buffer.from('love'), Buffer.from('emotion')) + postRoot = trie.root.toString('hex') + t.end() }) - it('should get values from before checkpoint', function (t) { - trie.get(Buffer.from('doge'), function (err, res) { - t.error(err) - t.ok(Buffer.from('coin').equals(Buffer.from(res!))) - t.end() - }) + it('should get values from before checkpoint', async function (t) { + const res = await trie.get(Buffer.from('doge')) + t.ok(Buffer.from('coin').equals(Buffer.from(res!))) + t.end() }) - it('should get values from cache', function (t) { - trie.get(Buffer.from('love'), function (err, res) { - t.error(err) - t.ok(Buffer.from('emotion').equals(Buffer.from(res!))) - t.end() - }) + it('should get values from cache', async function (t) { + const res = await trie.get(Buffer.from('love')) + t.ok(Buffer.from('emotion').equals(Buffer.from(res!))) + t.end() }) - it('should copy trie and get upstream and cache values after checkpoint', function (t) { + it('should copy trie and get upstream and cache values after checkpoint', async function (t) { trieCopy = trie.copy() t.equal(trieCopy.root.toString('hex'), postRoot) t.equal(trieCopy._checkpoints.length, 1) t.ok(trieCopy.isCheckpoint) - trieCopy.get(Buffer.from('do'), function (err, res) { - t.error(err) - t.ok(Buffer.from('verb').equals(Buffer.from(res!))) - trieCopy.get(Buffer.from('love'), function (err, res) { - t.error(err) - t.ok(Buffer.from('emotion').equals(Buffer.from(res!))) - t.end() - }) - }) + const res = await trieCopy.get(Buffer.from('do')) + t.ok(Buffer.from('verb').equals(Buffer.from(res!))) + const res2 = await trieCopy.get(Buffer.from('love')) + t.ok(Buffer.from('emotion').equals(Buffer.from(res2!))) + t.end() }) - it('should revert to the orginal root', function (t) { - t.equal(trie.isCheckpoint, true) - trie.revert(function () { - t.equal(trie.root.toString('hex'), preRoot) - t.equal(trie.isCheckpoint, false) - t.end() - }) + it('should revert to the orginal root', async function (t) { + t.ok(trie.isCheckpoint) + await trie.revert() + t.equal(trie.root.toString('hex'), preRoot) + t.notOk(trie.isCheckpoint) + t.end() }) - it('should not get values from cache after revert', function (t) { - trie.get(Buffer.from('love'), function (err, res) { - t.error(err) - t.notOk(res) - t.end() - }) + it('should not get values from cache after revert', async function (t) { + const res = await trie.get(Buffer.from('love')) + t.notOk(res) + t.end() }) - it('should commit a checkpoint', function (t) { + it('should commit a checkpoint', async function (t) { trie.checkpoint() - trie.put(Buffer.from('test'), Buffer.from('something'), function () { - trie.put(Buffer.from('love'), Buffer.from('emotion'), function () { - trie.commit(function () { - t.equal(trie.isCheckpoint, false) - t.equal(trie.root.toString('hex'), postRoot) - t.end() - }) - }) - }) + await trie.put(Buffer.from('test'), Buffer.from('something')) + await trie.put(Buffer.from('love'), Buffer.from('emotion')) + await trie.commit() + t.equal(trie.isCheckpoint, false) + t.equal(trie.root.toString('hex'), postRoot) + t.end() }) - it('should get new values after commit', function (t) { - trie.get(Buffer.from('love'), function (err, res) { - t.error(err) - t.ok(Buffer.from('emotion').equals(Buffer.from(res!))) - t.end() - }) + it('should get new values after commit', async function (t) { + const res = await trie.get(Buffer.from('love')) + t.ok(Buffer.from('emotion').equals(Buffer.from(res!))) + t.end() }) - it('should commit a nested checkpoint', function (t) { + it('should commit a nested checkpoint', async function (t) { trie.checkpoint() let root: Buffer - trie.put(Buffer.from('test'), Buffer.from('something else'), function () { - root = trie.root - trie.checkpoint() - trie.put(Buffer.from('the feels'), Buffer.from('emotion'), function () { - trie.revert(() => {}) - trie.commit(function () { - t.equal(trie.isCheckpoint, false) - t.equal(trie.root.toString('hex'), root.toString('hex')) - t.end() - }) - }) - }) + await trie.put(Buffer.from('test'), Buffer.from('something else')) + root = trie.root + trie.checkpoint() + await trie.put(Buffer.from('the feels'), Buffer.from('emotion')) + await trie.revert() + await trie.commit() + t.equal(trie.isCheckpoint, false) + t.equal(trie.root.toString('hex'), root.toString('hex')) + t.end() }) }) diff --git a/test/db.spec.ts b/test/db.spec.ts index 13014d2..cff5d2e 100644 --- a/test/db.spec.ts +++ b/test/db.spec.ts @@ -1,59 +1,36 @@ import * as tape from 'tape' -const DB = require('../dist/db').DB -import { DB as IDB, BatchDBOp } from '../dist/db' +import { DB, BatchDBOp } from '../src/db' tape('DB basic functionality', (t) => { - const db = new DB() as IDB + const db = new DB() const k = Buffer.from('foo') const v = Buffer.from('bar') - t.test('puts and gets value', (st) => { - db.put(k, v, () => { - db.get(k, (err, res) => { - st.error(err) - st.ok(v.equals(res!)) - st.end() - }) - }) + t.test('puts and gets value', async (st) => { + await db.put(k, v) + const res = await db.get(k) + st.ok(v.equals(res!)) + st.end() }) - t.test('dels value', (st) => { - db.del(k, () => { - db.get(k, (err, res) => { - st.error(err) - st.notOk(res) - st.end() - }) - }) + t.test('dels value', async (st) => { + await db.del(k) + const res = await db.get(k) + st.notOk(res) + st.end() }) - t.test('batch ops', (st) => { + t.test('batch ops', async (st) => { const k2 = Buffer.from('bar') const v2 = Buffer.from('baz') const ops = [ { type: 'put', key: k, value: v }, { type: 'put', key: k2, value: v2 }, ] as BatchDBOp[] - db.batch(ops, (err) => { - st.error(err) - db.get(k2, (err, res) => { - st.error(err) - st.ok(v2.equals(res!)) - st.end() - }) - }) - }) -}) - -tape('DB input types', (t) => { - const db = new DB() - - t.test('fails for invalid input', (st) => { - try { - db.get('test') - } catch (e) { - st.end() - } + await db.batch(ops) + const res = await db.get(k2) + st.ok(v2.equals(res!)) + st.end() }) }) diff --git a/test/encoding.spec.ts b/test/encoding.spec.ts index e82923e..3148c0b 100644 --- a/test/encoding.spec.ts +++ b/test/encoding.spec.ts @@ -1,14 +1,14 @@ import * as tape from 'tape' -const Trie = require('../dist/index').CheckpointTrie -const trie = new Trie() -const trie2 = new Trie() +import { toBuffer } from 'ethereumjs-util' +import { CheckpointTrie } from '../src' +const trie = new CheckpointTrie() +const trie2 = new CheckpointTrie() const hex = 'FF44A3B3' -tape('encoding hexprefixes', function (t) { - trie.put(Buffer.from(hex, 'hex'), Buffer.from('test'), function () { - trie2.put('0x' + hex, Buffer.from('test'), function () { - t.equal(trie.root.toString('hex'), trie2.root.toString('hex')) - t.end() - }) - }) + +tape('encoding hexprefixes', async function (t) { + await trie.put(Buffer.from(hex, 'hex'), Buffer.from('test')) + await trie2.put(toBuffer(`0x${hex}`), Buffer.from('test')) + t.equal(trie.root.toString('hex'), trie2.root.toString('hex')) + t.end() }) diff --git a/test/failingRefactorTests.spec.ts b/test/failingRefactorTests.spec.ts index d02ecd2..efa2df8 100644 --- a/test/failingRefactorTests.spec.ts +++ b/test/failingRefactorTests.spec.ts @@ -1,20 +1,17 @@ import * as tape from 'tape' -import * as async from 'async' -const Trie = require('../dist/secure').SecureTrie +import { SecureTrie } from '../src' -const trie = new Trie() +const trie = new SecureTrie() const a = Buffer.from( 'f8448080a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0a155280bc3c09fd31b0adebbdd4ef3d5128172c0d2008be964dc9e10e0f0fedf', 'hex', ) const ak = Buffer.from('095e7baea6a6c7c4c2dfeb977efac326af552d87', 'hex') - const b = Buffer.from( 'f844802ea056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0db94dc4aab9b6a1a11956906ea34f3252f394576aece12199b23b269bb2738ab', 'hex', ) const bk = Buffer.from('945304eb96065b2a98b57a48a06ae28d285a71b5', 'hex') - const c = Buffer.from( 'f84c80880de0b6b3a7640000a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470', 'hex', @@ -28,19 +25,16 @@ const d = Buffer.from( 'hex', ) const dk = Buffer.from('095e7baea6a6c7c4c2dfeb977efac326af552d87', 'hex') - const e = Buffer.from( 'f8478083010851a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0db94dc4aab9b6a1a11956906ea34f3252f394576aece12199b23b269bb2738ab', 'hex', ) const ek = Buffer.from('945304eb96065b2a98b57a48a06ae28d285a71b5', 'hex') - const f = Buffer.from( 'f84c01880de0b6b3540df72ca056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470', 'hex', ) const fk = Buffer.from('a94f5374fce5edbc8e2a8697c15331677e6ebf0b', 'hex') - // commit const g = Buffer.from( 'f8488084535500b1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0a155280bc3c09fd31b0adebbdd4ef3d5128172c0d2008be964dc9e10e0f0fedf', @@ -48,45 +42,17 @@ const g = Buffer.from( ) const gk = Buffer.from('095e7baea6a6c7c4c2dfeb977efac326af552d87', 'hex') -tape('secure tests shouldnt crash ', function (t) { - async.series( - [ - function (done) { - console.log('done') - trie.put(ak, a, done) - }, - function (done) { - trie.put(bk, b, done) - }, - function (done) { - trie.put(ck, c, done) - }, - function (done) { - trie.checkpoint() - trie.checkpoint() - done() - }, - function (done) { - trie.commit(done) - }, - function (done) { - trie.put(dk, d, done) - }, - function (done) { - trie.put(ek, e, done) - }, - function (done) { - trie.put(fk, f, done) - }, - function (done) { - trie.commit(done) - }, - function (done) { - trie.put(gk, g, done) - }, - ], - function () { - t.end() - }, - ) +tape('secure tests should not crash', async function (t) { + await trie.put(ak, a) + await trie.put(bk, b) + await trie.put(ck, c) + trie.checkpoint() + trie.checkpoint() + await trie.commit() + await trie.put(dk, d) + await trie.put(ek, e) + await trie.put(fk, f) + await trie.commit() + await trie.put(gk, g) + t.end() }) diff --git a/test/index.spec.ts b/test/index.spec.ts index e30ed11..d4c4523 100644 --- a/test/index.spec.ts +++ b/test/index.spec.ts @@ -1,143 +1,127 @@ import * as tape from 'tape' -import * as async from 'async' import * as rlp from 'rlp' -import * as ethUtil from 'ethereumjs-util' -const Trie = require('../dist/index').CheckpointTrie -import { CheckpointTrie } from '../dist/checkpointTrie' +import { KECCAK256_NULL } from 'ethereumjs-util' +import { CheckpointTrie } from '../src' tape('simple save and retrive', function (tester) { - var it = tester.test + const it = tester.test - it('should not crash if given a non-existant root', function (t) { - var root = Buffer.from( + it('should not crash if given a non-existant root', async function (t) { + const root = Buffer.from( '3f4399b08efe68945c1cf90ffe85bbe3ce978959da753f9e649f034015b8817d', 'hex', ) - var trie = new Trie(null, root) as CheckpointTrie - - trie.get(Buffer.from('test'), function (err, value) { - t.equal(value, null) - t.notEqual(err, null) - t.end() - }) + const trie = new CheckpointTrie(null, root) + const value = await trie.get(Buffer.from('test')) + t.equal(value, null) + t.end() }) - var trie = new Trie() as CheckpointTrie + const trie = new CheckpointTrie() - it('save a value', function (t) { - trie.put(Buffer.from('test'), Buffer.from('one'), t.end) + it('save a value', async function (t) { + await trie.put(Buffer.from('test'), Buffer.from('one')) + t.end() }) - it('should get a value', function (t) { - trie.get(Buffer.from('test'), function (err, value) { - t.equal(value!.toString(), 'one') - t.end(err) - }) + it('should get a value', async function (t) { + const value = await trie.get(Buffer.from('test')) + t.equal(value!.toString(), 'one') + t.end() }) - it('should update a value', function (t) { - trie.put(Buffer.from('test'), Buffer.from('two'), function () { - trie.get(Buffer.from('test'), function (err, value) { - t.equal(value!.toString(), 'two') - t.end(err) - }) - }) + it('should update a value', async function (t) { + await trie.put(Buffer.from('test'), Buffer.from('two')) + const value = await trie.get(Buffer.from('test')) + t.equal(value!.toString(), 'two') + t.end() }) - it('should delete a value', function (t) { - trie.del(Buffer.from('test'), function (err) { - trie.get(Buffer.from('test'), function (err, value) { - t.notok(value) - t.end(err) - }) - }) + it('should delete a value', async function (t) { + await trie.del(Buffer.from('test')) + const value = await trie.get(Buffer.from('test')) + t.notok(value) + t.end() }) - it('should recreate a value', function (t) { - trie.put(Buffer.from('test'), Buffer.from('one'), t.end) + it('should recreate a value', async function (t) { + await trie.put(Buffer.from('test'), Buffer.from('one')) + t.end() }) - it('should get updated a value', function (t) { - trie.get(Buffer.from('test'), function (err, value) { - t.equal(value!.toString(), 'one') - t.end(err) - }) + it('should get updated a value', async function (t) { + const value = await trie.get(Buffer.from('test')) + t.equal(value!.toString(), 'one') + t.end() }) - it('should create a branch here', function (t) { - trie.put(Buffer.from('doge'), Buffer.from('coin'), function () { - t.equal( - 'de8a34a8c1d558682eae1528b47523a483dd8685d6db14b291451a66066bf0fc', - trie.root.toString('hex'), - ) - t.end() - }) + it('should create a branch here', async function (t) { + await trie.put(Buffer.from('doge'), Buffer.from('coin')) + t.equal( + 'de8a34a8c1d558682eae1528b47523a483dd8685d6db14b291451a66066bf0fc', + trie.root.toString('hex'), + ) + t.end() }) - it('should get a value that is in a branch', function (t) { - trie.get(Buffer.from('doge'), function (err, value) { - t.equal(value!.toString(), 'coin') - t.end(err) - }) + it('should get a value that is in a branch', async function (t) { + const value = await trie.get(Buffer.from('doge')) + t.equal(value!.toString(), 'coin') + t.end() }) - it('should delete from a branch', function (t) { - trie.del(Buffer.from('doge'), function (err1) { - trie.get(Buffer.from('doge'), function (err2, value) { - t.equal(value, null) - t.end(err1 || err2) - }) - }) + it('should delete from a branch', async function (t) { + await trie.del(Buffer.from('doge')) + const value = await trie.get(Buffer.from('doge')) + t.equal(value, null) + t.end() }) -}) -tape('storing longer values', function (tester) { - var it = tester.test - var trie = new Trie() as CheckpointTrie - var longString = 'this will be a really really really long value' - var longStringRoot = 'b173e2db29e79c78963cff5196f8a983fbe0171388972106b114ef7f5c24dfa3' - - it('should store a longer string', function (t) { - trie.put(Buffer.from('done'), Buffer.from(longString), function (err1) { - trie.put(Buffer.from('doge'), Buffer.from('coin'), function (err2) { - t.equal(longStringRoot, trie.root.toString('hex')) - t.end(err1 || err2) - }) + tape('storing longer values', async function (tester) { + const it = tester.test + const trie = new CheckpointTrie() + const longString = 'this will be a really really really long value' + const longStringRoot = 'b173e2db29e79c78963cff5196f8a983fbe0171388972106b114ef7f5c24dfa3' + + it('should store a longer string', async function (t) { + await trie.put(Buffer.from('done'), Buffer.from(longString)) + await trie.put(Buffer.from('doge'), Buffer.from('coin')) + t.equal(longStringRoot, trie.root.toString('hex')) + t.end() }) - }) - it('should retreive a longer value', function (t) { - trie.get(Buffer.from('done'), function (err, value) { + it('should retreive a longer value', async function (t) { + const value = await trie.get(Buffer.from('done')) t.equal(value!.toString(), longString) - t.end(err) + t.end() }) - }) - it('should when being modiefied delete the old value', function (t) { - trie.put(Buffer.from('done'), Buffer.from('test'), t.end) + it('should when being modiefied delete the old value', async function (t) { + await trie.put(Buffer.from('done'), Buffer.from('test')) + t.end() + }) }) -}) -tape('testing Extentions and branches', function (tester) { - var trie = new Trie() as CheckpointTrie - var it = tester.test + tape('testing Extentions and branches', function (tester) { + const it = tester.test + const trie = new CheckpointTrie() - it('should store a value', function (t) { - trie.put(Buffer.from('doge'), Buffer.from('coin'), t.end) - }) + it('should store a value', async function (t) { + await trie.put(Buffer.from('doge'), Buffer.from('coin')) + t.end() + }) - it('should create extention to store this value', function (t) { - trie.put(Buffer.from('do'), Buffer.from('verb'), function () { + it('should create extention to store this value', async function (t) { + await trie.put(Buffer.from('do'), Buffer.from('verb')) t.equal( 'f803dfcb7e8f1afd45e88eedb4699a7138d6c07b71243d9ae9bff720c99925f9', trie.root.toString('hex'), ) t.end() }) - }) - it('should store this value under the extention ', function (t) { - trie.put(Buffer.from('done'), Buffer.from('finished'), function () { + it('should store this value under the extention ', async function (t) { + await trie.put(Buffer.from('done'), Buffer.from('finished')) t.equal( '409cff4d820b394ed3fb1cd4497bdd19ffa68d30ae34157337a7043c94a3e8cb', trie.root.toString('hex'), @@ -145,22 +129,23 @@ tape('testing Extentions and branches', function (tester) { t.end() }) }) -}) -tape('testing Extentions and branches - reverse', function (tester) { - var it = tester.test - var trie = new Trie() as CheckpointTrie + tape('testing Extentions and branches - reverse', function (tester) { + const it = tester.test + const trie = new CheckpointTrie() - it('should create extention to store this value', function (t) { - trie.put(Buffer.from('do'), Buffer.from('verb'), t.end) - }) + it('should create extention to store this value', async function (t) { + await trie.put(Buffer.from('do'), Buffer.from('verb')) + t.end() + }) - it('should store a value', function (t) { - trie.put(Buffer.from('doge'), Buffer.from('coin'), t.end) - }) + it('should store a value', async function (t) { + await trie.put(Buffer.from('doge'), Buffer.from('coin')) + t.end() + }) - it('should store this value under the extention ', function (t) { - trie.put(Buffer.from('done'), Buffer.from('finished'), function () { + it('should store this value under the extention ', async function (t) { + await trie.put(Buffer.from('done'), Buffer.from('finished')) t.equal( '409cff4d820b394ed3fb1cd4497bdd19ffa68d30ae34157337a7043c94a3e8cb', trie.root.toString('hex'), @@ -171,139 +156,88 @@ tape('testing Extentions and branches - reverse', function (tester) { }) tape('testing deletions cases', function (tester) { - var it = tester.test - var trie = new Trie() as CheckpointTrie - - it('should delete from a branch->branch-branch', function (t) { - async.parallel( - [ - async.apply(trie.put.bind(trie), Buffer.from([11, 11, 11]), Buffer.from('first')), - async.apply( - trie.put.bind(trie), - Buffer.from([12, 22, 22]), - Buffer.from('create the first branch'), - ), - async.apply( - trie.put.bind(trie), - Buffer.from([12, 34, 44]), - Buffer.from('create the last branch'), - ), - ], - function () { - trie.del(Buffer.from([12, 22, 22]), function () { - trie.get(Buffer.from([12, 22, 22]), function (err, val) { - t.equal(null, val) - trie = new Trie() as CheckpointTrie - t.end(err) - }) - }) - }, - ) - }) - - it('should delete from a branch->branch-extention', function (t) { - async.parallel( - [ - async.apply(trie.put.bind(trie), Buffer.from([11, 11, 11]), Buffer.from('first')), - async.apply( - trie.put.bind(trie), - Buffer.from([12, 22, 22]), - Buffer.from('create the first branch'), - ), - async.apply( - trie.put.bind(trie), - Buffer.from([12, 33, 33]), - Buffer.from('create the middle branch'), - ), - async.apply( - trie.put.bind(trie), - Buffer.from([12, 33, 44]), - Buffer.from('create the last branch'), - ), - ], - function () { - trie.del(Buffer.from([12, 22, 22]), function () { - trie.get(Buffer.from([12, 22, 22]), function (err, val) { - t.equal(null, val) - t.end(err) - }) - }) - }, - ) - }) - - it('should delete from a extention->branch-extention', function (t) { - trie.put(Buffer.from([11, 11, 11]), Buffer.from('first'), function () { - // create the top branch - trie.put(Buffer.from([12, 22, 22]), Buffer.from('create the first branch'), function () { - // crete the middle branch - trie.put(Buffer.from([12, 33, 33]), Buffer.from('create the middle branch'), function () { - trie.put(Buffer.from([12, 33, 44]), Buffer.from('create the last branch'), function () { - // delete the middle branch - trie.del(Buffer.from([11, 11, 11]), function () { - trie.get(Buffer.from([11, 11, 11]), function (err, val) { - t.equal(null, val) - t.end(err) - }) - }) - }) - }) - }) - }) - }) - - it('should delete from a extention->branch-branch', function (t) { - trie.put(Buffer.from([11, 11, 11]), Buffer.from('first'), function () { - // create the top branch - trie.put(Buffer.from([12, 22, 22]), Buffer.from('create the first branch'), function () { - // crete the middle branch - trie.put(Buffer.from([12, 33, 33]), Buffer.from('create the middle branch'), function () { - trie.put(Buffer.from([12, 34, 44]), Buffer.from('create the last branch'), function () { - // delete the middle branch - trie.del(Buffer.from([11, 11, 11]), function () { - trie.get(Buffer.from([11, 11, 11]), function (err, val) { - t.equal(null, val) - t.end(err) - }) - }) - }) - }) - }) - }) + const it = tester.test + const trie = new CheckpointTrie() + + it('should delete from a branch->branch-branch', async function (t) { + await trie.put(Buffer.from([11, 11, 11]), Buffer.from('first')) + await trie.put(Buffer.from([12, 22, 22]), Buffer.from('create the first branch')) + await trie.put(Buffer.from([12, 34, 44]), Buffer.from('create the last branch')) + + await trie.del(Buffer.from([12, 22, 22])) + const val = await trie.get(Buffer.from([12, 22, 22])) + t.equal(null, val) + t.end() + }) + + it('should delete from a branch->branch-extention', async function (t) { + await trie.put(Buffer.from([11, 11, 11]), Buffer.from('first')) + await trie.put(Buffer.from([12, 22, 22]), Buffer.from('create the first branch')) + await trie.put(Buffer.from([12, 33, 33]), Buffer.from('create the middle branch')) + await trie.put(Buffer.from([12, 34, 44]), Buffer.from('create the last branch')) + + await trie.del(Buffer.from([12, 22, 22])) + const val = await trie.get(Buffer.from([12, 22, 22])) + t.equal(null, val) + t.end() + }) + + it('should delete from a extention->branch-extention', async function (t) { + await trie.put(Buffer.from([11, 11, 11]), Buffer.from('first')) + await trie.put(Buffer.from([12, 22, 22]), Buffer.from('create the first branch')) + await trie.put(Buffer.from([12, 33, 33]), Buffer.from('create the middle branch')) + await trie.put(Buffer.from([12, 34, 44]), Buffer.from('create the last branch')) + + // delete the middle branch + await trie.del(Buffer.from([11, 11, 11])) + const val = await trie.get(Buffer.from([11, 11, 11])) + t.equal(null, val) + t.end() + }) + + it('should delete from a extention->branch-branch', async function (t) { + await trie.put(Buffer.from([11, 11, 11]), Buffer.from('first')) + await trie.put(Buffer.from([12, 22, 22]), Buffer.from('create the first branch')) + await trie.put(Buffer.from([12, 33, 33]), Buffer.from('create the middle branch')) + await trie.put(Buffer.from([12, 34, 44]), Buffer.from('create the last branch')) + // delete the middle branch + await trie.del(Buffer.from([11, 11, 11])) + const val = await trie.get(Buffer.from([11, 11, 11])) + t.equal(null, val) + t.end() }) }) tape('it should create the genesis state root from ethereum', function (tester) { - var it = tester.test - var trie4 = new Trie() as CheckpointTrie - var g = Buffer.from('8a40bfaa73256b60764c1bf40675a99083efb075', 'hex') - var j = Buffer.from('e6716f9544a56c530d868e4bfbacb172315bdead', 'hex') - var v = Buffer.from('1e12515ce3e0f817a4ddef9ca55788a1d66bd2df', 'hex') - var a = Buffer.from('1a26338f0d905e295fccb71fa9ea849ffa12aaf4', 'hex') - var stateRoot = Buffer.alloc(32) + const it = tester.test + const trie4 = new CheckpointTrie() + + const g = Buffer.from('8a40bfaa73256b60764c1bf40675a99083efb075', 'hex') + const j = Buffer.from('e6716f9544a56c530d868e4bfbacb172315bdead', 'hex') + const v = Buffer.from('1e12515ce3e0f817a4ddef9ca55788a1d66bd2df', 'hex') + const a = Buffer.from('1a26338f0d905e295fccb71fa9ea849ffa12aaf4', 'hex') + let stateRoot = Buffer.alloc(32) stateRoot.fill(0) - var startAmount = Buffer.alloc(26) + + let startAmount = Buffer.alloc(26) startAmount.fill(0) startAmount[0] = 1 - var account = [startAmount, 0, stateRoot, ethUtil.KECCAK256_NULL] - var rlpAccount = rlp.encode(account) - var cppRlp = + + const account = [startAmount, 0, stateRoot, KECCAK256_NULL] + const rlpAccount = rlp.encode(account) + const cppRlp = 'f85e9a010000000000000000000000000000000000000000000000000080a00000000000000000000000000000000000000000000000000000000000000000a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470' - var genesisStateRoot = '2f4399b08efe68945c1cf90ffe85bbe3ce978959da753f9e649f034015b8817d' + const genesisStateRoot = '2f4399b08efe68945c1cf90ffe85bbe3ce978959da753f9e649f034015b8817d' tester.equal(cppRlp, rlpAccount.toString('hex')) - it('shall match the root', function (t) { - trie4.put(g, rlpAccount, function () { - trie4.put(j, rlpAccount, function () { - trie4.put(v, rlpAccount, function () { - trie4.put(a, rlpAccount, function () { - t.equal(trie4.root.toString('hex'), genesisStateRoot) - t.end() - }) - }) - }) - }) + it('shall match the root', async function (t) { + await trie4.put(g, rlpAccount) + await trie4.put(j, rlpAccount) + await trie4.put(v, rlpAccount) + await trie4.put(a, rlpAccount) + t.equal(trie4.root.toString('hex'), genesisStateRoot) + t.end() }) }) diff --git a/test/offical.spec.ts b/test/offical.spec.ts deleted file mode 100644 index 67b677f..0000000 --- a/test/offical.spec.ts +++ /dev/null @@ -1,77 +0,0 @@ -import * as tape from 'tape' -import * as async from 'async' -const Trie = require('../dist/index').CheckpointTrie - -tape('offical tests', function (t) { - const jsonTests = require('./fixtures/trietest.json').tests - const testNames = Object.keys(jsonTests) - let trie = new Trie() - async.eachSeries( - testNames, - function (i, done) { - let inputs = jsonTests[i].in - let expect = jsonTests[i].root - - async.eachSeries( - inputs, - function (input: any, done) { - for (let i = 0; i < 2; i++) { - if (input[i] && input[i].slice(0, 2) === '0x') { - input[i] = Buffer.from(input[i].slice(2), 'hex') - } else if (input[i] && typeof input[i] === 'string') { - input[i] = Buffer.from(input[i]) - } - } - - trie.put(Buffer.from(input[0]), input[1], function () { - done() - }) - }, - function () { - t.equal('0x' + trie.root.toString('hex'), expect) - trie = new Trie() - done() - }, - ) - }, - t.end, - ) -}) - -tape('offical tests any order', function (t) { - const jsonTests = require('./fixtures/trieanyorder.json').tests - var testNames = Object.keys(jsonTests) - var trie = new Trie() - async.eachSeries( - testNames, - function (i, done) { - var test = jsonTests[i] - var keys = Object.keys(test.in) - - async.eachSeries( - keys, - function (key: any, done) { - var val = test.in[key] - - if (key.slice(0, 2) === '0x') { - key = Buffer.from(key.slice(2), 'hex') - } - - if (val && val.slice(0, 2) === '0x') { - val = Buffer.from(val.slice(2), 'hex') - } - - trie.put(Buffer.from(key), Buffer.from(val), function () { - done() - }) - }, - function () { - t.equal('0x' + trie.root.toString('hex'), test.root) - trie = new Trie() - done() - }, - ) - }, - t.end, - ) -}) diff --git a/test/official.spec.ts b/test/official.spec.ts new file mode 100644 index 0000000..478f742 --- /dev/null +++ b/test/official.spec.ts @@ -0,0 +1,53 @@ +import * as tape from 'tape' +import { CheckpointTrie } from '../src' + +tape('offical tests', async function (t) { + const jsonTests = require('./fixtures/trietest.json').tests + const testNames = Object.keys(jsonTests) + let trie = new CheckpointTrie() + + for await (const testName of testNames) { + let inputs = jsonTests[testName].in + let expect = jsonTests[testName].root + for (const input of inputs) { + for (let i = 0; i < 2; i++) { + if (input[i] && input[i].slice(0, 2) === '0x') { + input[i] = Buffer.from(input[i].slice(2), 'hex') + } else if (input[i] && typeof input[i] === 'string') { + input[i] = Buffer.from(input[i]) + } + await trie.put(Buffer.from(input[0]), input[1]) + } + } + t.equal('0x' + trie.root.toString('hex'), expect) + trie = new CheckpointTrie() + } + t.end() +}) + +tape('offical tests any order', async function (t) { + const jsonTests = require('./fixtures/trieanyorder.json').tests + const testNames = Object.keys(jsonTests) + let trie = new CheckpointTrie() + for await (const testName of testNames) { + const test = jsonTests[testName] + const keys = Object.keys(test.in) + let key: any + for await (key of keys) { + let val = test.in[key] + + if (key.slice(0, 2) === '0x') { + key = Buffer.from(key.slice(2), 'hex') + } + + if (val && val.slice(0, 2) === '0x') { + val = Buffer.from(val.slice(2), 'hex') + } + + await trie.put(Buffer.from(key), Buffer.from(val)) + } + t.equal('0x' + trie.root.toString('hex'), test.root) + trie = new CheckpointTrie() + } + t.end() +}) diff --git a/test/prioritizedTaskExecutor.spec.ts b/test/prioritizedTaskExecutor.spec.ts index 99b7b03..9d45509 100644 --- a/test/prioritizedTaskExecutor.spec.ts +++ b/test/prioritizedTaskExecutor.spec.ts @@ -1,11 +1,12 @@ import * as tape from 'tape' -const PrioritizedTaskExecutor = require('../dist/prioritizedTaskExecutor').PrioritizedTaskExecutor +import { PrioritizedTaskExecutor } from '../src/prioritizedTaskExecutor' + const taskExecutor = new PrioritizedTaskExecutor(2) tape('prioritized task executor test', function (t) { - var tasks = [1, 2, 3, 4] - var callbacks = [] as any - var executionOrder = [] as any + let tasks = [1, 2, 3, 4] + let callbacks = [] as any + let executionOrder = [] as any tasks.forEach(function (task) { taskExecutor.execute(task, function (cb: Function) { executionOrder.push(task) @@ -17,7 +18,7 @@ tape('prioritized task executor test', function (t) { callback() }) - var expectedExecutionOrder = [1, 2, 4, 3] + let expectedExecutionOrder = [1, 2, 4, 3] t.deepEqual(executionOrder, expectedExecutionOrder) t.end() }) diff --git a/test/proof.spec.ts b/test/proof.spec.ts index 3674321..cc7a32d 100644 --- a/test/proof.spec.ts +++ b/test/proof.spec.ts @@ -1,129 +1,124 @@ import * as tape from 'tape' -import * as async from 'async' -const { promisify } = require('util') -const Trie = require('../dist/index').CheckpointTrie +import { CheckpointTrie } from '../src' tape('simple merkle proofs generation and verification', function (tester) { - var it = tester.test + const it = tester.test + it('create a merkle proof and verify it', async (t) => { - const trie = new Trie() - const put = promisify(trie.put.bind(trie)) + const trie = new CheckpointTrie() - await put(Buffer.from('key1aa'), Buffer.from('0123456789012345678901234567890123456789xx')) - await put(Buffer.from('key2bb'), Buffer.from('aval2')) - await put(Buffer.from('key3cc'), Buffer.from('aval3')) + await trie.put(Buffer.from('key1aa'), Buffer.from('0123456789012345678901234567890123456789xx')) + await trie.put(Buffer.from('key2bb'), Buffer.from('aval2')) + await trie.put(Buffer.from('key3cc'), Buffer.from('aval3')) - let proof = await Trie.prove(trie, Buffer.from('key2bb')) - let val = await Trie.verifyProof(trie.root, Buffer.from('key2bb'), proof) - t.equal(val.toString('utf8'), 'aval2') + let proof = await CheckpointTrie.prove(trie, Buffer.from('key2bb')) + let val = await CheckpointTrie.verifyProof(trie.root, Buffer.from('key2bb'), proof) + t.equal(val!.toString('utf8'), 'aval2') - proof = await Trie.prove(trie, Buffer.from('key1aa')) - val = await Trie.verifyProof(trie.root, Buffer.from('key1aa'), proof) - t.equal(val.toString('utf8'), '0123456789012345678901234567890123456789xx') + proof = await CheckpointTrie.prove(trie, Buffer.from('key1aa')) + val = await CheckpointTrie.verifyProof(trie.root, Buffer.from('key1aa'), proof) + t.equal(val!.toString('utf8'), '0123456789012345678901234567890123456789xx') - proof = await Trie.prove(trie, Buffer.from('key2bb')) - val = await Trie.verifyProof(trie.root, Buffer.from('key2'), proof) + proof = await CheckpointTrie.prove(trie, Buffer.from('key2bb')) + val = await CheckpointTrie.verifyProof(trie.root, Buffer.from('key2'), proof) // In this case, the proof _happens_ to contain enough nodes to prove `key2` because // traversing into `key22` would touch all the same nodes as traversing into `key2` t.equal(val, null, 'Expected value at a random key to be null') let myKey = Buffer.from('anyrandomkey') - proof = await Trie.prove(trie, myKey) - val = await Trie.verifyProof(trie.root, myKey, proof) + proof = await CheckpointTrie.prove(trie, myKey) + val = await CheckpointTrie.verifyProof(trie.root, myKey, proof) t.equal(val, null, 'Expected value to be null') myKey = Buffer.from('anothergarbagekey') // should generate a valid proof of null - proof = await Trie.prove(trie, myKey) + proof = await CheckpointTrie.prove(trie, myKey) proof.push(Buffer.from('123456')) // extra nodes are just ignored - val = await Trie.verifyProof(trie.root, myKey, proof) + val = await CheckpointTrie.verifyProof(trie.root, myKey, proof) t.equal(val, null, 'Expected value to be null') await trie.put(Buffer.from('another'), Buffer.from('3498h4riuhgwe')) - // to throw an error we need to request proof for one key - proof = await Trie.prove(trie, 'another') - // and try to use that proof on another key - try { - await Trie.verifyProof(trie.root, Buffer.from('key1aa'), proof) - t.fail('expected error: Missing node in DB') - } catch (e) { - t.equal(e.message, 'Missing node in DB') - } - + // to fail our proof we can request a proof for one key + proof = await CheckpointTrie.prove(trie, Buffer.from('another')) + // and use that proof on another key + const result = await CheckpointTrie.verifyProof(trie.root, Buffer.from('key1aa'), proof) + t.equal(result, null) t.end() }) it('create a merkle proof and verify it with a single long key', async (t) => { - const trie = new Trie() - const put = promisify(trie.put.bind(trie)) + const trie = new CheckpointTrie() - await put(Buffer.from('key1aa'), Buffer.from('0123456789012345678901234567890123456789xx')) + await trie.put(Buffer.from('key1aa'), Buffer.from('0123456789012345678901234567890123456789xx')) - const proof = await Trie.prove(trie, Buffer.from('key1aa')) - const val = await Trie.verifyProof(trie.root, Buffer.from('key1aa'), proof) - t.equal(val.toString('utf8'), '0123456789012345678901234567890123456789xx') + const proof = await CheckpointTrie.prove(trie, Buffer.from('key1aa')) + const val = await CheckpointTrie.verifyProof(trie.root, Buffer.from('key1aa'), proof) + t.equal(val!.toString('utf8'), '0123456789012345678901234567890123456789xx') t.end() }) it('create a merkle proof and verify it with a single short key', async (t) => { - const trie = new Trie() - const put = promisify(trie.put.bind(trie)) + const trie = new CheckpointTrie() - await put(Buffer.from('key1aa'), Buffer.from('01234')) + await trie.put(Buffer.from('key1aa'), Buffer.from('01234')) - const proof = await Trie.prove(trie, Buffer.from('key1aa')) - const val = await Trie.verifyProof(trie.root, Buffer.from('key1aa'), proof) - t.equal(val.toString('utf8'), '01234') + const proof = await CheckpointTrie.prove(trie, Buffer.from('key1aa')) + const val = await CheckpointTrie.verifyProof(trie.root, Buffer.from('key1aa'), proof) + t.equal(val!.toString('utf8'), '01234') t.end() }) it('create a merkle proof and verify it whit keys in the middle', async (t) => { - const trie = new Trie() - const put = promisify(trie.put.bind(trie)) - - await put(Buffer.from('key1aa'), Buffer.from('0123456789012345678901234567890123456789xxx')) - await put(Buffer.from('key1'), Buffer.from('0123456789012345678901234567890123456789Very_Long')) - await put(Buffer.from('key2bb'), Buffer.from('aval3')) - await put(Buffer.from('key2'), Buffer.from('short')) - await put(Buffer.from('key3cc'), Buffer.from('aval3')) - await put(Buffer.from('key3'), Buffer.from('1234567890123456789012345678901')) - - let proof = await Trie.prove(trie, Buffer.from('key1')) - let val = await Trie.verifyProof(trie.root, Buffer.from('key1'), proof) - t.equal(val.toString('utf8'), '0123456789012345678901234567890123456789Very_Long') - - proof = await Trie.prove(trie, Buffer.from('key2')) - val = await Trie.verifyProof(trie.root, Buffer.from('key2'), proof) - t.equal(val.toString('utf8'), 'short') - - proof = await Trie.prove(trie, Buffer.from('key3')) - val = await Trie.verifyProof(trie.root, Buffer.from('key3'), proof) - t.equal(val.toString('utf8'), '1234567890123456789012345678901') + const trie = new CheckpointTrie() + + await trie.put( + Buffer.from('key1aa'), + Buffer.from('0123456789012345678901234567890123456789xxx'), + ) + await trie.put( + Buffer.from('key1'), + Buffer.from('0123456789012345678901234567890123456789Very_Long'), + ) + await trie.put(Buffer.from('key2bb'), Buffer.from('aval3')) + await trie.put(Buffer.from('key2'), Buffer.from('short')) + await trie.put(Buffer.from('key3cc'), Buffer.from('aval3')) + await trie.put(Buffer.from('key3'), Buffer.from('1234567890123456789012345678901')) + + let proof = await CheckpointTrie.prove(trie, Buffer.from('key1')) + let val = await CheckpointTrie.verifyProof(trie.root, Buffer.from('key1'), proof) + t.equal(val!.toString('utf8'), '0123456789012345678901234567890123456789Very_Long') + + proof = await CheckpointTrie.prove(trie, Buffer.from('key2')) + val = await CheckpointTrie.verifyProof(trie.root, Buffer.from('key2'), proof) + t.equal(val!.toString('utf8'), 'short') + + proof = await CheckpointTrie.prove(trie, Buffer.from('key3')) + val = await CheckpointTrie.verifyProof(trie.root, Buffer.from('key3'), proof) + t.equal(val!.toString('utf8'), '1234567890123456789012345678901') t.end() }) it('should succeed with a simple embedded extension-branch', async (t) => { - const trie = new Trie() - const put = promisify(trie.put.bind(trie)) + const trie = new CheckpointTrie() - await put(Buffer.from('a'), Buffer.from('a')) - await put(Buffer.from('b'), Buffer.from('b')) - await put(Buffer.from('c'), Buffer.from('c')) + await trie.put(Buffer.from('a'), Buffer.from('a')) + await trie.put(Buffer.from('b'), Buffer.from('b')) + await trie.put(Buffer.from('c'), Buffer.from('c')) - let proof = await Trie.prove(trie, Buffer.from('a')) - let val = await Trie.verifyProof(trie.root, Buffer.from('a'), proof) - t.equal(val.toString('utf8'), 'a') + let proof = await CheckpointTrie.prove(trie, Buffer.from('a')) + let val = await CheckpointTrie.verifyProof(trie.root, Buffer.from('a'), proof) + t.equal(val!.toString('utf8'), 'a') - proof = await Trie.prove(trie, Buffer.from('b')) - val = await Trie.verifyProof(trie.root, Buffer.from('b'), proof) - t.equal(val.toString('utf8'), 'b') + proof = await CheckpointTrie.prove(trie, Buffer.from('b')) + val = await CheckpointTrie.verifyProof(trie.root, Buffer.from('b'), proof) + t.equal(val!.toString('utf8'), 'b') - proof = await Trie.prove(trie, Buffer.from('c')) - val = await Trie.verifyProof(trie.root, Buffer.from('c'), proof) - t.equal(val.toString('utf8'), 'c') + proof = await CheckpointTrie.prove(trie, Buffer.from('c')) + val = await CheckpointTrie.verifyProof(trie.root, Buffer.from('c'), proof) + t.equal(val!.toString('utf8'), 'c') t.end() }) diff --git a/test/scratch.spec.ts b/test/scratch.spec.ts index 4a9a3e7..2ef8527 100644 --- a/test/scratch.spec.ts +++ b/test/scratch.spec.ts @@ -1,59 +1,45 @@ import * as tape from 'tape' -const ScratchDB = require('../dist/scratch').ScratchDB -const DB = require('../dist/db').DB -import { DB as IDB } from '../dist/db' -import { ScratchDB as IScratchDB } from '../dist/scratch' +import { DB } from '../src/db' +import { ScratchDB } from '../src/scratch' tape('ScratchDB', (t) => { - const upstream = new DB() as IDB - const scratch = new ScratchDB(upstream) as IScratchDB + const upstream = new DB() + const scratch = new ScratchDB(upstream) const k = Buffer.from('foo') const v = Buffer.from('bar') const k2 = Buffer.from('bar') const v2 = Buffer.from('baz') - t.test('should fail to get non-existent value', (st) => { - scratch.get(k, (err, res) => { - st.error(err) - st.notOk(res) - st.end() - }) + t.test('should fail to get non-existent value', async (st) => { + const res = await scratch.get(k) + st.notOk(res) + st.end() }) - t.test('puts value to scratch', (st) => { - scratch.put(k, v, () => { - scratch.get(k, (err, res) => { - st.error(err) - st.ok(v.equals(res!)) - st.end() - }) - }) + t.test('puts value to scratch', async (st) => { + await scratch.put(k, v) + const res = await scratch.get(k) + st.ok(v.equals(res!)) + st.end() }) - t.test('should not have put value to upstream', (st) => { - upstream.get(k, (err, res) => { - st.error(err) - st.notOk(res) - st.end() - }) + t.test('should not have put value to upstream', async (st) => { + const res = await upstream.get(k) + st.notOk(res) + st.end() }) - t.test('should put value directly to upstream', (st) => { - upstream.put(k2, v2, () => { - upstream.get(k2, (err, res) => { - st.error(err) - st.ok(v2.equals(res!)) - st.end() - }) - }) + t.test('should put value directly to upstream', async (st) => { + await upstream.put(k2, v2) + const res = await upstream.get(k2) + st.ok(v2.equals(res!)) + st.end() }) - t.test('scratch should get value from upstream', (st) => { - scratch.get(k2, (err, res) => { - st.error(err) - st.ok(v2.equals(res!)) - st.end() - }) + t.test('scratch should get value from upstream', async (st) => { + const res = await scratch.get(k2) + st.ok(v2.equals(res!)) + st.end() }) }) diff --git a/test/secure.spec.ts b/test/secure.spec.ts index f921ee4..6d36ba4 100644 --- a/test/secure.spec.ts +++ b/test/secure.spec.ts @@ -1,110 +1,70 @@ import * as tape from 'tape' -import * as async from 'async' -const Trie = require('../dist/secure').SecureTrie -import { SecureTrie } from '../dist/secure' +import { SecureTrie } from '../src' tape('SecureTrie', function (t) { - const trie = new Trie() as SecureTrie + const trie = new SecureTrie() const k = Buffer.from('foo') const v = Buffer.from('bar') - t.test('put and get value', function (st) { - trie.put(k, v, function () { - trie.get(k, function (err, res) { - st.error(err) - st.ok(v.equals(res!)) - st.end() - }) - }) + t.test('put and get value', async function (st) { + await trie.put(k, v) + const res = await trie.get(k) + st.ok(v.equals(res!)) + st.end() }) - t.test('copy trie', function (st) { + t.test('copy trie', async function (st) { const t = trie.copy() - t.get(k, function (err, res) { - st.error(err) - st.ok(v.equals(res!)) - st.end() - }) + const res = await t.get(k) + st.ok(v.equals(res!)) + st.end() }) -}) -tape('SecureTrie proof', function (t) { - t.test('create a merkle proof and verify it with a single short key', function (st) { - const trie = new Trie() + tape('SecureTrie proof', function (t) { + t.test('create a merkle proof and verify it with a single short key', async function (st) { + const trie = new SecureTrie() + await trie.put(Buffer.from('key1aa'), Buffer.from('01234')) - async.series( - [ - function (cb) { - trie.put(Buffer.from('key1aa'), Buffer.from('01234'), cb) - }, - async function () { - const proof = await Trie.prove(trie, Buffer.from('key1aa')) - const val = await Trie.verifyProof(trie.root, Buffer.from('key1aa'), proof) - st.equal(val.toString('utf8'), '01234') - st.end() - }, - ], - function (err) { - st.end(err) - }, - ) + const proof = await SecureTrie.prove(trie, Buffer.from('key1aa')) + const val = await SecureTrie.verifyProof(trie.root, Buffer.from('key1aa'), proof) + st.equal(val!.toString('utf8'), '01234') + st.end() + }) }) -}) -tape('secure tests', function (it) { - let trie = new Trie() as SecureTrie - const jsonTests = require('./fixtures/trietest_secureTrie.json').tests + tape('secure tests', function (it) { + let trie = new SecureTrie() + const jsonTests = require('./fixtures/trietest_secureTrie.json').tests - it.test('empty values', function (t) { - async.eachSeries( - jsonTests.emptyValues.in, - function (row: any, cb) { - trie.put( - Buffer.from(row[0]), - row[1] ? Buffer.from(row[1]) : ((null as unknown) as Buffer), - cb, - ) - }, - function (err) { - t.equal('0x' + trie.root.toString('hex'), jsonTests.emptyValues.root) - t.end(err) - }, - ) - }) + it.test('empty values', async function (t) { + for await (const row of jsonTests.emptyValues.in) { + const val = row[1] ? Buffer.from(row[1]) : ((null as unknown) as Buffer) + await trie.put(Buffer.from(row[0]), val) + } + t.equal('0x' + trie.root.toString('hex'), jsonTests.emptyValues.root) + t.end() + }) - it.test('branchingTests', function (t) { - trie = new Trie() - async.eachSeries( - jsonTests.branchingTests.in, - function (row: any, cb) { - trie.put( - Buffer.from(row[0]), - row[1] ? Buffer.from(row[1]) : ((null as unknown) as Buffer), - cb, - ) - }, - function () { - t.equal('0x' + trie.root.toString('hex'), jsonTests.branchingTests.root) - t.end() - }, - ) - }) + it.test('branchingTests', async function (t) { + trie = new SecureTrie() + for await (const row of jsonTests.branchingTests.in) { + const val = row[1] ? Buffer.from(row[1]) : ((null as unknown) as Buffer) + await trie.put(Buffer.from(row[0]), val) + } + t.equal('0x' + trie.root.toString('hex'), jsonTests.branchingTests.root) + t.end() + }) - it.test('jeff', function (t) { - async.eachSeries( - jsonTests.jeff.in, - function (row: any, cb) { - var val = row[1] + it.test('jeff', async function (t) { + for await (const row of jsonTests.jeff.in) { + let val = row[1] if (val) { val = Buffer.from(row[1].slice(2), 'hex') } - - trie.put(Buffer.from(row[0].slice(2), 'hex'), val, cb) - }, - function () { - t.equal('0x' + trie.root.toString('hex'), jsonTests.jeff.root.toString('hex')) - t.end() - }, - ) + await trie.put(Buffer.from(row[0].slice(2), 'hex'), val) + } + t.equal('0x' + trie.root.toString('hex'), jsonTests.jeff.root.toString('hex')) + t.end() + }) }) }) diff --git a/test/streams.spec.ts b/test/stream.spec.ts similarity index 75% rename from test/streams.spec.ts rename to test/stream.spec.ts index 23aa9dc..ce229d7 100644 --- a/test/streams.spec.ts +++ b/test/stream.spec.ts @@ -1,12 +1,11 @@ import * as tape from 'tape' -const Trie = require('../dist/index').CheckpointTrie -import { CheckpointTrie } from '../dist/checkpointTrie' -import { BatchDBOp } from '../dist/db' +import { CheckpointTrie } from '../src' +import { BatchDBOp } from '../src/db' tape('kv stream test', function (tester) { - var it = tester.test - var trie = new Trie() as CheckpointTrie - var init = [ + const it = tester.test + const trie = new CheckpointTrie() + const ops = [ { type: 'del', key: Buffer.from('father'), @@ -93,27 +92,28 @@ tape('kv stream test', function (tester) { }, ] as BatchDBOp[] - var valObj = {} as any - init.forEach(function (i) { - if (i.type === 'put') { - valObj[String(i.key)] = i.value + let valObj = {} as any + for (let op of ops) { + if (op.type === 'put') { + valObj[op.key.toString()] = op.value.toString() } - }) + } - it('should populate trie', function (t) { - trie.batch(init, function () { - t.end() - }) + it('should populate trie', async function (t) { + await trie.batch(ops) + t.end() }) it('should fetch all of the nodes', function (t) { - var stream = trie.createReadStream() - stream.on('data', function (d: any) { - t.equal(valObj[d.key.toString()].toString(), d.value.toString()) - delete valObj[d.key.toString()] + const stream = trie.createReadStream() + stream.on('data', (d: any) => { + const key = d.key.toString() + const value = d.value.toString() + t.equal(valObj[key], value) + delete valObj[key] }) - stream.on('end', function () { - var keys = Object.keys(valObj) + stream.on('end', () => { + let keys = Object.keys(valObj) t.equal(keys.length, 0) t.end() }) @@ -121,9 +121,9 @@ tape('kv stream test', function (tester) { }) tape('db stream test', function (tester) { - var it = tester.test - var trie = new Trie() - var init = [ + const it = tester.test + const trie = new CheckpointTrie() + const ops = [ { type: 'put', key: Buffer.from('color'), @@ -154,9 +154,9 @@ tape('db stream test', function (tester) { key: Buffer.from('color'), value: Buffer.from('pink'), }, - ] + ] as BatchDBOp[] - var expectedNodes = { + const expectedNodes = { '3c38d9aa6ad288c8e27da701e17fe99a5b67c8b12fd0469651c80494d36bc4c1': true, d5f61e1ff2b918d1c2a2c4b1732a3c68bd7e3fd64f35019f2f084896d4546298: true, e64329dadee2fb8a113b4c88cfe973aeaa9b523d4dc8510b84ca23f9d5bfbd90: true, @@ -164,20 +164,22 @@ tape('db stream test', function (tester) { '2386bfb0de9cf93902a110f5ab07b917ffc0b9ea599cb7f4f8bb6fd1123c866c': true, } as any - it('should populate trie', function (t) { + it('should populate trie', async function (t) { trie.checkpoint() - trie.batch(init, t.end) + await trie.batch(ops) + t.end() }) it('should only fetch nodes in the current trie', function (t) { - var stream = trie._createScratchReadStream() - stream.on('data', function (d: any) { - var key = d.key.toString('hex') + const stream = trie._createScratchReadStream() + stream.on('data', (d: any) => { + const key = d.key.toString('hex') t.ok(!!expectedNodes[key]) delete expectedNodes[key] }) - stream.on('end', function () { - t.equal(Object.keys(expectedNodes).length, 0) + stream.on('end', () => { + let keys = Object.keys(expectedNodes) + t.equal(keys.length, 0) t.end() }) })