nanomemotools.js
Cryptographically secure memos for every Nano block
This library allows you to sign, verify signature, encrypt, and decrypt messages with the same keys used to sign a Nano block. It includes multiple modules to assist you in doing offline actions as well as communicating with the NanoMemo.cc API endpoints. This documentation covers the capabilities of this library. For more details on the RESTful API on NanoMemo.cc you can view the documentation here: https://nanomemo.cc/docs/api.
Created by SomeNano Twitter: @SomeNanoTweets
Installation
Via NPM:
$ npm install nanomemotools
also available as a standalone js file in the github repository/dist, nanomemotools.js
<script src="nanomemotools.js"></script>
<script>
NanoMemoTools.memo...
</script>
Usage
Full documentation is located in the /docs directory or viewable online: (https://somenano.github.io/NanoMemoTools)
const NanoMemoTools = require('nanomemotools');
Tests can be run with the command:
npm test
Example
The /test directory on github has plenty of good examples.
NanoMemoTools.memo
Create a plaintext memo
const NanoMemoTools = require('nanomemotools');
const hash = '4ABC34D...';
const message = 'test message';
const signing_address = 'nano_1abc...';
const memo = new NanoMemoTools.memo.Memo(
hash,
message,
signing_address
);
// memo is unsigned at this point
memo.valid_signature == false;
// Sign it with the private key of the Nano Account that owns the block with the provided hash
const signing_private_key = '234ABC...';
const signature = memo.sign(signing_private_key);
memo.valid_signature == true;
Create an encrypted memo
const NanoMemoTools = require('nanomemotools');
const hash = '4ABC34D...';
const encrypted_message = 'test message';
const signing_address = 'nano_1abc...';
const decrypting_address = 'nano_3fed...';
const memo = new NanoMemoTools.memo.EncryptedMemo(
hash,
encrypted_message,
signing_address,
decrypting_address
);
// memo is unsigned at this point
memo.valid_signature == false;
// Sign it with the private key of the Nano Account that owns the block with the provided hash
const signing_private_key = '234ABC...';
const signature = memo.sign(signing_private_key);
memo.valid_signature == true;
Convert plaintext memo to encrypted memo
// Assume plaintext memo is already created...
const encrypted_memo = NanoMemoTools.memo.encrypt(memo, signing_private_key, decrypting_address);
// Signature is no longer valid since message was encrypted
encrypted_memo.valid_signature == false;
// Sign it with the private key of the Nano Account that owns the block with the provided hash
const signing_private_key = '234ABC...';
const signature = encrypted_memo.sign(signing_private_key);
encrypted_memo.valid_signature == true;
Convert encrypted memo to plaintext memo
// Assume encrypted memo is already created...
const memo = NanoMemoTools.memo.decrypt(encrypted_memo, decrypting_private_key);
// Signature is no longer valid since message was encrypted
memo.valid_signature == false;
// Sign it with the private key of the Nano Account that owns the block with the provided hash
const signing_private_key = '234ABC...';
const signature = memo.sign(signing_private_key);
memo.valid_signature == true;
NanoMemoTools.server
Get memo from server
const NanoMemoTools = require('nanomemotools');
const hash = '4ABC34D...';
const memo = await NanoMemoTools.server.getMemo(hash);
Save memo to server
Requires api key
const NanoMemoTools = require('nanomemotools');
const memo = new NanoMemoTools.memo.Memo( ... );
const api_key = '123...';
const api_secret = '321...';
const memo_response = await NanoMemoTools.server.saveMemo(memo, api_key, api_secret);
Get user data
Requires api key
const NanoMemoTools = require('nanomemotools');
const api_key = '123...';
const api_secret = '321...';
const user_data = await NanoMemoTools.server.getUserData(api_key, api_secret);
WebSocket
This websocket will send a message for every new memo that is created
const NanoMemoTools = require('nanomemotools');
const websocket = NanoMemoTools.server.websocketSubscribe(function(msg) {
// onmessage
console.log(msg);
});
// Can also unsubscribe
NanoMemoTools.server.websocketUnsubscribe();
Considerations
If someone has access to your Nano seed or private key they can access and transfer funds from your Nano Account. This library never stores your seed or private key. This library never sends your seed or private key to any server. All digital signing and encryption or decryption actions that require a private key are self-contained in this library and its dependencies.
It is your responsibility to use this library in a responsible manner and manage your own seed or private key.
Additionally, this library is covered by an MIT License which means it is provided "as is", without warranty of any kind. We make every attempt to be transparent. Below you will find the dependencies this library uses with links to their code and documentation repositories for your review as you see fit.
Requirements
- nanocurrency
- tweetnacl-blake2b
- blakejs
- Modified and locally included to use tweetnacl-blake2b instead of tweetnacl: ed2curve
- axios
- reconnecting-websocket
- ws