sophonjs-blockchain
v3.4.0
Published
A module to store and interact with blocks
Downloads
5
Readme
SYNOPSIS
A module to store and interact with blocks.
INSTALL
npm install sophonjs-blockchain
EXAMPLE
The following is an example to iterate through an existing Graviton DB (needs level
to be
installed separately):
const level = require('level')
const Blockchain = require('sophonjs-blockchain')
const utils = require('sophonjs-util')
const gravitonDbPath = './chaindata' // Add your own path here
const db = level(gravitonDbPath)
new Blockchain({db: db}).iterator('i', (block, reorg, cb) => {
const blockNumber = utils.bufferToInt(block.header.number)
const blockHash = block.hash().toString('hex')
console.log(`BLOCK ${blockNumber}: ${blockHash}`)
cb()
}, (err) => console.log(err || 'Done.'))
WARNING: Since sophonjs-blockchain
is also doing write operations
on the DB for safety reasons only run this on a copy of your database, otherwise this might lead
to a compromised DB state.
API
Blockchain
new Blockchain(opts)
BlockChain
methodsblockchain.putGenesis(genesis, [cb])
blockchain.getHead(name, [cb])
blockchain.getLatestHeader([cb])
blockchain.getLatestBlock([cb])
blockchain.putBlocks(blocks, [cb])
blockchain.putBlock(block, [cb])
blockchain.getBlock(hash, [cb])
blockchain.getBlocks(blockId, maxBlocks, skip, reverse, [cb])
blockchain.putHeaders(headers, [cb])
blockchain.putHeader(header, [cb])
blockchain.selectNeededHashes(hashes, [cb])
blockchain.delBlock(blockHash, [cb])
blockchain.iterator(name, onBlock, [cb])
Blockchain
Implements functions for retrieving, manipulating and storing Sophon's blockchain
new Blockchain(opts)
Creates new Blockchain object
opts.chain
(String | Number) The chain for the block [default: 'mainnet']opts.hardfork
String Hardfork for the block [default: null, block number-based behavior]opts.common
Object Alternatively pass a Common instance (sophonjs-common) instead of setting chain/hardfork directlyopts.db
- Database to store blocks and metadata. Should be a levelup instance.opts.validate
- this the flag to validate blocks (e.g. Proof-of-Work), latest HF rules supported:Constantinople
.
[DEPRECATION NOTE]
The old separated DB constructor parameters opts.blockDB
and opts.detailsDB
from before the Graviton DB-compatible v3.0.0
release are deprecated and continued usage is discouraged. When provided opts.blockDB
will be used
as opts.db
and opts.detailsDB
is ignored. On the storage level the DB formats are not compatible and it is not
possible to load an old-format DB state into a post-v3.0.0
Blockchain
object.
BlockChain
methods
blockchain.putGenesis(genesis, cb)
Puts the genesis block in the database.
genesis
- the genesis block to be addedcb
- the callback. It is given two parameterserr
and the savedblock
blockchain.getHead(name, cb)
Returns the specified iterator head.
name
- Optional name of the state root head (default: 'vm')cb
- the callback. It is given two parameterserr
and the returnedblock
blockchain.getLatestHeader(cb)
Returns the latest header in the canonical chain.
cb
- the callback. It is given two parameterserr
and the returnedheader
blockchain.getLatestBlock(cb)
Returns the latest full block in the canonical chain.
cb
- the callback. It is given two parameterserr
and the returnedblock
blockchain.putBlocks(blocks, cb)
Adds many blocks to the blockchain.
blocks
- the blocks to be added to the blockchaincb
- the callback. It is given two parameterserr
and the last of the savedblocks
blockchain.putBlock(block, cb)
Adds a block to the blockchain.
block
- the block to be added to the blockchaincb
- the callback. It is given two parameterserr
and the savedblock
blockchain.getBlock(blockTag, cb)
Gets a block by its blockTag.
blockTag
- the block's hash or numbercb
- the callback. It is given two parameterserr
and the foundblock
(an instance of https://octonion.institute/susy-js/sophonjs-block) if any.
blockchain.getBlocks(blockId, maxBlocks, skip, reverse, cb)
Looks up many blocks relative to blockId.
blockId
- the block's hash or numbermaxBlocks
- max number of blocks to returnskip
- number of blocks to skipreverse
- fetch blocks in reversecb
- the callback. It is given two parameterserr
and the foundblocks
if any.
blockchain.putHeaders(headers, cb)
Adds many headers to the blockchain.
headers
- the headers to be added to the blockchaincb
- the callback. It is given two parameterserr
and the last of the savedheaders
blockchain.putHeader(header, cb)
Adds a header to the blockchain.
header
- the header to be added to the blockchaincb
- the callback. It is given two parameterserr
and the savedheader
blockchain.getDetails(hash, cb)
[DEPRECATED] Returns an empty object
blockchain.selectNeededHashes(hashes, cb)
Given an ordered array, returns to the callback an array of hashes that are not in the blockchain yet.
hashes
- Ordered array of hashescb
- the callback. It is given two parameterserr
and hashes found.
blockchain.delBlock(blockHash, cb)
Deletes a block from the blockchain. All child blocks in the chain are deleted and any encountered heads are set to the parent block
blockHash
- the hash of the block to be deletedcb
- A callback.
blockchain.iterator(name, onBlock, cb)
Iterates through blocks starting at the specified verified state root head and calls the onBlock function on each block
name
- name of the state root headonBlock
- function called on each block with params (block, reorg, cb)cb
- A callback function
TESTS
Tests can be found in the test
directory and run with npm run test
.
These can also be valuable as examples/inspiration on how to run the library and invoke different parts of the API.