How to mine Waves (Windows)

13 Jul 2016

Waves is a decentralized crypto platform, based on an improved authenticated dynamic dictionaries scalability approach being built on top of the Scorex framework. The total supply of Waves tokens is 100 million, which were issued on the genesis block and distributed to users that participated in the ICO and/or bounty campaign. This token supply does not increase. Instead, a combination of DPOS (Delegated Proof of Stake) and LPOS (Leased Proof of Stake) approaches will be implemented with the transaction fees being the reward for staking. Learn more about Waves

In a Leased Proof of Stake environment, users can choose to be a full node and use the mining power of other users to process transactions faster and more efficiency or to lease their mining power to a full node in order to receive transaction fees without having to run a full node. This system allows anyone to participate in the Waves network maintenance.  

Waves can be mined through leasing on any computer or mobile device that has an internet browser since Waves provides a lite client solution that does not require "Miners", that are leasing their balance to store the whole Blockchain or to have the wallet running.

The leasing function is active and has been added to the lite client!

In the first part of the guide, we're going to show you how to lease your balance. (Windows)

We assume you already have a wallet address and are using the Waves Lite client. If you're not, you can install it here or use the browser version here. You'll need to have the Waves client installed in order to start leasing.

In order to lease your balance, you need a full node to lease to. You can choose between, Wavesnode.comWavesGo, FountainPerpetuaBearWaves, WavesCommunityNode, WavesPool and LeasingWaves at the moment, although more pools will be available in the future.

How to Lease your Waves (Video)

Part 1 - Lease your Waves

Step 1: Open the Waves Client
Step 2: Enter your wallet seed/password and click "Log in"

Step 3: Go to the leasing tab by clicking the "L" icon

Step 4: Enter the Waves address you want to lease to. We're using the address from WavesGo node

Step 5: Enter the number of Waves tokens you want to lend

Step 6: Choose your fee which will determine the speed of the transaction

Step 7: Lastly, click "Lease"

Step 8: Check the details and click "Confirm"

You can see the transaction by scrolling down



Part 3 - Unlease Waves

Step 1: To unlease your balance, click "Options" icon on the transaction history as seen below

Step 2: Choose "Cancel Leasing"

Step 3: Check the details and click "Confirm"

You can see the transaction by scrolling down

In this second part guide we are going to show you how to host a full node. You need to have at least 10000 Waves in your wallet. (Windows)

