Full Code of nanocurrency/nano-docs for AI

main cfb6ed4239ca cached
172 files
815.0 KB
221.3k tokens
1 requests
Download .txt
Showing preview only (868K chars total). Download the full file or copy to clipboard to get everything.
Repository: nanocurrency/nano-docs
Branch: main
Commit: cfb6ed4239ca
Files: 172
Total size: 815.0 KB

Directory structure:
gitextract_g8vbq387/

├── .github/
│   └── workflows/
│       ├── build.yml
│       ├── cleanup-docker-pr.yml
│       ├── cleanup-docker-untagged.yml
│       ├── deploy-staging.yml
│       ├── deploy.yml
│       ├── publish-docker-master.yml
│       ├── publish-docker-pr.yml
│       └── push-to-staging.yml
├── .gitignore
├── Dockerfile
├── deploy-key.enc
├── docs/
│   ├── CNAME
│   ├── articles/
│   │   └── readme.md
│   ├── commands/
│   │   ├── command-line-interface.md
│   │   └── rpc-protocol.md
│   ├── core-development/
│   │   ├── code-standards.md
│   │   ├── collaboration-process.md
│   │   ├── developer-discussions.md
│   │   ├── overview.md
│   │   └── understanding-the-code.md
│   ├── glossary.md
│   ├── index.md
│   ├── integration-guides/
│   │   ├── advanced.md
│   │   ├── block-confirmation-tracking.md
│   │   ├── build-options.md
│   │   ├── index.md
│   │   ├── ipc-integration.md
│   │   ├── key-management.md
│   │   ├── the-basics.md
│   │   ├── websockets.md
│   │   └── work-generation.md
│   ├── javascript/
│   │   └── mermaid-loose-security.js
│   ├── living-whitepaper/
│   │   └── index.md
│   ├── node-implementation/
│   │   ├── blocks.md
│   │   ├── components.md
│   │   ├── database.md
│   │   ├── introduction.md
│   │   ├── networking.md
│   │   ├── voting.md
│   │   └── work.md
│   ├── protocol-design/
│   │   ├── attack-vectors.md
│   │   ├── blocks.md
│   │   ├── distribution-and-units.md
│   │   ├── introduction.md
│   │   ├── ledger.md
│   │   ├── networking.md
│   │   ├── orv-consensus.md
│   │   ├── resource-usage.md
│   │   ├── signing-hashing-and-key-derivation.md
│   │   └── spam-work-and-prioritization.md
│   ├── releases/
│   │   ├── network-upgrades.md
│   │   ├── node-releases.md
│   │   ├── release-v19-0.md
│   │   ├── release-v20-0.md
│   │   ├── release-v21-0.md
│   │   ├── release-v21-1.md
│   │   ├── release-v21-2.md
│   │   ├── release-v21-3.md
│   │   ├── release-v22-0.md
│   │   ├── release-v22-1.md
│   │   ├── release-v23-0.md
│   │   ├── release-v23-1.md
│   │   ├── release-v23-3.md
│   │   ├── release-v24-0.md
│   │   ├── release-v25-0.md
│   │   ├── release-v25-1.md
│   │   ├── release-v26-0.md
│   │   ├── release-v26-1.md
│   │   ├── release-v27-0.md
│   │   ├── release-v27-1.md
│   │   ├── release-v28-0.md
│   │   ├── release-v28-1.md
│   │   ├── release-v28-2.md
│   │   └── roadmap.md
│   ├── running-a-node/
│   │   ├── advanced-monitoring.md
│   │   ├── beta-network.md
│   │   ├── beyond-the-node.md
│   │   ├── configuration.md
│   │   ├── docker-management.md
│   │   ├── ledger-management.md
│   │   ├── logging-tracing.md
│   │   ├── node-setup.md
│   │   ├── overview.md
│   │   ├── security.md
│   │   ├── test-network.md
│   │   ├── troubleshooting.md
│   │   ├── voting-as-a-representative.md
│   │   └── wallet-setup.md
│   ├── snippets/
│   │   ├── community-links.md
│   │   ├── config-node-option-node-enable-voting-true.md
│   │   ├── config-node-option-rpc-enable-control-false.md
│   │   ├── config-node-option-rpc-enable-control-true.md
│   │   ├── config-node-option-rpc-enable-true.md
│   │   ├── contributing-code.md
│   │   ├── current-build-links-all.md
│   │   ├── current-build-links-beta.md
│   │   ├── current-build-links-main.md
│   │   ├── current-build-links-test.md
│   │   ├── dedicated-representative-nodes.md
│   │   ├── deprecation-info-pending.md
│   │   ├── directory-contents.md
│   │   ├── directory-locations-all.md
│   │   ├── directory-locations-beta.md
│   │   ├── directory-locations-main.md
│   │   ├── directory-locations-test.md
│   │   ├── docker-ipv6-tip.md
│   │   ├── docker-run-command-beta.md
│   │   ├── docker-run-command-main.md
│   │   ├── docker-run-command-test.md
│   │   ├── enable-voting.md
│   │   ├── hardware-recommendations.md
│   │   ├── join-technical-mailing-list.md
│   │   ├── known-issue-macos-too-many-open-files.md
│   │   ├── known-issue-peers-stake-reporting.md
│   │   ├── known-issue-unable-to-find-libboost.md
│   │   ├── known-issue-unchecked-keys-rpc-rocksdb.md
│   │   ├── known-issue-windows-logging-stable.md
│   │   ├── network-details-simple-beta.md
│   │   ├── network-details-simple-main.md
│   │   ├── network-details-simple-test.md
│   │   ├── network-details.md
│   │   ├── release-details-v18-0.md
│   │   ├── release-details-v19-0.md
│   │   ├── release-details-v20-0.md
│   │   ├── release-details-v21-0.md
│   │   ├── release-details-v21-1.md
│   │   ├── release-details-v21-2.md
│   │   ├── release-details-v21-3.md
│   │   ├── release-details-v22-0.md
│   │   ├── release-details-v22-1.md
│   │   ├── release-details-v23-0.md
│   │   ├── release-details-v23-1.md
│   │   ├── release-details-v23-3.md
│   │   ├── release-details-v24-0.md
│   │   ├── release-details-v25-0.md
│   │   ├── release-details-v25-1.md
│   │   ├── release-details-v26-0.md
│   │   ├── release-details-v26-1.md
│   │   ├── release-details-v27-0.md
│   │   ├── release-details-v27-1.md
│   │   ├── release-details-v28-0.md
│   │   ├── release-details-v28-1.md
│   │   ├── release-details-v28-2.md
│   │   ├── release-details-v29-0.md
│   │   ├── security-vulnerability-reporting.md
│   │   ├── setup-beta-test-testing.md
│   │   ├── terms-block-transaction-transfer.md
│   │   ├── toml-config-commands.md
│   │   ├── unconfirmed-information.md
│   │   ├── warning-alternative-work-generation-setup-preferred.md
│   │   ├── warning-debug-only-command.md
│   │   ├── warning-docker-limitations.md
│   │   ├── warning-enable-control.md
│   │   ├── warning-external-libraries.md
│   │   ├── warning-includes-unconfirmed.md
│   │   ├── warning-multiple-confirmation-notifications.md
│   │   ├── warning-multiple-node-setups.md
│   │   ├── warning-node-wallet-not-for-prod-use.md
│   │   ├── warning-only-official-builds-supported.md
│   │   ├── warning-process-sub-type-recommended.md
│   │   ├── warning-security-vulnerability-reporting.md
│   │   ├── warning-telemetry-can-be-forged.md
│   │   ├── warning-unsupported-configuration.md
│   │   └── wip-living-whitepaper.md
│   ├── stylesheets/
│   │   └── extras.css
│   ├── what-is-nano/
│   │   └── overview.md
│   └── whitepaper/
│       └── english.md
├── mkdocs.yml
├── readme.md
├── requirements.txt
└── theme-overrides/
    ├── main.html
    └── partials/
        └── footer.html

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/workflows/build.yml
================================================
name: build
on: pull_request

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 #v3.1.0
      - uses: actions/setup-python@13ae5bb136fac2878aff31522b9efb785519f984 #v4.3.0
        with:
          python-version: 3.x
      - run: pip install -r requirements.txt
      - run: mkdocs build --strict

env:
  GH_TOKEN: ${{ secrets.GH_TOKEN }}


================================================
FILE: .github/workflows/cleanup-docker-pr.yml
================================================
name: cleanup-docker-pr
on:
  pull_request:
    types: [closed]

env:
  PR_NUMBER: ${{ github.event.number }}
  OWNER: orgs/nanocurrency
  PACKAGE_NAME: nano-docs
  PER_PAGE: 100

jobs:
  container_cleanup:
    runs-on: ubuntu-latest
    steps:
      - name: Clean up PR specific container
        uses: actions/github-script@d556feaca394842dc55e4734bf3bb9f685482fa0 #v6.3.3
        with:
          github-token: ${{ secrets.GHCR_TOKEN }}
          script: |
            const response = await github.request("GET /${{ env.OWNER }}/packages/container/${{ env.PACKAGE_NAME }}/versions",
              { per_page: ${{ env.PER_PAGE }}
            });
            for(version of response.data) {
                if (version.metadata.container.tags[0] == "pr-${{ env.PR_NUMBER }}") {
                    console.log("delete " + version.id)
                    const deleteResponse = await github.request("DELETE /${{ env.OWNER }}/packages/container/${{ env.PACKAGE_NAME }}/versions/" + version.id, { });
                    console.log("status " + deleteResponse.status)
                }
            }


================================================
FILE: .github/workflows/cleanup-docker-untagged.yml
================================================
name: cleanup-docker-untagged
on:
  push:
    branches:
      - main

env:
  OWNER: orgs/nanocurrency
  PACKAGE_NAME: nano-docs
  PER_PAGE: 100

jobs:
  container_cleanup:
    runs-on: ubuntu-latest
    steps:
      - name: Clean up untagged containers
        uses: actions/github-script@d556feaca394842dc55e4734bf3bb9f685482fa0 #v6.3.3
        with:
          github-token: ${{ secrets.GHCR_TOKEN }}
          script: |
            const response = await github.request("GET /${{ env.OWNER }}/packages/container/${{ env.PACKAGE_NAME }}/versions",
              { per_page: ${{ env.PER_PAGE }}
            });
            for(version of response.data) {
                if ( version.metadata.container.tags.length == 0 ) {
                    console.log("delete " + version.id)
                    const deleteResponse = await github.request("DELETE /${{ env.OWNER }}/packages/container/${{ env.PACKAGE_NAME }}/versions/" + version.id, { });
                    console.log("status " + deleteResponse.status)
                }
            }


================================================
FILE: .github/workflows/deploy-staging.yml
================================================
name: deploy
on:
  push:
    branches:
      - staging
jobs:
  deploy:
    runs-on: ubuntu-latest
    env:
      PRODUCTION: TRUE
    if: github.repository == 'nanocurrency/nano-docs-staging'
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: 3.x
      - run: pip install -r requirements.txt
      - run: mkdocs gh-deploy --force
env:
  GH_TOKEN: ${{ secrets.GH_TOKEN }}


================================================
FILE: .github/workflows/deploy.yml
================================================
name: deploy
on:
  push:
    branches:
      - main
jobs:
  deploy:
    runs-on: ubuntu-latest
    env:
      PRODUCTION: TRUE
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: 3.x
      - run: pip install -r requirements.txt
      - run: mkdocs gh-deploy --force
env:
  GH_TOKEN: ${{ secrets.GH_TOKEN }}


================================================
FILE: .github/workflows/publish-docker-master.yml
================================================
name: publish-docker-master
on:
  push:
    branches:
      - main

jobs:
  build_publish:
    runs-on: ubuntu-latest
    env:
      PRODUCTION: TRUE
    steps:
      - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 #v3.1.0

      # Build and test Docker image
      - run: |
          echo ${{ secrets.GHCR_TOKEN }} | docker login ghcr.io -u nanocurrency --password-stdin
          docker pull squidfunk/mkdocs-material:9.4.10@sha256:01605a03397a654b74b9de3157f56915d1e075e2d3bd22fcf3fb82c443553c25
          docker build -t ghcr.io/nanocurrency/nano-docs:latest .
          docker push ghcr.io/nanocurrency/nano-docs:latest


================================================
FILE: .github/workflows/publish-docker-pr.yml
================================================
name: publish-docker-pr
on: pull_request

env:
  PR_NUMBER: ${{ github.event.number }}

jobs:
  build_publish:
    runs-on: ubuntu-latest
    env:
      PRODUCTION: TRUE
    steps:
      - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 #v3.1.0

      # Build and test Docker image
      - run: |
          echo ${{ secrets.GHCR_TOKEN }} | docker login ghcr.io -u nanocurrency --password-stdin
          docker pull squidfunk/mkdocs-material:9.4.10@sha256:01605a03397a654b74b9de3157f56915d1e075e2d3bd22fcf3fb82c443553c25
          docker build -t ghcr.io/nanocurrency/nano-docs:pr-${{ env.PR_NUMBER }} .
          docker push ghcr.io/nanocurrency/nano-docs:pr-${{ env.PR_NUMBER }}


================================================
FILE: .github/workflows/push-to-staging.yml
================================================
name: push-to-staging
on:
  workflow_dispatch:
    inputs:
      branch:
        description: "nano-docs branch to push to staging"
        default: "staging"
        required: true

jobs:
  push:
    runs-on: ubuntu-latest
    steps:
      - name: push
        uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 #v3.1.0
        with:
          fetch-depth: 0
          ref: ${{ github.event.inputs.branch }}
          token: ${{ secrets.GH_TOKEN }}
      - run: |
          git remote add nano-docs-staging https://github.com/nanocurrency/nano-docs-staging.git
          git push nano-docs-staging ${{ github.event.inputs.branch }}:staging

================================================
FILE: .gitignore
================================================
site/
.idea
venv
.cache

================================================
FILE: Dockerfile
================================================
FROM squidfunk/mkdocs-material:9.4.10@sha256:01605a03397a654b74b9de3157f56915d1e075e2d3bd22fcf3fb82c443553c25

# Set build directory
#WORKDIR /docs

# Copy files necessary for build
COPY ./ /docs

RUN \
  pip install --upgrade pip && \
  pip install -r /docs/requirements.txt

# Set working directory
WORKDIR /docs

# Expose MkDocs development server port
EXPOSE 8000

# Start development server by default
ENTRYPOINT ["mkdocs"]
CMD ["serve", "--dev-addr=0.0.0.0:8000"]


================================================
FILE: docs/CNAME
================================================
docs.nano.org

================================================
FILE: docs/articles/readme.md
================================================
Please see https://github.com/nanocurrency/nano-docs/issues/555 for details the article management process and list of ideas.

================================================
FILE: docs/commands/command-line-interface.md
================================================
title: Command Line Interface
description: Reference for the CLI commands available for the nano node

