/feeless

⋰·⋰ Feeless is a Nano cryptocurrency node, wallet, tools, and Rust crate.

Primary LanguageRustApache License 2.0Apache-2.0

⋰·⋰ Feeless

Crates.io docs.rs GitHub last commit MIT OR Apache-2.0 Licence

What is Feeless?

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 🤐.

Working Features

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.

What is Nano?

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/

Installation

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].

Goals

General

  • Correctness before performance.

Rust crate

  • A complete library that a Rust developer can use to handle wallets, keys, blocks, signing, proof of work, etc.

Tools

  • 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.

Nano node

  • 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! 🤦‍♀️

Non-goals

  • Only support protocol v18+ (Maybe only v19+ depending on timing)
  • No UDP support
  • No user interface

Task list

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
    • Storage
      • Basic KV store to file
      • Basic cookie/peer storage
      • Peers
      • Blocks
      • ...
    • RPC
  • 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 of anyhow 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

Credits and references

Other implementations

License

Licensed under either of these at your option:

Contribution

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.