Feeless is a Nano cryptocurrency node, wallet, tools, and Rust crate. This is not the official project for Nano, only an implementation written in Rust. The official Nano node implementation lives here.
🚸 This is a work in progress. The API will probably change without notice until v0.2
. 🚸
I decided to start this project as a personal adventure of understanding Nano. I give no promises about my future motivation to complete this project 🤐.
Feature | Progress | Notes |
---|---|---|
Rust crate | 80% | See the documentation for usage and examples. Please suggest if a feature is missing. |
CLI tool | 60% | Seeds, phrases, public, private, addresses, parse a wireshark network capture1. |
Wallet | 0% | No wallet code yet, but should be quick to implement. |
Node | 20% | Can connect and communicate. No voting, storage, chain validation, etc. |
1. feeless pcap [file.pcapng]
can dump a capture file and dissect the packets. There are additional arguments you
can see with --help
. To do this as successfully as possible, capture with Wireshark, set the filter to nano
, File -> Export Specified Packets
, make sure Displayed
is selected.
Nano is digital money that significantly improves on Bitcoin and other cryptocurrencies.
The main features of Nano are:
-
No transaction fees.
-
Extremely fast to send money—less than 1 second for 100% confirmation.
Bitcoin takes 10 minutes on average for ~80%1 confirmation. Nano is more asynchronous than Bitcoin—individual transactions are voted on separately from the rest of the network. -
Highly decentralized.
Using the Nakamoto coefficient measurement, it is more decentralized than Bitcoin2 3.
-
No inflation.
-
Green—Massively less energy use than Bitcoin.
For more information on what Nano is, see the Nano documentation: https://docs.nano.org/what-is-nano/overview/
Nano is also known as: Nano cryptocurrency, Nano coin, RaiBlocks.
1. The Bitcoin white paper, under section 11 "Calculations" explains there's a ~80% chance for an attacker with 10% mining power to overtake the longest chain. https://bitcoin.org/bitcoin.pdf 2. Measuring Decentralization in Bitcoin and Ethereum using Multiple Metrics and Granularities https://arxiv.org/pdf/2101.10699.pdf 3. List of representative nodes showing a Nakamoto coefficient of 8 at the time of writing (2021-02) https://nanocharts.info/Currently the only way to do this is to install Rust, then run cargo install feeless
. This will
create a file in your rust's bin directory, or to specify a location run cargo install feeless --root [install-dir]
.
- Correctness before performance.
- A complete library that a Rust developer can use to handle wallets, keys, blocks, signing, proof of work, etc.
- A command line tool for particular actions, e.g. generating seeds, conversions between keys, addresses, etc.
- A command line client for the official Nano RPC server.
- A functional Nano node with business logic from the official C++ implementation.
- Correct rebroadcasting rules
- Representative voting
- Bootstrapping
- It has to perform well enough to help the network. I don't want Nano to slow down if people start using this! 🤦♀️
- Only support protocol v18+ (Maybe only v19+ depending on timing)
- No UDP support
- No user interface
A medium term task list:
- Seeds
- Mnemonic (word list) seed generation/parsing (BIP39)
- Derive keys from mnemonic (BIP33)
- Hex seeds
- Keys (ed25519/blake2b)
- Private keys
- Public keys
- Nano addresses
- Validation
- Parsing
- Conversion to/from public keys
- Nano amount conversions
- raw
- nano
- Mnano/NANO
- Proof of work (core)
- Verification against a threshold
- Generation
- Dynamic threshold
- Blocks
- Hashing
- Work
- State blocks
- <v18 blocks?
- Packet dissector
- Parse pcap file
- Dump some message types to console
- Mark this done when all packets are decoded successfully (see below)
- Node
- Configuration
- Initial command line interface
- Network
- Database
- ...
- Networks
- Live (Don't worry, I'm only connecting to my own node at the moment!)
- Test
- Beta
- Bootstrap peer connection (peering.nano.org)
- Validate given peer network
- Validate given peer versions
- Multiple peer connectivity (currently only connects to one peer)
- Configurable maximum peer limit
- Header parsing
- Network
- Versions
- Extensions
- Handshake query/response flags
- Count
- Block type
- Telemetry size
- Extended params present
- Logic
- Rebroadcasting
- Representatives
- Publish retries (difficulty changes)
- Respond to telemetry request
- ...
- Messages
- Node ID Handshake
- Serialize (TODO: needs small refactor)
- Deserialize
- Send cookie
- Cookie/peer store and logic
- Validate response
- Validate signature
- Confirm Req
- Serialize
- Deserialize
- Hash pairs
- Block selector
- Handle response
- Confirm Ack
- Serialize
- Deserialize
- Vote by hash
- Block
- Validate signature
- Keepalive
- Serialize
- Deserialize
- Publish
- Serialize
- Deserialize
- State blocks
- Other blocks
- Bulk pull
- Bulk pull account
- Bulk pull blocks
- Bulk push
- Telemetry Req
- Serialize
- Deserialize
- Telemetry Ack
- Serialize
- Deserialize
- Most fields
- Timestamp
- Active difficulty
- Validate signature
- Frontier Req
- Serialize
- Deserialize
- Node ID Handshake
- Storage
- Basic KV store to file
- Basic cookie/peer storage
- Peers
- Blocks
- ...
- RPC
- Configuration
- Rust
- Ask around for a code review
- Use either
zerocopy
or make all core types zero-copy with storing[u8]
and methods as accessors.zerocopy
did work for most things when I tried but had problems with enums. Might revisit. - Use
thiserror
instead ofanyhow
in certain places. - Github actions CI (including
cargo clippy
)
- Future things
- Fast bootstrapping related to the user's wallet
- Performance
- Automated comparison
- Proof of work
- Server
- GPU
- WASM
- Thanks to the hard work from the Nano Foundation.
- https://github.com/nanocurrency/nano-node
- The actual Nano implementation as a source of truth.
- https://forum.nano.org/, https://old.reddit.com/r/nanocurrency/, Nano Discord: https://chat.nano.org/
- A very friendly community helping out others and myself.
- https://docs.nano.org/
- General useful information.
- https://nanoo.tools/
- Helped me understand technical details on state blocks and hashing, and also with validating conversions between things.
- https://github.com/nanocurrency/protocol/blob/master/reference
- Node protocol specification.
- https://iancoleman.io/bip39/
- Helped me test out my BIP 39/BIP 44 implementations.
- nano-rs (Rust) https://github.com/termhn/nano-rs
- Railroad (Rust) https://github.com/PlasmaPower/railroad
- nano-python (Python) https://github.com/orhanhenrik/nano-python-node
- gonano (Go) https://github.com/alexbakker/gonano
- Go Nano (Go) https://github.com/frankh/nano
- Node.js Nano Node (JavaScript) https://github.com/numtel/node-nano-node
- nanocurrency-node (TypeScript) https://github.com/pRizz/nanocurrency-node
- Prailude (Lua, C) https://github.com/slact/prailude
- RaiSharp (C#) https://github.com/vardthomas/Aggrex.RaiSharp
Licensed under either of these at your option:
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.