# Command Line Interface
## nano_node commands
| Command | Description |
|---------|-------------|      
| `--account_create --wallet=<wallet>` | Insert next deterministic key into `<wallet>` |
| `--account_get --key=<key>` | Get account number for the `<key>` |
| `--account_key --account=<account>` | Get the public key for `<account>` |
| `--clear_send_ids` | Remove all send IDs from the database (dangerous: not intended for production use). Optional `--data_path=<path>`|
| `--compare_rep_weights` | Displays a summarized comparison between the hardcoded bootstrap weights and representative weights from the ledger. Full comparison is output to logs. Optional `--data_path=<path>`. |
| `--confirmation_height_clear` | Requires `--account` and sets the confirmation heights of the specified account to 0. Use `all` to reset all accounts. Do not use while the node is running. |
| `--daemon` | Start node daemon. Network and path will be output. |
| `--diagnostics` | Run internal diagnostics and validate existing config file (or create default config file if it doesn't exist). |
| `--final_vote_clear` | Either specify a single `--root` to clear or `--all` to clear all final votes (not recommended). |
| `--generate_config node|rpc|log` | Write configuration to stdout, populated with commented-out defaults suitable for this system. Use `--use_defaults` for uncommented values. |
| `--help` | Print out options. |
| `--initialize` | Initializes the data folder, if it is not already initialized. Meant for an empty data folder. |
| `--key_create` | Generates an adhoc random keypair and prints it to stdout. |
| `--key_expand --key=<key>` | Derive public key and account number from `<key>`. |
| `--migrate_database_lmdb_to_rocksdb` | Deletes existing rocksdb subfolder if it exists and migrates the ledger from LMDB to RocksDB. Does not delete the data.ldb file afterwards. Optional `--data_path=<path>` |
| `--online_weight_clear` | Clear record history for long term online weight trending. Optional `--data_path=<path>`|
| `--peer_clear` | Clear cached peers. Optional `--data_path=<path>`|
| `--rebuild_database` | Rebuild LMDB database with `--vacuum` for best compaction. Requires approximately `data.ldb size * 2` free space on disk. |
| `--snapshot` | Compact database and create snapshot, functions similar to vacuum but does not replace the existing database. Optional: `--unchecked_clear`, `--clear_send_ids`, `--online_weight_clear`, `--peer_clear`, `--confirmation_height_clear`. |
| `--unchecked_clear` | Clear unchecked blocks. Optional `--data_path=<path>`|
| `--update_config`| Reads the current node configuration and updates it with missing keys and values and delete keys that are no longer used. Updated configuration is written to stdout. |
| `--vacuum` | Compact database. If `data_path` is missing, the database in the data directory is compacted. Optional: `--unchecked_clear`, `--clear_send_ids`, `--online_weight_clear`, `--peer_clear`, `--confirmation_height_clear`, `--rebuild_database`. Requires approximately `data.ldb size * 2` free space on disk. |
| `--validate_blocks` | Validate blocks in the ledger, includes checks for confirmation height. Optional `--threads` for multithreaded validation. |
| `--version` | Prints out version. |
| `--wallet_add_adhoc`<br>&nbsp;&nbsp;`--wallet=<wallet>`<br>&nbsp;&nbsp;`--key=<key>` | Insert `<key>` into `<wallet>`. |
| `--wallet_create`<br>&nbsp;&nbsp;`--seed=<seed>`<br>&nbsp;&nbsp;`--password=<password>` | Creates a new wallet with optional `<seed>` and optional `<password>`, and prints the ID. |
| `--wallet_change_seed`<br>&nbsp;&nbsp;`--wallet=<wallet>`<br>&nbsp;&nbsp;`--seed=<seed>` | Changes seed for `<wallet>` to `<seed>`. |
| `--wallet_decrypt_unsafe`<br>&nbsp;&nbsp;`--wallet=<wallet>`<br>&nbsp;&nbsp;`--password=<password>` | Decrypts `<wallet>` using `<password>`. <br>**USE WITH CAUTION: THIS WILL PRINT YOUR PRIVATE KEY AND SEED TO STDOUT** |
| `--wallet_destroy --wallet=<wallet>` | Destroys `<wallet>` and all keys it contains. |
| `--wallet_import`<br>&nbsp;&nbsp;`--file=<filepath>`<br>&nbsp;&nbsp;`--wallet=<wallet>`<br>&nbsp;&nbsp;`--password=<password>` | Imports keys in `<filepath>` using `<password>` into `<wallet>`. If the wallet id does not exist and `--force` is included, a new wallet will be created with the provided wallet id value. |
| `--wallet_list` | Dumps wallet IDs and public keys. |
| `--wallet_remove`<br>&nbsp;&nbsp;`--wallet=<wallet>`<br>&nbsp;&nbsp;`--account=<account>` | Remove `<account>` from `<wallet>`. |
| `--wallet_representative_get`<br>&nbsp;&nbsp;`--wallet=<wallet>` | Prints default representative for `<wallet>`. |
| `--wallet_representative_set`<br>`--wallet=<wallet>`<br>&nbsp;&nbsp;`--account=<account>` | Set `<account>` as default representative for `<wallet>`. |

## Launch Options
The node is typically run like this:

```bash
./nano_node --daemon [--launch_options]
```
!!! note "Intended for developer use"
	These options are only for developer use so please understand the impacts before use.

| Option | Description |
|--------|-------------|
| `--network` | Allows selection of a different network at runtime. Values `live`, `beta` and `test` supported. |
| `--data_path=<path>` | Use the supplied `<path>` as the data directory. |
| `--config key=value` | Pass node configuration values. This takes precedence over any values in the configuration file. This option can be repeated multiple times. |
| `--rpcconfig key=value` | Pass RPC configuration values. This takes precedence over any values in the configuration file. This option can be repeated multiple times. |
| `--enable_pruning` | "Enable experimental ledger pruning" |
| `--block_processor_batch_size` | Increase block processor transaction batch write size, default 0 (limited by config block_processor_batch_max_time), 256k for fast_bootstrap. |
| `--block_processor_full_size` | Increase block processor allowed blocks queue size before dropping live network packets and holding bootstrap download, default 65536, 1 million for fast_bootstrap. |
| `--block_processor_verification_size` | Increase batch signature verification size in block processor, default 0 (limited by config signature_checker_threads), unlimited for fast_bootstrap. |
| `--fast_bootstrap` | **legacy bootstrap:** Increase bootstrap processor limits to allow more blocks before hitting full state and verify/write more per database call. Also disable deletion of processed unchecked blocks. |
| `--allow_bootstrap_peers_duplicates` | **legacy bootstrap:** Allow multiple connections to the same peer in bootstrap attempts. |
| `--inactive_votes_cache_size` | Increase cached votes without active elections size, default 16384. |
| `--vote_processor_capacity` | Vote processor queue size before dropping votes, default 144k. |
| `--disable_activate_successors` | Disables activate_successors in active_elections |
| `--disable_add_initial_peers` | Disables the add initial peers function called on startup which reads the peers table and contacts all the peers listed in it. |
| `--disable_ascending_bootstrap` | Disable ascending bootstrap |
| `--disable_backup` | Turn off automatic wallet backup process. |
| `--disable_block_processor_republishing` | Disables block republishing by disabling the local_block_broadcaster component |
| `--disable_block_processor_unchecked_deletion` | Disable deletion of unchecked blocks after processing. |
| `--disable_bootstrap_bulk_pull_server` | Disables the legacy bulk pull server for bootstrap operations |
| `--disable_bootstrap_bulk_push_client` | Disables the legacy bulk push client for bootstrap operations | 
| `--disable_bootstrap_listener` | Turn off listener on the bootstrap network so incoming TCP (bootstrap) connections are rejected. Note: this does not impact TCP traffic for the live network. |
| `--disable_lazy_bootstrap` | Turn off use of lazy bootstrap. |
| `--disable_legacy_bootstrap` | Turn off use of legacy bootstrap. |
| `--disable_max_peers_per_ip` | Disables the limit on the number of peer connections allowed per IP address |
| `--disable_max_peers_per_subnetwork` | Disables the limit on the number of peer connections allowed per subnetwork |
| `--disable_ongoing_bootstrap` | Turn off the ability for ongoing bootstraps to occur. |
| `--disable_ongoing_telemetry_requests` | Disables ongoing telemetry requests to peers | 
| `--disable_providing_telemetry_metrics` | Do not provide any telemetry data to nodes requesting it. Responses are still made to requests, but they will have an empty payload. |
| `--disable_rep_crawler` | Turn off the rep crawler process. |
| `--disable_request_loop` | Turn off the request loop. |
| `--disable_search_pending` | Disables the periodic search for pending transactions | 
| `--disable_tcp_realtime` | Turn off use of TCP live network (TCP for bootstrap will remain available). |
| `--disable_unchecked_cleanup` | Prevent periodic cleaning of unchecked table. |
| `--disable_unchecked_drop` | Prevent drop of all unchecked entries at node/wallet start. |
| `--disable_wallet_bootstrap` | Turn off use of wallet-based bootstrap. |

## Debug commands
| Command | Description |
|---------|-------------|
| `--debug_account_count` | Display the number of accounts. |
| `--debug_account` | Display the total counts of each version for all accounts (including unpocketed). |
| `--debug_block_count` | Display the number of blocks. |
| `--debug_block_dump` | Print ledger blocks - use with caution due to the potentially large amount of data this can output. |
| `--debug_bootstrap_generate` | Generate bootstrap sequence of blocks. |
| `--debug_cemented_block_count` | Display the number of cemented blocks (blocks which are under the confirmation height of their accounts). |
| `--debug_dump_frontier_unchecked_dependents` | Dump frontiers which have matching unchecked keys. |
| `--debug_dump_online_weight` | List online weights table and current online_weights value. |
| `--debug_dump_representatives` | List representatives and weights. |
| `--debug_generate_crash_report` | After a node crash on Linux, this command reads the dump files generated from that crash and produces a "nano_node_crash_report.txt" file. Requires `addr2line` to be installed on the system. |
| `--debug_opencl` | Profile OpenCL work generation for (optional) `--device=<device>` on `--device=<platform>` using `--threads=<threads>` count. |
| `--debug_output_last_backtrace_dump` | Output the stacktrace stored after a node crash. |
| `--debug_profile_bootstrap` | Profile simulated bootstrap process. |
| `--debug_profile_frontiers_confirmation` | Profile frontiers confirmation speed. |
| `--debug_profile_generate` | Profile work generation. Optional: `--pow_sleep_interval` which sets an amount to sleep (in nanoseconds) between batches of POW calculations when using the CPU. `--difficulty`, `--multiplier` (only the latter is used if both given) to set the work generation threshold. |
| `--debug_profile_kdf` | Profile kdf function. |
| `--debug_profile_sign` | Profile signature generation. |
| `--debug_profile_validate` | Profile work validation. |
| `--debug_profile_votes` | Profile vote verification. |
| `--debug_rpc` | Allows running RPC commands without enabling the RPC server. Not recommended for daily usage. Example: `echo '{"action": "block_count"}' | nano_node --debug_rpc` |
| `--debug_stacktrace` | Prints a stacktrace example, useful to verify that it includes the desired information, such as files, function names and line numbers. |
| `--debug_sys_logging` | On *nix system this checks writing to the system log. On Windows it writes to the event viewer, a registry entry needs to exist for this to work correctly which can be created by running this command for the first time as an administrator. |
| `--debug_unconfirmed_frontiers` | Prints the account, height, frontiers and cemented frontier for all accounts which are not fully confirmed. Sorted by height in descending order. |
| `--debug_validate_blocks` | Alias to `--validate_blocks`. |
| `--debug_verify_profile` | Profile signature verification. |
| `--debug_dump_trended_weight`| Dump trended weights table |
| `--debug_profile_process`| Profile active blocks processing (only for nano_dev_network)|
| `--debug_random_feed`| Generates output to RNG test suites |
| `--debug_peers`| Display peer IPv6:port connections |
| `--debug_prune`| Prune accounts up to last confirmed blocks **EXPERIMENTAL**|

## Removed

| Command | Description |
|---------|-------------|
| `--vote_dump` | Dump most recent votes from representatives. |


================================================
FILE: docs/commands/rpc-protocol.md
================================================
title: RPC Protocol
description: Reference for the RPC commands available for the Nano node

# RPC Protocol

The RPC protocol accepts JSON HTTP POST requests. The following are RPC commands along with the responses that are expected. This page is split into the following sections:

| Section | Purpose |
|---------|---------|
| <span class="no-break">**[Node RPCs](#node-rpcs)**</span>                        | For interacting with the node and ledger. |
| <span class="no-break">**[Wallet RPCs](#wallet-rpcs)**</span>                    | For interacting with the built-in, QT-based node wallet. **NOTE**: This wallet is only recommended for development and testing. |
| <span class="no-break">**[Unit Conversion RPCs](#unit-conversion-rpcs)**</span> | For converting different units to and from raw. |
| <span class="no-break">**[Deprecated RPCs](#deprecated-rpcs)**</span>           | No longer recommended for use. |

## Node RPCs

!!! warning "Unconfirmed blocks returned"
    Unless otherwise specified, RPC calls can return unconfirmed blocks and related details. In the most important cases where balances or similar details may include unconfirmed amounts, additional warnings have been included. Refer to [Block confirmation procedures](/integration-guides/key-management/#block-confirmation-procedures) for details.

---

### account_balance 
Returns how many RAW is owned and how many have not yet been received by **account**  

--8<-- "deprecation-info-pending.md"

**Request:**
```json 
{
  "action": "account_balance",
  "account": "nano_3e3j5tkog48pnny9dmfzj1r16pg8t1e76dz5tmac6iq689wyjfpi00000000"
}
```

**Response:**
```json
{
  "balance": "10000",
  "pending": "10000",
  "receivable": "10000"
}
```

**Optional "include_only_confirmed"**
_version 22.0+_   
Boolean, true by default. Results in `balance` only including blocks on this account that have already been confirmed and `receivable` only including incoming send blocks that have already been confirmed on the sending account.

---

### account_block_count
Get number of blocks for a specific **account**  

**Request:**
```json
{
  "action": "account_block_count",
  "account": "nano_3t6k35gi95xu6tergt6p69ck76ogmitsa8mnijtpxm9fkcm736xtoncuohr3"
}
```

**Response:**
```json
{
  "block_count" : "19"
}
```

---

### account_get
Get account number for the **public key**  

**Request:**
```json
{
  "action": "account_get",
  "key": "3068BB1CA04525BB0E416C485FE6A67FD52540227D267CC8B6E8DA958A7FA039"
}
```

**Response:**
```json
{
  "account" : "nano_1e5aqegc1jb7qe964u4adzmcezyo6o146zb8hm6dft8tkp79za3sxwjym5rx"
}
```

---

### account_history  

Reports send/receive information for an account. Returns only **send & receive** blocks by default (unless raw is set to true - see optional parameters below): change, state change & state epoch blocks are skipped, open & state open blocks will appear as receive, state receive/send blocks will appear as receive/send entries. Response will start with the latest block for the account (the frontier), and will list all blocks back to the open block of this account when "count" is set to "-1". **Note**: "local_timestamp" returned since version 18.0, "height" field returned since version 19.0 and "confirmed" returned since version 23.0

--8<-- "warning-includes-unconfirmed.md"

**Request:**
```json
{
  "action": "account_history",
  "account": "nano_1ipx847tk8o46pwxt5qjdbncjqcbwcc1rrmqnkztrfjy5k7z4imsrata9est",
  "count": "1"
}
```

**Response:**
```json
{
  "account": "nano_1ipx847tk8o46pwxt5qjdbncjqcbwcc1rrmqnkztrfjy5k7z4imsrata9est",
  "history": [
    {
      "type": "send",
      "account": "nano_38ztgpejb7yrm7rr586nenkn597s3a1sqiy3m3uyqjicht7kzuhnihdk6zpz",
      "amount": "80000000000000000000000000000000000",
      "local_timestamp": "1551532723",
      "height": "60",
      "hash": "80392607E85E73CC3E94B4126F24488EBDFEB174944B890C97E8F36D89591DC5",
      "confirmed": "true"
    }
  ],
  "previous": "8D3AB98B301224253750D448B4BD997132400CEDD0A8432F775724F2D9821C72"
}
```

If the `count` limit results in stopping before the end of the account chain, then the response will also contain a `previous` field (outside of the `history` field) which contains the block hash that would be next to process if `count` was larger.

**Optional parameters:**

- `raw` (bool): if set to `true` instead of the default `false`, instead of outputting a simplified send or receive explanation of blocks (intended for wallets), output all parameters of the block itself as seen in block_create or other APIs returning blocks. It still includes the "account" and "amount" properties you'd see without this option.  State/universal blocks in the raw history will also have a `subtype` field indicating their equivalent "old" block. Unfortunately, the "account" parameter for open blocks is the account of the source block, not the account of the open block, to preserve similarity with the non-raw history.   
- `head` (64 hexadecimal digits string, 256 bit): instead of using the latest block for a specified account, use this block as the head of the account instead. Useful for pagination.
- `include_linked_account` (bool): _version 28.0+._ When set to `true`, the response will include a new field `linked_account`, which returns the linked account associated with the block (or "0" if no linked account exists/was found e.g. due to pruning).
- `offset` (decimal integer): skips a number of blocks starting from `head` (if given). Not often used. _Available since version 11.0_    
- `reverse` (bool): if set to `true` instead of the default `false`, the response starts from `head` (if given, otherwise the first block of the account), and lists blocks up to the frontier (limited by "count"). **Note**: the field `previous` in the response changes to `next`. _Available since version 19.0_  
- `account_filter` (array of public addresses): results will be filtered to only show sends/receives connected to the provided account(s). _Available since version 19.0_. **Note:** In v19.0, this option does not handle receive blocks; fixed in v20.0.

---

### account_info
Returns frontier, open block, change representative block, balance, last modified timestamp from local database & block count for **account**. Only works for accounts that have received their first transaction and have an entry on the ledger, will return "Account not found" otherwise. To open an account, use [receive](#receive).  

--8<-- "unconfirmed-information.md"
    The balance is obtained from the frontier, which may be unconfirmed. As long as you follow the [guidelines](/integration-guides/key-management/#transaction-order-and-correctness), you can rely on the **balance** for the purposes of creating transactions for this account. If the frontier is never confirmed, then the blocks that proceed it will also never be confirmed.

    If you need only details for confirmed blocks, use the `include_confirmed` option below and referenced the `confirmed_*` fields added in to the response.

**Request:**
```json
{
  "action": "account_info",
  "account": "nano_3t6k35gi95xu6tergt6p69ck76ogmitsa8mnijtpxm9fkcm736xtoncuohr3"
}
```

**Response:**
```json
{
  "frontier": "FF84533A571D953A596EA401FD41743AC85D04F406E76FDE4408EAED50B473C5",
  "open_block": "991CF190094C00F0B68E2E5F75F6BEE95A2E0BD93CEAA4A6734DB9F19B728948",
  "representative_block": "991CF190094C00F0B68E2E5F75F6BEE95A2E0BD93CEAA4A6734DB9F19B728948",
  "balance": "235580100176034320859259343606608761791",
  "modified_timestamp": "1501793775",
  "block_count": "33",
  "account_version": "1",
  "confirmation_height" : "28",
  "confirmation_height_frontier" : "34C70FCA0952E29ADC7BEE6F20381466AE42BD1CFBA4B7DFFE8BD69DF95449EB"
}
```

In response `confirmation_height` only available for _version 19.0+_  
In response `confirmation_height_frontier` only available for _version 21.0+_ which is the block hash at that confirmation height.  

**Optional "include_confirmed"**
_version 22.0+_   
Boolean, false by default. Adds new return fields with prefix of `confirmed_` for consistency:

- `confirmed_balance`: balance for only blocks on this account that have already been confirmed
- `confirmed_height`: matches `confirmation_height` value
- `confirmed_frontier`: matches `confirmation_height_frontier` value
- If `representative` option also `true`, `confirmed_representative` included: representative account from the confirmed frontier block
- If `receivable` option also `true`, `confirmed_receivable` included: balance of all receivable amounts where the matching incoming send blocks have been confirmed on their account

--8<-- "deprecation-info-pending.md"

**Request:**
```json
{
  "action": "account_info",  
  "account": "nano_1gyeqc6u5j3oaxbe5qy1hyz3q745a318kh8h9ocnpan7fuxnq85cxqboapu5",
  "representative": "true",
  "weight": "true",
  "receivable": "true",
  "include_confirmed": "true"
}
```

**Response:**
```json
{
    "frontier": "80A6745762493FA21A22718ABFA4F635656A707B48B3324198AC7F3938DE6D4F",
    "open_block": "0E3F07F7F2B8AEDEA4A984E29BFE1E3933BA473DD3E27C662EC041F6EA3917A0",
    "representative_block": "80A6745762493FA21A22718ABFA4F635656A707B48B3324198AC7F3938DE6D4F",
    "balance": "11999999999999999918751838129509869131",
    "confirmed_balance": "11999999999999999918751838129509869131",
    "modified_timestamp": "1606934662",
    "block_count": "22966",
    "account_version": "1",
    "confirmed_height": "22966",
    "confirmed_frontier": "80A6745762493FA21A22718ABFA4F635656A707B48B3324198AC7F3938DE6D4F",
    "representative": "nano_1gyeqc6u5j3oaxbe5qy1hyz3q745a318kh8h9ocnpan7fuxnq85cxqboapu5",
    "confirmed_representative": "nano_1gyeqc6u5j3oaxbe5qy1hyz3q745a318kh8h9ocnpan7fuxnq85cxqboapu5",
    "weight": "11999999999999999918751838129509869131",
    "pending": "0",
    "receivable": "0",
    "confirmed_pending": "0",
    "confirmed_receivable": "0"
}
```

**Optional "representative", "weight", "pending"**
_version 9.0+_   
Booleans, false by default. Additionally returns representative, voting weight, pending/receivable balance for account   

**Request:**
```json
{
  "action": "account_info",
  "account": "nano_3t6k35gi95xu6tergt6p69ck76ogmitsa8mnijtpxm9fkcm736xtoncuohr3",
  "representative": "true",
  "weight": "true",
  "pending": "true"
}
```

**Response:**
```json
{
  "frontier": "FF84533A571D953A596EA401FD41743AC85D04F406E76FDE4408EAED50B473C5",
  "open_block": "991CF190094C00F0B68E2E5F75F6BEE95A2E0BD93CEAA4A6734DB9F19B728948",
  "representative_block": "991CF190094C00F0B68E2E5F75F6BEE95A2E0BD93CEAA4A6734DB9F19B728948",
  "balance": "235580100176034320859259343606608761791",
  "modified_timestamp": "1501793775",
  "block_count": "33",
  "account_version": "1",
  "confirmation_height" : "28",
  "confirmation_height_frontier" : "34C70FCA0952E29ADC7BEE6F20381466AE42BD1CFBA4B7DFFE8BD69DF95449EB",
  "representative": "nano_3t6k35gi95xu6tergt6p69ck76ogmitsa8mnijtpxm9fkcm736xtoncuohr3",
  "weight": "1105577030935649664609129644855132177",
  "pending": "2309370929000000000000000000000000",
  "receivable": "2309370929000000000000000000000000"
}
```

---

### account_key
Get the public key for **account**  

**Request:**
```json
{
  "action": "account_key",
  "account" : "nano_1e5aqegc1jb7qe964u4adzmcezyo6o146zb8hm6dft8tkp79za3sxwjym5rx"
}
```  
**Response:**
```json
{
  "key": "3068BB1CA04525BB0E416C485FE6A67FD52540227D267CC8B6E8DA958A7FA039"
}
```

---

### account_representative 
Returns the representative for **account**  

**Request:**
```json
{
  "action": "account_representative",
  "account": "nano_39a73oy5ungrhxy5z5oao1xso4zo7dmgpjd4u74xcrx3r1w6rtazuouw6qfi"
}
```  
**Response:**
```json
{
  "representative" : "nano_16u1uufyoig8777y6r8iqjtrw8sg8maqrm36zzcm95jmbd9i9aj5i8abr8u5"
}
```

---

### account_weight  
Returns the voting weight for **account**  

**Request:**
```json
{
  "action": "account_weight",
  "account": "nano_3e3j5tkog48pnny9dmfzj1r16pg8t1e76dz5tmac6iq689wyjfpi00000000"
}
```  
**Response:**
```json
{
  "weight": "10000"
}
```

---

### accounts_balances  
Returns how many RAW is owned and how many have not yet been received by **accounts list**  

--8<-- "unconfirmed-information.md"
    The receivable balances are calculated from potentially unconfirmed blocks. Account balances are obtained from their frontiers. An atomic [account_info](#account_info) RPC call is recommended for the purposes of creating transactions.

--8<-- "deprecation-info-pending.md"

**Request:**
```json
{
  "action": "accounts_balances",
  "accounts": ["nano_3t6k35gi95xu6tergt6p69ck76ogmitsa8mnijtpxm9fkcm736xtoncuohr3", "nano_3i1aq1cchnmbn9x5rsbap8b15akfh7wj7pwskuzi7ahz8oq6cobd99d4r3b7"]
}
```  
**Response:**
```json
{
  "balances" : {
    "nano_3t6k35gi95xu6tergt6p69ck76ogmitsa8mnijtpxm9fkcm736xtoncuohr3": {
        "balance": "325586539664609129644855132177",
        "pending": "2309372032769300000000000000000000",
        "receivable": "2309372032769300000000000000000000"
    },
    "nano_3i1aq1cchnmbn9x5rsbap8b15akfh7wj7pwskuzi7ahz8oq6cobd99d4r3b7":
    {
      "balance": "10000000",
      "pending": "0",
      "receivable": "0"
    }
  }
}
```  

**Optional "include_only_confirmed"**
_version 25.0+_   
Boolean, true by default. Results in `balance` only including blocks on the provided account that have already been confirmed and `receivable` only including incoming send blocks that have already been confirmed on the sending account.

!!! info "Error handling"
    With _version 25.0+_, `accounts_balances` response errors come in a different entry, named as `errors`. This
    fixes the breaking change added in V24.0. Please notice that when an account is not found in the ledger, no error
    is returned anymore. It now returns a zero balance and zero as receivable.
    ```json
    {
      "balances": {
        "nano_3t6k35gi95xu6tergt6p69ck76ogmitsa8mnijtpxm9fkcm736xtoncuohr3": {
          "balance": "325586539664609129644855132177",
          "pending": "2309370929000000000000000000000000",
          "receivable": "2309370929000000000000000000000000"
        },
        "nano_1hrts7hcoozxccnffoq9hqhngnn9jz783usapejm57ejtqcyz9dpso1bibuy": {
          "balance": "0",
          "pending": "0",
          "receivable": "0"
        }
      },
      "errors": {
        "nano_36uccgpjzhjsdbj44wm1y5hyz8gefx3wjpp1jircxt84nopxkxti5bzq1rnz": "Bad account number"
      }
    }
    ```
    If all requested entries result in errors, no entry will be added in the response for `balances`. Similarly,
    if there are no errors, no entry will be added for `errors`.  
    Request:
    ```json
    {  
      "action": "accounts_balances",  
      "accounts": ["nano_36uccgpjzhjsdbj44wm1y5hyz8gefx3wjpp1jircxt84nopxkxti5bzq1rnz"]  
    }
    ```
    Response:
    ```json
    {
      "errors": {
        "nano_36uccgpjzhjsdbj44wm1y5hyz8gefx3wjpp1jircxt84nopxkxti5bzq1rnz": "Bad account number"
      }
    }
    ```
    In _version 24.0+_, `accounts_balances` response errors are returned per account entry in `balances` object.
    If an account does not exist, zero balance and zero receivables should be returned, but V24.0 has a bug: unopened
    accounts with receivables return an error instead of the receivables.
    ```json
    {
      "balances": {
        "nano_3wfddg7a1paogrcwi3yhwnaerboukbr7rs3z3ino5toyq3yyhimo6f6egij6": {
          "balance": "442000000000000000000000000000",
          "pending": "0",
          "receivable": "0"
        },
        "nano_1hrts7hcoozxccnffoq9hqhngnn9jz783usapejm57ejtqcyz9dpso1bibuy": {
          "error": "Account not found"
        }
      }
    }
    ```


---

### accounts_frontiers  
Returns a list of pairs of account and block hash representing the head block for **accounts list**  

--8<-- "warning-includes-unconfirmed.md"

**Request:**
```json
{
  "action": "accounts_frontiers",
  "accounts": ["nano_3t6k35gi95xu6tergt6p69ck76ogmitsa8mnijtpxm9fkcm736xtoncuohr3", "nano_3i1aq1cchnmbn9x5rsbap8b15akfh7wj7pwskuzi7ahz8oq6cobd99d4r3b7"]
}
```  
**Response:**
```json
{
  "frontiers" : {
    "nano_3t6k35gi95xu6tergt6p69ck76ogmitsa8mnijtpxm9fkcm736xtoncuohr3": "791AF413173EEE674A6FCF633B5DFC0F3C33F397F0DA08E987D9E0741D40D81A",
    "nano_3i1aq1cchnmbn9x5rsbap8b15akfh7wj7pwskuzi7ahz8oq6cobd99d4r3b7": "6A32397F4E95AF025DE29D9BF1ACE864D5404362258E06489FABDBA9DCCC046F"
  }
}
```  

!!! info "Error handling"
    With _version 25.0+_, `accounts_frontiers` response errors come in a different entry, named `errors`.
    ```json
    {
      "frontiers": {
        "nano_3t6k35gi95xu6tergt6p69ck76ogmitsa8mnijtpxm9fkcm736xtoncuohr3": "023B94B7D27B311666C8636954FE17F1FD2EAA97A8BAC27DE5084FBBD5C6B02C"
      },
      "errors": {
        "nano_36uccgpjzhjsdbj44wm1y5hyz8gefx3wjpp1jircxt84nopxkxti5bzq1rnz": "Bad account number",
        "nano_1hrts7hcoozxccnffoq9hqhngnn9jz783usapejm57ejtqcyz9dpso1bibuy": "Account not found"
      }
    }
    ```
    If all requested entries result in errors, no entry will be added in the response for `frontiers`. Similarly,
    if there are no errors, no entry will be added for `errors`.  
    Request:
    ```json
    {  
      "action": "accounts_frontiers",  
      "accounts": ["nano_1hrts7hcoozxccnffoq9hqhngnn9jz783usapejm57ejtqcyz9dpso1bibuy"]  
    }
    ```
    Response:  
    ```json
    {
      "errors": {
        "nano_1hrts7hcoozxccnffoq9hqhngnn9jz783usapejm57ejtqcyz9dpso1bibuy": "Account not found"
      }
    }
    ```
    In _version 24.0+_, `accounts_frontiers` response errors were returned per account entry in the
    `frontiers` object.
    ```json
    {
      "frontiers": {
        "nano_3wfddg7a1paogrcwi3yhwnaerboukbr7rs3z3ino5toyq3yyhimo6f6egij6": "75BD65296241EB871918EBE3E99E9A191970A2724B3214B27F8AB205FF4FC30A",
        "nano_36uccgpjzhjsdbj44wm1y5hyz8gefx3wjpp1jircxt84nopxkxti5bzq1rnz": "error: Bad account number",
        "nano_1hrts7hcoozxccnffoq9hqhngnn9jz783usapejm57ejtqcyz9dpso1bibuy": "error: Account not found"
      }
    }
    ```

---

### accounts_receivable  

_since V24.0, use [accounts_pending](#accounts_pending) for V23.3 and below_

Returns a list of confirmed block hashes which have not yet been received by these **accounts**  

**Request:**
```json
{
  "action": "accounts_receivable",
  "accounts": ["nano_1111111111111111111111111111111111111111111111111117353trpda", "nano_3t6k35gi95xu6tergt6p69ck76ogmitsa8mnijtpxm9fkcm736xtoncuohr3"],
  "count": "1"
}
```  
**Response:**
```json
{
  "blocks" : {
    "nano_1111111111111111111111111111111111111111111111111117353trpda": ["142A538F36833D1CC78B94E11C766F75818F8B940771335C6C1B8AB880C5BB1D"],
    "nano_3t6k35gi95xu6tergt6p69ck76ogmitsa8mnijtpxm9fkcm736xtoncuohr3": ["4C1FEEF0BEA7F50BE35489A1233FE002B212DEA554B55B1B470D78BD8F210C74"]
  }
}
```  
**Optional "threshold"**  
_version 8.0+_   
Number (128 bit, decimal). Returns a list of receivable block hashes with amount more or equal to **threshold**   

**Request:**
```json
{
  "action": "accounts_receivable",
  "accounts": ["nano_1111111111111111111111111111111111111111111111111117353trpda", "nano_3t6k35gi95xu6tergt6p69ck76ogmitsa8mnijtpxm9fkcm736xtoncuohr3"],
  "count": "1",
  "threshold": "1000000000000000000000000"
}
```  
**Response:**
```json
{
  "blocks" : {
    "nano_1111111111111111111111111111111111111111111111111117353trpda": {
      "142A538F36833D1CC78B94E11C766F75818F8B940771335C6C1B8AB880C5BB1D": "6000000000000000000000000000000"
    },
    "nano_3t6k35gi95xu6tergt6p69ck76ogmitsa8mnijtpxm9fkcm736xtoncuohr3": {
      "4C1FEEF0BEA7F50BE35489A1233FE002B212DEA554B55B1B470D78BD8F210C74": "106370018000000000000000000000000"
    }
  }
}
```  
**Optional "source"**  
_version 9.0+_   
Boolean, false by default. Returns a list of receivable block hashes with amount and source accounts   

**Request:**
```json
{
  "action": "accounts_receivable",
  "accounts": ["nano_1111111111111111111111111111111111111111111111111117353trpda", "nano_3t6k35gi95xu6tergt6p69ck76ogmitsa8mnijtpxm9fkcm736xtoncuohr3"],
  "count": "1",
  "source": "true"
}
```  
**Response:**
```json
{
  "blocks" : {
    "nano_1111111111111111111111111111111111111111111111111117353trpda": {
      "142A538F36833D1CC78B94E11C766F75818F8B940771335C6C1B8AB880C5BB1D": {
        "amount": "6000000000000000000000000000000",
        "source": "nano_3dcfozsmekr1tr9skf1oa5wbgmxt81qepfdnt7zicq5x3hk65fg4fqj58mbr"
      }
    },
    "nano_3t6k35gi95xu6tergt6p69ck76ogmitsa8mnijtpxm9fkcm736xtoncuohr3": {
      "4C1FEEF0BEA7F50BE35489A1233FE002B212DEA554B55B1B470D78BD8F210C74": {
        "amount": "106370018000000000000000000000000",
        "source": "nano_13ezf4od79h1tgj9aiu4djzcmmguendtjfuhwfukhuucboua8cpoihmh8byo"
      }
    }
  }
}
```  
**Optional "include_active"**

_version 15.0+_   
Boolean, false by default. Include active (not confirmed) blocks    

**Request:**
```json
{
  "action": "accounts_receivable",
  "accounts": ["nano_1111111111111111111111111111111111111111111111111117353trpda", "nano_3t6k35gi95xu6tergt6p69ck76ogmitsa8mnijtpxm9fkcm736xtoncuohr3"],
  "count": "1",
  "include_active": "true"
}
```  

**Optional "sorting"**

_version 19.0+_    
Boolean, false by default. Additionally sorts each account's blocks by their amounts in descending order.

**Optional "include_only_confirmed"**

_version 19.0+_  
Boolean, true by default (_version 22.0+_), previously false by default. Only returns confirmed blocks but with the caveat that their confirmation height might not be up-to-date yet. If false, unconfirmed blocks will also be returned.

---

### accounts_representatives 
Returns the representatives for given **accounts**  

**Request:**
```json
{
  "action": "accounts_representatives",
  "accounts": ["nano_16u1uufyoig8777y6r8iqjtrw8sg8maqrm36zzcm95jmbd9i9aj5i8abr8u5","nano_3t6k35gi95xu6tergt6p69ck76ogmitsa8mnijtpxm9fkcm736xtoncuohr3"]
}
```  
**Response:**
```json
{
  "representatives" : {
    "nano_16u1uufyoig8777y6r8iqjtrw8sg8maqrm36zzcm95jmbd9i9aj5i8abr8u5": "nano_3hd4ezdgsp15iemx7h81in7xz5tpxi43b6b41zn3qmwiuypankocw3awes5k",
    "nano_3t6k35gi95xu6tergt6p69ck76ogmitsa8mnijtpxm9fkcm736xtoncuohr3": "nano_3t6k35gi95xu6tergt6p69ck76ogmitsa8mnijtpxm9fkcm736xtoncuohr3"
  }
}
```

!!! info "Error handling"
    With _version 25.0+_, `accounts_representatives` response errors come in a different entry, named `errors`.
    ```json
    {
      "representatives": {
      "nano_3t6k35gi95xu6tergt6p69ck76ogmitsa8mnijtpxm9fkcm736xtoncuohr3":   "nano_3t6k35gi95xu6tergt6p69ck76ogmitsa8mnijtpxm9fkcm736xtoncuohr3"
      },
      "errors": {
        "nano_36uccgpjzhjsdbj44wm1y5hyz8gefx3wjpp1jircxt84nopxkxti5bzq1rnz": "Bad account number",
        "nano_1hrts7hcoozxccnffoq9hqhngnn9jz783usapejm57ejtqcyz9dpso1bibuy": "Account not found"
      }
    }
    ```
    If all requested entries result in errors, no entry will be added in the response for `representatives`. Similarly,
    if there are no errors, no entry will be added for `errors`.  
    Request:
    ```json
    {  
      "action": "accounts_representatives",  
      "accounts": ["nano_1hrts7hcoozxccnffoq9hqhngnn9jz783usapejm57ejtqcyz9dpso1bibuy"]  
    }
    ```
    Response:  
    ```json
    {
      "errors": {
        "nano_1hrts7hcoozxccnffoq9hqhngnn9jz783usapejm57ejtqcyz9dpso1bibuy": "Account not found"
      }
    }
    ```
    In _version 24.0+_, `accounts_representatives` response errors were returned per account entry in the
    `representatives` object.
    ```json
    {
      "representatives": {
        "nano_3wfddg7a1paogrcwi3yhwnaerboukbr7rs3z3ino5toyq3yyhimo6f6egij6": "nano_3wfddg7a1paogrcwi3yhwnaerboukbr7rs3z3ino5toyq3yyhimo6f6egij6",
        "nano_36uccgpjzhjsdbj44wm1y5hyz8gefx3wjpp1jircxt84nopxkxti5bzq1rnz": "error: Bad account number",
        "nano_1hrts7hcoozxccnffoq9hqhngnn9jz783usapejm57ejtqcyz9dpso1bibuy": "error: Account not found"
      }
    }
    ```

---

### available_supply  
Returns how many raw are in the public supply  

**Request:**
```json
{
  "action": "available_supply"
}
```  
**Response:**
```json
{
  "available": "133248061996216572282917317807824970865"
}
```

---

### block_account  
Returns the account containing block  

**Request:**
```json
{
  "action": "block_account",
  "hash": "023B94B7D27B311666C8636954FE17F1FD2EAA97A8BAC27DE5084FBBD5C6B02C"
}
```  
**Response:**
```json
{
  "account": "nano_3t6k35gi95xu6tergt6p69ck76ogmitsa8mnijtpxm9fkcm736xtoncuohr3"
}
```

---

### block_confirm   
_version 12.2+_   
Request confirmation for **block** from known online representative nodes. Check results with [confirmation history](#confirmation_history).

**Request:**
```json
{
  "action": "block_confirm",
  "hash": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F"
}
```  
**Response:**
```json
{
  "started": "1"
}
```

**NOTE:** Unless there was an error encountered during the command, the response will always return `"started": "1"`. This response does not indicate the block was successfully confirmed, only that an error did not occur. This response happens even if the block has already been confirmed previously and notifications will be triggered for this block (via HTTP callbacks or WebSockets) in all cases. This behavior may change in a future release.

---

### block_count  
Reports the number of blocks in the ledger and unchecked synchronizing blocks   

**Request:**
```json
{
  "action": "block_count"
}
```  
**Response:**
```json
{
  "count": "1000",
  "unchecked": "10",
  "cemented": "25"
}
```
**Note:** If the node is running the RocksDB backend the unchecked count may only be estimate.  

**Optional "include_cemented"**

_version 19.0+ (enable_control required in version 19.0, not required in version 20.0+)_  
Default "true". If "true", "cemented" in the response will contain the number of cemented blocks. (In V19.0 default was "false")

--8<-- "warning-enable-control.md"

---

### block_create
_enable_control required, version 9.0+_  
Creates a json representations of new block based on input data & signed with **private key** or **account** in **wallet**. Use for offline signing. Using the optional `json_block` is recommended since v19.0.  

--8<-- "warning-enable-control.md"


**Request sample for state block:**  
```json
{
  "action": "block_create",
  "json_block": "true",
  "type": "state",
  "balance": "1000000000000000000000",
  "key": "0000000000000000000000000000000000000000000000000000000000000002",
  "representative": "nano_1hza3f7wiiqa7ig3jczyxj5yo86yegcmqk3criaz838j91sxcckpfhbhhra1",
  "link": "19D3D919475DEED4696B5D13018151D1AF88B2BD3BCFF048B45031C1F36D1858",
  "previous": "F47B23107E5F34B2CE06F562B5C435DF72A533251CB414C51B2B62A8F63A00E4"
}
```  
Parameters for state block:

* `balance`: **final** balance for account after block creation, formatted in 'raw' units using a decimal integer. If balance is less than previous, block is considered as send subtype!
* `wallet` (optional): The wallet ID that the account the block is being created for is in.
* `account` (optional): The [account](../glossary.md#account) the block is being created for.
* `key` (optional): Instead of using "wallet" & "account" parameters, you can directly pass in a private key.
* `source` (optional): The block hash of the source of funds for this receive block (the send block that this receive block will pocket).
* `destination` (optional): The [account](../glossary.md#account) that the sent funds should be accessible to.
* `link` (optional): Instead of using "source" and "destination" parameters, you can directly pass "link". If the block is sending funds, set link to the public key of the destination account. If it is receiving funds, set link to the hash of the block to receive. If the block has no balance change but is updating representative only, set link to 0. See [Block format section](../integration-guides/the-basics.md#block-format) for more information
* `representative`: The [account](../glossary.md#account) that block account will use as its representative.
* `previous`: The block hash of the previous block on this account's block chain ("0" for first block).

**Warning:** It is **critical** that `balance` is the balance of the account **after** created block!

**Optional "json_block"**

_version 19.0+_  
Default "false". If "true", "block" in the response will contain a JSON subtree instead of a JSON string.
 
**Optional "work"**

Work value (16 hexadecimal digits string, 64 bit). Uses **work** value for block from external source  

**Optional "version"**

_version 21.0+_
Work version string. Currently "work_1" is the default and only valid option. Only used if optional **work** is not given.

**Optional "difficulty"**

_version 21.0+_  
Difficulty value (16 hexadecimal digits string, 64 bit). Uses **difficulty** value to generate work. Only used if optional **work** is not given.  

If difficulty and work values are both not given, RPC processor tries to calculate difficulty for work generation based on ledger data: epoch from previous block or from link for receive subtype; block subtype from previous block balance.  

**Examples**

**Response sample for above request**:  
```json
{
  "hash": "FF0144381CFF0B2C079A115E7ADA7E96F43FD219446E7524C48D1CC9900C4F17",
  "difficulty": "ffffffe1278b3dc6", // since V21.0
  "block": {
    "type": "state",
    "account": "nano_3qgmh14nwztqw4wmcdzy4xpqeejey68chx6nciczwn9abji7ihhum9qtpmdr",
    "previous": "F47B23107E5F34B2CE06F562B5C435DF72A533251CB414C51B2B62A8F63A00E4",
    "representative": "nano_1hza3f7wiiqa7ig3jczyxj5yo86yegcmqk3criaz838j91sxcckpfhbhhra1",
    "balance": "1000000000000000000000",
    "link": "19D3D919475DEED4696B5D13018151D1AF88B2BD3BCFF048B45031C1F36D1858",
    "link_as_account": "nano_18gmu6engqhgtjnppqam181o5nfhj4sdtgyhy36dan3jr9spt84rzwmktafc",
    "signature": "3BFBA64A775550E6D49DF1EB8EEC2136DCD74F090E2ED658FBD9E80F17CB1C9F9F7BDE2B93D95558EC2F277FFF15FD11E6E2162A1714731B743D1E941FA4560A",
    "work": "cab7404f0b5449d0"
  }
}
```  

---

### block_hash  
_version 13.0+_   
Returning block hash for given **block** content. Using the optional `json_block` is recommended since v19.0.  

**Request:**
```json
{  
  "action": "block_hash",
  "json_block": "true", 
  "block": {
    "type": "state",
    "account": "nano_3qgmh14nwztqw4wmcdzy4xpqeejey68chx6nciczwn9abji7ihhum9qtpmdr",
    "previous": "F47B23107E5F34B2CE06F562B5C435DF72A533251CB414C51B2B62A8F63A00E4",
    "representative": "nano_1hza3f7wiiqa7ig3jczyxj5yo86yegcmqk3criaz838j91sxcckpfhbhhra1",
    "balance": "1000000000000000000000",
    "link": "19D3D919475DEED4696B5D13018151D1AF88B2BD3BCFF048B45031C1F36D1858",
    "link_as_account": "nano_18gmu6engqhgtjnppqam181o5nfhj4sdtgyhy36dan3jr9spt84rzwmktafc",
    "signature": "3BFBA64A775550E6D49DF1EB8EEC2136DCD74F090E2ED658FBD9E80F17CB1C9F9F7BDE2B93D95558EC2F277FFF15FD11E6E2162A1714731B743D1E941FA4560A",
    "work": "cab7404f0b5449d0"
  }
}
```  
**Response:**
```json
{
  "hash": "FF0144381CFF0B2C079A115E7ADA7E96F43FD219446E7524C48D1CC9900C4F17"
}
```

**Optional "json_block"**

_version 19.0+_  
Default "false". If "true", "block" must contain a JSON subtree instead of a JSON string.

---

### block_info  
Retrieves a json representation of the block in `contents` along with:

* _since version 18.0_: `block_account`, transaction `amount`, block `balance`, block `height` in account chain, block local modification `timestamp`
* _since version 19.0_: Whether block was `confirmed`, `subtype` (_for state blocks_) of `send`, `receive`, `change` or `epoch`
* _since version 23.0_: `successor` returned

Using the optional `json_block` is recommended since v19.0.  

**Request:**
```json
{  
  "action": "block_info",
  "json_block": "true",
  "hash": "87434F8041869A01C8F6F263B87972D7BA443A72E0A97D7A3FD0CCC2358FD6F9"
}
```  
**Response:**
```json
{
  "block_account": "nano_1ipx847tk8o46pwxt5qjdbncjqcbwcc1rrmqnkztrfjy5k7z4imsrata9est",
  "amount": "30000000000000000000000000000000000",
  "balance": "5606157000000000000000000000000000000",
  "height": "58",
  "local_timestamp": "0",
  "successor": "8D3AB98B301224253750D448B4BD997132400CEDD0A8432F775724F2D9821C72",
  "confirmed": "true",
  "contents": {
    "type": "state",
    "account": "nano_1ipx847tk8o46pwxt5qjdbncjqcbwcc1rrmqnkztrfjy5k7z4imsrata9est",
    "previous": "CE898C131AAEE25E05362F247760F8A3ACF34A9796A5AE0D9204E86B0637965E",
    "representative": "nano_1stofnrxuz3cai7ze75o174bpm7scwj9jn3nxsn8ntzg784jf1gzn1jjdkou",
    "balance": "5606157000000000000000000000000000000",
    "link": "5D1AA8A45F8736519D707FCB375976A7F9AF795091021D7E9C7548D6F45DD8D5",
    "link_as_account": "nano_1qato4k7z3spc8gq1zyd8xeqfbzsoxwo36a45ozbrxcatut7up8ohyardu1z",
    "signature": "82D41BC16F313E4B2243D14DFFA2FB04679C540C2095FEE7EAE0F2F26880AD56DD48D87A7CC5DD760C5B2D76EE2C205506AA557BF00B60D8DEE312EC7343A501",
    "work": "8a142e07a10996d5"
  },
  "subtype": "send"
}
```

Note: The `Balance` in contents is a uint128. However, it will be a hex-encoded (like `0000000C9F2C9CD04674EDEA40000000` for [1 nano](../protocol-design/distribution-and-units.md#unit-dividers)) when the block is a legacy *Send Block*. If the block is a *State-Block*, the same `Balance` will be a numeric-string (like `1000000000000000000000000000000`).

**Optional "json_block"**

_version 19.0+_  
Default "false". If "true", "contents" will contain a JSON subtree instead of a JSON string.


**Optional `include_linked_account`**

_version 28.0+_
(bool):  When set to `true`, the response will include a new field `linked_account`, which returns the linked account associated with the block (or "0" if no linked account exists/was found e.g. due to pruning).


---

### blocks  
Retrieves a json representations of **blocks**. Using the optional `json_block` is recommended since v19.0.  

**Request:**
```json
{
  "action": "blocks",
  "json_block": "true",
  "hashes": ["87434F8041869A01C8F6F263B87972D7BA443A72E0A97D7A3FD0CCC2358FD6F9"]
}
```  
**Response:**
```json
{
  "blocks": {
    "87434F8041869A01C8F6F263B87972D7BA443A72E0A97D7A3FD0CCC2358FD6F9": {
      "type": "state",
      "account": "nano_1ipx847tk8o46pwxt5qjdbncjqcbwcc1rrmqnkztrfjy5k7z4imsrata9est",
      "previous": "CE898C131AAEE25E05362F247760F8A3ACF34A9796A5AE0D9204E86B0637965E",
      "representative": "nano_1stofnrxuz3cai7ze75o174bpm7scwj9jn3nxsn8ntzg784jf1gzn1jjdkou",
      "balance": "5606157000000000000000000000000000000",
      "link": "5D1AA8A45F8736519D707FCB375976A7F9AF795091021D7E9C7548D6F45DD8D5",
      "link_as_account": "nano_1qato4k7z3spc8gq1zyd8xeqfbzsoxwo36a45ozbrxcatut7up8ohyardu1z",
      "signature": "82D41BC16F313E4B2243D14DFFA2FB04679C540C2095FEE7EAE0F2F26880AD56DD48D87A7CC5DD760C5B2D76EE2C205506AA557BF00B60D8DEE312EC7343A501",
      "work": "8a142e07a10996d5"
    }
  }
}
```

**Optional "json_block"**

_version 19.0+_  
Default "false". If "true", "contents" will contain a JSON subtree instead of a JSON string.

---

### blocks_info   
Retrieves a json representations of `blocks` in `contents` along with:

* _since version 18.0_: `block_account`, transaction `amount`, block `balance`, block `height` in account chain, block local modification `timestamp`
* _since version 19.0_: Whether block was `confirmed`, `subtype` (_for state blocks_) of `send`, `receive`, `change` or `epoch`
* _since version 23.0_: `successor` returned

Using the optional `json_block` is recommended since v19.0.  

**Request:**
```json
{
  "action": "blocks_info",
  "json_block": "true",
  "hashes": ["87434F8041869A01C8F6F263B87972D7BA443A72E0A97D7A3FD0CCC2358FD6F9"]
}
```  
**Response:**
```json
{
  "blocks": {
    "87434F8041869A01C8F6F263B87972D7BA443A72E0A97D7A3FD0CCC2358FD6F9": {
      "block_account": "nano_1ipx847tk8o46pwxt5qjdbncjqcbwcc1rrmqnkztrfjy5k7z4imsrata9est",
      "amount": "30000000000000000000000000000000000",
      "balance": "5606157000000000000000000000000000000",
      "height": "58",
      "local_timestamp": "0",
      "successor": "8D3AB98B301224253750D448B4BD997132400CEDD0A8432F775724F2D9821C72",
      "confirmed": "true",
      "contents": {
        "type": "state",
        "account": "nano_1ipx847tk8o46pwxt5qjdbncjqcbwcc1rrmqnkztrfjy5k7z4imsrata9est",
        "previous": "CE898C131AAEE25E05362F247760F8A3ACF34A9796A5AE0D9204E86B0637965E",
        "representative": "nano_1stofnrxuz3cai7ze75o174bpm7scwj9jn3nxsn8ntzg784jf1gzn1jjdkou",
        "balance": "5606157000000000000000000000000000000",
        "link": "5D1AA8A45F8736519D707FCB375976A7F9AF795091021D7E9C7548D6F45DD8D5",
        "link_as_account": "nano_1qato4k7z3spc8gq1zyd8xeqfbzsoxwo36a45ozbrxcatut7up8ohyardu1z",
        "signature": "82D41BC16F313E4B2243D14DFFA2FB04679C540C2095FEE7EAE0F2F26880AD56DD48D87A7CC5DD760C5B2D76EE2C205506AA557BF00B60D8DEE312EC7343A501",
        "work": "8a142e07a10996d5"
      },
      "subtype": "send"
    }
  }
}
```
**Optional `include_linked_account`**

_version 28.0+_
(bool): When set to `true`, the response will include a new field `linked_account`, which returns the linked account associated with the block (or "0" if no linked account exists/was found e.g. due to pruning).
  
**Optional "pending", "source"**

_pending, source: version 9.0+_  
Booleans, false by default. Additionally checks if block is pending, returns source account for receive & open blocks (0 for send & change blocks).

--8<-- "deprecation-info-pending.md"

**Request:**
```json
{
  "action": "blocks_info",
  "hashes": ["E2FB233EF4554077A7BF1AA85851D5BF0B36965D2B0FB504B2BC778AB89917D3"],
  "pending": "true",
  "source": "true"
}
```  
**Response:**
```json
{
  "blocks" : {
    "E2FB233EF4554077A7BF1AA85851D5BF0B36965D2B0FB504B2BC778AB89917D3": {
      "block_account": "nano_1qato4k7z3spc8gq1zyd8xeqfbzsoxwo36a45ozbrxcatut7up8ohyardu1z",
      "amount": "30000000000000000000000000000000000",
      "contents": {
        ...
      },
      "pending": "0",
      "source_account": "nano_1ipx847tk8o46pwxt5qjdbncjqcbwcc1rrmqnkztrfjy5k7z4imsrata9est",
      "balance": "40200000001000000000000000000000000"
    }
  }
}
```
**Optional "receive_hash"**

_version 24.0+_  
Boolean, default false. If "true", displays the hash of the send block's corresponding receive (if any). Returns 0 for non-send blocks, and for receivable blocks that do not yet have a corresponding receive.

**Request:**
```json
{
  "action": "blocks_info",
  "hashes": ["67D9F9F03566D22926159193BD5BDE549FBE8308807C666BCCD3CEA098FBF49D"], 
  "receive_hash": "true" 
}
```

**Response**
```json
{
    "blocks": {
        "67D9F9F03566D22926159193BD5BDE549FBE8308807C666BCCD3CEA098FBF49D": {
            "block_account": "nano_1pnano6m6o1ix3eshr6fj9rryd4ckziyii1mf3ychqno9t3soz638dc9fj9a",
            "amount": "1240000000000000000000000000",
            "balance": "11017588042701000000000000000000",
            "height": "271199",
            "local_timestamp": "1674588370",
            "successor": "0000000000000000000000000000000000000000000000000000000000000000",
            "confirmed": "true",
            "contents": {
              ...
            },
            "subtype": "send",
            "receive_hash": "4DCA5A5E2C732A6899292B9091B7A90CE87E8063954498DF30F469416E6DD6C0"
        }
    }
}
```

**Optional "json_block"**  
_version 19.0+_  
Default "false". If "true", "contents" will contain a JSON subtree instead of a JSON string.

**Optional "include_not_found"**  
_version 19.0+_  
Default "false". If "true", an additional "blocks_not_found" is provided in the response, containing a list of the block hashes that were not found in the local database. Previously to this version an error would be produced if any block was not found.

**Request:**
```json
{
  "action": "blocks_info",
  "include_not_found": "true",
  "hashes": ["87434F8041869A01C8F6F263B87972D7BA443A72E0A97D7A3FD0CCC2358FD6F9", "0000000000000000000000000000000000000000000000000000000000000001"]
}
```

**Response:**
```json
{
  "blocks" : {
    "87434F8041869A01C8F6F263B87972D7BA443A72E0A97D7A3FD0CCC2358FD6F9": {
      "block_account": "nano_1ipx847tk8o46pwxt5qjdbncjqcbwcc1rrmqnkztrfjy5k7z4imsrata9est",
      "amount": "30000000000000000000000000000000000",
      "balance": "5606157000000000000000000000000000000",
      "height": "58",
      "local_timestamp": "0",
      "confirmed": "false",
      "contents": {
        ...
      }
    }
  },
  "blocks_not_found": [
    "0000000000000000000000000000000000000000000000000000000000000001"
  ]
}
```

---

### bootstrap  
Initialize bootstrap to specific **IP address** and **port**. Not compatible with launch flag [--disable_legacy_bootstrap](/commands/command-line-interface/#-disable_legacy_bootstrap)   

**Request:**
```json
{
  "action": "bootstrap",
  "address": "::ffff:138.201.94.249",
  "port": "7075"
}
```  
**Response:**
```json
{
  "success": ""
}
```

**Optional "bypass_frontier_confirmation"**  
_version 20.0-21.3_  
Default "false". If "true", frontier confirmation will not be performed for this bootstrap. Normally not to be changed.

**Optional "id"**  
_version 21.0+_  
String, empty by default. Set specific ID for new bootstrap attempt for better tracking.

---

### bootstrap_any  
Initialize multi-connection bootstrap to random peers. Not compatible with launch flag [--disable_legacy_bootstrap](/commands/command-line-interface/#-disable_legacy_bootstrap)   

**Request:**
```json
{
  "action": "bootstrap_any"
}
```  
**Response:**
```json
{
  "success": ""
}
```
**Optional "force"**  
_version 20.0+_  
Boolean, false by default. Manually force closing of all current bootstraps  

**Optional "id"**  
_version 21.0+_  
String, empty by default. Set specific ID for new bootstrap attempt for better tracking.

**Optional "account"**
_version 22.0+_
String, empty by default. Public address for targeting a specific account on bootstrap attempt

---

### bootstrap_lazy  
_enable_control required, version 17.0+_   
Initialize lazy bootstrap with given block **hash**. Not compatible with launch flag [--disable_lazy_bootstrap](/commands/command-line-interface/#-disable_lazy_bootstrap). As of _version 22.0_, response includes whether new election was `started` and whether a new lazy `key_inserted` was successful.

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "bootstrap_lazy",
  "hash": "FF0144381CFF0B2C079A115E7ADA7E96F43FD219446E7524C48D1CC9900C4F17"
}
```  
**Response:**
```json
{
  "started": "1",
  "key_inserted": "0"
}
```
**Optional "force"**

Boolean, false by default. Manually force closing of all current bootstraps  

**Optional "id"**  
_version 21.0+_  
String, empty by default. Set specific ID for new bootstrap attempt for better tracking.

---

### bootstrap_priorities  
_enable_control required, version 28.0+_   
Dumps info about priority and blocking sets to aid in debugging any potential problems

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "bootstrap_priorities"
}
```  

---

### bootstrap_reset  
_enable_control required, version 28.0+_   
Resets ascending bootstrap state - both priority and blocking sets are cleared.

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "bootstrap_reset"
}
```  

---

### bootstrap_status  
_version 17.0+_

--8<-- "warning-debug-only-command.md"

Returning status of current bootstrap attempt

**Request:**
```json
{
  "action": "bootstrap_status"
}
```  
**Response:**
_versions 21.0+_
```json
{
  "bootstrap_threads": "2",
  "running_attempts_count": "2",
  "total_attempts_count": "6",
  "connections": {
    "clients": "31",
    "connections": "45",
    "idle": "0",
    "target_connections": "64",
    "pulls": "1158514"
  },
  "attempts": [
    {
      "id": "EE778222D6407F94A666B8A9E03D242D",
      "mode": "legacy",
      "started": "true",
      "pulling": "1158544",
      "total_blocks": "4311",
      "requeued_pulls": "7",
      "frontier_pulls": "0",
      "frontiers_received": "true",
      "frontiers_confirmed": "false",
      "frontiers_confirmation_pending": "false",
      "frontiers_age": "4294967295",
      "last_account": "nano_1111111111111111111111111111111111111111111111111111hifc8npp",
      "duration": "133"
    },
    {
      "id": "291D2CC32F44E004896C4215A6CDEDAFEF317F6AC802C244E8F4B4F2456175CB",
      "mode": "lazy",
      "started": "true",
      "pulling": "1",
      "total_blocks": "1878",
      "requeued_pulls": "4",
      "lazy_blocks": "1878",
      "lazy_state_backlog": "1",
      "lazy_balances": "4",
      "lazy_destinations": "0",
      "lazy_undefined_links": "0",
      "lazy_pulls": "13",
      "lazy_keys": "2",
      "lazy_key_1": "E6D0B5BD5EBDB3CEC7DBC32EDC3C2DBD5ABA17C54E34485A358BF8948039ED6A",
      "duration": "17"
    }
  ]
}
```

??? abstract "Response V17.0-V20.0"
    ```json
    {
      "clients": "0",
      "pulls": "0",
      "pulling": "0",
      "connections": "31",
      "idle": "31",
      "target_connections": "16",
      "total_blocks": "13558",
      "runs_count": "0",
      "requeued_pulls": "31",
      "frontiers_received": "true",
      "frontiers_confirmed": "false",
      "mode": "legacy",
      "lazy_blocks": "0",
      "lazy_state_backlog": "0",
      "lazy_balances": "0",
      "lazy_destinations": "0",
      "lazy_undefined_links": "0",
      "lazy_pulls": "32",
      "lazy_keys": "32",
      "lazy_key_1": "36897874BDA3028DC8544C106BE1394891F23DDDF84DE100FED450F6FBC8122C",
      "duration": "29"
    }
    ```

---

### chain  
Returns a consecutive list of block hashes in the account chain starting at **block** back to **count** (direction from frontier back to open block, from newer blocks to older). Will list all blocks back to the open block of this chain when count is set to "-1". The requested block hash is included in the answer.  

**Request:**
```json
{
  "action": "chain",
  "block": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F",
  "count": "1"
}
```  
**Response:**
```json
{
  "blocks": [
    "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F"
  ]
}
```
**Optional "offset"**

_version 18.0+_   
Number, 0 by default. Return the account chain block hashes **offset** by the specified number of blocks    

**Optional "reverse"**

_version 18.0+_   
Boolean, false by default. Returns a list of block hashes in the account chain starting at **block** up to **count** (direction from open block up to frontier, from older blocks to newer). Equal to [successors](#successors)    

---

### confirmation_active  
_version 16.0+_   
Returns list of active elections qualified roots (excluding stopped & aborted elections); since V21, also includes the number of unconfirmed and confirmed active elections. Find info about specific qualified root with [confirmation_info](#confirmation_info)  

!!! note
    The roots provided are two parts and differ between the first account block and subsequent blocks:

    * First account block (open): account public key + `0000000000000000000000000000000000000000000000000000000000000000`
    * Other blocks: previous hash + previous hash


**Request:**
```json
{
  "action": "confirmation_active"
}
```  
**Response:**
```json
{
 "confirmations": [
   "8031B600827C5CC05FDC911C28BBAC12A0E096CCB30FA8324F56C123676281B28031B600827C5CC05FDC911C28BBAC12A0E096CCB30FA8324F56C123676281B2"
 ],
 "unconfirmed": "133", // since V21.0
 "confirmed": "5" // since V21.0
}
```   
   
**Optional "announcements"**

Number, 0 by default. Returns only active elections with equal or higher announcements count. Useful to find long running elections   

---

### confirmation_history  
_version 12.0+_

--8<-- "warning-debug-only-command.md"
 
duration, time, confirmation_stats: version 17.0+_   
Returns hash, tally weight, election duration (in milliseconds), election confirmation timestamp for recent elections winners; since V20.0, the confirmation request count; since V21.0, the number of blocks and voters. Also returns stats: count of elections in history (limited to 2048) & average duration time.

With version 19.0+ `confirmation_history_size` can be managed in the configuration file to adjust the number of elections to be kept in history and returned by this call. Due to timings inside the node, the default 2048 limit will return all confirmations up to traffic levels of approximately 56 confirmations/sec. To properly track levels above this, increase this value or use the confirmation subscription through the [websocket](/integration-guides/websockets) instead.

**Request:**
```json
{
  "action": "confirmation_history"
}
```  
**Response:**
```json
{
  "confirmation_stats": {
    "count": "2",
    "average": "5000"
  },
  "confirmations": [
    {
      "hash": "EA70B32C55C193345D625F766EEA2FCA52D3F2CCE0B3A30838CC543026BB0FEA",
      "duration": "4000",
      "time": "1544819986",
      "tally": "80394786589602980996311817874549318248",
      "final": "80394786589602980996311817874549318248", // since V22.0
      "blocks": "1", // since V21.0
      "voters": "37", // since V21.0
      "request_count": "2" // since V20.0
    },
    {
      "hash": "F2F8DA6D2CA0A4D78EB043A7A29E12BDE5B4CE7DE1B99A93A5210428EE5B8667",
      "duration": "6000",
      "time": "1544819988",
      "tally": "68921714529890443063672782079965877749",
      "final": "68921714529890443063672782079965877749", // since V22.0
      "blocks": "1", // since V21.0
      "voters": "64", // since V21.0
      "request_count": "7" // since V20.0
    }
  ]
}
```   
**Optional "hash"**

Valid block hash, filters return for only the provided hash. If there is no confirmation available for that hash anymore, the following return can be expected:  
```json
{
  "confirmation_stats": {
    "count": "0"
  },
  "confirmations": ""
}
```  

If the block is unknown on the node, the following error will be returned:  
```"error": "Invalid block hash"```  
 
---

### confirmation_info 
_version 16.0+_   
Returns info about an unconfirmed active election by **root**. Including announcements count, last winner (initially local ledger block), total tally of voted representatives, concurrent blocks with tally & block contents for each. Using the optional `json_block` is recommended since v19.0. Updated in v28.0 to include a list of representatives_final (representatives that have voted with final votes). 

!!! note
    The roots provided are two parts and differ between the first account block and subsequent blocks:

    * First account block (open): `0000000000000000000000000000000000000000000000000000000000000000` + account public key
    * Other blocks: previous hash + previous hash


**Request:**
```json
{
  "action": "confirmation_info",
  "json_block": "true",
  "root": "EE125B1B1D85D3C24636B3590E1642D9F21B166C0C6CD99C9C6087A1224A0C44EE125B1B1D85D3C24636B3590E1642D9F21B166C0C6CD99C9C6087A1224A0C44"
}
```  
**Response:**
```json
{
  "announcements": "2",
  "voters": "29",
  "last_winner": "B94C505029F04BC057A0486ADA8BD07981B4A8736AE6581F2E98C6D18498146F",
  "total_tally": "51145880360832646375807054724596663794",
  "final_tally": "51145880360832646375807054724596663794",
  "blocks": {
    "B94C505029F04BC057A0486ADA8BD07981B4A8736AE6581F2E98C6D18498146F": {
      "tally": "51145880360832646375807054724596663794",
      "contents": {
        "type": "state",
        "account": "nano_3fihmbtuod33s4nrbqfczhk9zy9ddqimwjshzg4c3857es8c9631i5rg6h9p",
        "previous": "EE125B1B1D85D3C24636B3590E1642D9F21B166C0C6CD99C9C6087A1224A0C44",
        "representative": "nano_3o7uzba8b9e1wqu5ziwpruteyrs3scyqr761x7ke6w1xctohxfh5du75qgaj",
        "balance": "218195000000000000000000000000",
        "link": "0000000000000000000000000000000000000000000000000000000000000000",
        "link_as_account": "nano_1111111111111111111111111111111111111111111111111111hifc8npp",
        "signature": "B1BD285235C612C5A141FA61793D7C6C762D3F104A85102DED5FBD6B4514971C4D044ACD3EC8C06A9495D8E83B6941B54F8DABA825ADF799412ED9E2C86D7A0C",
        "work": "05bb28cd8acbe71d"
      }
    }
  }
}   
```   

**Optional "contents"**

Boolean, true by default. Disable contents for each block   

**Optional "json_block"**

_version 19.0+_  
Default "false". If "true", "contents" will contain a JSON subtree instead of a JSON string.

**Optional "representatives"**

Boolean, false by default. Returns list of votes representatives & its weights for each block   

**Request:**
```json
{
  "action": "confirmation_info",
  "json_block": "true",
  "root": "EE125B1B1D85D3C24636B3590E1642D9F21B166C0C6CD99C9C6087A1224A0C44EE125B1B1D85D3C24636B3590E1642D9F21B166C0C6CD99C9C6087A1224A0C44",
  "representatives": "true"
}
```  
**Response:**
```json
{
  "announcements": "5",
  "last_winner": "B94C505029F04BC057A0486ADA8BD07981B4A8736AE6581F2E98C6D18498146F",
  "total_tally": "51145880360792646375807054724596663794",
  "blocks": {
    "B94C505029F04BC057A0486ADA8BD07981B4A8736AE6581F2E98C6D18498146F": {
      "tally": "51145880360792646375807054724596663794",
      "contents": {
        "type": "state",
        "account": "nano_3fihmbtuod33s4nrbqfczhk9zy9ddqimwjshzg4c3857es8c9631i5rg6h9p",
        "previous": "EE125B1B1D85D3C24636B3590E1642D9F21B166C0C6CD99C9C6087A1224A0C44",
        "representative": "nano_3o7uzba8b9e1wqu5ziwpruteyrs3scyqr761x7ke6w1xctohxfh5du75qgaj",
        "balance": "218195000000000000000000000000",
        "link": "0000000000000000000000000000000000000000000000000000000000000000",
        "link_as_account": "nano_1111111111111111111111111111111111111111111111111111hifc8npp",
        "signature": "B1BD285235C612C5A141FA61793D7C6C762D3F104A85102DED5FBD6B4514971C4D044ACD3EC8C06A9495D8E83B6941B54F8DABA825ADF799412ED9E2C86D7A0C",
        "work": "05bb28cd8acbe71d"
      },
      "representatives": {
        "nano_3pczxuorp48td8645bs3m6c3xotxd3idskrenmi65rbrga5zmkemzhwkaznh": "12617828599372664613607727105312358589",
        "nano_1stofnrxuz3cai7ze75o174bpm7scwj9jn3nxsn8ntzg784jf1gzn1jjdkou": "5953738757270291536911559258663615240",
        ...
        "nano_3i4n5n6c6xssapbdtkdoutm88c5zjmatc5tc77xyzdkpef8akid9errcpjnx": "0"
      }
    }
  }
}
```   

---

### confirmation_quorum  
_version 16.0+_   
Returns information about node elections settings & observed network state:

- `quorum_delta`: Online weight times `online_weight_quorum_percent`
- `online_weight_quorum_percent`: Percent of online vote weight required for confirmation
- `online_weight_minimum`: When calculating online weight, the node is forced to assume at least this much voting weight is online, thus setting a floor for voting weight to confirm transactions at `online_weight_minimum` * `quorum_delta`
- `online_stake_total`: Total online weight from gossip vote traffic
- `peers_stake_total`: Total online weight from direct node connections
- `trended_stake_total`: Median of online weight samples taken every 5 minutes over previous 2 week period
- Removed in _version 22.0_: `peers_stake_required`

**Request:**
```json
{  
  "action": "confirmation_quorum"      
}
```  
**Response:**
```json
{
  "quorum_delta": "41469707173777717318245825935516662250",
  "online_weight_quorum_percent": "50",
  "online_weight_minimum": "60000000000000000000000000000000000000",
  "online_stake_total": "82939414347555434636491651871033324568",
  "peers_stake_total": "69026910610720098597176027400951402360",
  "trended_stake_total": "81939414347555434636491651871033324568"
}   
```   

**Optional "peer_details"**

_version 17.0+_ 

Boolean, false by default. If true, add account/ip/rep weight for each peer considered in the summation of *peers_stake_total*.

**Response field "peers_stake_required"**

_version 19.0+_

The effective stake needed from directly connected peers for quorum. Per v19, this field is computed as `max(quorum_delta, online_weight_minimum)`. If `peers_stake_total` is lower than this value, the node will not mark blocks as confirmed.

---

### database_txn_tracker
_enable_control required, v19.0+_  

--8<-- "warning-debug-only-command.md"
  
Returns a list of open database transactions which are equal or greater than the `min_read_time` or `min_write_time` for reads and read-writes respectively.  

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "database_txn_tracker",
  "min_read_time" : "1000",
  "min_write_time" : "0"
}
```
**Response on Windows/Debug:**  
```json
{
  "txn_tracking": [
    {
      "thread": "Blck processing",  // Which thread held the transaction
      "time_held_open": "2",        // Seconds the transaction has currently been held open for
      "write": "true",              // If true it is a write lock, otherwise false.
      "stacktrace": [
        {
          "name": "nano::mdb_store::tx_begin_write",
          "address": "00007FF7142C5F86",
          "source_file": "c:\\users\\wesley\\documents\\raiblocks\\nano\\node\\lmdb.cpp",
          "source_line": "825"
        },
        {
          "name": "nano::block_processor::process_batch",
          "address": "00007FF714121EEA",
          "source_file": "c:\\users\\wesley\\documents\\raiblocks\\nano\\node\\blockprocessor.cpp",
          "source_line": "243"
        },
        {
          "name": "nano::block_processor::process_blocks",
          "address": "00007FF71411F8A6",
          "source_file": "c:\\users\\wesley\\documents\\raiblocks\\nano\\node\\blockprocessor.cpp",
          "source_line": "103"
        },
        ...
      ]
    }
    ... // other threads
  ]
}
```

---

### delegators  
_version 8.0+_   
Returns a list of pairs of delegator accounts and balances given a representative **account**

**Request:**
```json
{
  "action": "delegators",
  "account": "nano_1111111111111111111111111111111111111111111111111117353trpda"
}
```  
**Response:**
```json
{
  "delegators": {
    "nano_13bqhi1cdqq8yb9szneoc38qk899d58i5rcrgdk5mkdm86hekpoez3zxw5sd": "500000000000000000000000000000000000",
    "nano_17k6ug685154an8gri9whhe5kb5z1mf5w6y39gokc1657sh95fegm8ht1zpn": "961647970820730000000000000000000000"
  }
}
```   

**Optional parameters:**  
_since V23.0_  

* `threshold`: minimum required balance for a delegating account to be included in the response
* `count`: number of delegators to return
* `start`: account in the list you would like to start after, to allow for paging responses

---

### delegators_count  
_version 8.0+_   
Get number of delegators for a specific representative **account**  

**Request:**
```json
{
  "action": "delegators_count",
  "account": "nano_1111111111111111111111111111111111111111111111111117353trpda"
}
```  
**Response:**
```json
{
  "count": "2"
}
```   

---

### deterministic_key  
Derive deterministic keypair from **seed** based on **index**  

**Request:**
```json
{
  "action": "deterministic_key",
  "seed": "0000000000000000000000000000000000000000000000000000000000000000",
  "index": "0"
}
```  
**Response:**
```json
{
  "private": "9F0E444C69F77A49BD0BE89DB92C38FE713E0963165CCA12FAF5712D7657120F",
  "public": "C008B814A7D269A1FA3C6528B19201A24D797912DB9996FF02A1FF356E45552B",
  "account": "nano_3i1aq1cchnmbn9x5rsbap8b15akfh7wj7pwskuzi7ahz8oq6cobd99d4r3b7"
}
```  

---

### election_statistics  
_version 27.0+_ 

Returns the number of each election type, the maximum and average election age from Active Election Container (AEC).

Values in `max_election_age` and `average_election_age` are in milliseconds.

**Request:**
```json
{
  "action": "election_statistics"
}
```  
**Response sample:**
```json
{
    "normal": "152",
    "priority": "1",
    "hinted": "0",
    "optimistic": "19",
    "total": "172",
    "aec_utilization_percentage": "3.42",
    "max_election_age": "5493",
    "average_election_age": "421"
}
```

---

### epoch_upgrade  
_enable_control required, version 20.0+_ 

--8<-- "warning-debug-only-command.md"

Upgrade network to new **epoch** with epoch signer private **key**. This spawns a background task to iterate over all accounts and add the epoch block to any accounts that do not have it. It will return `{ "started" = "1" }` if the background task was spawned successfully or `{ "started" = "0" }` if the operation could not be started. Reasons for not being able to start the operations include the node being stopped and a previous being in progress. `epoch` can be set to either 1 (representing the [network upgrade to state blocks](../releases/network-upgrades.md#state-blocks)) or 2 (representing the [network upgrade for increase work difficulty](../releases/network-upgrades.md#increased-work-difficulty)).

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "epoch_upgrade",
  "epoch": "1",
  "key": "0000000000000000000000000000000000000000000000000000000000000000"
}
```  
**Response:**
```json
{
  "started": "1"
}
```  
**Optional "count"**  
Number. Determines limit of number of accounts to upgrade.

**Optional "threads"**  
_version 21.0+_  
Number. Determines limit of work threads to use for concurrent upgrade processes (useful with multiple work peers or high work peer latency).

---

### frontier_count  
Reports the number of accounts in the ledger  

**Request:**
```json
{
  "action": "frontier_count"
}
```  
**Response:**
```json
{
  "count": "920471"
}
```

---

### frontiers  
Returns a list of pairs of account and block hash representing the head block starting at **account** up to **count**  

**Request:**
```json
{
  "action": "frontiers",
  "account": "nano_1111111111111111111111111111111111111111111111111111hifc8npp",
  "count": "1"
}
```  
**Response:**
```json
{
  "frontiers" : {
    "nano_3e3j5tkog48pnny9dmfzj1r16pg8t1e76dz5tmac6iq689wyjfpi00000000": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F"
  }
}
```

---

### keepalive  
_enable_control required_  
Tells the node to send a keepalive packet to **address**:**port**  

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "keepalive",
  "address": "::ffff:192.169.0.1",
  "port": "1024"
}
```  
**Response:**
```json
{
  "started": "1"
}
```

---

### key_create 
Generates an **adhoc random keypair**  

**Request:**
```json
{
  "action": "key_create"
}
```  
**Response:**
```json
{
  "private": "781186FB9EF17DB6E3D1056550D9FAE5D5BBADA6A6BC370E4CBB938B1DC71DA3",
  "public": "3068BB1CA04525BB0E416C485FE6A67FD52540227D267CC8B6E8DA958A7FA039",
  "account": "nano_1e5aqegc1jb7qe964u4adzmcezyo6o146zb8hm6dft8tkp79za3sxwjym5rx"
}
```  

---

### key_expand  
Derive public key and account number from **private key**  

**Request:**
```json
{
  "action": "key_expand",
  "key": "781186FB9EF17DB6E3D1056550D9FAE5D5BBADA6A6BC370E4CBB938B1DC71DA3"
}
```  
**Response:**
```json
{
  "private": "781186FB9EF17DB6E3D1056550D9FAE5D5BBADA6A6BC370E4CBB938B1DC71DA3",
  "public": "3068BB1CA04525BB0E416C485FE6A67FD52540227D267CC8B6E8DA958A7FA039",
  "account": "nano_1e5aqegc1jb7qe964u4adzmcezyo6o146zb8hm6dft8tkp79za3sxwjym5rx"
}
```  

---

### ledger
_enable_control required, version 9.0+_   
Returns frontier, open block, change representative block, balance, last modified timestamp from local database & block count starting at **account** up to **count**   

--8<-- "warning-enable-control.md"

--8<-- "warning-includes-unconfirmed.md"

**Request:**
```json
{
  "action": "ledger",
  "account": "nano_1111111111111111111111111111111111111111111111111111hifc8npp",
  "count": "1"
}
```  
**Response:**
```json
{
  "accounts": {
    "nano_11119gbh8hb4hj1duf7fdtfyf5s75okzxdgupgpgm1bj78ex3kgy7frt3s9n": {
      "frontier": "E71AF3E9DD86BBD8B4620EFA63E065B34D358CFC091ACB4E103B965F95783321",
      "open_block": "643B77F1ECEFBDBE1CC909872964C1DBBE23A6149BD3CEF2B50B76044659B60F",
      "representative_block": "643B77F1ECEFBDBE1CC909872964C1DBBE23A6149BD3CEF2B50B76044659B60F",
      "balance": "0",
      "modified_timestamp": "1511476234",
      "block_count": "2"
    }
  }
}
```  
**Optional "representative", "weight", "receivable"**  
Booleans, false by default. Additionally returns representative, voting weight, receivable balance for each account   

**Request:**
```json
{
  "action": "ledger",
  "account": "nano_1111111111111111111111111111111111111111111111111111hifc8npp",
  "count": "1",
  "representative": "true",
  "weight": "true",
  "receivable": "true"
}
```  
**Response:**
```json
{
  "accounts": {
    "nano_11119gbh8hb4hj1duf7fdtfyf5s75okzxdgupgpgm1bj78ex3kgy7frt3s9n": {
      "frontier": "E71AF3E9DD86BBD8B4620EFA63E065B34D358CFC091ACB4E103B965F95783321",
      "open_block": "643B77F1ECEFBDBE1CC909872964C1DBBE23A6149BD3CEF2B50B76044659B60F",
      "representative_block": "643B77F1ECEFBDBE1CC909872964C1DBBE23A6149BD3CEF2B50B76044659B60F",
      "balance": "0",
      "modified_timestamp": "1511476234",
      "block_count": "2",
      "representative": "nano_1anrzcuwe64rwxzcco8dkhpyxpi8kd7zsjc1oeimpc3ppca4mrjtwnqposrs",
      "weight": "0",
      "pending": "0",
      "receivable": "0"
    }   
  }   
}
```  
**Optional "modified_since"**  
_version 11.0+_   
UNIX timestamp (number), 0 by default. Return only accounts modified in local database after specific timestamp   

**Optional "sorting"**  
Boolean, false by default. Additional sorting accounts in descending order  
NOTE: The "count" option is ignored if "sorting" is specified

**Optional "threshold"**  
_version 19.0+_  
Number (128 bit, decimal), default 0. Return only accounts with balance above **threshold**. If **receivable** is also given, the number compared with the threshold is the sum of account balance and receivable balance.

---

### node_id
_enable_control required, version 17.0+_ 

--8<-- "warning-debug-only-command.md"
 
Returns private key, public key and node ID number with checksum (similar to account representation) from the existing node ID created on startup. "as_account" field is **deprecated**  
_version 20.0 will generate the node_id with `node_` prefix, earlier versions will generate with `nano_` prefix_  

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "node_id"
}
```  
**Response:**
```json
{
  "private": "2AD75C9DC20EA497E41722290C4DC966ECC4D6C75CAA4E447961F918FD73D8C7",
  "public": "78B11E1777B8E7DF9090004376C3EDE008E84680A497C0805F68CA5928626E1C",
  "as_account": "nano_1y7j5rdqhg99uyab1145gu3yur1ax35a3b6qr417yt8cd6n86uiw3d4whty3",
  "node_id": "node_1y7j5rdqhg99uyab1145gu3yur1ax35a3b6qr417yt8cd6n86uiw3d4whty3"
}
```  

---

### peers  
Returns a list of pairs of online peer IPv6:port and its node protocol network version    

**Request:**
```json
{
  "action": "peers"
}
```  
 
**Response version 8.0+:**
```json
{
  "peers": {
    "[::ffff:172.17.0.1]:32841": "16"
  }
}
```   

**Response before version 8.0:**
```json
{
  "peers": [
      "[::ffff:172.17.0.1]:32841"
  ]
}
```   
**Optional "peer_details"**

_version 18.0+_   
Boolean, false by default. Returns a list of peers IPv6:port with its node protocol network version and node ID. The node ID is random and is not a Nano address. As of Version V21+ `type` returns `tcp`, as `udp` was **deprecated** and is not longer used for peering with that node.

_version 20.0 will generate the node_id with `node_` prefix, earlier versions will generate with `nano_` prefix_  

**Request:**
```json

{
  "action": "peers",
  "peer_details": "true"
}
```

**Response:**
```json
{
  "peers": {
    "[::ffff:172.17.0.1]:7075": {
      "protocol_version": "18",
      "node_id": "node_1y7j5rdqhg99uyab1145gu3yur1ax35a3b6qr417yt8cd6n86uiw3d4whty3",
      "type": "tcp"
    }
  }
}
```

---

### populate_backlog
_enable_control required_ 
Scans all accounts, checks for unconfirmed blocks in account chains, and then queues those blocks for confirmation via the election scheduler. Useful for local test networks, since default backlog population is normally done over longer intervals (e.g. 5 minutes).

--8<-- "warning-enable-control.md"

**Request**
```json
{ 
  "action": "populate_backlog"   
}
```
**Response**
```json
{
  "success": "" 
}
```

---

### process  
Publish **block** to the network. Using the optional `json_block` is recommended since v19.0. In v20.0-v21.3, blocks are watched for confirmation by default (see optional `watch_work`).  If `enable_control` is not set to `true` on the node, then the optional `watch_work` must be set to `false`. In V22.0+ the work watcher has been removed.

Note: after v25.0, it is possible that the block processing queue can internally drop a block if the queue gets full. This stat can be checked for `blockprocessor` type, and `drop` details.

--8<-- "warning-process-sub-type-recommended.md"

**Request:**
```json
{
  "action": "process",
  "json_block": "true",
  "subtype": "send",
  "block": {
    "type": "state",
    "account": "nano_1qato4k7z3spc8gq1zyd8xeqfbzsoxwo36a45ozbrxcatut7up8ohyardu1z",
    "previous": "6CDDA48608C7843A0AC1122BDD46D9E20E21190986B19EAC23E7F33F2E6A6766",
    "representative": "nano_3pczxuorp48td8645bs3m6c3xotxd3idskrenmi65rbrga5zmkemzhwkaznh",
    "balance": "40200000001000000000000000000000000",
    "link": "87434F8041869A01C8F6F263B87972D7BA443A72E0A97D7A3FD0CCC2358FD6F9",
    "link_as_account": "nano_33t5by1653nt196hfwm5q3wq7oxtaix97r7bhox5zn8eratrzoqsny49ftsd",
    "signature": "A5DB164F6B81648F914E49CAB533900C389FAAD64FBB24F6902F9261312B29F730D07E9BCCD21D918301419B4E05B181637CF8419ED4DCBF8EF2539EB2467F07",
    "work": "000bc55b014e807d"
  }
}
```  
**Response:**
```json
{
  "hash": "E2FB233EF4554077A7BF1AA85851D5BF0B36965D2B0FB504B2BC778AB89917D3"
}
```
**Optional "force"**  
_version 13.1+_  
Boolean, false by default. Manually forcing fork resolution if processed block is not accepted as fork

**Optional "subtype"**  
_version 18.0+_  
String, empty by default. Additional check for state blocks subtype, i.e. prevent accidental sending to incorrect accounts instead of receiving receivable blocks. Options:

* `send` - account balance is reduced
* `receive` - account balance is increased
* `open` - first block on account with account balance initially set higher than 0
* `change` - account balance is unchanged, representative field value changed to valid public address
* `epoch` - block signed with epoch signer private key (does not allow balance or representative changes)

**Optional "json_block"**  
_version 19.0+_  
Boolean, default "false". If "true", "block" must contain a JSON subtree instead of a JSON string.

**Optional "watch_work"**  
_added in version 20.0+_  
_removed in version 22.0_  
Boolean, default "true". If "true", **block** will be placed on watch for confirmation, with equivalent functionality to in-wallet transactions using [send](#send), [receive](#receive) and [account_representative_set](#account_representative_set), including republishing and rework if confirmation is delayed (default is 5 seconds, set by `work_watcher_period` config entry) and if [active_difficulty](#active_difficulty) is higher than the block's PoW difficulty.

**Optional "async"**  
_version 22.0+_  
Boolean, default "false". If "true", requests will add the blocks to the block processor queue and `{"started":"1"}` will be immediately returned, instead of waiting for block process completion to return. To know if the block was properly processed, monitor the [WebSocket topic `new_unconfirmed_block`](../integration-guides/websockets.md#new-unconfirmed-blocks) and a notification for that successful block will be sent.

---

### receivable

_since V23.0, use [pending](#pending) for V22.1 and below_  
Returns a list of block hashes which have not yet been received by this account.

**Request:**
```json
{
  "action": "receivable",
  "account": "nano_1111111111111111111111111111111111111111111111111117353trpda",
  "count": "1"
}
```  
**Response:**
```json
{
  "blocks": [ "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F" ]
}
```   
**Optional "count"**  
Number. Determines limit of number of blocks to return.

**Optional "threshold"**  
_version 8.0+_   
Number (128 bit, decimal). Returns a list of receivable block hashes with amount more or equal to **threshold**  

**Request:**
```json
{
  "action": "receivable",
  "account": "nano_1111111111111111111111111111111111111111111111111117353trpda",
  "count": "1",
  "threshold": "1000000000000000000000000"
}
```  
**Response:**
```json
{
  "blocks" : {
    "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F": "6000000000000000000000000000000"
  }
}
```  
**Optional "source"**  
_version 9.0+_   
Boolean, false by default. Returns a list of receivable block hashes with amount and source accounts   

**Request:**
```json
{
  "action": "receivable",
  "account": "nano_1111111111111111111111111111111111111111111111111117353trpda",
  "count": "1",
  "source": "true"
}
```  
**Response:**
```json
{
  "blocks" : {
    "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F": {
      "amount": "6000000000000000000000000000000",
      "source": "nano_3dcfozsmekr1tr9skf1oa5wbgmxt81qepfdnt7zicq5x3hk65fg4fqj58mbr"
    }
  }
}
```  
**Optional "include_active"**

_version 15.0+_   
Boolean, false by default. Include active blocks without finished confirmations 

**Request:**
```json
{
  "action": "receivable",
  "account": "nano_1111111111111111111111111111111111111111111111111117353trpda",
  "count": "1",
  "include_active": "true"
}
```  

**Optional "min_version"**

_version 15.0+_   
Boolean, false by default. Returns the minimum version (epoch) of a block which can pocket this receivable block.

**Optional "sorting"**

Boolean, false by default. Additionally sorts the blocks by their amounts in descending order.   

_version 22.0+_   
If used with "count" returns the absolute sorted values.

_version 19.0+_   
If used with "count" only sorts relative to the first receivable entries found up to count so not necessarily the ones with the largest receivable balance.   

**Optional "include_only_confirmed"**

_version 19.0+_  
Boolean, true by default (_version 22.0+_), previously false by default. Only returns confirmed blocks but with the caveat that their confirmation height might not be up-to-date yet. If false, unconfirmed blocks will also be returned.

---

### receivable_exists

_since V23.0, use [pending_exists](#pending_exists) for V22.1 and below_  
Check whether block is receivable by **hash**  

**Request:**
```json
{
  "action": "receivable_exists",
  "hash": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F"
}
```  
**Response:**
```json
{
  "exists" : "1"
}
```

**Optional "include_active"**

_version 15.0+_   
Boolean, false by default. Include active blocks without finished confirmations 

**Request:**
```json
{
  "action": "receivable_exists",
  "hash": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F",
  "include_active": "true"
}
```  

**Optional "include_only_confirmed"**

_version 19.0+_  
Boolean, true by default (_version 22.0+_), previously false by default. Only returns confirmed blocks but with the caveat that their confirmation height might not be up-to-date yet. If false, unconfirmed blocks will also be returned.

---

### representatives  
Returns a list of pairs of representative and its voting weight  

**Request:**
```json
{
  "action": "representatives"
}
```  
**Response:**
```json
{
  "representatives": {
    "nano_1111111111111111111111111111111111111111111111111117353trpda": "3822372327060170000000000000000000000",
    "nano_1111111111111111111111111111111111111111111111111awsq94gtecn": "30999999999999999999999999000000",
    "nano_114nk4rwjctu6n6tr6g6ps61g1w3hdpjxfas4xj1tq6i8jyomc5d858xr1xi": "0"
  }
}
```
**Optional "count"**

_version 9.0+_   
Number. Returns a list of pairs of representative and its voting weight up to **count**
   
**Optional "sorting"**

_version 9.0+_   
Boolean, false by default. Additional sorting representatives in descending order  
NOTE: The "count" option is ignored if "sorting" is specified  

---

### representatives_online  
_version 18.0+_   
Returns a list of online representative accounts that have voted recently  

**Request:**
```json
{
  "action": "representatives_online"
}
```  
**Response:**
```json
{
  "representatives": [
    "nano_1111111111111111111111111111111111111111111111111117353trpda",
    "nano_1111111111111111111111111111111111111111111111111awsq94gtecn",
    "nano_114nk4rwjctu6n6tr6g6ps61g1w3hdpjxfas4xj1tq6i8jyomc5d858xr1xi"
  ]
}
```
_versions 11.2–17.1_   
Returns a list of pairs of online representative accounts that have voted recently and empty strings  
**Response:**
```json
{
  "representatives" : {
    "nano_1111111111111111111111111111111111111111111111111117353trpda": "",
    "nano_1111111111111111111111111111111111111111111111111awsq94gtecn": "",
    "nano_114nk4rwjctu6n6tr6g6ps61g1w3hdpjxfas4xj1tq6i8jyomc5d858xr1xi": ""
  }
}
```
**Optional "weight"**

_version 17.0+_   
Boolean, false by default. Returns voting weight for each representative.  
**Response:**
```json
{
  "representatives": {
    "nano_114nk4rwjctu6n6tr6g6ps61g1w3hdpjxfas4xj1tq6i8jyomc5d858xr1xi": {
      "weight": "150462654614686936429917024683496890"
    }
  }
}
```

**Optional "accounts"**  
Array of accounts. Returned list is filtered for only these accounts.

**Request:**
```json
{
  "action": "representatives_online",
  "accounts": ["nano_1q3hqecaw15cjt7thbtxu3pbzr1eihtzzpzxguoc37bj1wc5ffoh7w74gi6p", "nano_1111111111111111111111111111111111111111111111111117353trpda"]
}
```  
**Response:**
```json
{
  "representatives": [
    "nano_1q3hqecaw15cjt7thbtxu3pbzr1eihtzzpzxguoc37bj1wc5ffoh7w74gi6p"
  ]
}
```

---

### republish  
Rebroadcast blocks starting at **hash** to the network    

**Request:**
```json
{
  "action": "republish",
  "hash": "991CF190094C00F0B68E2E5F75F6BEE95A2E0BD93CEAA4A6734DB9F19B728948"
}
```  
**Response:**
```json
{
  "success": "",
  "blocks": [
    "991CF190094C00F0B68E2E5F75F6BEE95A2E0BD93CEAA4A6734DB9F19B728948",
    "A170D51B94E00371ACE76E35AC81DC9405D5D04D4CEBC399AEACE07AE05DD293"
  ]
}
```   

**Optional "sources"**

_version 8.0+_   
Boolean, false by default. Additionally rebroadcast source chain blocks for receive/open up to **sources** depth   

**Request:**
```json
{
  "action": "republish",
  "hash": "90D0C16AC92DD35814E84BFBCC739A039615D0A42A76EF44ADAEF1D99E9F8A35",
  "count": "1",
  "sources": "2"
}
```  
**Response:**
```json
{
  "blocks": [
    "991CF190094C00F0B68E2E5F75F6BEE95A2E0BD93CEAA4A6734DB9F19B728948",
    "A170D51B94E00371ACE76E35AC81DC9405D5D04D4CEBC399AEACE07AE05DD293",
    "90D0C16AC92DD35814E84BFBCC739A039615D0A42A76EF44ADAEF1D99E9F8A35"
  ]
}
```   

**Optional "destinations"**

_version 8.0+_   
Boolean, false by default. Additionally rebroadcast destination chain blocks from receive up to **destinations** depth   

**Request:**
```json
{
  "action": "republish",
  "hash": "A170D51B94E00371ACE76E35AC81DC9405D5D04D4CEBC399AEACE07AE05DD293",
  "count": "1",
  "destinations": "2"
}
```  
**Response:**
```json
{
  "blocks": [
    "A170D51B94E00371ACE76E35AC81DC9405D5D04D4CEBC399AEACE07AE05DD293",
    "90D0C16AC92DD35814E84BFBCC739A039615D0A42A76EF44ADAEF1D99E9F8A35",
    "18563C814A54535B7C12BF76A0E23291BA3769536634AB90AD0305776A533E8E"
  ]
}
```   

---

### sign
_version 18.0+_  
Signing provided **block** with private **key** or key of **account** from **wallet**. Using the optional `json_block` is recommended since v19.0.  

**Request with private key:**
```json
{
  "action": "sign",
  "json_block": "true",
  "key": "1D3759BB2CA187A66875D3B8497624159A576FD315E07F702B99B92BC59FC14A",
  "block": {
    "type": "state",
    "account": "nano_1qato4k7z3spc8gq1zyd8xeqfbzsoxwo36a45ozbrxcatut7up8ohyardu1z",
    "previous": "6CDDA48608C7843A0AC1122BDD46D9E20E21190986B19EAC23E7F33F2E6A6766",
    "representative": "nano_3pczxuorp48td8645bs3m6c3xotxd3idskrenmi65rbrga5zmkemzhwkaznh",
    "balance": "40200000001000000000000000000000000",
    "link": "87434F8041869A01C8F6F263B87972D7BA443A72E0A97D7A3FD0CCC2358FD6F9",
    "link_as_account": "nano_33t5by1653nt196hfwm5q3wq7oxtaix97r7bhox5zn8eratrzoqsny49ftsd",
    "signature": "A5DB164F6B81648F914E49CAB533900C389FAAD64FBB24F6902F9261312B29F730D07E9BCCD21D918301419B4E05B181637CF8419ED4DCBF8EF2539EB2467F07",
    "work": "000bc55b014e807d"
  }
}
```

**Request with account from wallet:**
```json
{
  "action": "sign",
  "json_block": "true",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F",
  "account": "nano_18ky5chy5ws89oi46ki4zjy6x5ezpmj98zg6icwke9bmuy99nosieyqf8c1h",
  "block": {
    "type": "state",
    "account": "nano_1qato4k7z3spc8gq1zyd8xeqfbzsoxwo36a45ozbrxcatut7up8ohyardu1z",
    "previous": "6CDDA48608C7843A0AC1122BDD46D9E20E21190986B19EAC23E7F33F2E6A6766",
    "representative": "nano_3pczxuorp48td8645bs3m6c3xotxd3idskrenmi65rbrga5zmkemzhwkaznh",
    "balance": "40200000001000000000000000000000000",
    "link": "87434F8041869A01C8F6F263B87972D7BA443A72E0A97D7A3FD0CCC2358FD6F9",
    "link_as_account": "nano_33t5by1653nt196hfwm5q3wq7oxtaix97r7bhox5zn8eratrzoqsny49ftsd",
    "signature": "A5DB164F6B81648F914E49CAB533900C389FAAD64FBB24F6902F9261312B29F730D07E9BCCD21D918301419B4E05B181637CF8419ED4DCBF8EF2539EB2467F07",
    "work": "000bc55b014e807d"
  }
}
```
**Response:**
```json
{
  "signature": "2A71F3877033F5966735F260E906BFCB7FA82CDD543BCD1224F180F85A96FC26CB3F0E4180E662332A0DFE4EE6A0F798A71C401011E635604E532383EC08C70D",
  "block": {
    "type": "state",
    "account": "nano_1qato4k7z3spc8gq1zyd8xeqfbzsoxwo36a45ozbrxcatut7up8ohyardu1z",
    "previous": "6CDDA48608C7843A0AC1122BDD46D9E20E21190986B19EAC23E7F33F2E6A6766",
    "representative": "nano_3pczxuorp48td8645bs3m6c3xotxd3idskrenmi65rbrga5zmkemzhwkaznh",
    "balance": "40200000001000000000000000000000000",
    "link": "87434F8041869A01C8F6F263B87972D7BA443A72E0A97D7A3FD0CCC2358FD6F9",
    "link_as_account": "nano_33t5by1653nt196hfwm5q3wq7oxtaix97r7bhox5zn8eratrzoqsny49ftsd",
    "signature": "2A71F3877033F5966735F260E906BFCB7FA82CDD543BCD1224F180F85A96FC26CB3F0E4180E662332A0DFE4EE6A0F798A71C401011E635604E532383EC08C70D",
    "work": "000bc55b014e807d"
  }
}
```

**Optional "json_block"**

_version 19.0+_  
Default "false". If "true", the input "block" must contain a JSON subtree instead of a JSON string. In addition, the response block will be a JSON subtree.


**Optional sign block hash**  
_Requires configuration changes. Set "rpc.enable_sign_hash" to "true"_  

**Request:**
```json
{
  "action": "sign",
  "hash": "E2FB233EF4554077A7BF1AA85851D5BF0B36965D2B0FB504B2BC778AB89917D3"
}
```  
**Response:**
```json
{
  "signature": "2A71F3877033F5966735F260E906BFCB7FA82CDD543BCD1224F180F85A96FC26CB3F0E4180E662332A0DFE4EE6A0F798A71C401011E635604E532383EC08C70D"
}
```  

---

### stats
_version 12.2+_  
For configuration and other details, please see [Statistics from RPC](/running-a-node/troubleshooting/#statistics-from-rpc)

**Request counters:**
```json
{
  "action": "stats",
  "type": "counters"
}
```

**Counters response:**
```json
{
  "type": "counters",
  "created": "2018.03.29 01:46:36",
  "entries": [
    {
      "time": "01:46:36",
      "type": "traffic_tcp",
      "detail": "all",
      "dir": "in",
      "value": "3122792"
    },
    {
      "time": "01:46:36",
      "type": "traffic_tcp",
      "detail": "all",
      "dir": "out",
      "value": "203184"
    }
    ...
  ]
}
```

_version 18.0+ also returns "stat_duration_seconds": the number of seconds since startup or since the last "stats_clear" call_

**Request samples:**
```json
{
  "action": "stats",
  "type": "samples"
}
```

**Samples response:**
```json
{
  "type": "samples",
  "created": "2018.03.29 01:47:08",
  "entries": [
    {
      "time": "01:47:04",
      "type": "traffic_tcp",
      "detail": "all",
      "dir": "in",
      "value": "59480"
    },
    {
      "time": "01:47:05",
      "type": "traffic_tcp",
      "detail": "all",
      "dir": "in",
      "value": "44496"
    }
    ...
   ]
}
```
_version 18.0+_  
NOTE: This call is for debug purposes only and is unstable as returned objects may be frequently changed.

**Request objects:**
```json
{
  "action": "stats",
  "type": "objects"
}
```

**Objects response:**
```json
{
  "node": {
    "ledger": {
      "bootstrap_weights": {
        "count": "125",
        "size": "7000"
      }
    },
    "peers": {
      "peers": {
        "count": "38",
        "size": "7296"
      },
      "attempts": {
        "count": "95",
        "size": "3800"
      },
    },
    ...
  }
}
```

_version 22.0+_  
NOTE: This call is for debug purposes only and is unstable as returned objects may be frequently changed and will be different depending on the ledger backend.

**Request database:**
```json
{
  "action": "stats",
  "type": "database"
}
```

**Database response:**  
**LMDB:**
```json
{
    "branch_pages": "0",
    "depth": "1",
    "entries": "11",
    "leaf_pages": "1",
    "overflow_pages": "0",
    "page_size": "4096"
}
```
**RocksDB:**  
```json
{
    "cur-size-all-mem-tables": "74063072",
    "size-all-mem-tables": "487744504",
    "estimate-table-readers-mem": "113431016",
    "estimate-live-data-size": "17756425993",
    "compaction-pending": "0",
    "estimate-num-keys": "81835964",
    "estimate-pending-compaction-bytes": "0",
    "total-sst-files-size": "20350606013",
    "block-cache-capacity": "318767104",
    "block-cache-usage": "150310696"
}
```
---

### stats_clear
_version 18.0+_

Clears all collected statistics. The "stat_duration_seconds" value in the "stats" action is also reset.


**Request:**
```json
{
  "action": "stats_clear"
}
```  
**Response:**
```json
{
  "success": ""
}
```

---

### stop   
_enable_control required_  
Method to safely shutdown node  

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "stop"
}
```  
**Response:**
```json
{
  "success": ""
}
```  

---

### successors  
Returns a list of block hashes in the account chain starting at **block** up to **count** (direction from open block up to frontier, from older blocks to newer). Will list all blocks up to frontier (latest block) of this chain when count is set to "-1". The requested block hash is included in the answer.    

**Request:**
```json
{
  "action": "successors",
  "block": "991CF190094C00F0B68E2E5F75F6BEE95A2E0BD93CEAA4A6734DB9F19B728948",
  "count": "1"
}
```  
**Response:**
```json
{
  "blocks" : [
    "991CF190094C00F0B68E2E5F75F6BEE95A2E0BD93CEAA4A6734DB9F19B728948"
  ]
}
```
**Optional "offset"**

_version 18.0+_   
Number, 0 by default. Return the account chain block hashes **offset** by the specified number of blocks    

**Optional "reverse"**

_version 18.0+_   
Boolean, false by default. Returns a consecutive list of block hashes in the account chain starting at **block** back to **count** (direction from frontier back to open block, from newer blocks to older). Equal to [chain](#chain)    

---

### telemetry
_version 21.0+_  
Return metrics from other nodes on the network. By default, returns a summarized view of the whole network. See below for details on obtaining local telemetry data.  
[Networking - node telemetry](/protocol-design/networking#node-telemetry) contains more detailed information on the protocol implementation of telemetry.  
**Request:**
```json
{
  "action": "telemetry"
}
```
**Response:**
```json
{
    "block_count": "214104509",
    "cemented_count": "214104509",
    "unchecked_count": "5161",
    "account_count": "37186909",
    "bandwidth_cap": "10485760",
    "peer_count": "176",
    "protocol_version": "21",
    "uptime": "3188200",
    "genesis_block": "991CF190094C00F0B68E2E5F75F6BEE95A2E0BD93CEAA4A6734DB9F19B728948",
    "major_version": "28",
    "minor_version": "2",
    "patch_version": "0",
    "pre_release_version": "0",
    "maker": "0",
    "timestamp": "1765074100220",
    "active_difficulty": "fffffff800000000",
    "database_backend": "lmdb",
    "confirmation_latency_ms_p50": "254",
    "confirmation_latency_ms_p90": "510",
    "confirmation_latency_ms_p99": "1205",
    "bootstrap_status": "idle",
    "node_id": "node_3odec59q6i9qarh5txyrxmu3aqhfzm54mxoxgtumwpzyq6obxqktdzcxkfag",
    "signature": "067523993D0B4C07525DF4C5AA814FBCC40875F868C2A04A85AC288F75E152763196B7DCB11240921F6D8BA92E3E9F094D8F2F9D8B0970114CDAD48838372100"
}
```

This contains a summarized view of the network with 10% of lower/upper bound results removed to reduce the effect of outliers. Returned values are calculated as follows:

| Field Name | Response details |
|------------|------------------------------------|
| **block_count**       | average count of blocks in ledger (including unconfirmed) |
| **cemented_count**    | average count of blocks cemented in ledger (only confirmed) |
| **unchecked_count**   | average count of unchecked blocks. This should only be considered an estimate as nodes running RocksDB may not return exact counts. |
| **account_count**     | average count of accounts in ledger |
| **bandwidth_cap**     | `0` = unlimited; the mode is chosen if there is more than 1 common result otherwise the results are averaged (excluding `0`) |
| **peer_count**        | average count of peers nodes are connected to |
| **\*_version**        | mode (most common) of (protocol, major, minor, patch, pre_release) versions |
| **uptime**            | average number of seconds since the UTC epoch at the point where the response is sent from the peer |
| **genesis_block**     | mode (most common) of genesis block hashes |
| **maker**             | mode (most common), meant for third party node software implementing the protocol so that it can be distinguished, `0` = Nano Foundation, `1` = Nano Foundation pruned node |
| **timestamp**         | number of milliseconds since the UTC epoch at the point where the response is sent from the peer |
| **active_difficulty** | _V22.0+_ returns minimum network difficulty due to deprecated active difficulty measurements<br><br> _up to V21.3_ returns average of the current network difficulty, see [active_difficulty](/commands/rpc-protocol/#active_difficulty) "network_current" |
| **database_backend**  | the database backend used by the node: `lmdb` or `rocksdb` |
| **confirmation_latency_ms_p50** | 50th percentile (median) confirmation latency in milliseconds, based on recently confirmed elections |
| **confirmation_latency_ms_p90** | 90th percentile confirmation latency in milliseconds, based on recently confirmed elections |
| **confirmation_latency_ms_p99** | 99th percentile confirmation latency in milliseconds, based on recently confirmed elections |
| **bootstrap_status**  | current bootstrap status of the node: `idle` or `active` |
| **node_id**           | _V21.0+_ returns the node identifier used to sign the telemetry message. This allows receivers to verify which peer the telemetry originated from. |
| **signature**         | _V21.0+_ returns the signature of the telemetry payload, created using the node's private key. It enables verification that the data was produced by the reported `node_id` and has not been altered. |

This only returns values which have been cached by the ongoing polling of peer metric data. Each response is cached for 60 seconds on the main network and 15 seconds on beta; a few additional seconds are added on for response delays.

**Optional "raw"**  
When setting raw to true metrics from all nodes are displayed. It additionally contains **address** and **port** from each peer.

**Request:**
```json
{
  "action": "telemetry",
  "raw" : "true"
}
```

**Response:**
```json
{
  "metrics": [
    {
      "block_count": "5777903",
      ...
      "node_id": "node_1cmi8difuruopgzpnb4ybrnnj5rproxwuwe5mad7ucbsekakiwn37qqg1zo5",
      "signature": "5F8DEE5F895D53E122FDEB4B1B4118A41F9DDB818C6B299B09DF59131AF9F201BB7057769423F6B0C868B57509177B54D5D2C731405FE607527F5E2B6B2E290F",
      "address": "::ffff:152.89.106.89",
      "port": "54000"
    },
    {
      "block_count": "5777902",
      ...    
      "node_id": "node_3ipxdjrha3rfg9h3spiz5jkprw8kdj7bph9fir51kf6pmryzznsyhakqznk3",
      "signature": "D691B855D9EC70EA6320DE609EB379EB706845433E034AD22721E8F91BF3A26156F40CCB2E98653F1E63D4CE5F10F530A835DE1B154D1213464E3B9BB9BE4908",
      "address": "::ffff:95.216.205.215",
      "port": "54006"
    }
    ...
  ]
}
```

**Optional "address" & "port"**  
Get metrics from a specific peer. It accepts both ipv4 and ipv6 addresses
```json
{
  "action": "telemetry",
  "address": "246.125.123.456",
  "port": "7075"
}
```

!!!tip "Requesting telemetry data from the local node"
    Metrics for the local node can be requested using the peering port and any loopback address **127.0.0.1**, **::1** or **[::1]**

---

### validate_account_number 
Check whether **account** is a valid account number using checksum  

**Request:**
```json
{
  "action": "validate_account_number",
  "account": "nano_1111111111111111111111111111111111111111111111111117353trpda"
}
```  
**Response:**
```json
{
  "valid" : "1"
}
```

---

### version 
Returns version information for RPC, Store, Protocol (network), Node (Major & Minor version).  
Since _version 20.0_ also returns the Network label and identifier (hash of the genesis open block), and Build Info. Since _version 21.0_ also returns Database backend information.  
_RPC Version always returns "1" as of 01/11/2018_  

**Request:**
```json
{
  "action": "version"
}
```  
**Response:**
```json
{
  "rpc_version": "1",
  "store_version": "14",
  "protocol_version": "17",
  "node_vendor": "Nano 20.0",
  "store_vendor": "LMDB 0.9.23", // since V21.0
  "network": "live", // since v20.0
  "network_identifier": "991CF190094C00F0B68E2E5F75F6BEE95A2E0BD93CEAA4A6734DB9F19B728948", // since v20.0
  "build_info": "Build Info <git hash> \"<compiler> version \" \"<compiler version string>\" \"BOOST <boost version>\" BUILT \"<build date>\"" // since v20.0
}
```

---

### unchecked  
_version 8.0+_   
Returns a list of pairs of unchecked block hashes and their json representation up to **count**. Using the optional `json_block` is recommended since v20.0.

**Request:**
```json
{
  "action": "unchecked",
  "json_block": "true",
  "count": "1",
}
```  
**Response:**
```json
{
  "blocks": {
    "87434F8041869A01C8F6F263B87972D7BA443A72E0A97D7A3FD0CCC2358FD6F9": {
      "type": "state",
      "account": "nano_1ipx847tk8o46pwxt5qjdbncjqcbwcc1rrmqnkztrfjy5k7z4imsrata9est",
      "previous": "CE898C131AAEE25E05362F247760F8A3ACF34A9796A5AE0D9204E86B0637965E",
      "representative": "nano_1stofnrxuz3cai7ze75o174bpm7scwj9jn3nxsn8ntzg784jf1gzn1jjdkou",
      "balance": "5606157000000000000000000000000000000",
      "link": "5D1AA8A45F8736519D707FCB375976A7F9AF795091021D7E9C7548D6F45DD8D5",
      "link_as_account": "nano_1qato4k7z3spc8gq1zyd8xeqfbzsoxwo36a45ozbrxcatut7up8ohyardu1z",
      "signature": "82D41BC16F313E4B2243D14DFFA2FB04679C540C2095FEE7EAE0F2F26880AD56DD48D87A7CC5DD760C5B2D76EE2C205506AA557BF00B60D8DEE312EC7343A501",
      "work": "8a142e07a10996d5"
    }
  }
}
```

---

### unchecked_clear   
_enable_control required, version 8.0+_     
Clear unchecked synchronizing blocks   

--8<-- "warning-enable-control.md"

**Request:**
```json
{
    "action": "unchecked_clear"
}
```  
**Response:**
```json
{
    "success": ""
}
```  

---

### unchecked_get  
_version 8.0+_  
Retrieves a json representation of unchecked synchronizing block by **hash**. Using the optional `json_block` is recommended since v19.0.  

**Request:**
```json
{
  "action": "unchecked_get",
  "json_block": "true",
  "hash": "19BF0C268C2D9AED1A8C02E40961B67EA56B1681DE274CD0C50F3DD972F0655C"
}
```  
**Response:**
```json
{
  "modified_timestamp": "1565856525",
  "contents": {
    "type": "state",
    "account": "nano_1hmqzugsmsn4jxtzo5yrm4rsysftkh9343363hctgrjch1984d8ey9zoyqex",
    "previous": "009C587914611E83EE7F75BD9C000C430C720D0364D032E84F37678D7D012911",
    "representative": "nano_1stofnrxuz3cai7ze75o174bpm7scwj9jn3nxsn8ntzg784jf1gzn1jjdkou",
    "balance": "189012679592109992600249228",
    "link": "0000000000000000000000000000000000000000000000000000000000000000",
    "link_as_account": "nano_1111111111111111111111111111111111111111111111111111hifc8npp",
    "signature": "845C8660750895843C013CE33E31B80EF0A7A69E52DDAF74A5F1BDFAA9A52E4D9EA2C3BE1AB0BD5790FCC1AD9B7A3D2F4B44EECE4279A8184D414A30A1B4620F",
    "work": "0dfb32653e189699"
  }
}
```
**Optional "json_block"**

_version 19.0+_  
Default "false". If "true", "contents" will contain a JSON subtree instead of a JSON string.

---

### unchecked_keys   
_version 8.0+_   
Retrieves unchecked database keys, blocks hashes & a json representations of unchecked receivable blocks starting from **key** up to **count**. Using the optional `json_block` is recommended since v19.0.   

--8<-- "known-issue-unchecked-keys-rpc-rocksdb.md"

**Request:**
```json
{
  "action": "unchecked_keys",
  "json_block": "true",
  "key": "19BF0C268C2D9AED1A8C02E40961B67EA56B1681DE274CD0C50F3DD972F0655C",
  "count": "1"
}
```  
**Response:**
```json
{
  "unchecked": [
    {
      "key": "19BF0C268C2D9AED1A8C02E40961B67EA56B1681DE274CD0C50F3DD972F0655C",
      "hash": "A1A8558CBABD3F7C1D70F8CB882355F2EF688E7F30F5FDBD0204CAE157885056",
      "modified_timestamp": "1565856744",
      "contents": {
        "type": "state",
        "account": "nano_1hmqzugsmsn4jxtzo5yrm4rsysftkh9343363hctgrjch1984d8ey9zoyqex",
        "previous": "19BF0C268C2D9AED1A8C02E40961B67EA56B1681DE274CD0C50F3DD972F0655C",
        "representative": "nano_1stofnrxuz3cai7ze75o174bpm7scwj9jn3nxsn8ntzg784jf1gzn1jjdkou",
        "balance": "189012679592109992600249226",
        "link": "0000000000000000000000000000000000000000000000000000000000000000",
        "link_as_account": "nano_1111111111111111111111111111111111111111111111111111hifc8npp",
        "signature": "FF5D49925AD3C8705E6EEDD993E8C4120E6107D7F1CB53B287773448DEA0B1D32918E67804248FC83609F0D93401D833DFA33127F21B6CD02F75D6E31A00450A",
        "work": "8193ddf00947e694"
      }
    }
  ]
}
```   

**Optional "json_block"**

_version 19.0+_  
Default "false". If "true", "contents" will contain a JSON subtree instead of a JSON string.

---

### unopened  

_enable_control required, version 19.0+_   

Returns the total receivable balance for unopened accounts in the local database, starting at **account** (optional) up to **count** (optional), sorted by account number. _**Notes:**_ By default excludes the burn account.   

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "unopened",
  "account": "nano_1111111111111111111111111111111111111111111111111111hifc8npp",
  "count": "1"
}
```   

**Response:**
```json 
{
  "accounts": {
    "nano_1111111111111111111111111111111111111111111111111111hifc8npp": "207034077034226183413773082289554618448"
  }
}
```   

**Optional "threshold"**  
Number (128 bit, decimal), default 0. Return only accounts with total receivable balance above **threshold**.

---

### uptime   
_version 18.0+_   
Return node uptime in seconds  

**Request:**
```json
{
  "action": "uptime"
}
```  
**Response:**
```json
{
    "seconds": "6000"
}
```  

---

### work_cancel
_enable_control required_  
Stop generating **work** for block  

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "work_cancel",
  "hash": "718CC2121C3E641059BC1C2CFC45666C99E8AE922F7A807B7D07B62C995D79E2"
}
```  
**Response:**
```json
{
  "success": ""
}
```  

---

### work_generate
_enable_control required_  
Generates **work** for block. **hash** is the frontier of the account or in the case of an open block, the public key representation of the account which can be found with [account_key](#account_key).  

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "work_generate",
  "hash": "718CC2121C3E641059BC1C2CFC45666C99E8AE922F7A807B7D07B62C995D79E2"
}
```  
**Response:**
```json
{
  "work": "2b3d689bbcb21dca",
  "difficulty": "fffffff93c41ec94", // of the resulting work
  "multiplier": "1.182623871097636", // since v19.0, calculated from default base difficulty
  "hash": "718CC2121C3E641059BC1C2CFC45666C99E8AE922F7A807B7D07B62C995D79E2" // since v20.0
}
```  

**Optional "use_peers"**

_version 14.0+_
Boolean, false by default. If the optional `use_peers` parameter is set to `true`, then the node will query its work peers (if it has any).
Without this parameter, the node will only generate work locally.

**Optional "difficulty"**

!!! info "Difficulty no longer useful"
    With _version 22.0+_ the difficulty is no longer used for prioritization so targeting higher difficulty thresholds on work generation is not useful. However, this can still be used for targeting a lower difficulty for receive blocks. This option may be removed in a future release.

_version 19.0+_  
Difficulty value (16 hexadecimal digits string, 64 bit). Uses **difficulty** value to generate work. Defaults to the network base difficulty.

**Optional "multiplier"**

!!! info "Multiplier no longer useful"
    With _version 22.0+_ the difficulty is no longer used for prioritization so targeting higher multipliers on work generation is not useful. This option will be removed in a future release.

_version 20.0+_  
Multiplier from base difficulty (positive number). Uses equivalent difficulty as **multiplier** from base difficulty to generate work.  
***Note:*** overrides the `difficulty` parameter.  

**Optional "account"**

_version 20.0+_  
A valid Nano account. If provided and `use_peers` is set to `true`, this information will be relayed to work peers.

**Optional "version"**

_version 21.0+_  
Work version string. Currently "work_1" is the default and only valid option.

**Optional "block"**

_version 21.0+_  
A valid Nano block (string or JSON). Using the optional `json_block` is recommended. If provided and `difficulty` or `multiplier` are both not given, RPC processor tries to calculate the appropriate difficulty threshold based on ledger data.  
***Note:*** block should be the one where the resulting work value will be used, not the previous block.

**Optional "json_block"**

_version 21.0+_  
Default "false". If "true", `block` in the request should contain a JSON subtree instead of a JSON string.

---

### work_peer_add  
_enable_control required, version 8.0+_     
Add specific **IP address** and **port** as work peer for node until restart   

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "work_peer_add",
  "address": "::ffff:172.17.0.1",
  "port": "7076"
}
```  
**Response:**
```json
{
  "success": ""
}
```  

---

### work_peers   
_enable_control required, version 8.0+_     

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "work_peers"
}
```  
**Response:**
```json
{
  "work_peers": [
    "::ffff:172.17.0.1:7076"
  ]
}
```  

---

### work_peers_clear  
_enable_control required, version 8.0+_     
Clear work peers node list until restart   

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "work_peers_clear"
}
```  
**Response:**
```json
{
  "success": ""
}
```  

---

### work_validate 
Check whether **work** is valid for block. Provides two values: **valid_all** is `true` if the work is valid at the current network difficulty (work can be used for any block). **valid_receive** is `true` if the work is valid for use in a receive block.

**Read the details below when using this RPC in V21**.

!!! warning "Semantics change in V21.0"
    In V21.0, when the optional **difficulty** is *not* given, **valid** is no longer included in the response.

    Use the new response fields **"valid_all"** and **"valid_receive"** taking into account the subtype of the block using this work value:

    - **valid_all** validates at the current network difficulty. As soon as the node processes the first [epoch_2 block](/releases/network-upgrades#increased-work-difficulty), this difficulty is increased.
    - **valid_receive** is completely accurate **only once the [epoch_2 upgrade](/releases/network-upgrades#increased-work-difficulty) is finished.** Until the upgrade is finished, it is only accurate if the account where this work will be used is already upgraded. The upgrade status of an account can be obtained from [account_info](#account_info). The account is upgraded if "account_version" is `"2"`.

**Request:**
```json
{
  "action": "work_validate",
  "work": "2bf29ef00786a6bc",
  "hash": "718CC2121C3E641059BC1C2CFC45666C99E8AE922F7A807B7D07B62C995D79E2"
}
```  
**Response since v21.0:**
```json
{
  "valid_all": "1",
  "valid_receive": "1",
  "difficulty": "fffffff93c41ec94",
  "multiplier": "1.182623871097636" // calculated from the default base difficulty
}
```

??? abstract "Response up to v20.0"
    ```json
    {
      "valid": "1",
      "difficulty": "fffffff93c41ec94", // since v19.0
      "multiplier": "9.4609" // since v19.0
    }
    ```

**Optional "difficulty"**

_version 19.0+_  
Difficulty value (16 hexadecimal digits string, 64 bit). Uses **difficulty** value to validate work. Defaults to the network base difficulty. Response includes extra field **valid** signifying validity at the given difficulty.  

**Request with given "difficulty"**  
```json
{
  "action": "work_validate",
  "difficulty": "ffffffffffffffff",
  "work": "2bf29ef00786a6bc",
  "hash": "718CC2121C3E641059BC1C2CFC45666C99E8AE922F7A807B7D07B62C995D79E2"
}
```
**Response with given "difficulty:**
```json
{
  "valid": "0",
  "valid_all": "1", // since v21.0
  "valid_receive": "1", // since v21.0
  "difficulty": "fffffff93c41ec94",
  "multiplier": "1.182623871097636"
}
```

**Optional "multiplier"**

_version 20.0+_  
Multiplier from base difficulty (positive number). Uses equivalent difficulty as **multiplier** from base difficulty to validate work.  
***Note:*** overrides the `difficulty` parameter.  

**Optional "version"**

_version 21.0+_
Work version string. Currently "work_1" is the default and only valid option.

---

## Wallet RPCs

!!! warning "For development and testing only"
    Below are RPC commands that interact with the built-in, QT-based node wallet. This wallet is only recommended for development and testing. For production integrations, setting up custom [External Management](/integration-guides/key-management/#external-management) processes is required.

---

### account_create  
_enable_control required_  
Creates a new account, insert next deterministic key in **wallet**  

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "account_create",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F"
}
```
  
**Response:**
```json
{
  "account": "nano_3e3j5tkog48pnny9dmfzj1r16pg8t1e76dz5tmac6iq689wyjfpi00000000"
}
```
**Optional "index"**

_version 18.0+_  
unset by default. Indicates which index to create account for starting with 0  

**Request:**
```json
{
  "action": "account_create",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F",
  "index": "1"
}
```

**Optional "work"**

_version 9.0+_  
Boolean, true by default. Setting false disables work generation after creating account  

**Request:**
```json
{
  "action": "account_create",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F",
  "work": "false"
}
```

---

### account_list  
Lists all the accounts inside **wallet**  

**Request:**
```json
{
  "action": "account_list",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F"
}
```  
**Response:**
```json
{
  "accounts": [
    "nano_3e3j5tkog48pnny9dmfzj1r16pg8t1e76dz5tmac6iq689wyjfpi00000000"
  ]
}
```

---

### account_move  
_enable_control required_  
Moves **accounts** from **source** to **wallet**  

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "account_move",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F",
  "source": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F",
  "accounts": [
    "nano_3e3j5tkog48pnny9dmfzj1r16pg8t1e76dz5tmac6iq689wyjfpi00000000"
  ]
}
```  
**Response:**
```json
{
  "moved" : "1"
}
```

---

### account_remove
_enable_control required_  
Remove **account** from **wallet**  

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "account_remove",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F",
  "account": "nano_39a73oy5ungrhxy5z5oao1xso4zo7dmgpjd4u74xcrx3r1w6rtazuouw6qfi"
}
```  
**Response:**
```json
{
  "removed": "1"
}
```

---

### account_representative_set  
_enable_control required_  
Sets the representative for **account** in **wallet**  

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "account_representative_set",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F",
  "account": "nano_39a73oy5ungrhxy5z5oao1xso4zo7dmgpjd4u74xcrx3r1w6rtazuouw6qfi",
  "representative": "nano_16u1uufyoig8777y6r8iqjtrw8sg8maqrm36zzcm95jmbd9i9aj5i8abr8u5"
}
```  
**Response:**
```json
{
  "block": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F"
}
```
**Optional "work"**

_version 9.0+_  
Work value (16 hexadecimal digits string, 64 bit). Uses **work** value for block from external source and disables work precaching for this account. Not using this field re-enables work precaching.  

---

### accounts_create  
_enable_control required, version 9.0+_  
Creates new accounts, insert next deterministic keys in **wallet** up to **count**  

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "accounts_create",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F",
  "count": "2"
}
```  
**Response:**
```json
{
  "accounts": [
    "nano_3e3j5tkog48pnny9dmfzj1r16pg8t1e76dz5tmac6iq689wyjfpi00000000",
    "nano_1e5aqegc1jb7qe964u4adzmcezyo6o146zb8hm6dft8tkp79za3s00000000"
  ]
}
```
**Optional enabling work generation**  
_version 11.2+_  
Boolean, false by default. Enables work generation after creating accounts  

**Request:**
```json
{
  "action": "accounts_create",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F",
  "count": "2",
  "work": "true"
}
```  
***Note:*** Before version 11.2 work generation was enabled by default, if you want to disable work generation for previous versions, use "work": "false"

---

### block_create (optional wallet)
See [block_create](#block_create) Node RPC command above

---

### password_change  
_enable_control required_  
Changes the password for **wallet** to **password**  

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "password_change",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F",
  "password": "test"
}
```  
**Response:**
```json
{
  "changed" : "1"
}
```

---

### password_enter  
Enters the **password** in to **wallet** to unlock it  

**Request:**
```json
{
  "action": "password_enter",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F",
  "password": "test"
}
```  
**Response:**
```json
{
  "valid": "1"
}
```

---

### password_valid  
Checks whether the password entered for **wallet** is valid  

**Request:**
```json
{
  "action": "password_valid",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F"
}
```  
**Response:**
```json
{
  "valid" : "1"
}
```

---

### receive  
_enable_control required_  
Receive receivable **block** for **account** in **wallet**. If receiving the block opens the account, sets the account representative to a [wallet representative](#wallet_representative). Before v21, the representative is set to the account itself.  

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "receive",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F",
  "account": "nano_3e3j5tkog48pnny9dmfzj1r16pg8t1e76dz5tmac6iq689wyjfpi00000000",
  "block": "53EAA25CE28FA0E6D55EA9704B32604A736966255948594D55CBB05267CECD48"
}
```  
**Response:**
```json
{
  "block": "EE5286AB32F580AB65FD84A69E107C69FBEB571DEC4D99297E19E3FA5529547B"
}
```
**Optional "work"**

_version 9.0+_  
Work value (16 hexadecimal digits string, 64 bit). Uses **work** value for block from external source and disables work precaching for this account. Not using this field re-enables work precaching.  

---

### receive_minimum  
_enable_control required, version 8.0+_   
Returns receive minimum for node wallet  

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "receive_minimum"
}
```  
**Response:**
```json
{
  "amount": "1000000000000000000000000"
}
```

---

### receive_minimum_set  
_enable_control required, version 8.0+_   
Set **amount** as new receive minimum for node wallet until restart  

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "receive_minimum_set",
  "amount": "1000000000000000000000000000000"
}
```  
**Response:**
```json
{
  "success": ""
}
```

---

### search_pending

Deprecated in V24.0+. Replaced by [search_receivable](#search_receivable)

---

### search_receivable

_since V24.0, use [search_pending](#search_pending) for V23.3 and below_

_enable_control required_  
Tells the node to look for receivable blocks for any account in **wallet**  

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "search_receivable",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F"
}
```  
**Response:**
```json
{
  "started": "1"
}
```
---

### search_pending_all

Deprecated in V24.0+. Replaced by [search_receivable_all](#search_receivable_all)

---

### search_receivable_all  

_since V24.0, use [search_pending_all](#search_pending_all) for V23.3 and below_

_enable_control required, version 8.0+_  
Tells the node to look for receivable blocks for any account in all available wallets  

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "search_receivable_all"
}
```  
**Response:**
```json
{
  "success": ""  
}
```

---

### send  
_enable_control required_  
Send **amount** from **source** in **wallet** to **destination**  

--8<-- "warning-enable-control.md"

!!! success "Use of `id` option is highly recommended"
    Integrations using the node wallet must ensure idempotency for transactions and this can be done externally if preferred. Using the `id` field provides this option internally and is highly recommended for all node wallet uses.

**Request:**
```json
{
  "action": "send",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F",
  "source": "nano_3e3j5tkog48pnny9dmfzj1r16pg8t1e76dz5tmac6iq689wyjfpi00000000",
  "destination": "nano_3e3j5tkog48pnny9dmfzj1r16pg8t1e76dz5tmac6iq689wyjfpi00000000",
  "amount": "1000000",
  "id": "your-unique-id"
}
```  
**Response:**
```json
{
  "block": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F"
}
```
Proof of Work is precomputed for **one** transaction in the background when you are using the node wallet to track accounts.  If it has been a while since your last transaction it will send instantly, the next one will need to wait for Proof of Work to be generated.

If the request times out, then the send may or may not have gone through. If you want to the ability to retry a failed send, all send calls must specify the id parameter as follows

**Highly recommended "id"**

_version 10.0+_  

You can (and should) specify a **unique** id for each spend to provide [idempotency](https://en.wikipedia.org/wiki/Idempotence#Computer_science_meaning). That means that if you call `send` two times with the same id, the second request won't send any additional Nano, and will return the first block instead. The id can be any string. **This may be a required parameter in the future.**

If you accidentally reuse an id, the send will not go through (it will be seen as a duplicate request), so make sure your ids are unique! They must be unique per node, and are not segregated per wallet.

Using the same id for requests with different parameters (wallet, source, destination, and amount) is undefined behavior and may result in an error in the future.


**Request:**
```json
{
  "action": "send",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F",
  "source": "nano_3e3j5tkog48pnny9dmfzj1r16pg8t1e76dz5tmac6iq689wyjfpi00000000",
  "destination": "nano_3e3j5tkog48pnny9dmfzj1r16pg8t1e76dz5tmac6iq689wyjfpi00000000",
  "amount": "1000000",
  "id": "7081e2b8fec9146e"
}
```  
**Response:**
```json
{
  "block": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F"
}
```

Sending the request again will yield the same block, and will not affect the ledger.

**Optional "work"**

_version 9.0+_  
Work value (16 hexadecimal digits string, 64 bit). Uses **work** value for block from external source and disables work precaching for this account. Not using this field re-enables work precaching.  

**Request:**
```json
{
  "action": "send",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F",
  "source": "nano_3e3j5tkog48pnny9dmfzj1r16pg8t1e76dz5tmac6iq689wyjfpi00000000",
  "destination": "nano_3e3j5tkog48pnny9dmfzj1r16pg8t1e76dz5tmac6iq689wyjfpi00000000",
  "amount": "1000000",
  "work": "2bf29ef00786a6bc"
}
```  

---

### sign (optional wallet)
See [sign](#sign) Node RPC command above

---

### wallet_add  
_enable_control required_  
Add an adhoc private key **key** to **wallet**  

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "wallet_add",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F",
  "key": "34F0A37AAD20F4A260F0A5B3CB3D7FB50673212263E58A380BC10474BB039CE4"
}
```  
**Response:**
```json
{
  "account": "nano_3e3j5tkog48pnny9dmfzj1r16pg8t1e76dz5tmac6iq689wyjfpi00000000"
}
```
**Optional disabling work generation**

_version 9.0+_  
Boolean, false by default. Disables work generation after adding account  

**Request:**
```json
{
  "action": "wallet_add",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F",
  "key": "34F0A37AAD20F4A260F0A5B3CB3D7FB50673212263E58A380BC10474BB039CE4",
  "work": "false"
}
```  

---

### wallet_add_watch  
_enable_control required, version 11.0+_  
Add watch-only **accounts** to **wallet**  

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "wallet_add_watch",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F",
  "accounts": [
    "nano_3e3j5tkog48pnny9dmfzj1r16pg8t1e76dz5tmac6iq689wyjfpi00000000",
    "nano_111111111111111111111111111111111111111111111111111000000000"
  ]
}
```  
**Response:**
```json
{
  "success" : ""
}
```

---

### wallet_balances  
Returns how many raw is owned and how many have not yet been received by all accounts in **wallet**  

--8<-- "warning-includes-unconfirmed.md"

--8<-- "deprecation-info-pending.md"

**Request:**
```json
{
  "action": "wallet_balances",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F"
}
```  
**Response:**
```json
{
  "balances" : {
    "nano_3e3j5tkog48pnny9dmfzj1r16pg8t1e76dz5tmac6iq689wyjfpi00000000": {
      "balance": "10000",
      "pending": "10000",
      "receivable": "10000"
    }
  }
}
```
**Optional "threshold"**

_version 9.0+_   
Number (128 bit, decimal). Returns wallet accounts balances more or equal to **threshold**   

---

### wallet_change_seed  
_enable_control required_  
Changes seed for **wallet** to **seed**.  ***Notes:*** Clear all deterministic accounts in wallet! To restore account from new seed use RPC [accounts_create](#accounts_create).  
`last_restored_account` and `restored_count` fields in response returned since _version 19.0+_  

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "wallet_change_seed",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F",
  "seed": "74F2B37AAD20F4A260F0A5B3CB3D7FB51673212263E58A380BC10474BB039CEE"
}
```  
**Response:**
```json
{
  "success" : "",
  "last_restored_account": "nano_1mhdfre3zczr86mp44jd3xft1g1jg66jwkjtjqixmh6eajfexxti7nxcot9c",
  "restored_count": "1"
}
```

**Optional "count"**

_version 18.0+_   
Number, 0 by default. Manually set **count** of accounts to restore from seed    

---

### wallet_contains  
Check whether **wallet** contains **account**  

**Request:**
```json
{
  "action": "wallet_contains",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F",
  "account": "nano_3e3j5tkog48pnny9dmfzj1r16pg8t1e76dz5tmac6iq689wyjfpi00000000"
}
```  
**Response:**
```json
{
  "exists": "1"
}
```

---

### wallet_create  
_enable_control required_  
Creates a new random wallet id  

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "wallet_create"
}
```  
**Response:**
```json
{
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F"
}
```
**Optional "seed"**

_version 18.0+_   
Seed value (64 hexadecimal digits string, 256 bit). Changes seed for a new wallet to **seed**, returning last restored account from given seed & restored count  

---

### wallet_destroy  
_enable_control required_  
Destroys **wallet** and all contained accounts  

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "wallet_destroy",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F"
}
```  
**Response:**
```json
{
  "destroyed": "1"
}
```

---

### wallet_export  
Return a json representation of **wallet**  

**Request:**
```json
{
  "action": "wallet_export",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F"
}
```  
**Response:**
```json
{
  "json" : "{\"0000000000000000000000000000000000000000000000000000000000000000\": \"0000000000000000000000000000000000000000000000000000000000000001\"}"
}
```

---

### wallet_frontiers  
Returns a list of pairs of account and block hash representing the head block starting for accounts from **wallet**  

**Request:**
```json
{
  "action": "wallet_frontiers",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F"
}
```  
**Response:**
```json
{
  "frontiers": {
    "nano_3e3j5tkog48pnny9dmfzj1r16pg8t1e76dz5tmac6iq689wyjfpi00000000": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F"
  }
}
```

---

### wallet_history  
_version 18.0+_   
Reports send/receive information for accounts in wallet. Change blocks are skipped, open blocks will appear as receive. Response will start with most recent blocks according to local ledger.

--8<-- "warning-includes-unconfirmed.md"

**Request:**
```json
{
  "action": "wallet_history",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F"
}
```  
**Response:**
```json
{
  "history":
  [
    {
      "type": "send",
      "account": "nano_1qato4k7z3spc8gq1zyd8xeqfbzsoxwo36a45ozbrxcatut7up8ohyardu1z",
      "amount": "30000000000000000000000000000000000",
      "block_account": "nano_1ipx847tk8o46pwxt5qjdbncjqcbwcc1rrmqnkztrfjy5k7z4imsrata9est",
      "hash": "87434F8041869A01C8F6F263B87972D7BA443A72E0A97D7A3FD0CCC2358FD6F9",
      "local_timestamp": "1527698508"
    },
    {
      "type": "send",
      "account": "nano_38ztgpejb7yrm7rr586nenkn597s3a1sqiy3m3uyqjicht7kzuhnihdk6zpz",
      "amount": "40000000000000000000000000000000000",
      "block_account": "nano_1ipx847tk8o46pwxt5qjdbncjqcbwcc1rrmqnkztrfjy5k7z4imsrata9est",
      "hash": "CE898C131AAEE25E05362F247760F8A3ACF34A9796A5AE0D9204E86B0637965E",
      "local_timestamp": "1527698492"
    }
  ]
}
```
**Optional "modified_since"**

UNIX timestamp (number), 0 by default. Return only accounts modified in local database after specific timestamp   

---

### wallet_info  
_version 15.0+_   
Given a **wallet** id, from all of the accounts in the wallet, returns:

* Sum of their **balance** amounts
* Total number of accounts as **accounts_count**
* Number of deterministic accounts as **deterministic_count**
* Number of adhoc (non-deterministic) accounts as **adhoc_count**
* Index of last account derived from the walet seed as **deterministic_index** (equal to deterministic accounts number if no accounts were removed)
* Sum of all frontier block heights as **accounts_block_count**
* Sum of confirmed block heights as **accounts_cemented_block_count**

--8<-- "warning-includes-unconfirmed.md"

--8<-- "deprecation-info-pending.md"

**Request:**
```json
{
  "action": "wallet_info",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F"
}
```  
**Response:**
```json
{
  "balance": "10000",
  "pending": "10000",
  "receivable": "10000",
  "accounts_count": "3",
  "adhoc_count": "1",
  "deterministic_count": "2",
  "deterministic_index": "2",
  "accounts_block_count": "14",
  "accounts_cemented_block_count": "13"
}
```

---

### wallet_ledger
_enable_control required, version 11.0+_   
Returns frontier, open block, change representative block, balance, last modified timestamp from local database & block count for accounts from **wallet**   

--8<-- "warning-includes-unconfirmed.md"

--8<-- "warning-enable-control.md"

--8<-- "deprecation-info-pending.md"

**Request:**
```json
{
  "action": "wallet_ledger",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F"
}
```  
**Response:**
```json
{
  "accounts": {
    "nano_11119gbh8hb4hj1duf7fdtfyf5s75okzxdgupgpgm1bj78ex3kgy7frt3s9n": {
      "frontier": "E71AF3E9DD86BBD8B4620EFA63E065B34D358CFC091ACB4E103B965F95783321",
      "open_block": "643B77F1ECEFBDBE1CC909872964C1DBBE23A6149BD3CEF2B50B76044659B60F",
      "representative_block": "643B77F1ECEFBDBE1CC909872964C1DBBE23A6149BD3CEF2B50B76044659B60F",
      "balance": "0",
      "modified_timestamp": "1511476234",
      "block_count": "2"
    }
  }
}
```  
**Optional "representative", "weight", "receivable"**

Booleans, false by default. Additionally returns representative, voting weight, receivable balance for each account   

**Request:**
```json
{
  "action": "wallet_ledger",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F",
  "representative": "true",
  "weight": "true",
  "receivable": "true"
}
```  
**Response:**
```json
{
  "accounts": {
    "nano_11119gbh8hb4hj1duf7fdtfyf5s75okzxdgupgpgm1bj78ex3kgy7frt3s9n": {
      "frontier": "E71AF3E9DD86BBD8B4620EFA63E065B34D358CFC091ACB4E103B965F95783321",
      "open_block": "643B77F1ECEFBDBE1CC909872964C1DBBE23A6149BD3CEF2B50B76044659B60F",
      "representative_block": "643B77F1ECEFBDBE1CC909872964C1DBBE23A6149BD3CEF2B50B76044659B60F",
      "balance": "0",
      "modified_timestamp": "1511476234",
      "block_count": "2",
      "representative": "nano_1anrzcuwe64rwxzcco8dkhpyxpi8kd7zsjc1oeimpc3ppca4mrjtwnqposrs",
      "weight": "0",
      "pending": "0",
      "receivable": "0"
    }
  }
}
```  
**Optional "modified_since"**

UNIX timestamp (number), 0 by default. Return only accounts modified in local database after specific timestamp   

---

### wallet_lock   
_enable_control required, version 9.0+_  
Locks **wallet**  

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "wallet_lock",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F"
}
```  
**Response:**
```json
{
  "locked": "1"
}
```

---

### wallet_locked   
Checks whether **wallet** is locked  

**Request:**
```json
{
  "action": "wallet_locked",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F"
}
```  
**Response:**
```json
{
  "locked": "0"
}
```
---

### wallet_pending

Deprecated in V24.0+. Replaced by [wallet_receivable](#wallet_receivable)

---

### wallet_receivable

_since V24.0, use [wallet_pending](#wallet_pending) for V23.3 and below_

_enable_control required_   
Returns a list of block hashes which have not yet been received by accounts in this **wallet**  

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "wallet_receivable",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F",
  "count": "1"
}
```  
**Response:**
```json
{
  "blocks": {
    "nano_1111111111111111111111111111111111111111111111111117353trpda": ["142A538F36833D1CC78B94E11C766F75818F8B940771335C6C1B8AB880C5BB1D"],
    "nano_3t6k35gi95xu6tergt6p69ck76ogmitsa8mnijtpxm9fkcm736xtoncuohr3": ["4C1FEEF0BEA7F50BE35489A1233FE002B212DEA554B55B1B470D78BD8F210C74"]
  }
}
```  
**Optional "threshold"**

Number (128 bit, decimal). Returns a list of receivable block hashes with amount more or equal to **threshold**   

**Request:**
```json
{
  "action": "wallet_receivable",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F",
  "count": "1",
  "threshold": "1000000000000000000000000"
}
```  
**Response:**
```json
{
  "blocks": {
    "nano_1111111111111111111111111111111111111111111111111117353trpda": {
      "142A538F36833D1CC78B94E11C766F75818F8B940771335C6C1B8AB880C5BB1D": "6000000000000000000000000000000"
    },
    "nano_3t6k35gi95xu6tergt6p69ck76ogmitsa8mnijtpxm9fkcm736xtoncuohr3": {
      "4C1FEEF0BEA7F50BE35489A1233FE002B212DEA554B55B1B470D78BD8F210C74": "106370018000000000000000000000000"
    }
  }
}
```  
**Optional "source"**

_version 9.0+_   
Boolean, false by default. Returns a list of receivable block hashes with amount and source accounts   

**Request:**
```json
{
  "action": "wallet_receivable",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F",
  "count": "1",
  "source": "true"
}
```  
**Response:**
```json
{
  "blocks": {
    "nano_1111111111111111111111111111111111111111111111111117353trpda": {
      "142A538F36833D1CC78B94E11C766F75818F8B940771335C6C1B8AB880C5BB1D": {
        "amount": "6000000000000000000000000000000",
        "source": "nano_3dcfozsmekr1tr9skf1oa5wbgmxt81qepfdnt7zicq5x3hk65fg4fqj58mbr"
      }
    },
    "nano_3t6k35gi95xu6tergt6p69ck76ogmitsa8mnijtpxm9fkcm736xtoncuohr3": {
      "4C1FEEF0BEA7F50BE35489A1233FE002B212DEA554B55B1B470D78BD8F210C74": {
        "amount": "106370018000000000000000000000000",
        "source": "nano_13ezf4od79h1tgj9aiu4djzcmmguendtjfuhwfukhuucboua8cpoihmh8byo"
      }
    }
  }
}
```  
**Optional "include_active"**

_version 15.0+_   
Boolean, false by default. Include active blocks without finished confirmations 

**Request:**
```json
{
  "action": "wallet_receivable",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F",
  "count": "1",
  "include_active": "true"
}
```  

**Optional "min_version"**

_version 15.0+_   
Boolean, false by default. Returns the minimum version (epoch) of a block which can pocket this receivable block.

**Optional "include_only_confirmed"**

_version 19.0+_  
Boolean, true by default (_version 22.0+_), previously false by default. Only returns confirmed blocks but with the caveat that their confirmation height might not be up-to-date yet. If false, unconfirmed blocks will also be returned.

---

### wallet_representative  
Returns the default representative for **wallet**  

**Request:**
```json
{
  "action": "wallet_representative",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F"
}
```  
**Response:**
```json
{
  "representative": "nano_3e3j5tkog48pnny9dmfzj1r16pg8t1e76dz5tmac6iq689wyjfpi00000000"
}
```

---

### wallet_representative_set  
_enable_control required_  
Sets the default **representative** for **wallet** _(used only for new accounts, already existing accounts use already set representatives)_  

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "wallet_representative_set",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F",
  "representative": "nano_3e3j5tkog48pnny9dmfzj1r16pg8t1e76dz5tmac6iq689wyjfpi00000000"
}
```  
**Response:**
```json
{
  "set": "1"
}
```

**Optional "update_existing_accounts"**

_version 18.0+_   
Boolean, false by default. Change representative for existing accounts in wallet. May require a lot of time to complete for large wallets due to work generation for change type state blocks  

---

### wallet_republish  
_enable_control required, version 8.0+_   
Rebroadcast blocks for accounts from **wallet** starting at frontier down to **count** to the network     

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "wallet_republish",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F",
  "count": "2"
}
```  
**Response:**
```json
{
  "blocks": [
    "991CF190094C00F0B68E2E5F75F6BEE95A2E0BD93CEAA4A6734DB9F19B728948",
    "A170D51B94E00371ACE76E35AC81DC9405D5D04D4CEBC399AEACE07AE05DD293",
    "90D0C16AC92DD35814E84BFBCC739A039615D0A42A76EF44ADAEF1D99E9F8A35"
  ]       
}
```   

---

### wallet_work_get
_enable_control required, version 8.0+_     
Returns a list of pairs of account and work from **wallet**   

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "wallet_work_get",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F"
}
```  
**Response:**
```json
{
  "works": {
    "nano_1111111111111111111111111111111111111111111111111111hifc8npp": "432e5cf728c90f4f"
  }
}
```  

---

### work_get
_enable_control required, version 8.0+_     
Retrieves work for **account** in **wallet**  

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "work_get",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F",
  "account": "nano_1111111111111111111111111111111111111111111111111111hifc8npp"
}
```  
**Response:**
```json
{
  "work": "432e5cf728c90f4f"
}
```  

---

### work_set
_enable_control required, version 8.0+_     
Set **work** for **account** in **wallet**  

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "work_set",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F",
  "account": "nano_1111111111111111111111111111111111111111111111111111hifc8npp",
  "work": "0000000000000000"
}
```  
**Response:**
```json
{
    "success": ""
}
```  

---

## Unit Conversion RPCs

---

### nano_to_raw    
Convert `nano` amount (10^30 raw) into `raw` (10^0) 

**Request:**
```json
{
  "action": "nano_to_raw",
  "amount": "1"
}
```  
**Response:**
```json
{
  "amount": "1000000000000000000000000000000"
}
```

### raw_to_nano    
Convert `raw` amount (10^0) into `nano` (10^30 raw)

**Request:**
```json
{
  "action": "raw_to_nano",
  "amount": "1000000000000000000000000000000"
}
```  
**Response:**
```json
{
  "amount": "1"
}
```

---

## Deprecated RPCs

---


### active_difficulty
_added in version 19.0+_  
_deprecated in version 22.0_

Returns the difficulty values (16 hexadecimal digits string, 64 bit) and related multiplier from base difficulty.

| Field Name                | Response Details |
|---------------------------|------------------|
| `multiplier`              | Multiplier of the `network_current` from the base difficulty of `network_minimum` for comparison. Note that in V22.0+ this will always be 1 (see below for details). |
| `network_minimum`         | Minimum difficulty required for the network for all block types |
| `network_current`         | _V22.0+_ same minimum difficulty above due to the deprecation of active difficulty calculations used for prioritization in previous versions; _up to V21.3_ 10 second trended average of adjusted difficulty seen on prioritized transactions, refreshed every 500ms |
| `network_receive_minimum` | Lower difficulty threshold exclusively for receive blocks |
| `network_receive_current` | _V22.0+_ same minimum receive difficulty above due to the deprecation of active difficulty calculations used for prioritization in previous versions; _up to V21.3_ 10 second trended average of adjusted difficulty seen on prioritized receive transactions, refreshed every 500ms |

!!! info "Constant values returned"
    Due to the deprecation of active difficulty calculations as of V22.0, this RPC call will return constant values as seen below. These values can be used as difficulty thresholds for the respective block types, but this RPC call should not be used for retrieving these values going forward.

**Request:**
```json
{
  "action": "active_difficulty"
}
```  

**Response:**
```json
{
    "deprecated": "1",
    "network_minimum": "fffffff800000000",
    "network_receive_minimum": "fffffe0000000000", // since V21.2
    "network_current": "fffffff800000000",
    "network_receive_current": "fffffe0000000000", // since V21.2
    "multiplier": "1"
}
```

**Optional "include_trend"**

Boolean, false by default. Also returns the trend of difficulty seen on the network as a **list of multipliers**. Sampling occurs every 500ms. The list is ordered such that the first value is the most recent sample.  
Note: Before v20, the sampling period was between 16 and 36 seconds.

**Request:**
```json
{
  "action": "active_difficulty",
  "include_trend": "true"
}
```

**Response:**
```json
{
  ...,
  "difficulty_trend": [
    "1.156096135149775",
    "1.190133894573061",
    "1.135567138563921",
    "1.000000000000000",
    "...",
    "1.000000000000000"
  ]
}
```

---

### accounts_pending

Deprecated in V24.0+. Replaced by [accounts_receivable](#accounts_receivable)

---

### history  

**Deprecated**: please use `account_history` instead. It provides a `head` option which is identical to the history `hash` option.

---

### krai_from_raw   

Deprecated in V28.0+. For alternatives, see [Unit Conversion RPCs](#unit-conversion-rpcs)

Divide a raw amount down by the krai ratio.  

**Request:**
```json
{
  "action": "krai_from_raw",
  "amount": "1000000000000000000000000000"
}
```  
**Response:**
```json
{
  "amount": "1"
}
```

---

### krai_to_raw    

Deprecated in V28.0+. For alternatives, see [Unit Conversion RPCs](#unit-conversion-rpcs)

Multiply an krai amount by the krai ratio.  

**Request:**
```json
{
  "action": "krai_to_raw",
  "amount": "1"
}
```  
**Response:**
```json
{
  "amount": "1000000000000000000000000000"
}
```

---

### mrai_from_raw    

Deprecated in V28.0+. For alternatives, see [Unit Conversion RPCs](#unit-conversion-rpcs)

Divide a raw amount down by the Mrai ratio.  

**Request:**
```json
{
  "action": "mrai_from_raw",
  "amount": "1000000000000000000000000000000"
}
```  
**Response:**
```json
{
  "amount": "1"
}
```

---

### mrai_to_raw    

Deprecated in V28.0+. For alternatives, see [Unit Conversion RPCs](#unit-conversion-rpcs)

Multiply an Mrai amount by the Mrai ratio.  

**Request:**
```json
{
  "action": "mrai_to_raw",
  "amount": "1"
}
```  
**Response:**
```json
{
  "amount": "1000000000000000000000000000000"
}
```

---

### node_id_delete
_enable_control required, _added in version 17.0+_  
_deprecated in version 19.0_

--8<-- "warning-debug-only-command.md"

Removing node ID (restart required to take effect)

--8<-- "warning-enable-control.md"

**Request:**
```json
{
  "action": "node_id_delete"
}
```  
**Response:**
```json
{
  "deprecated": "1"
}
```  

---

### rai_from_raw    

Deprecated in V28.0+. For alternatives, see [Unit Conversion RPCs](#unit-conversion-rpcs)

Divide a raw amount down by the rai ratio.  

**Request:**
```json
{
  "action": "rai_from_raw",
  "amount": "1000000000000000000000000"
}
```  
**Response:**
```json
{
  "amount": "1"
}
```

---

### rai_to_raw   

Deprecated in V28.0+. For alternatives, see [Unit Conversion RPCs](#unit-conversion-rpcs)

Multiply an rai amount by the rai ratio.  

**Request:**
```json
{
  "action": "rai_to_raw",
  "amount": "1"
}
```  
**Response:**
```json
{
  "amount": "1000000000000000000000000"
}
```

---

### pending

Deprecated in V23.0+. Replaced by [receivable](#receivable)

---

### pending_exists

Deprecated in V23.0+. Replaced by [receivable_exists](#receivable_exists)

---

## Removed RPCs

---

### confirmation_height_currently_processing
_added in version 19.0+_  
_removed in version 27.0_

--8<-- "warning-debug-only-command.md"

Returns the hash of the block which is having the confirmation height set for, error otherwise. When a block is being confirmed, it must confirm all blocks in the chain below and iteratively follow all receive blocks. This can take a long time, so it can be useful to find which block was the original being confirmed.

**Request:**
```json
{
  "action": "confirmation_height_currently_processing"
}
```  
**Response:**
```json
{
  "hash": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F"
}
```

---

### block_count_type  
Reports the number of blocks in the ledger by type (send, receive, open, change, state with version)   

**Request:**
```json
{
  "action": "block_count_type"
}
```  
**Response:**
```json
{
  "send": "5016664",
  "receive": "4081228",
  "open": "546457",
  "change": "24193",
  "state_v0": "4216537",
  "state_v1": "10653709",
  "state": "14870246"
}
```  

---

### payment_begin   
Begin a new payment session. Searches wallet for an account that's marked as available and has a 0 balance. If one is found, the account number is returned and is marked as unavailable. If no account is found, a new account is created, placed in the wallet, and returned.  

**Request:**
```json
{
  "action": "payment_begin",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F"
}
```  
**Response:**
```json
{
  "account" : "nano_3e3j5tkog48pnny9dmfzj1r16pg8t1e76dz5tmac6iq689wyjfpi00000000"
}
```  

---

### payment_end  
End a payment session.  Marks the account as available for use in a payment session. 

**Request:**
```json
{
  "action": "payment_end",
  "account": "nano_3e3j5tkog48pnny9dmfzj1r16pg8t1e76dz5tmac6iq689wyjfpi00000000",
  "wallet": "FFFD1BAEC8EC20814BBB9059B393051AAA8380F9B5A2E6B2489A277D81789EEE"
}
```  
**Response:**
```json
{
}
```   

---

### payment_init  
Marks all accounts in wallet as available for being used as a payment session.  

**Request:**
```json
{
  "action": "payment_init",
  "wallet": "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F"
}
```  
**Response:**
```json
{
  "status": "Ready"
}
```  

---

### payment_wait  
Wait for payment of 'amount' to arrive in 'account' or until 'timeout' milliseconds have elapsed.  

**Request:**
```json
{
  "action": "payment_wait",
  "account": "nano_3e3j5tkog48pnny9dmfzj1r16pg8t1e76dz5tmac6iq689wyjfpi00000000",
  "amount": "1",
  "timeout": "1000"
}
```  
**Response:**
```json
{
  "deprecated": "1",
  "status" : "success"
}
```  


================================================
FILE: docs/core-development/code-standards.md
================================================
title: Code Standards
description: Learn about the code standards expected when contributing to the nano protocol and node implementation

# Code standards

## Formatting

clang-format is used to enforce most of the formatting rules, such as:

* Tabs for indentation.
* Open braces go on new lines.
* Space before open parenthesis.
* Space after comma.

Running `ci/clang-format-do.sh` on \*nix systems is required before pushing your code to ensure that the formatting is good. If you want to do formatting from the IDE, chances are there's a plugin available. Visual Studio for instance provides a way to automatically format on saving. The definition file `.clang-format` is located in the project root directory. For CMake changes, running `cmake-format-do.sh` is required as well.

Make sure you set up your editor to use tabs. Use tabs for indentation, and spaces for alignment [^1]. That way, you can use any tab size you want in your favorite editor, but the code will still look good for people with different settings.

## General guidelines

* Use `auto` type inference for local variables if it's clear from the context what the type will be. Use your best judgement, sometimes adding explicit types can increase readability [^2]
* Handle exceptions, including IO exceptions for file and network operations.
* Be liberal with `debug_assert`. Use asserts to check invariants, not potential runtime errors, which should be handled gracefully. `debug_assert` has an advantage over normal `assert` as it will always print out the stacktrace of the current thread when it hits. Debug asserts are for detecting bugs, not error handling. There is also `release_assert` which is similar to `debug_assert` but also hits in a release build. When there is unexpected behaviour and no suitable way to recover it can be used to halt program execution.
* Be liberal with `logger.always_log` or `logger.try_log` statements, except in performance critical paths.
* Add comments to explain complex and subtle situations, but avoid comments that reiterates what the code already says.
* Use RAII and C++11 smart pointers to manage memory and other resources.

## Performance and scalabiliy considerations

* When making changes, think about performance and scalability. Pick good data structures and think about algorithmic complexity. 
    * Nested loops yield quadratic behavior - is there an alternative? A typical example is removing an inner lookup loop with an unordered set/map to improve lookup performance to O(1).
* Make sure your change doesn't conflict with the scalability characteristics described in the white paper.

## Security

Your code will be reviewed with security in mind, but please do your part before creating a pull request:

* Familiarize yourself with best practices for writing secure C++ code. In particular:
    * Consult https://wiki.sei.cmu.edu/confluence/display/cplusplus
    * Avoid using ANSI C functions. Many of these are prone to buffer overruns.
    * Avoid using C strings and direct buffer manipulation.

* Use static and dynamic analysis tools, such as valgrind, XCode instrumentation, linters and sanitizers. These tools are also great for debugging crashes and performance problems.

[^1]: https://dmitryfrank.com/articles/indent_with_tabs_align_with_spaces
[^2]: http://www.acodersjourney.com/2016/02/c-11-auto/


================================================
FILE: docs/core-development/collaboration-process.md
================================================
title: Collaboration Process
description: Find out how the open source collaboration process works with the nano protocol and node software

# Collaboration Process

## Code Process

**Fork and do all your work on a branch**

Nano prefers the standard GitHub workflow. You create a fork of the nanocurrency/nano-node repository (or other repositories as needed), make changes on new branches for features/fixes, and push these up to be added as Pull Requests. 

**Create pull requests**

Before:

* Branch out of the **develop** branch. The **master** branch is only updated on new releases.
* Review your code locally. Have you followed the [Code Standards](code-standards.md) closely?
* Run tests: `core_test`,`qt_test`,`rpc_test` (see [running tests](understanding-the-code.md#tests) for more details). Did you consider adding a test case for your feature?
* Run [ASAN](../integration-guides/build-options.md#address-sanitizer), [TSAN](../integration-guides/build-options.md#thread-sanitizer) and [Valgrind](../integration-guides/build-options.md#valgrind) to detect memory, threading or other bugs
* Run clang formatting script and resolve any raised issues: `ci/clang-format-do.sh`
* Commit and push your fork branch

After:

* Create pull request on the upstream repository:
    * Make sure you add a description that clearly describes the purpose of the PR.
    * If the PR solves one or more issues, please reference these in the description.
* Check that CI completes successfully - this can take up to a few hours depending on current CI queues. If any failures exist, fix the problem and push an update.
* Respond to comments and reviews in a timely fashion.

**Resolve conflicts**

If time passes between your pull request (PR) submission and the team accepting it, merge conflicts may occur due to activity on develop, such as merging other PR's before yours. In order for your PR to be accepted, you must resolve these conflicts.

The preferred process is to rebase your changes, resolve any conflicts, and push your changes again. [^1][^2]

* Check out your branch
* `git fetch upstream`
* `git rebase upstream/develop`
* Resolve conflicts in your favorite editor
* `git add {filename}`
* `git rebase --continue`
* Commit and push your branch

**Consider squashing or amending commits**

In the review process, you're likely to get feedback. You'll commit and push more changes, get more feedback, etc. 

This can lead to a messy git history, and can make stuff like bisecting harder.

Once your PR is OK'ed, please squash the commits into a one.[^3]

Note that you can also update the last commit with `git commit --amend`. Say your last commit had a typo. Instead of committing and having to squash it later, simply commit with amend and push the branch.

## Finding issues or features to work on

- Issues are available on GitHub, with the most urgent being in the latest milestone for release
- Start with issues labeled as [`good first issue`](https://github.com/nanocurrency/nano-node/labels/good%20first%20issue) or connect with the NF core developers on [Discord](https://chat.nano.org) or the [forum](https://forum.nano.org) for ideas on how to help
- If you find an issue you'd like to help with, comment and tag a [Nano Foundation team member](https://github.com/orgs/nanocurrency/people) who can evaluate and assign it to you

## Submitting issues and feature requests

Standard GitHub templates exist for submitting any found issues or feature requests. If you plan on working on a bug or feature that doesn't already have a GitHub Issue associated with it, please submit it first so the team is aware. See https://github.com/nanocurrency/nano-node/issues/new/choose for templates.

## Discussion channels

Various channels exist for discussing code changes with the Nano Foundation and community.

**GitHub**

To help persist useful information about a particular issue or feature, it is best to discuss within the related GitHub Issue or Pull Request. Members of the nano community and Nano Foundation actively follow and will engage when available.

**Discord for chat**

For live chat, join the server at https://chat.nano.org and check out the `#protocol` and `#development` channels. The various channels under the `TESTING` section can also be helpful to follow.

**Forum**

Another area for technical and code related discussions is the [forum](https://forum.nano.org). There are categories for `Protocol Design` and `Development` that are useful in discussing ideas. This can be a great place for getting feedback on ideas and exploring further before finalizing fixes and features in GitHub.

## Proposals

There currently is no formal process for proposals on the nano network. This is an area actively being investigated and if requirements for submissions change, this area will be updated. For now, if you wish to propose an new idea, it is recommended to discuss on the [forum](https://forum.nano.org) first to gather feedback and use the [GitHub Issues](https://github.com/nanocurrency/nano-node/issues/new/choose) on the concept is solidifed/validated.

[^1]: https://help.github.com/articles/resolving-merge-conflicts-after-a-git-rebase/
[^2]: https://help.github.com/articles/resolving-a-merge-conflict-using-the-command-line/
[^3]: https://github.com/todotxt/todo.txt-android/wiki/Squash-All-Commits-Related-to-a-Single-Issue-into-a-Single-Commit

================================================
FILE: docs/core-development/developer-discussions.md
================================================
title: Developer Discussions
description: Links & notes for recurring live discussions about Nano development. Includes discussion between community developers and the Nano Foundation. Technical, developer-focused.

# Developer Discussions

Links & notes for recurring live discussions about Nano development. Includes discussion between community developers and the Nano Foundation. Technical, developer-focused.

!!! note
    These developer discussions are best effort, live discussions, and may not contain the most accurate (or most recent) information. The intent of these discussions is to promote transparency, collaboration, & community-driven efforts, but development plans may change at any time. 
    
    The below notes are also best effort, and may not be 100% accurate.

## Sept 3, 2024

- [Developer call](https://x.com/ColinLeMahieu/status/1830969052820578365?t=Abqg6T-exPd5FhaQ2inY2w&s=19)
- [Reddit discussion](https://www.reddit.com/r/nanocurrency/comments/1f822rt/weekly_nano_developer_space_aug_3_2024/)

## Aug 20, 2024

- [Developer call](https://x.com/ColinLeMahieu/status/1825895842437607934?t=3t1YvnV2gRsLJXoCgECw6w&s=19)
- [Reddit discussion](https://www.reddit.com/r/nanocurrency/comments/1ewzj2n/weekly_nano_developer_space_aug_20_2024/)

## Aug 6, 2024

- [Developer call](https://x.com/ColinLeMahieu/status/1820822202297819143)
- [Reddit discussion](https://www.reddit.com/r/nanocurrency/comments/1elry5z/weekly_nano_developer_space_aug_6_2024/)

## July 23, 2024

- [Developer call](https://x.com/ColinLeMahieu/status/1815748878320189616?t=L8QhI04wdbx87MQIJYoxug&s=19)
- [Reddit discussion](https://www.reddit.com/r/nanocurrency/comments/1eaa9i0/weekly_nano_developer_space_jul_23_2024/)
- [YouTube](https://www.youtube.com/watch?v=cMK_Q50uWHk)

## July 16, 2024

- [Developer call](https://x.com/ColinLeMahieu/status/1813204252380070206)
- [Reddit discussion](https://www.reddit.com/r/nanocurrency/comments/1e54dvm/weekly_nano_developer_space_july_16_2024/)
- [YouTube](https://www.youtube.com/watch?v=Dx5ZEYwdbyw)
    
## July 9, 2024

- [Developer call](https://x.com/ColinLeMahieu/status/1810675179137192279?t=hEmkKBHOxRK9RofyNnUwVg&s=19)
- [Reddit discussion](https://www.reddit.com/r/nanocurrency/comments/1dz36p3/weekly_nano_developer_space_jul_9_2024/)
- [YouTube](https://www.youtube.com/watch?v=Z7n75b8i9sI)
  
## July 2, 2024

- [Developer call](https://x.com/ColinLeMahieu/status/1808138726742065452?t=eqerZHL7ApiqRzFOs91V5g&s=19)
- [Reddit discussion](https://www.reddit.com/r/nanocurrency/comments/1dtmuk4/weekly_nano_developer_space_jul_2_2024/)
- [YouTube](https://www.youtube.com/watch?v=JSEBA5HNqgE)

## June 18, 2024

- [Developer call](https://x.com/ColinLeMahieu/status/1803065216919273931)
- [Reddit discussion](https://www.reddit.com/r/nanocurrency/comments/1dj46ct/weekly_nano_developer_space_june_18_2024/)
  
## June 11, 2024

- [Developer call](https://x.com/ColinLeMahieu/status/1800528535251267598?t=b7_ZOImygrwAW8yiRw8cdw&s=19)
- [Reddit discussion](https://www.reddit.com/r/nanocurrency/comments/1ddgvyj/weekly_nano_developer_talk_june_11_2024/)
 
## May 21, 2024

- [Developer call](https://x.com/ColinLeMahieu/status/1792897054726824333)
- [Reddit discussion](https://www.reddit.com/r/nanocurrency/comments/1cx7jqw/weekly_nano_developer_space_may_21_2024/)
 
## May 14, 2024

- [Developer call](https://x.com/ColinLeMahieu/status/1790381641107439731?t=Ms5Dy0bBFVqx8GbkOy8lGA)
- [Reddit discussion](https://www.reddit.com/r/nanocurrency/comments/1crv7i1/weekly_nano_developer_space_may_14_2024/)
 
## April 30, 2024

- [Developer call](https://x.com/ColinLeMahieu/status/1785308297924432315)
- [Reddit discussion](https://www.reddit.com/r/nanocurrency/comments/1ch55iu/weekly_nano_developer_space_apr_30_2024/)

## April 23, 2024

- [Developer call](https://x.com/ColinLeMahieu/status/1782771656408158483)
- [Reddit discussion](https://www.reddit.com/r/nanocurrency/comments/1cbhe9x/weekly_nano_developer_space_apr_23_2024/)
  
## April 16, 2024

- [Developer call](https://x.com/ColinLeMahieu/status/1780234655565746684?t=FGvjQKPRKAbxGRSIfCHR4A)
- [Reddit discussion](https://www.reddit.com/r/nanocurrency/comments/1c5gwux/weekly_nano_developer_space_apr_16_2024/)
 
## April 9, 2024

- [Developer call](https://x.com/ColinLeMahieu/status/1777697905698107554)
- [Reddit discussion](https://www.reddit.com/r/nanocurrency/comments/1c0268f/weekly_nano_developer_space_apr_9_2024/)
 
## March 26, 2024

- [Developer call](https://x.com/ColinLeMahieu/status/1772639556455567629?t=RTr-oEgf8ZoM1tEcfInxBw)
- [Reddit discussion](https://www.reddit.com/r/nanocurrency/comments/1bobrah/weekly_nano_developer_space_mar_26_2024/)
 
## March 19, 2024

- [Developer call](https://x.com/ColinLeMahieu/status/1770091771541828085)
- [Reddit discussion](https://www.reddit.com/r/nanocurrency/comments/1bin1m6/weekly_nano_developer_space_mar_19_2024/)
 
## March 12, 2024

- [Developer call](https://x.com/ColinLeMahieu/status/1767566192103825707)
- [Reddit discussion](https://www.reddit.com/r/nanocurrency/comments/1bd25p2/weekly_nano_developer_talk_mar_12_2024/)
 
## March 5, 2024

- [Developer call](https://x.com/ColinLeMahieu/status/1765029691398734023?t=r6mG_OO6tKdnu32F5dhjnQ)
- [Reddit discussion](https://www.reddit.com/r/nanocurrency/comments/1b79viz/weekly_nano_developer_space_mar_5_2024/)
 
## February 20, 2024

- [Developer call](https://x.com/ColinLeMahieu/status/1759956505606971745?t=98X_E9aTopR6qVaps1BEpw)
- [Reddit discussion](https://www.reddit.com/r/nanocurrency/comments/1avmgtd/weekly_nano_developer_space_feb_20_2024/)
 
## February 13, 2024

- [Developer call](https://x.com/ColinLeMahieu/status/1757414995858526559)
- [Reddit discussion](https://www.reddit.com/r/nanocurrency/comments/1apv3i4/weekly_nano_developer_space_feb_13_2024/)
  
## February 6, 2024

- [Developer call](https://x.com/ColinLeMahieu/status/1754882713926926420?t=3KncD_dJcwZeI07_JXuNdg)
- [Reddit discussion](https://www.reddit.com/r/nanocurrency/comments/1akexw7/weekly_nano_developer_space_feb_6_2024/)
  
## January 30, 2024

- [Developer call](https://x.com/gr0vity_dev/status/1752345979024490835)
- [Reddit discussion](https://www.reddit.com/r/nanocurrency/comments/1af3o40/weekly_nano_developer_call_jan_30_2024/)
  
## January 23, 2024

- [Developer call](https://x.com/ColinLeMahieu/status/1749804269925232822)
- [Reddit discussion](https://www.reddit.com/r/nanocurrency/comments/19dv1ca/weekly_nano_developer_call_jan_23_2024/)
  
## January 16, 2024

- [Developer call](https://twitter.com/ColinLeMahieu/status/1747272701008634175)
- [Reddit discussion](https://www.reddit.com/r/nanocurrency/comments/198wdac/weekly_nano_developer_call_jan_16_2023/)

## January 9, 2024

- [Developer call](https://twitter.com/ColinLeMahieu/status/1744735898879811779)
- [Reddit discussion](https://www.reddit.com/r/nanocurrency/comments/192my3t/weekly_nano_developer_space_jan_9_2024/)

## December 12, 2023

- [Developer call](https://twitter.com/ColinLeMahieu/status/1734588963585728526)
- [Reddit discussion](https://www.reddit.com/r/nanocurrency/comments/18gs1kr/weekly_nano_developer_space_dec_12_2023_last_one/)

## December 5, 2023

- [Developer call](https://twitter.com/ColinLeMahieu/status/1732052255103221870)
- [Reddit discussion](https://www.reddit.com/r/nanocurrency/comments/18bdsq8/weekly_nano_developer_talk_dec_5_2023/)

## November 28, 2023

- [Developer call](https://twitter.com/ColinLeMahieu/status/1729515603529023585)
- [Reddit discussion](https://www.reddit.com/r/nanocurrency/comments/185xrqi/weekly_nano_developer_call_nov_28_2023/)

## November 21, 2023

- [Developer call](https://twitter.com/gr0vity_dev/status/1726978836074742207)
- [Reddit discussion](https://www.reddit.com/r/nanocurrency/comments/180p7jf/weekly_nano_developer_space_nov_21_2023/)

## November 14, 2023

- [Developer call](https://twitter.com/ColinLeMahieu/status/1724442197179650478)
- [Reddit discussion](https://www.reddit.com/r/nanocurrency/comments/17v5uat/weekly_nano_developer_space_november_14_2023/)

## November 7, 2023

- [Developer call](https://twitter.com/ColinLeMahieu/status/1721905435056488743)
- [Reddit discussion](https://www.reddit.com/r/nanocurrency/comments/17pwaa2/weekly_nano_developer_space_nov_7_2023/)

## October 31, 2023

- [Developer call](https://twitter.com/ColinLeMahieu/status/1719368918895088121)

## October 24, 2023

- [Developer call](https://twitter.com/ColinLeMahieu/status/1716817097408524743)

## October 17, 2023

- [Developer call](https://twitter.com/ColinLeMahieu/status/1714280349738701183)
- [Reddit discussion](https://www.reddit.com/r/nanocurrency/comments/17a344v/weekly_nano_developer_space_oct_17_2023/)

## October 10, 2023

- [Developer call](https://twitter.com/ColinLeMahieu/status/1711743518576672943)
- [Reddit discussion](https://www.reddit.com/r/nanocurrency/comments/174yxtu/weekly_nano_developer_space_oct_10_2023/)

## October 3, 2023

- [Developer call](https://twitter.com/ColinLeMahieu/status/1709206677633782029)

## September 26, 2023

- [Developer call](https://twitter.com/ColinLeMahieu/status/1706669851912151247?t=YTMabUbEfkQgjIoVtGSKKg&s=19)
- [Reddit discussion](https://www.reddit.com/r/nanocurrency/comments/16spnl2/colin_lemahieu_hosting_live_twitter_space_about/)


================================================
FILE: docs/core-development/overview.md
================================================
title: Core Development Overview
description: All you need to know to help contribute to the core development of the nano node and protocol

# Core Development

Welcome and thanks for your interest in core development of the nano! The following resources contain information and guides for getting involved with the development of the node and protocol.

## Getting started

It is recommended to have an understanding of how the nano protocol is designed to work so the code can be more easily read and evaluated.

- Start by reviewing the [living whitepaper](../living-whitepaper/index.md)
- Read through (or try out) the [running a node guides](../running-a-node/overview.md)
- Understand [the basics](../integration-guides/the-basics.md) and maybe even some [advanced details](../integration-guides/advanced.md) about integrations
- Learn how to [build the node yourself](../integration-guides/build-options.md)
- Participate in the community through [Discord](https://chat.nano.org)
- Start perusing the code in the repositories below and don't be afraid to ask questions


## Code repositories

The Nano Foundation manages the [`nanocurrency`](https://github.com/nanocurrency) GitHub Organization account which includes various repositories for nano tools and implementations. Below is a partial list of the most common repositories referenced.

| Name | Language | Purpose |
|------|----------|---------|
| [nanocurrency/nano-node](https://github.com/nanocurrency/nano-node) | C++| Primary node implementation used on the nano network |
| [rs-nano-node](https://github.com/rsnano-node/rsnano-node) | Rust| Alternative node implementation by Gustav |
| [nanocurrency/nano-work-server](https://github.com/nanocurrency/nano-work-server) | Rust | Standalone server for generating work values for blocks |
| [nanocurrency/protocol](https://github.com/nanocurrency/protocol) | Kaitai Struct | Specification for nano network message protocol |
| [nanocurrency/nanodb-specification](https://github.com/nanocurrency/nanodb-specification) | Kaitai Struct | Specification for database tables and fields used by the `nano-node` implementation |
| [nanocurrency/nano-docs](https://github.com/nanocurrency/nano-docs) | Markdown | MKDocs based documentation this docs.nano.org site is built from |

Most of the content in the following documentation is focused around the [nanocurrency/nano-node](https://github.com/nanocurrency/nano-node) repository, as that is where most development activity occurs. But there are tons of related projects creating useful tools, libraries, services and more for the nano ecosystem (see some options in [GitHub](https://github.com/search?q=nanocurrency&type=discussions)).

## Security vulnerability reporting

--8<-- "warning-security-vulnerability-reporting.md"

## Nano Foundation core developers

In addition to contributions from the wider nano community, the [Nano Foundation](https://nano.org/foundation) manages a team of core developers who contribute to the protocol and primary node implementation. For a list of code contributors, see the [GitHub Insights page](https://github.com/nanocurrency/nano-node/graphs/contributors).

================================================
FILE: docs/core-development/understanding-the-code.md
================================================
title: Understanding the code
description: Learn about the nano code for better development practices

# Understanding the code

This guide is designed to give an overall structure of the core nano protocol codebase to help new developers get a better understanding of the different areas and how they interoperate. Due to the rapid changing nature of the protocol it’s possible some of the features are moved to different places or have changed entirely. Working on the protocol requires a very multi-disciplined and wide area of knowledge, none of it is particularly mandatory to get started but a good C++ understanding will help prevent being too overwhelmed initially:  

Items required include:

- Windows/MacOS/Linux
- C++20 compiler
- Boost
- Git
- CMake

Useful experience includes modern C++ knowledge (up to C++20) including multithreading primitives (mutex, condition variables, atomics) & templates, Boost (asio & beast), RocksDB, LMDB, FlatBuffers, JSON-RPC, IPC, networking communication (ip/tcp, message passing, broadcasting algorithms), QT, signal handling, PKI cryptography, git & cross-platform development.

The main Nano projects are located inside the `/nano` subdirectory.  

## Executable binaries

All executables have `nano_` prefix and projects have a `main` function inside `entry.cpp`

**nano_node** – The standard way to start a node. There are 2 source files in here, `entry.cpp` and `daemon.cpp`. `nano_daemon::daemon::run()` is always called so is a good place to put a breakpoint if there are any issues during node operation (especially errors when launching initially).

**nano_rpc** – This executable does not need to be run explicitly unless out of process RPC is selected. https://docs.nano.org/integration-guides/advanced/?h=+nano_rpc#running-nano-as-a-service Because this project is quite small it is all done inside the `entry.cpp` file and is probably an easier starting point template should anything else need to be moved out of process in the future.

**nano_wallet** – This essentially does the same as `nano_node` but doesn’t support all CLI commands and has a graphical user interface for the wallet.

---

## Tests

The googletest (gtest) framework is used to validate a variety of functionality in the node, we do not currently use gmock in the codebase.  

### Running tests
The dev network is forced for locally run tests, this lowers work and other settings to make it simpler to test.
Build with `cmake -DNANO_TEST=ON ..`
See docs.nano.org for more information. There may be intermittent failures, if so add them here https://github.com/nanocurrency/nano-node/issues/1121 and fix if possible.

### Executables

**core\_test** – This is where the majority of tests should go. If there is any new functionality added or something has changed, it more often than not should have a test here! Any new core areas should have their own separate test file to encapsulate the logic.   

**ipc\_flatbuffers\_test** – This actually doesn’t use the `gtest` library and has its own main file which just contains a simple example of using flatbuffers.  

**load_test** – This creates a dynamic number of nodes, sends blocks from 1 of the nodes (primary) and waits until all other nodes have the same number of blocks. This does not normally need to be modified but is run as part CI at the end.  

**rpc_test** – All RPC tests go here. There is some boilerplate to follow which creates an `ipc_server` for the node which mimics out of process rpc commands communicating with it. Care must be taken when creating write transactions as they are not allowed on io-threads (https://github.com/nanocurrency/nano-node/pull/1264). To make sure this is adhered to when calling the RPC commands, there is an RAII object `scoped_io_thread_name_change` which changes the current thread (normally the main one) to be `io`, and restores it when the object goes out of scope. For instance
```
...
scoped_thread_name_io.reset ();
node.process (state_block);
scoped_thread_name_io.renew ();
```
**slow_test** – Any core tests which are not suitable for CI because they take a long time (> a few seconds) should go here. There is a desire to make this file run once per night, but until then should be periodically run by developers.

### Work/Sig verification modifying for tests

A common mistake is to request work for the hash of the block to be added, but it should happen on the root (previous one). The work difficulty is different for the live/beta/dev networks and are set using the `work_thresholds` class. During any local testing, where a lot of blocks are processed, work generation and signature verification can take the majority of the time. To speed this up it can make sense to manually lower the work difficulty even further and change the sig verification to always return `true`.

### Helpers

**test_common** – This is a helper library which contains test specific (not node related) things which can be used by all test projects. This project should not have a `node` dependency. Anything which does should be put into `nano/node/testing.cpp`.

### Fuzzer

The fuzzer uses libfuzzer which inputs arbitrary data continuously trying to find catch edge cases missed in traditional testing on specific examples. This is not currently supported on Windows. The executables are found in fuzzer_test/\*. The node must be built with the CMake option `-DNANO_FUZZER_TEST=ON`, this does not require that `NANO_TEST` be set. Currently there are 3 executables built: fuzz_bignum, fuzz_buffer, fuzz_endpoint_parsing.

**Notes:**  
There aren’t currently tests for specific CLIs so it’s recommended to abstract the functionality so that it can be tested in `core_test`.

### Testing implementation details
Sometimes it is necessary to be able to change something about a class only for a test. Rather than make this the class interface public just for tests, the specific tests can be added as friends to the class, this is done like so for a test named like so TEST (node, example);
```
class my_class
{
private:
   int private_member; // the Test (node, example); test can access this member
   friend class node_example_Test;
};
```
The test itself needs to be wrapped with the nano { } namespace for this to work correctly, if the class itself is in the nano namespace which is normally the case.

### Additional pre-release testing
- Run tests with TSAN/ASAN/Valgrind. All errors should be fixed before launch unless these are determined to be test related or false positives. We currently have some errors with using coroutines. There are blacklist files for the sanitizers which remove some errors caused by lmdb & rocksdb.

---

## Bootstrapping

When you first start a Nano node, it must download & validate transactions until its ledger (account & transaction history) is in sync with the other nodes on the network. This process is called bootstrapping. There are 3 bootstrapping methods, ascending, legacy, and lazy. See [here](https://github.com/nanocurrency/nano-node/issues/3837) and [here](https://medium.com/nanocurrency/nano-explainer-lazy-bootstrapping-6f091e1eae8c) for more information. 
`node/bootstrap/boostrap_attempt.hpp` contains the base class definition for bootstrap attempts.

### Ascending

`node/bootstrap/bootstrap.cpp`

Nano node versions V24 & V25 introduced ascended bootstrapping - a complete rewrite of how Nano nodes sync account & transaction history from scratch.  Prior to V24, the bootstrap mechanism served transactions (blocks) in a top down format (i.e. newest to oldest / frontier to genesis), but since the blocks must be added to the local ledger from the bottom up (i.e. oldest to newest / genesis to frontier), the node spent a lot of time reordering transactions. This consumed a significant amount of disk space and disk IO (disk reads/writes), both of which contribute to long bootstrapping times (i.e. days or weeks).

Ascending bootstrapping sends & processes transactions from the bottom up, allowing nodes to easily trace transaction order without a complicated (and time consuming) re-ordering process. This significantly improves the speed of bootstrapping, removes complexity from the codebase, & reduces overall resource usage.

For more technical details, see [here](https://github.com/nanocurrency/nano-node/issues/3837).

### Legacy

`node/bootstrap/bootstrap_legacy.cpp`

Legacy bootstrapping works by requesting frontiers periodically (every 5 minutes) from a random selection of peers, this is done in `nano::node::ongoing_bootstrap ()`. `bootstrap_frontier.cpp` contains the frontier req client and server. A `frontier_req` message is send from `frontier_req_client` to get a list of frontiers from a peer’s `frontier_req_server` starting at `frontier_req.start` which is done as `accounts_begin (transaction, current + 1);`. The accounts are sorted by their hash.

### Lazy

`node/bootstrap/bootstrap_lazy.hpp` 

Lazy bootstrapping works by having nodes monitor the real-time network and observing live block confirmation. In combination with [optimistic elections](https://github.com/nanocurrency/nano-node/pull/4111), when a node sees confirmation for a new block, all previous blocks in the newly confirmed block's account-chain are also considered valid & confirmed, and are then inserted into node's local ledger.

### Wallet lazy

TODO

### How messages are handled

`node/bootstrap/bootstrap_server.cpp` 

When a message is received through the bootstrap server, its header is first checked inside `nano::bootstrap_server::receive_header_action ()`. The message is deserialized and added in `add_request ()` to the `std::queue<std::unique_ptr<nano::message>> requests` collection which holds a queue of messages. `run_next ()` is then called (and will be called after the request is finished if there are more messages to process), this runs the message through a `request_response_visitor` object which creates a `tcp_message_item` and adds it to the `tcp_message_manager` to be processed. The newest set of messages added were for telemetry. If new messages need adding that can be used as a guide: https://github.com/nanocurrency/nano-node/pull/2446

---

## Workers (thread pool)

The class definition for `thread_pool` is defined inside `nano/lib/threading.cpp`, which allows tasks to be added to a queue for execution as well as executed at a specific time. Previously there were worker/alarm classes, which were combined in https://github.com/nanocurrency/nano-node/pull/2871. Its primary purpose was to schedule write transactions off the io threads. It is generally recommended to push other tasks onto the io threads though to avoid bottlenecking these threads.

---

## Database

There are 2 logical areas where a persistent file is needed: the ledger and wallets. For this 2 NoSQL databases which store binary data are used, namely LMDB & RocksDB. The ledger database is comprised of a few files:

- `nano/secure/store.hpp`: database interfaces, value object conversions, visitors, and high-level implementations
- `nano/node/lmdb/`: anything specific to LMDB goes here
- `nano/node/rocksdb/`: anything specific to RocksDB goes here

The wallets database uses the wallets_store which only has an LMDB backend.

### Database upgrades

`nano::lmdb::store::do_upgrades ()` is where LMDB database upgrades are done. For instance `void nano::lmdb::store::upgrade_v21_to_v22 ()` combines all block databases into a single one. Raw mdb functions are normally required as `block_store::get ()` and other functions normally can’t be used because they are updated to the latest db spec. The RocksDB upgrades were introduced by V25.0. It follows a similar approach implemented for LMDB. There were in the past multiple upgrades during a release when a beta build went out and a subsequent upgrade was desired. Previously a ledger reset was done and the version was re-used but this was deemed too inconvenient.

### write_database_queue
This was introduced to reduce LMDB write lock contention between the block processor and the confirmation height processor. As during bootstrapping or high TPS the block processor can hold onto the lock up to 5s (by default), before the lock is held by the blockprocessor it signals that it is about to get the LMDB lock, the confirmation height processor can make use of this information and continue processing where it would otherwise be stalled. Ongoing pruning also makes use of this.

---

## Block processing

There are 4 types of legacy blocks: open, receive, send & change. There are the state blocks which encompass traits from the legacy subtypes as well as support epochs. In various places an `epoch_link` is checked, this indicates that the link field is set to one of the epoch accounts (for v1 state blocks), or possibly self for v2 state blocks upgrade blocks. No new legacy blocks can be created (there are about 10million), but they still need to be handled in any algorithm which deals with blocks because users can still be bootstrap from scratch. When a node is first launched without a ledger `block_store_partial::init ()` is called, this creates the genesis block. Blocks are then bootstrapped.

---

## Ledger

`nano/secure/ledger.cpp` is where blocks are added and deleted to the ledger database.

The ledger cache is used when it may be expensive to try and determine the count of something in the ledger. It was originally used for the cemented count, because this is determined by adding the confirmation height from all accounts. This does mean that any external write operations from LMDB (such as CLI command `--confirmation_height_clear`) will cause this number to get out of sync. This is not possible with RocksDB backend because it does not allow multi-process write transactions.

---

## Node initialization

The biggest bottleneck for node start-up is caused by setting up the ledger cache. This requires scanning all accounts & conf height databases. A multi-threaded process (added in https://github.com/nanocurrency/nano-node/pull/2876) splits the account space into equal partitions (as accounts should be randomly distributed) and does sequential sorted reads in each partition; this is the most efficient way to search through any of the databases. Point/Random reads are very slow in comparison.

### Keeping build times low

`nano/node/node.hpp` is the largest build bottleneck, it can increase build times of files by up to 10 seconds on some systems! Some boost files tend to be large too, they offer forward declaration headers such as `<boost/property_tree/ptree_fwd.hpp>` & `<boost/stacktrace/stacktrace_fwd.hpp>` worth checking if they exist for any you are using in header files.

### node_initialized_latch

Some classes use `node_initialized_latch.wait ();` The latch was added in https://github.com/nanocurrency/nano-node/pull/2042 this is to prevent some of the issues in the node constructor initializer list where the `node` object is passed and a child constructor is wants to use a node member which is not yet initialized. This makes it resume operation once the latch is incremented at the beginning of the `node` constructor.
Download .txt
gitextract_g8vbq387/

├── .github/
│   └── workflows/
│       ├── build.yml
│       ├── cleanup-docker-pr.yml
│       ├── cleanup-docker-untagged.yml
│       ├── deploy-staging.yml
│       ├── deploy.yml
│       ├── publish-docker-master.yml
│       ├── publish-docker-pr.yml
│       └── push-to-staging.yml
├── .gitignore
├── Dockerfile
├── deploy-key.enc
├── docs/
│   ├── CNAME
│   ├── articles/
│   │   └── readme.md
│   ├── commands/
│   │   ├── command-line-interface.md
│   │   └── rpc-protocol.md
│   ├── core-development/
│   │   ├── code-standards.md
│   │   ├── collaboration-process.md
│   │   ├── developer-discussions.md
│   │   ├── overview.md
│   │   └── understanding-the-code.md
│   ├── glossary.md
│   ├── index.md
│   ├── integration-guides/
│   │   ├── advanced.md
│   │   ├── block-confirmation-tracking.md
│   │   ├── build-options.md
│   │   ├── index.md
│   │   ├── ipc-integration.md
│   │   ├── key-management.md
│   │   ├── the-basics.md
│   │   ├── websockets.md
│   │   └── work-generation.md
│   ├── javascript/
│   │   └── mermaid-loose-security.js
│   ├── living-whitepaper/
│   │   └── index.md
│   ├── node-implementation/
│   │   ├── blocks.md
│   │   ├── components.md
│   │   ├── database.md
│   │   ├── introduction.md
│   │   ├── networking.md
│   │   ├── voting.md
│   │   └── work.md
│   ├── protocol-design/
│   │   ├── attack-vectors.md
│   │   ├── blocks.md
│   │   ├── distribution-and-units.md
│   │   ├── introduction.md
│   │   ├── ledger.md
│   │   ├── networking.md
│   │   ├── orv-consensus.md
│   │   ├── resource-usage.md
│   │   ├── signing-hashing-and-key-derivation.md
│   │   └── spam-work-and-prioritization.md
│   ├── releases/
│   │   ├── network-upgrades.md
│   │   ├── node-releases.md
│   │   ├── release-v19-0.md
│   │   ├── release-v20-0.md
│   │   ├── release-v21-0.md
│   │   ├── release-v21-1.md
│   │   ├── release-v21-2.md
│   │   ├── release-v21-3.md
│   │   ├── release-v22-0.md
│   │   ├── release-v22-1.md
│   │   ├── release-v23-0.md
│   │   ├── release-v23-1.md
│   │   ├── release-v23-3.md
│   │   ├── release-v24-0.md
│   │   ├── release-v25-0.md
│   │   ├── release-v25-1.md
│   │   ├── release-v26-0.md
│   │   ├── release-v26-1.md
│   │   ├── release-v27-0.md
│   │   ├── release-v27-1.md
│   │   ├── release-v28-0.md
│   │   ├── release-v28-1.md
│   │   ├── release-v28-2.md
│   │   └── roadmap.md
│   ├── running-a-node/
│   │   ├── advanced-monitoring.md
│   │   ├── beta-network.md
│   │   ├── beyond-the-node.md
│   │   ├── configuration.md
│   │   ├── docker-management.md
│   │   ├── ledger-management.md
│   │   ├── logging-tracing.md
│   │   ├── node-setup.md
│   │   ├── overview.md
│   │   ├── security.md
│   │   ├── test-network.md
│   │   ├── troubleshooting.md
│   │   ├── voting-as-a-representative.md
│   │   └── wallet-setup.md
│   ├── snippets/
│   │   ├── community-links.md
│   │   ├── config-node-option-node-enable-voting-true.md
│   │   ├── config-node-option-rpc-enable-control-false.md
│   │   ├── config-node-option-rpc-enable-control-true.md
│   │   ├── config-node-option-rpc-enable-true.md
│   │   ├── contributing-code.md
│   │   ├── current-build-links-all.md
│   │   ├── current-build-links-beta.md
│   │   ├── current-build-links-main.md
│   │   ├── current-build-links-test.md
│   │   ├── dedicated-representative-nodes.md
│   │   ├── deprecation-info-pending.md
│   │   ├── directory-contents.md
│   │   ├── directory-locations-all.md
│   │   ├── directory-locations-beta.md
│   │   ├── directory-locations-main.md
│   │   ├── directory-locations-test.md
│   │   ├── docker-ipv6-tip.md
│   │   ├── docker-run-command-beta.md
│   │   ├── docker-run-command-main.md
│   │   ├── docker-run-command-test.md
│   │   ├── enable-voting.md
│   │   ├── hardware-recommendations.md
│   │   ├── join-technical-mailing-list.md
│   │   ├── known-issue-macos-too-many-open-files.md
│   │   ├── known-issue-peers-stake-reporting.md
│   │   ├── known-issue-unable-to-find-libboost.md
│   │   ├── known-issue-unchecked-keys-rpc-rocksdb.md
│   │   ├── known-issue-windows-logging-stable.md
│   │   ├── network-details-simple-beta.md
│   │   ├── network-details-simple-main.md
│   │   ├── network-details-simple-test.md
│   │   ├── network-details.md
│   │   ├── release-details-v18-0.md
│   │   ├── release-details-v19-0.md
│   │   ├── release-details-v20-0.md
│   │   ├── release-details-v21-0.md
│   │   ├── release-details-v21-1.md
│   │   ├── release-details-v21-2.md
│   │   ├── release-details-v21-3.md
│   │   ├── release-details-v22-0.md
│   │   ├── release-details-v22-1.md
│   │   ├── release-details-v23-0.md
│   │   ├── release-details-v23-1.md
│   │   ├── release-details-v23-3.md
│   │   ├── release-details-v24-0.md
│   │   ├── release-details-v25-0.md
│   │   ├── release-details-v25-1.md
│   │   ├── release-details-v26-0.md
│   │   ├── release-details-v26-1.md
│   │   ├── release-details-v27-0.md
│   │   ├── release-details-v27-1.md
│   │   ├── release-details-v28-0.md
│   │   ├── release-details-v28-1.md
│   │   ├── release-details-v28-2.md
│   │   ├── release-details-v29-0.md
│   │   ├── security-vulnerability-reporting.md
│   │   ├── setup-beta-test-testing.md
│   │   ├── terms-block-transaction-transfer.md
│   │   ├── toml-config-commands.md
│   │   ├── unconfirmed-information.md
│   │   ├── warning-alternative-work-generation-setup-preferred.md
│   │   ├── warning-debug-only-command.md
│   │   ├── warning-docker-limitations.md
│   │   ├── warning-enable-control.md
│   │   ├── warning-external-libraries.md
│   │   ├── warning-includes-unconfirmed.md
│   │   ├── warning-multiple-confirmation-notifications.md
│   │   ├── warning-multiple-node-setups.md
│   │   ├── warning-node-wallet-not-for-prod-use.md
│   │   ├── warning-only-official-builds-supported.md
│   │   ├── warning-process-sub-type-recommended.md
│   │   ├── warning-security-vulnerability-reporting.md
│   │   ├── warning-telemetry-can-be-forged.md
│   │   ├── warning-unsupported-configuration.md
│   │   └── wip-living-whitepaper.md
│   ├── stylesheets/
│   │   └── extras.css
│   ├── what-is-nano/
│   │   └── overview.md
│   └── whitepaper/
│       └── english.md
├── mkdocs.yml
├── readme.md
├── requirements.txt
└── theme-overrides/
    ├── main.html
    └── partials/
        └── footer.html
Condensed preview — 172 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (875K chars).
[
  {
    "path": ".github/workflows/build.yml",
    "chars": 413,
    "preview": "name: build\non: pull_request\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@93ea57"
  },
  {
    "path": ".github/workflows/cleanup-docker-pr.yml",
    "chars": 1098,
    "preview": "name: cleanup-docker-pr\non:\n  pull_request:\n    types: [closed]\n\nenv:\n  PR_NUMBER: ${{ github.event.number }}\n  OWNER: o"
  },
  {
    "path": ".github/workflows/cleanup-docker-untagged.yml",
    "chars": 1043,
    "preview": "name: cleanup-docker-untagged\non:\n  push:\n    branches:\n      - main\n\nenv:\n  OWNER: orgs/nanocurrency\n  PACKAGE_NAME: na"
  },
  {
    "path": ".github/workflows/deploy-staging.yml",
    "chars": 443,
    "preview": "name: deploy\non:\n  push:\n    branches:\n      - staging\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n    env:\n      PRODUCT"
  },
  {
    "path": ".github/workflows/deploy.yml",
    "chars": 378,
    "preview": "name: deploy\non:\n  push:\n    branches:\n      - main\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n    env:\n      PRODUCTION"
  },
  {
    "path": ".github/workflows/publish-docker-master.yml",
    "chars": 643,
    "preview": "name: publish-docker-master\non:\n  push:\n    branches:\n      - main\n\njobs:\n  build_publish:\n    runs-on: ubuntu-latest\n  "
  },
  {
    "path": ".github/workflows/publish-docker-pr.yml",
    "chars": 697,
    "preview": "name: publish-docker-pr\non: pull_request\n\nenv:\n  PR_NUMBER: ${{ github.event.number }}\n\njobs:\n  build_publish:\n    runs-"
  },
  {
    "path": ".github/workflows/push-to-staging.yml",
    "chars": 653,
    "preview": "name: push-to-staging\non:\n  workflow_dispatch:\n    inputs:\n      branch:\n        description: \"nano-docs branch to push "
  },
  {
    "path": ".gitignore",
    "chars": 23,
    "preview": "site/\n.idea\nvenv\n.cache"
  },
  {
    "path": "Dockerfile",
    "chars": 470,
    "preview": "FROM squidfunk/mkdocs-material:9.4.10@sha256:01605a03397a654b74b9de3157f56915d1e075e2d3bd22fcf3fb82c443553c25\n\n# Set bui"
  },
  {
    "path": "docs/CNAME",
    "chars": 13,
    "preview": "docs.nano.org"
  },
  {
    "path": "docs/articles/readme.md",
    "chars": 125,
    "preview": "Please see https://github.com/nanocurrency/nano-docs/issues/555 for details the article management process and list of i"
  },
  {
    "path": "docs/commands/command-line-interface.md",
    "chars": 12709,
    "preview": "title: Command Line Interface\ndescription: Reference for the CLI commands available for the nano node\n\n# Command Line In"
  },
  {
    "path": "docs/commands/rpc-protocol.md",
    "chars": 142294,
    "preview": "title: RPC Protocol\ndescription: Reference for the RPC commands available for the Nano node\n\n# RPC Protocol\n\nThe RPC pro"
  },
  {
    "path": "docs/core-development/code-standards.md",
    "chars": 3354,
    "preview": "title: Code Standards\ndescription: Learn about the code standards expected when contributing to the nano protocol and no"
  },
  {
    "path": "docs/core-development/collaboration-process.md",
    "chars": 5394,
    "preview": "title: Collaboration Process\ndescription: Find out how the open source collaboration process works with the nano protoco"
  },
  {
    "path": "docs/core-development/developer-discussions.md",
    "chars": 9288,
    "preview": "title: Developer Discussions\ndescription: Links & notes for recurring live discussions about Nano development. Includes "
  },
  {
    "path": "docs/core-development/overview.md",
    "chars": 3163,
    "preview": "title: Core Development Overview\ndescription: All you need to know to help contribute to the core development of the nan"
  },
  {
    "path": "docs/core-development/understanding-the-code.md",
    "chars": 39681,
    "preview": "title: Understanding the code\ndescription: Learn about the nano code for better development practices\n\n# Understanding t"
  },
  {
    "path": "docs/glossary.md",
    "chars": 12276,
    "preview": "title: Glossary\ndescription: A glossary of common terms used within the nano documentation and network\n\n# Glossary\n\n####"
  },
  {
    "path": "docs/index.md",
    "chars": 2797,
    "preview": "---\r\ntitle: Home\r\ndescription: Explore the design, features, releases and other related resources for the nano protocol "
  },
  {
    "path": "docs/integration-guides/advanced.md",
    "chars": 14921,
    "preview": "title: Advanced Integration Guide\ndescription: More advanced guides to integrating with nano including cold wallets, pri"
  },
  {
    "path": "docs/integration-guides/block-confirmation-tracking.md",
    "chars": 4539,
    "preview": "title: Block Confirmation Tracking\ndescription: Guide detailing best practices for block confirmation tracking from the "
  },
  {
    "path": "docs/integration-guides/build-options.md",
    "chars": 19482,
    "preview": "title: Build Options\ndescription: Instructions for manually building the Nano node for a variety of operating systems\n\n#"
  },
  {
    "path": "docs/integration-guides/index.md",
    "chars": 8587,
    "preview": "title: Get started integrating Nano\ndescription: An introduction to the process of starting a Nano integration\n\n# Integr"
  },
  {
    "path": "docs/integration-guides/ipc-integration.md",
    "chars": 10548,
    "preview": "title: IPC Integration Guide\ndescription: Learn how to integrate with the nano node using the Interprocess Communication"
  },
  {
    "path": "docs/integration-guides/key-management.md",
    "chars": 41443,
    "preview": "title: Key Management Guide\ndescription: Learn best practices for private key management for the nano protocol\n\n# Key Ma"
  },
  {
    "path": "docs/integration-guides/the-basics.md",
    "chars": 15523,
    "preview": "title: Integration Basics Guide\ndescription: Understand some of the core details of the nano protocol including block sp"
  },
  {
    "path": "docs/integration-guides/websockets.md",
    "chars": 19765,
    "preview": "title: WebSockets Integration Guide\ndescription: Details for how to integrate with WebSockets for getting notifications "
  },
  {
    "path": "docs/integration-guides/work-generation.md",
    "chars": 17973,
    "preview": "title: Work Generation Guide\ndescription: Understand the best configurations for work generation on the nano network\n\n!!"
  },
  {
    "path": "docs/javascript/mermaid-loose-security.js",
    "chars": 105,
    "preview": "var mermaid_config = {\n\tstartOnLoad:true,\n\tsecurityLevel:'loose',\n};\n\nmermaid.initialize(mermaid_config);"
  },
  {
    "path": "docs/living-whitepaper/index.md",
    "chars": 3331,
    "preview": "title: Living Whitepaper\ndescription: Overview of the living whitepaper on the Nano protocol and existing node implement"
  },
  {
    "path": "docs/node-implementation/blocks.md",
    "chars": 1475,
    "preview": "title: Node Implementation - Blocks\ndescription: Review of block handling in the current nano node implementation\n\n# Nod"
  },
  {
    "path": "docs/node-implementation/components.md",
    "chars": 494,
    "preview": "title: Node Implementation - Components\ndescription: A breakdown of the various components making up the nano node imple"
  },
  {
    "path": "docs/node-implementation/database.md",
    "chars": 584,
    "preview": "title: Node Implementation - Database\ndescription: Learn how the ledger is managed in the various tables and backend dat"
  },
  {
    "path": "docs/node-implementation/introduction.md",
    "chars": 1308,
    "preview": "title: Node Implementation - Introduction\ndescription: An overview of the nano node implementation being developed by th"
  },
  {
    "path": "docs/node-implementation/networking.md",
    "chars": 722,
    "preview": "title: Node Implementation - Networking\ndescription: Details of networking setup design for the nano node\n\n# Node Implem"
  },
  {
    "path": "docs/node-implementation/voting.md",
    "chars": 3636,
    "preview": "title: Node Implementation - Voting\ndescription: Review the various aspects of voting and vote management in the nano no"
  },
  {
    "path": "docs/node-implementation/work.md",
    "chars": 510,
    "preview": "title: Node Implementation - Work\ndescription: Explore how work generation and management has been implemented in the na"
  },
  {
    "path": "docs/protocol-design/attack-vectors.md",
    "chars": 9426,
    "preview": "title: Protocol Design - Attack Vectors\ndescription: Understand the different attack vectors on the nano network and the"
  },
  {
    "path": "docs/protocol-design/blocks.md",
    "chars": 8610,
    "preview": "title: Protocol Design - Blocks\ndescription: Tour the unique design and structure of blocks in the nano protocol\n\n# Prot"
  },
  {
    "path": "docs/protocol-design/distribution-and-units.md",
    "chars": 3523,
    "preview": "title: Protocol Design - Distribution and Units\ndescription: Review the breakdown of divisibility, distribution and unit"
  },
  {
    "path": "docs/protocol-design/introduction.md",
    "chars": 9681,
    "preview": "title: Protocol Design Introduction\ndescription: As the beginning of the living whitepaper, get details and background o"
  },
  {
    "path": "docs/protocol-design/ledger.md",
    "chars": 7699,
    "preview": "title: Protocol Design - Ledger\ndescription: Explore the structure of the ledger in nano including accounts, blocks and "
  },
  {
    "path": "docs/protocol-design/networking.md",
    "chars": 3178,
    "preview": "title: Protocol Design - Networking\ndescription: Details of networking setup design for nano protocol\n\n# Protocol Design"
  },
  {
    "path": "docs/protocol-design/orv-consensus.md",
    "chars": 7755,
    "preview": "title: Protocol Design - ORV Consensus\ndescription: Take a deep dive into the unique, gossip-based algorithm used by nan"
  },
  {
    "path": "docs/protocol-design/resource-usage.md",
    "chars": 819,
    "preview": "title: Protocol Design - Resource Usage\ndescription: Find out the expected resource usage for the nano procotol across n"
  },
  {
    "path": "docs/protocol-design/signing-hashing-and-key-derivation.md",
    "chars": 1665,
    "preview": "title: Protocol Design - Signing, Hashing and Key Derivation\ndescription: All about the methods for signing messages, ha"
  },
  {
    "path": "docs/protocol-design/spam-work-and-prioritization.md",
    "chars": 22946,
    "preview": "title: Protocol Design - Spam, Work, & Prioritization\ndescription: Learn how Nano fights spam using balance-bucket trans"
  },
  {
    "path": "docs/releases/network-upgrades.md",
    "chars": 18872,
    "preview": "title: Network Upgrades\ndescription: Check out the various types of network upgrades available on the nano network and e"
  },
  {
    "path": "docs/releases/node-releases.md",
    "chars": 11343,
    "preview": "title: Node Releases\ndescription: Explore details of the current, next and past releases of the nano node, including pro"
  },
  {
    "path": "docs/releases/release-v19-0.md",
    "chars": 12034,
    "preview": "title: Release notes - V19.0 nano node\ndescription: Details of the V19.0 nano node release including upgrade notices, ma"
  },
  {
    "path": "docs/releases/release-v20-0.md",
    "chars": 13280,
    "preview": "title: Release notes - V20.0 nano node\ndescription: Details of the V20.0 nano node release including upgrade notices, ma"
  },
  {
    "path": "docs/releases/release-v21-0.md",
    "chars": 13751,
    "preview": "title: Release notes - V21.0 nano node\ndescription: Details of the V21.0 nano node release including upgrade notices, ma"
  },
  {
    "path": "docs/releases/release-v21-1.md",
    "chars": 359,
    "preview": "title: Release notes - V21.1 nano node\ndescription: Details of the V21.1 nano node release including upgrade notices, ma"
  },
  {
    "path": "docs/releases/release-v21-2.md",
    "chars": 359,
    "preview": "title: Release notes - V21.2 nano node\ndescription: Details of the V21.2 nano node release including upgrade notices, ma"
  },
  {
    "path": "docs/releases/release-v21-3.md",
    "chars": 510,
    "preview": "title: Release notes - V21.3 nano node\ndescription: Details of the V21.3 nano node release including upgrade notices, ma"
  },
  {
    "path": "docs/releases/release-v22-0.md",
    "chars": 11162,
    "preview": "title: Release notes - V22.0 nano node\ndescription: Details of the V22.0 nano node release including upgrade notices, ma"
  },
  {
    "path": "docs/releases/release-v22-1.md",
    "chars": 831,
    "preview": "title: Release notes - V22.1 nano node\ndescription: Details of the V22.1 nano node release including upgrade notices and"
  },
  {
    "path": "docs/releases/release-v23-0.md",
    "chars": 6571,
    "preview": "title: Release notes - V23.0 nano node\ndescription: Details of the V23.0 nano node release including upgrade notices, ma"
  },
  {
    "path": "docs/releases/release-v23-1.md",
    "chars": 1021,
    "preview": "title: Release notes - V23.1 nano node\ndescription: Details of the V23.1 nano node release including upgrade notices and"
  },
  {
    "path": "docs/releases/release-v23-3.md",
    "chars": 1672,
    "preview": "title: Release notes - V23.3 nano node\ndescription: Details of the V23.3 nano node release including upgrade notices and"
  },
  {
    "path": "docs/releases/release-v24-0.md",
    "chars": 9435,
    "preview": "title: Release notes - V24.0 nano node\ndescription: Details of the V24.0 nano node release including upgrade notices, ma"
  },
  {
    "path": "docs/releases/release-v25-0.md",
    "chars": 5919,
    "preview": "title: Release notes - V25.0 nano node\ndescription: Details of the V25.0 nano node release including upgrade notices, ma"
  },
  {
    "path": "docs/releases/release-v25-1.md",
    "chars": 707,
    "preview": "title: Release notes - V25.1 nano node\ndescription: Details of the V25.1 nano node release including upgrade notices.\n\n#"
  },
  {
    "path": "docs/releases/release-v26-0.md",
    "chars": 179,
    "preview": "title: Release notes - V26.0 nano node\ndescription: Details of the V26.0 nano node release.\n\n# V26.0\n\n--8<-- \"release-de"
  },
  {
    "path": "docs/releases/release-v26-1.md",
    "chars": 195,
    "preview": "title: Release notes - V26.1 nano node\ndescription: Details of the V26.1 nano node.\n\n# V26.1\n\n--8<-- \"release-details-v2"
  },
  {
    "path": "docs/releases/release-v27-0.md",
    "chars": 3616,
    "preview": "title: Release notes - V27.0 nano node\ndescription: Details of the V27.0 nano node release.\n\n# V27.0\n\n--8<-- \"release-de"
  },
  {
    "path": "docs/releases/release-v27-1.md",
    "chars": 1567,
    "preview": "title: Release notes - V27.1 nano node\ndescription: Details of the V27.1 nano node release.\n\n# V27.1\n\n--8<-- \"release-de"
  },
  {
    "path": "docs/releases/release-v28-0.md",
    "chars": 6152,
    "preview": "title: Release notes - V28.0 nano node\ndescription: Details of the V28.0 nano node release.\n\n# V28.0\n\n--8<-- \"release-de"
  },
  {
    "path": "docs/releases/release-v28-1.md",
    "chars": 946,
    "preview": "title: Release notes - V28.1 nano node\ndescription: Details of the V28.1 nano node release.\n\n# V28.1\n\n--8<-- \"release-de"
  },
  {
    "path": "docs/releases/release-v28-2.md",
    "chars": 1478,
    "preview": "title: Release notes - V28.2 nano node\ndescription: Details of the V28.2 nano node release.\n\n# V28.2\n\n--8<-- \"release-de"
  },
  {
    "path": "docs/releases/roadmap.md",
    "chars": 411,
    "preview": "title: Roadmap\ndescription: The Nano roadmap which is aimed at achieving the mission of allowing Nano to become a global"
  },
  {
    "path": "docs/running-a-node/advanced-monitoring.md",
    "chars": 5345,
    "preview": "title: Advanced Monitoring\ndescription: Learn how to install advanced monitoring to keep an eye on your nano node using "
  },
  {
    "path": "docs/running-a-node/beta-network.md",
    "chars": 6738,
    "preview": "title: Beta Network\ndescription: Find out how to join the nano community in testing the latest nano node and protocol fe"
  },
  {
    "path": "docs/running-a-node/beyond-the-node.md",
    "chars": 1303,
    "preview": "title: Beyond the node\ndescription: Explore other tools, services, education and inspiration available after getting you"
  },
  {
    "path": "docs/running-a-node/configuration.md",
    "chars": 16305,
    "preview": "title: Node Configuration\ndescription: Dig into the most popular configuration options to help your nano node work the b"
  },
  {
    "path": "docs/running-a-node/docker-management.md",
    "chars": 8724,
    "preview": "title: Docker Management\ndescription: Learn how to use Docker to manage your nano node - starting, stopping, upgrading, "
  },
  {
    "path": "docs/running-a-node/ledger-management.md",
    "chars": 13773,
    "preview": "title: Ledger Management\ndescription: Learn various aspects of properly managing your nano node's ledger file including "
  },
  {
    "path": "docs/running-a-node/logging-tracing.md",
    "chars": 6717,
    "preview": "# Nano Node Logging Documentation\n\n## Introduction \n\nThis documentation covers the logging facilities of the Nano Node, "
  },
  {
    "path": "docs/running-a-node/node-setup.md",
    "chars": 15755,
    "preview": "title: Node Setup\ndescription: Get the basic recommendations and instructions for setting up a nano node to participate "
  },
  {
    "path": "docs/running-a-node/overview.md",
    "chars": 5098,
    "preview": "title: Running a Node Overview\ndescription: Understand the purpose for running a nano node, the different types of nodes"
  },
  {
    "path": "docs/running-a-node/security.md",
    "chars": 5646,
    "preview": "title: Node Security\ndescription: Information about how to properly secure your nano node when getting setup on the netw"
  },
  {
    "path": "docs/running-a-node/test-network.md",
    "chars": 3394,
    "preview": "title: Test Network\ndescription: Find out how to get a nano node setup on the test network for general integration and n"
  },
  {
    "path": "docs/running-a-node/troubleshooting.md",
    "chars": 20792,
    "preview": "title: Troubleshooting\ndescription: Find answers for common issues nano node operators run as well as methods for gettin"
  },
  {
    "path": "docs/running-a-node/voting-as-a-representative.md",
    "chars": 6399,
    "preview": "title: Voting as a Representative\ndescription: A comprehensive guide for getting your nano node to participate in consen"
  },
  {
    "path": "docs/running-a-node/wallet-setup.md",
    "chars": 11646,
    "preview": "title: Wallet Setup\ndescription: Learn how to setup a nano wallet with your node\n\n# Wallet Setup\n\nIn order to transact o"
  },
  {
    "path": "docs/snippets/community-links.md",
    "chars": 497,
    "preview": "!!! note \"\"\n\t[Nano.org](https://nano.org) | [Forum](https://forum.nano.org) | [GitHub](https://github.com/nanocurrency) "
  },
  {
    "path": "docs/snippets/config-node-option-node-enable-voting-true.md",
    "chars": 435,
    "preview": "#### node.enable_voting\nNewly setup nodes have voting disabled by default. In order to participate in network consensus,"
  },
  {
    "path": "docs/snippets/config-node-option-rpc-enable-control-false.md",
    "chars": 383,
    "preview": "In the [`config-rpc.toml`](../running-a-node/configuration.md#configuration-file-locations) file, you can disable the co"
  },
  {
    "path": "docs/snippets/config-node-option-rpc-enable-control-true.md",
    "chars": 611,
    "preview": "This configuration option, which is needed for certain sensitive RPC calls such as those for creating wallets and accoun"
  },
  {
    "path": "docs/snippets/config-node-option-rpc-enable-true.md",
    "chars": 247,
    "preview": "#### rpc.enable\nTo enable communication via RPC, set this configuration option in the [`config-node.toml`](../running-a-"
  },
  {
    "path": "docs/snippets/contributing-code.md",
    "chars": 235,
    "preview": "!!! tip \"Contributing to the code\"\n\tIf you are interested in helping develop the C++ based Nano node we will help you ou"
  },
  {
    "path": "docs/snippets/current-build-links-all.md",
    "chars": 184,
    "preview": "=== \"Test network\"\n\n    --8<-- \"current-build-links-test.md\"\n\n=== \"Main network\"\n\n    --8<-- \"current-build-links-main.m"
  },
  {
    "path": "docs/snippets/current-build-links-beta.md",
    "chars": 129,
    "preview": "Join the [nano Discord server](https://chat.nano.org) and head to the `#beta-announcements` channel for the latest build"
  },
  {
    "path": "docs/snippets/current-build-links-main.md",
    "chars": 2674,
    "preview": "| OS                  | Download link/command                                                                           "
  },
  {
    "path": "docs/snippets/current-build-links-test.md",
    "chars": 877,
    "preview": "| OS                  | Download link/command                                            |\n|---------------------|------"
  },
  {
    "path": "docs/snippets/dedicated-representative-nodes.md",
    "chars": 397,
    "preview": "!!! tip \"Dedicated Representative nodes recommended\"\n\tDue to the resources needed to participate in the voting process, "
  },
  {
    "path": "docs/snippets/deprecation-info-pending.md",
    "chars": 291,
    "preview": "!!! info \"\"\n\tThe term `pending` was deprecated in favor of [`receivable`](/glossary/#receivable). For compatibility reas"
  },
  {
    "path": "docs/snippets/directory-contents.md",
    "chars": 729,
    "preview": "The Nano directory contains:\n\n- Node wallet files (`wallets.ldb`, `wallets.ldb-lock`)\n- [Configuration files](../running"
  },
  {
    "path": "docs/snippets/directory-locations-all.md",
    "chars": 184,
    "preview": "=== \"Test network\"\n\n    --8<-- \"directory-locations-test.md\"\n\n=== \"Main network\"\n\n    --8<-- \"directory-locations-main.m"
  },
  {
    "path": "docs/snippets/directory-locations-beta.md",
    "chars": 360,
    "preview": "| **OS**         | **Location** |\n|----------------|--------------|\n| Windows        | `C:\\Users\\<user>\\AppData\\Local\\Na"
  },
  {
    "path": "docs/snippets/directory-locations-main.md",
    "chars": 345,
    "preview": "| **OS/Build**   | **Location** |\n|----------------|--------------|\n| Windows        | `C:\\Users\\<user>\\AppData\\Local\\Na"
  },
  {
    "path": "docs/snippets/directory-locations-test.md",
    "chars": 360,
    "preview": "| **OS**         | **Location** |\n|----------------|--------------|\n| Windows        | `C:\\Users\\<user>\\AppData\\Local\\Na"
  },
  {
    "path": "docs/snippets/docker-ipv6-tip.md",
    "chars": 125,
    "preview": "!!! tip\n\tOn some systems it may be necessary to replace `127.0.0.1` with IPv6 equivalent of `[::1]` when mapping Docker "
  },
  {
    "path": "docs/snippets/docker-run-command-beta.md",
    "chars": 440,
    "preview": "``` { .bash .annotate }\ndocker run --restart=unless-stopped -d \\\n  -p 54000:54000 \\\n  -p 127.0.0.1:55000:55000 \\ # (1)\n "
  },
  {
    "path": "docs/snippets/docker-run-command-main.md",
    "chars": 427,
    "preview": "``` { .bash .annotate }\ndocker run --restart=unless-stopped -d \\\n  -p 7075:7075 \\\n  -p 127.0.0.1:7076:7076 \\ # (1)\n  -p "
  },
  {
    "path": "docs/snippets/docker-run-command-test.md",
    "chars": 440,
    "preview": "``` { .bash .annotate }\ndocker run --restart=unless-stopped -d \\\n  -p 17075:17075 \\\n  -p 127.0.0.1:17076:17076 \\ # (1)\n "
  },
  {
    "path": "docs/snippets/enable-voting.md",
    "chars": 284,
    "preview": "!!! tip \"Enable Voting\"\n\tWhen setting up a new node, voting is disabled by default in the configuration file and must be"
  },
  {
    "path": "docs/snippets/hardware-recommendations.md",
    "chars": 1570,
    "preview": "### Principal Representative Nodes\nThe following are minimum recommended specifications for nodes with more than 0.1% of"
  },
  {
    "path": "docs/snippets/join-technical-mailing-list.md",
    "chars": 815,
    "preview": "!!! info \"\"\n\t<div style=\"display:flex;\">\n\t\t<div style=\"padding-right: 10px;\">\n\t\t\t<a href=\"http://eepurl.com/gZucL1\" targ"
  },
  {
    "path": "docs/snippets/known-issue-macos-too-many-open-files.md",
    "chars": 731,
    "preview": "??? info \"Known Issue V19+: 'Too many open files'\"\n\n    * **Issue:** The following error, or a similar one, can be seen "
  },
  {
    "path": "docs/snippets/known-issue-peers-stake-reporting.md",
    "chars": 867,
    "preview": "??? warning \"Known Issue V20: Peers stake reporting inaccurate (Windows only)\"\n\n    * **Issue:** For Windows builds only"
  },
  {
    "path": "docs/snippets/known-issue-unable-to-find-libboost.md",
    "chars": 408,
    "preview": "??? warning \"Known Issue Linux V21: 'unable to find libboost'\"\n\tIf you are on Linux and unable to get V21.0 to start, `u"
  },
  {
    "path": "docs/snippets/known-issue-unchecked-keys-rpc-rocksdb.md",
    "chars": 369,
    "preview": "???info \"Known issue with RocksDB: RPC `unchecked_keys` not working properly\"\n    **Issue:** The RPC `unchecked_keys` is"
  },
  {
    "path": "docs/snippets/known-issue-windows-logging-stable.md",
    "chars": 281,
    "preview": "??? warning \"Known Issue Windows V21: Crash when using config `node.logging.stable_log_filename`\"\r\n\tSetting `node.loggin"
  },
  {
    "path": "docs/snippets/network-details-simple-beta.md",
    "chars": 836,
    "preview": "| Port | Protocol | Required?   | Purpose |\n|-------------|----------|------------------|---------|\n| 54000       | TCP "
  },
  {
    "path": "docs/snippets/network-details-simple-main.md",
    "chars": 832,
    "preview": "| Port | Protocol | Required?   | Purpose |\n|-------------|----------|------------------|---------|\n| 7075       | TCP  "
  },
  {
    "path": "docs/snippets/network-details-simple-test.md",
    "chars": 836,
    "preview": "| Port | Protocol | Required?   | Purpose |\n|-------------|----------|------------------|---------|\n| 17075       | TCP "
  },
  {
    "path": "docs/snippets/network-details.md",
    "chars": 1834,
    "preview": "## Network Details\n\n| Port | Type | Default  | Details |\n|      |      |          |         |\n| 7075 | TCP  | Enabled  |"
  },
  {
    "path": "docs/snippets/release-details-v18-0.md",
    "chars": 391,
    "preview": "| Node | Protocol | Database | Release Date | Release Notes | GitHub Links | \n|      |          |          |            "
  },
  {
    "path": "docs/snippets/release-details-v19-0.md",
    "chars": 496,
    "preview": "| Node | Protocol | Database | Release Date | Release Notes | GitHub Links | \n|      |          |          |            "
  },
  {
    "path": "docs/snippets/release-details-v20-0.md",
    "chars": 544,
    "preview": "| Node | Protocol | Database | Release Date | Release Notes | GitHub Links | \n|      |          |          |            "
  },
  {
    "path": "docs/snippets/release-details-v21-0.md",
    "chars": 594,
    "preview": "| Node | Protocol | Database | Release Date | Release Notes | GitHub Links | \n|      |          |          |            "
  },
  {
    "path": "docs/snippets/release-details-v21-1.md",
    "chars": 580,
    "preview": "| Node | Protocol | Database | Release Date | Release Notes | GitHub Links | \n|      |          |          |            "
  },
  {
    "path": "docs/snippets/release-details-v21-2.md",
    "chars": 532,
    "preview": "| Node | Protocol | Database | Release Date | Release Notes | GitHub Links | \n|      |          |          |            "
  },
  {
    "path": "docs/snippets/release-details-v21-3.md",
    "chars": 532,
    "preview": "| Node | Protocol | Database | Release Date | Release Notes | GitHub Links | \n|      |          |          |            "
  },
  {
    "path": "docs/snippets/release-details-v22-0.md",
    "chars": 576,
    "preview": "| Node | Protocol | Database | Release Date | Release Notes | GitHub Links | \n|      |          |          |            "
  },
  {
    "path": "docs/snippets/release-details-v22-1.md",
    "chars": 461,
    "preview": "| Node | Protocol | Database | Release Date | Release Notes | GitHub Links | \n|      |          |          |            "
  },
  {
    "path": "docs/snippets/release-details-v23-0.md",
    "chars": 516,
    "preview": "| Node | Protocol | Database | Release Date | Release Notes | GitHub Links | \n|      |          |          |            "
  },
  {
    "path": "docs/snippets/release-details-v23-1.md",
    "chars": 518,
    "preview": "| Node | Protocol | Database | Release Date | Release Notes | GitHub Links | \n|      |          |          |            "
  },
  {
    "path": "docs/snippets/release-details-v23-3.md",
    "chars": 448,
    "preview": "| Node | Protocol | Database | Release Date | Release Notes | GitHub Links | \n|      |          |          |            "
  },
  {
    "path": "docs/snippets/release-details-v24-0.md",
    "chars": 534,
    "preview": "| Node | Protocol | Database | Release Date | Release Notes | GitHub Links | \n|      |          |          |            "
  },
  {
    "path": "docs/snippets/release-details-v25-0.md",
    "chars": 542,
    "preview": "| Node | Protocol | Database | Release Date | Release Notes | GitHub Links | \n|      |          |          |            "
  },
  {
    "path": "docs/snippets/release-details-v25-1.md",
    "chars": 472,
    "preview": "| Node | Protocol | Database | Release Date | Release Notes | GitHub Links | \n|      |          |          |            "
  },
  {
    "path": "docs/snippets/release-details-v26-0.md",
    "chars": 542,
    "preview": "| Node | Protocol | Database | Release Date | Release Notes | GitHub Links | \n|      |          |          |            "
  },
  {
    "path": "docs/snippets/release-details-v26-1.md",
    "chars": 485,
    "preview": "| Node | Protocol | Database | Release Date | Release Notes | GitHub Links | \n|      |          |          |            "
  },
  {
    "path": "docs/snippets/release-details-v27-0.md",
    "chars": 473,
    "preview": "| Node | Protocol | Database | Release Date | Release Notes | GitHub Links |\n|      |          |          |             "
  },
  {
    "path": "docs/snippets/release-details-v27-1.md",
    "chars": 420,
    "preview": "| Node | Protocol | Database | Release Date | Release Notes | GitHub Links |\n|      |          |          |             "
  },
  {
    "path": "docs/snippets/release-details-v28-0.md",
    "chars": 463,
    "preview": "| Node | Protocol | Database | Release Date | Release Notes | GitHub Links |\n|      |          |          |             "
  },
  {
    "path": "docs/snippets/release-details-v28-1.md",
    "chars": 393,
    "preview": "| Node | Protocol | Database | Release Date | Release Notes | GitHub Links |\n|      |          |          |             "
  },
  {
    "path": "docs/snippets/release-details-v28-2.md",
    "chars": 393,
    "preview": "| Node | Protocol | Database | Release Date | Release Notes | GitHub Links |\n|      |          |          |             "
  },
  {
    "path": "docs/snippets/release-details-v29-0.md",
    "chars": 250,
    "preview": "| Node | Protocol | Database | Release Date | Release Notes | GitHub Links |\n|      |          |          |             "
  },
  {
    "path": "docs/snippets/security-vulnerability-reporting.md",
    "chars": 900,
    "preview": "!!! warning \"Submit vulnerabilities privately\"\n\t**Do NOT discuss potential security vulnerabilities on the issue tracker"
  },
  {
    "path": "docs/snippets/setup-beta-test-testing.md",
    "chars": 478,
    "preview": "!!! info \"Setup for testing on beta or test network\"\n\tIf you are looking to test the latest version of the node ahead of"
  },
  {
    "path": "docs/snippets/terms-block-transaction-transfer.md",
    "chars": 410,
    "preview": "* **block** is the digital encoding of the transaction details.\n\n* **transaction** is the action of creating and publish"
  },
  {
    "path": "docs/snippets/toml-config-commands.md",
    "chars": 588,
    "preview": "| **Name**  | **Description** | **Generated or updated with** |\n|---------|--------------|--------------|\n| `config-node"
  },
  {
    "path": "docs/snippets/unconfirmed-information.md",
    "chars": 209,
    "preview": "!!! info \"Unconfirmed information\"\n\tThis call returns information that may be based on unconfirmed blocks. These details"
  },
  {
    "path": "docs/snippets/warning-alternative-work-generation-setup-preferred.md",
    "chars": 359,
    "preview": "!!! warning \"Alternative work generation setup preferred\"\n\tDue to potential performance impacts to nodes participating o"
  },
  {
    "path": "docs/snippets/warning-debug-only-command.md",
    "chars": 175,
    "preview": "!!! warning \"Debug purposes only\"\n\tThis call is for internal diagnostics/debug purposes only. Do not rely on this interf"
  },
  {
    "path": "docs/snippets/warning-docker-limitations.md",
    "chars": 513,
    "preview": "!!! warning \"Docker Limitations\"\n\tAlthough Docker is a great choice for many setups, it is not recommended to run a \\*ni"
  },
  {
    "path": "docs/snippets/warning-enable-control.md",
    "chars": 541,
    "preview": "!!! danger \"Dangerous RPC calls controlled by `enable_control`\"\n\tThis RPC command/option requires `enable_control` to be"
  },
  {
    "path": "docs/snippets/warning-external-libraries.md",
    "chars": 335,
    "preview": "!!! warning \"External libraries, review before using\"\n    The linked resources below contain code dealing with private k"
  },
  {
    "path": "docs/snippets/warning-includes-unconfirmed.md",
    "chars": 223,
    "preview": "!!! warning \"Includes unconfirmed blocks\"\n\tThis call may return results that include unconfirmed blocks, so it should no"
  },
  {
    "path": "docs/snippets/warning-multiple-confirmation-notifications.md",
    "chars": 374,
    "preview": "!!! warning \"Multiple notifications for blocks\"\n    Depending on the node setup and sync status, multiple confirmation n"
  },
  {
    "path": "docs/snippets/warning-multiple-node-setups.md",
    "chars": 687,
    "preview": "!!! warning \"Warning - Multiple Node Setups\"\n\t**Never** use the same seed on multiple running nano node instances at the"
  },
  {
    "path": "docs/snippets/warning-node-wallet-not-for-prod-use.md",
    "chars": 188,
    "preview": "!!! warning \"Node wallet not for production use\"\n\tThe node wallet is not supported for use in production environments. U"
  },
  {
    "path": "docs/snippets/warning-only-official-builds-supported.md",
    "chars": 404,
    "preview": "!!! warning \"Only Official Builds Supported\"\n\t* The fastest and most recommended method of installation is through [Dock"
  },
  {
    "path": "docs/snippets/warning-process-sub-type-recommended.md",
    "chars": 316,
    "preview": "!!! warning \"Including `subtype` in `process` RPC calls highly recommended\"\n\tIn order to avoid potential incorrect sends"
  },
  {
    "path": "docs/snippets/warning-security-vulnerability-reporting.md",
    "chars": 900,
    "preview": "!!! warning \"Submit vulnerabilities privately\"\n\t**Do NOT discuss potential security vulnerabilities on the issue tracker"
  },
  {
    "path": "docs/snippets/warning-telemetry-can-be-forged.md",
    "chars": 379,
    "preview": "!!! warning \"Telemetry can be forged\"\n\tAlthough the telemetry messages are signed by nodes, the data provided by other p"
  },
  {
    "path": "docs/snippets/warning-unsupported-configuration.md",
    "chars": 520,
    "preview": "!!! warning \"Unsupported configuration\"\n\t* This documentation is intended only for developers of the Nano Node software,"
  },
  {
    "path": "docs/snippets/wip-living-whitepaper.md",
    "chars": 797,
    "preview": "??? info \"Part of work in progress Living Whitepaper\"\n\tThis page is part of the Living Whitepaper revisions currently un"
  },
  {
    "path": "docs/stylesheets/extras.css",
    "chars": 5238,
    "preview": "\n[data-md-color-scheme=\"nano\"] {\n  --md-primary-fg-color:        #4a90e2;\n  --md-primary-fg-color--light: #F4FAFF;\n  --m"
  },
  {
    "path": "docs/what-is-nano/overview.md",
    "chars": 5282,
    "preview": "---\ntitle: What is nano?\ndescription: A broad introduction to nano - the instant, fee-less and eco-friendly digital mone"
  },
  {
    "path": "docs/whitepaper/english.md",
    "chars": 37743,
    "preview": "title: Original RaiBlocks/Nano Whitepaper\ndescription: An HTML-based version of the original RaiBlocks/nano whitepaper l"
  },
  {
    "path": "mkdocs.yml",
    "chars": 8379,
    "preview": "site_name: Nano Documentation\nsite_url: https://docs.nano.org/\ntheme:\n  name: 'material'\n  palette:\n    - scheme: nano\n "
  },
  {
    "path": "readme.md",
    "chars": 6389,
    "preview": "# Nano Protocol Documentation\n\n`nano-docs` is the source code for the Nano protocol documentation and is built using [Mk"
  },
  {
    "path": "requirements.txt",
    "chars": 118,
    "preview": "# Direct dependencies\nmkdocs>=1.5\nmkdocs-material[imaging]>=9.4\nmkdocs-material-extensions>=1.3\nmkdocs-redirects>=1.2\n"
  },
  {
    "path": "theme-overrides/main.html",
    "chars": 1102,
    "preview": "{% extends \"base.html\" %}\n\n{% block extrahead %}\n  <!-- Extra Twitter Card data (other data comes from MKDocs Material S"
  },
  {
    "path": "theme-overrides/partials/footer.html",
    "chars": 2609,
    "preview": "<!-- Application footer -->\n<footer class=\"md-footer\">\n\n  <!-- Link to previous and/or next page -->\n  {% if page.previo"
  }
]

// ... and 1 more files (download for full content)

About this extraction

This page contains the full source code of the nanocurrency/nano-docs GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 172 files (815.0 KB), approximately 221.3k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!