nano-node
v0.0.9
Published
Publish blocks to raiblocks
Downloads
279
Readme
Node.js Nano Node
Partial (light, leech) Node for Nano currency (Formerly Raiblocks) for Node.js.
Examples:
- Pending: How to listen for new pending blocks on a specific account
- Receive: How to publish a block
- Pull: How to fetch an account blockchain history
- Votes: How to listen for representative votes
- State Blocks: How to listen for state blocks
Table of Contents
Installation
npm install --save nano-node
class NanoNode extends EventEmitter
Events Emitted
Name | Listener Arguments | Description
-----|-------------------|-----------------------
message
| msg
, rinfo
| Network message received
block
| block
, rinfo
| Block received (messages of publish
type)
vote
| msg
, rinfo
| Vote received (messages of confirm_ack
type)
ready
| None | Server is listening
error
| error
| An error has occurred
Properties
May be set after construction.
Name | Description
-----|---------------
peers
| Array of strings containing hostname concatenated with a colon and the portDefault: ['rai.raiblocks.net:7075']
maxPeers
| Maximum number of latest peers to publish new messagesDefault: 200
minimalConfirmAck
| Parsing and validating each confirm_ack
message as it arrives is very compute intensive due to the 2 blake2b hashes calculated on each receive. Set this value to false
to parse and validate comfirm_ack
messages. By default, (true
) only the account
public key is parsed.
tcpTimeout
| Duration to wait when performing TCP operations in millisecondsDefault: 4000
constructor(port)
port
<Integer>
Optional, random if unspecified
Create a new listening UDP service.
publish(msg, accountKey, callback)
msg
<Object>
Required, message definition, supports typeskeepalive
,publish
,confirm_req
. May also pass fully rendered messages asBuffer
.accountKey
<String>
Ifpublish
message and no signature provided, pass account private key as hex string for block signing.callback
<Function>
Optional, callback function
Publish a message to known peers. Known peers are managed automatically. Upon receiving a message, the peer is added to the top of the list. Up to maxPeers
peers are kept.
Returns only on publish
and confirm_req
messages: hex block hash
Publishing regular keepalive
messages is important to continure receiving messages:
const NanoNode = require('nano-node');
const node = new NanoNode();
setInterval(() => {
console.log('Sending keepalive to ', node.peers.length, 'peers...');
node.publish({type: 'keepalive'});
}, 30000);
Message Properties
Name | Default | Type | Description
-----|--------|-------|--------------
type
| None | String | Required, keepalive
or publish
mainnet
| true
| Boolean | Optional, True (default) for mainnet, false for testnet
versionMax
| 7
| Integer | Optional
versionUsing
| 7
| Integer | Optional
versionMin
| 1
| Integer | Optional
extensions
| 0
| Integer | Optional, overwritten with block type for publish
messages
body
| None | Object | Required for publish
messages
Publish Body Object Properties
Name | Required Types | Type | Description
-----|----------------|----|---
type
| All | String | send
, receive
, open
, change
, state
previous
| send
, receive
, change
, state
| 64 character hex string | Hash of previous block in account
destination
| send
| 64 character hex string | Account public key of recipient
balance
| send
, state
| 32 character hex string | New balance of account
source
| receive
, open
| 64 character hex string | Hash of pending send
block
representative
| open
, change
, state
| 64 character hex string | Public key of representative account to assign
account
| open
, state
| 64 character hex string | Public key of the current account
link
| state
| 64 character hex string | Public key of the current account
signature
| Optional | 128 character hex string | Pass precomputed signature in this property. Otherwise, pass accountKey
argument for block signing.
work
| All | 16 character hex string | Required for all block types, calculated from account public key for open
type blocks, previous block hash for all other block types. See raiblocks-pow NPM package for generating this value.
fetchAccount(publicKey, callback)
publicKey
<String>
Required, account public key to fetch block historycallback
<Function>
error, result
Connect to known peers over TCP and send a bulk_pull
message for a single account. Wait until timeout from tcpTimeout
property, then determine the longest valid chain returned.
Without a full lattice database, the balance of an account can not be determined unless the frontier block is a send
block.
Result object properties:
Name | Type | Description
----|-------|--------------
blocks
| Array | Transaction history sorted newest to oldest
matchProportion
| Number | Between 0 and 1 indicating the proportion of peer responses that match this chain. A value of 1 means all responding peers agree on this length.
returnCount
| Number | Count of peer responses returned before timeout
Static parseMessage(buf, minimalConfirmAck)
buf
<Buffer>
Required, full UDP messageminimalConfirmAck
<Boolean>
Optional, default: true. Only parse account value of vote (confirm_ack) messages
Returns an object with the properties of the message
Static renderMessage(msg, accountKey)
Useful for obtaining a block's hash without publishing it yet.
msg
<Object>
Required, message properties as described aboveaccountKey
<String>
Required to sign blocks forpublish
,confirm_req
messages, otherwise provide signature property
Returns an object { message: <Buffer>, hash: <String|null> }
hash
is block hash if available
Static keyFromAccount(account)
account
<String>
Required, account address to convert
Return the public key for a given address
Static accountFromKey(key)
key
<String>
Required, public key to convert
Return the address for a given account public key
Static accountPair(seed, index)
seed
<String|Buffer>
Required, wallet seed as 32 byte Buffer or 64 character hex stringindex
<Number>
Required, 32-bit unsigned integer specifying account index
Returns an object {privateKey: <String>, publicKey: <String>, address: <string>}
License
MIT