(In this guide we refer to the staking or forging process as mining. Although there is no Proof of Work mining involved in the Waves Platform, mining is a common term used by the cryptocurrency community, one that is more known than forging or staking. Be aware, however, that when you're "mining" Waves, you will not receive newly issued coins. Instead, the profits come from transaction fees within the network)

Part 1 -  Install Java SE Runtime Environment (JRE)

The first thing we need to do is to install JRE 1.8 in order for Waves to function properly.

Step 1: Click here to download the Java SE Runtime Environment (JRE) 1.8
Step 2: Click "Accept License Agreement" and choose the option that best fits your operative system.

Step 3: Run the Installer

You must add a line ;JAVA_HOME/bin to your existing PATH environment variable to access the JRE from the command line. We are going to show you how to do so in Windows 10. If you're using another Operative System check here.


Step 4: Right click the "Computer" Icon and click "Properties".

Step 5: Choose "Advanced system settings"

Step 6: Click "Environment Variables"

Step 7: To add a line in the PATH variable, click "PATH(1) and then click "Edit"

Step 8: Go to the end of the variable value and type "JAVA_HOME/bin" then click "OK"

Step 9: Click "OK" on all windows to save

Part 2 - Download and Configure Waves

Now we need to download the latest version of waves.jar and the required configuration file to any folder, for example C:/waves.

Step 1: Click here to see all the Waves releases and download the latest version of waves.jar (currently v0.6.4)

Step 2: You will also need to download the required configuration file for the mainnet which can be found here
Step 3: Open the waves-mainnet.conf file with advanced text editor. We are going to use notepad but advise you to use notepad++

Step 4: Configure the .conf file. This is the tricky part. It is advisable that you read the official github guide

In the end, your configuration file should look something like this:

# Waves Node settings section.
waves {
  # Node base directory.
  directory = ${user.home}"/waves"

  # Application logging level. Could be DEBUG | INFO | WARN | ERROR. The default value is INFO.
  logging-level = INFO

  # P2P Network settings.
  network {
    # Peers and blacklist storage file.
    file = ${}"/data/peers.dat"

    # Network address.
    bind-address = ""

    # Port number.
    port = 6863

    # Node name to send during a handshake. Comment this string out to set random node name.
    #node-name = "some-node-name"

    # String with IP address and port to send as an external address during a handshake. Could be set automatically in case of UPnP is enabled.
    declared-address = ""

    # A nonce to send during a handshake. Should be different if few nodes run on the same external IP address. Comment this out to set random nonce.
    #nonce = 0

    # List of IP addresses of well-known nodes.
    known-peers = ["", "", "", ""]

    # Restricts node communication to local machine.
    local-only = no

    # How long the information about peer stays in the database after the last communication with it.
    peers-data-residence-time = 1d

    # For how long a peer stays in the blacklist after getting in it.
    black-list-residence-time = 10m

    # A number of network connections handled simultaneously.
    max-connections = 30

    # Timeout on network communications with peers.
    connection-timeout = 30s

    # Network buffer size.
    outbound-buffer-size = 16M

    # The minimal ephemeral port number used to distinguish incoming connections.
    min-ephemeral-port-number = 35368

    # The size of a circular buffer to store unverified peers.
    max-unverified-peers = 1000

    # The period of time between broadcasts of the connected peers' list.
    peers-broadcast-interval = 2m

    # The number of incorrect packets received from a peer to blacklist it.
    black-list-threshold = 50

    # The number of unrequested packets received from a peer to blacklist the peer.
    unrequested-packets-threshold = 100

    # UPnP settings.
    upnp {
      # Enable or disable UPnP tunnel creation. Use this setting only if your router/gateway supports it. This is useful only if your node is running in a home network. And completely unuseful if your node is in the cloud.
      enable = no

      # UPnP timeouts.
      gateway-timeout = 7s
      discover-timeout = 3s

  # Wallet settings.
  wallet {
    # The path to wallet file.
    file = ${}"/wallet/wallet.dat"

    # Password to protect wallet file.
    password = "some string as password"

    # Wallet seed as a BASE58 string.
    seed = ""

  # Blockchain settings.
  blockchain {
    # The path to blockchain file.
    file = ${}"/data/blockchain.dat"

    # Blockchain type. Could be TESTNET | MAINNET | CUSTOM. The default value is TESTNET.
    type = TESTNET

    # The 'custom' section should be uncommented and set only in case of CUSTOM blockchain type is selected. It's impossible to overwrite predefined 'testnet' and 'mainnet' configurations.
    #    custom {
    #      # Address feature character. Used to prevent mixin up addresses from different networks.
    #      address-scheme-character = "C"
    #      # Timestamps/heights of activation/deactivation of different funcions.
    #      functionality {
    #        allow-temporary-negative-until = 0
    #        allow-invalid-payment-transactions-by-timestamp = 0
    #        require-sorted-transactions-after = 0
    #        generation-balance-depth-from-50-to-1000-after-height = 0
    #        minimal-generating-balance-after = 0
    #        allow-transactions-from-future-until = 0
    #        allow-unissued-assets-until = 0
    #        allow-burn-transaction-after = 0
    #        require-payment-unique-id-after = 0
    #        allow-exchange-transaction-after: 0
    #        allow-createalias-transaction-after: 0
    #      }
    #      # List of genesis transactions
    #      genesis {
    #        # Timestamp of genesis block and transactions in it
    #        timestamp = 1460678400000
    #        # Genesis block signature
    #        signature = "BASE58BLOCKSIGNATURE"
    #        # Initial balance in smallest units
    #        initial-balance = 100000000000000
    #        # Initial base target
    #        initial-base-target =153722867
    #        # Average delay between blocks
    #        average-block-delay = 60s
    #        # List of genesis transactions
    #        transactions = [
    #          {recipient = "BASE58ADDRESS1", amount = 50000000000000},
    #          {recipient = "BASE58ADDRESS2", amount = 50000000000000}
    #        ]
    #      }
    #    }

  # Checkpoints settings.
  checkpoints {
    # The public key for checkpoints verification. The default value is the TESTNET public key.
    public-key = "4PvoqxpWi7kCA9N3UXcEB9CZx4iPPeHX9jSYdAioPhnr"

  # Transaction fees for different types of transactions.
  fees {
    payment {
      WAVES = 100000
    issue {
      WAVES = 100000000
    transfer {
      WAVES = 100000
    reissue {
      WAVES = 100000
    burn {
      WAVES = 100000
    exchange {
      WAVES = 100000
    lease {
      WAVES = 100000
    lease-cancel {
      WAVES = 100000
    create-alias {
      WAVES = 100000

  # Matcher settings.
  matcher {
    # Enable/disable matcher.
    enable = yes

    # Matcher's account address.
    account = ""

    # Matcher REST API bind address.
    bind-address = ""

    # Matcher REST API port.
    port = 6886

    # Minimum allowed order fee.
    min-order-fee = 100000

    # A fee of order match transaction.
    order-match-tx-fee = 100000

    # Matcher's directories.
    journal-directory = ${}"/journal"
    snapshots-directory = ${}"/snapshots"

    # Snapshot creation interval.
    snapshots-interval = 1d

    # A maximum number of open orders.
    max-open-orders = 1000

    # Base assets used as price assets.
    price-assets: []

    # Predefined ordering of base assets.
    predefined-pairs: []

  # New block generator settings.
  miner {
    # Enable/disable block generation.
    enable = yes

    # Enable/disable off-line block generation.
    offline = no

    # The number of connected peers required to start block generation.
    quorum = 1

    # New block generation interval.
    generation-delay = 15s

    # The maximum age of the last block to allow generation.
    interval-after-last-block-then-generation-is-allowed = 1d

    # Enable/disable TF-Like scheduling.
    tf-like-scheduling = yes

  # Node's REST API settings.
  rest-api {
    # Enable/disable REST API.
    enable = yes

    # Network address to bind.
    bind-address = ""

    # Port to listen to REST API requests.
    port = 6869

    # Hash of API key string.
    api-key-hash = "H6nsiifwYKYEx6YzYD7woP1XCn72RVvx6tC1zjjLXqsu"

    # Enable/disable CORS support.
    cors = yes

  # Nodes' synchronisation settings.
  synchronization {

    # The number of blocks that could be rolled back in case of a fork detection. If the fork is longer than this the rollback is impossible.
    max-rollback = 100

    # The size of temporary storage for forked blocks.
    max-chain-length = 101

    # Load only entire chain from peer then requested.
    load-entire-chain = yes

    # Timeout to receive all requested blocks.
    synchronization-timeout = 30s

    # Stick to one peer while receiving requested blocks.
    pin-to-initial-peer = yes

    # The number of retries of synchronisation before sending the peer to the blacklist.
    retries-before-blacklisting = 2

    # The number of retries of synchronisation operations.
    operation-retires = 3

    # Score broadcast interval.
    score-broadcast-interval = 30s

    # Time to live for broadcasted score.
    score-ttl = 90s

  # Unverified transactions pool settings.
  utx {

    # Pool size.
    size = 10000

    # Random transaction broadcast interval.
    broadcast-interval = 30s

If you want to use an existing Waves address from the Liteclient , all you need to do is check the backup window on the Liteclient and use the encoded seed on the seed = "" field, and your wallet password on the password = "" field in Wallet settings.


Part 3 - Run Waves

It is also very important that you encrypt your apikey on api-key-hash = "". To do so, simply run Waves with the default bind-address = "" and with enable = yes, in Node's REST API settings. This ensures that you can connect to the network safely and encrypt your apikey

Download the blockchain. Then go to on your browser, where you will be able to use the RPC commands through Swagger

Once this is done, you'll need to close the node and set the different apikey and apikeyhash on the config file, as well as the rpcAddress. Let's get started:

Step 1: Open a command line window (This can be done by searching cmd on Windows)

Step 2: Navigate to the folder where your waves.jar and the configuration file are stored. This is done with the "cd" command (change directory). Since we have the file on a folder called waves in the desktop, the command we'll use is: "cd C:\Users\kanopt\Desktop\waves"

Step 3: Now enter the command "java -jar waves.jar waves-mainnet.conf" to run Waves with the config you specifie

You'll now download the blockchain

Step 4: Once that the blockchain is fully downloaded (You can check through the blockexplorer), you'll be able to access Swagger to encrypt a apikey. Open your browser and go to """
Step 5: Now click "Utils"

Step 6: then "/utils/hash/secure

Step 7: Enter your desired apikey (1) and click "Try it out(2)

Step 8: Now take your apikey and its hash and put it in the configuration file in the  "apiKeyHash": ""Simply replace "H6nsiifwYKYEx6YzYD7woP1XCn72RVvx6tC1zjjLXqsu" with the hash field

Step 9: Change the "rpcAddress": "" field to your external IP 
Step 10: Close the command line terminal that is downloading the blockchain and repeat Step 1Step 2, and Step 3

Step 11: The blockchain will now download fully. When it completes, you will begin the staking process.

Remember, you need 10,000 Waves tokens to start mining and those tokens must be in your account for at least 1000 blocks! Good luck and let us know your results in the comment box below.


Important information

This website is only provided for your general information and is not intended to be relied upon by you in making any investment decisions. You should always combine multiple sources of information and analysis before making an investment and seek independent expert financial advice.

Where we list or describe different products and services, we try to give you the information you need to help you compare them and choose the right product or service for you. We may also have tips and more information to help you compare providers.

Some providers pay us for advertisements or promotions on our website or in emails we may send you. Any commercial agreement we have in place with a provider does not affect how we describe them or their products and services. Sponsored companies are clearly labelled.

CryptoCompare needs a newer browser in order to work.
Please use one of the browsers below: