All pages
Powered by GitBook
Couldn't generate the PDF for 135 pages, generation stopped at 100.
Extend with 50 more pages.
1 of 100

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

.github

Contributing to the Aeternity node

Pull Requests

  • Squash your commits to ensure each resulting commit is stable and can be tested.

  • Include issue numbers in the PR title, e.g. "GH-128. Resolves issue #123".

  • Follow the indentation, e.g. provided by .

  • Add unit tests for self-contained modules.

  • Add integration tests as needed.

  • Document new code.

  • End all files with a newline

Git Commit Messages

  • Use the present tense ("Add feature" not "Added feature")

  • Use the imperative mood ("Move cursor to..." not "Moves cursor to...")

  • Limit the first line to 72 characters or less

  • Reference issues and pull requests liberally after the first line

Learn more about .

The Æternity Code of Conduct

Conduct

Contact: or any member you trust.

  • We are committed to providing a friendly, safe and welcoming environment for all, regardless of level of experience, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, religion, nationality, or other similar characteristic.

aeternity

Aeternity node

A new blockchain for æpps.

Optimized for scalability via smart contracts inside state-channels.

Has a built-in oracle for integration with real-world data.

Comes with a naming system, for developerability.

Written in Erlang.

To install and run the Aeternity node, see the instructions

Erlang mode for Emacs
EDTS
writing a good commit message

Please avoid using overtly sexual nicknames or other nicknames that might detract from a friendly, safe and welcoming environment for all.

  • Please be kind and courteous. There's no need to be mean or rude.

  • Respect that people have differences of opinion and that every design or implementation choice carries a trade-off and numerous costs. There is seldom a right answer.

  • Please keep unstructured critique to a minimum. If you have solid ideas you want to experiment with, make a fork and see how it works.

  • We will exclude you from interaction if you insult, demean or harass anyone. That is not welcome behaviour. We interpret the term "harassment" as including the definition in the Citizen Code of Conduct; if you have any lack of clarity about what might be included in that concept, please read their definition. In particular, we don't tolerate behavior that excludes people in socially marginalized groups.

  • Private harassment is also unacceptable. No matter who you are, if you feel you have been or are being harassed or made uncomfortable by a community member, please contact us immediately. Whether you're a regular contributor or a newcomer, we care about making this community a safe place for you and we've got your back.

  • Likewise any spamming, trolling, flaming, baiting or other attention-stealing behaviour is not welcome.

  • Moderation

    These are the policies for upholding our community's standards of conduct.

    1. Remarks that violate the Æternity standards of conduct, including hateful, hurtful, oppressive, or exclusionary remarks, are not allowed. (Cursing is allowed, but never targeting another user, and never in a hateful manner.)

    2. Remarks that moderators find inappropriate, whether listed in the code of conduct or not, are also not allowed.

    3. Moderators will first respond to such remarks with a warning.

    4. If the warning is unheeded, the user will be "kicked," i.e., kicked out of the communication channel to cool off.

    5. If the user comes back and continues to make trouble, they will be banned, i.e., indefinitely excluded.

    6. Moderators may choose at their discretion to un-ban the user if it was a first offense and they offer the offended party a genuine apology.

    7. If a moderator bans someone and you think it was unjustified, please take it up with that moderator, or with a different moderator, in private. Complaints about bans in-channel are not allowed.

    8. Moderators are held to a higher standard than other community members. If a moderator creates an inappropriate situation, they should expect less leeway than others.

    In the Æternity community we strive to go the extra step to look out for each other. Don't just aim to be technically unimpeachable, try to be your best self. In particular, avoid flirting with offensive or sensitive issues, particularly if they're off-topic; this all too often leads to unnecessary fights, hurt feelings, and damaged trust; worse, it can drive people away from the community entirely.

    And if someone takes issue with something you said or did, resist the urge to be defensive. Just stop doing what it was they complained about and apologize. Even if you feel you were misinterpreted or unfairly accused, chances are good there was something you could've communicated better — remember that it's your responsibility to make your fellow community members comfortable. Everyone wants to get along and we are all here first and foremost because we want to talk about blockchains and anything related to them. You will find that people will be eager to assume good intent and forgive as long as you earn their trust.

    The enforcement policies listed above apply to all official Æternity venues; including official slack channels; GitHub repositories under aeternity.

    Adapted from the Rust Code of Conduct

    [email protected]

    feature_request

    Is your feature request related to a problem? Please describe.

    A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

    Describe the solution you'd like

    A clear and concise description of what you want to happen.

    Describe alternatives you've considered

    A clear and concise description of any alternative solutions or features you've considered.

    Additional context

    Add any other context or screenshots about the feature request here.

    Node API

    Aeternity node API is documented in the protocol repository.

    Swagger API documentation is available online at Aeternity node API documentation

    ISSUE_TEMPLATE

    release-notes

    or just follow the progress of the project via GitHub Issues.

    If you have discovered a bug or security vulnerability please get in touch. The Aeternity Crypto Foundation pays bug bounties up to 100.000 AE Tokens for critical vulnerabilities. Please get in touch via [email protected].

    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to Aeternity node documentation.

    We keep our protocol, APIs and research spec in separate protocol repository.

    How to start

    We publish packages for major platforms on GitHub. Each release comes with release notes describing the changes of the Aeternity node in each particular version.

    Please use the latest published stable release rather than the master branch. The master branch tracks the ongoing efforts towards the next stable release to be published though it is not guaranteed to be stable.

    Quick Install

    Linux / Mac

    By using the installer to install the latest stable version:

    See the documentation for starting and configuring the node.

    Docker

    Alternatively, you can run the node client as a docker container:

    Linux / Mac

    Or running a docker container (latest tag):

    Windows

    Restore from snapshot

    To speed up the initial blockchain synchronization the node database can be restored from a snapshot following the below steps:

    • delete the contents of the database if the node has been started already

    • download the database snapshot

    • verify if the snapshot checksum matches the downloaded file

    • unarchive the database snapshot

    Note that the docker container must be stopped before replacing the database

    The following snippet can be used to replace the current database with the latest mainnet snapshot assuming the database path is ~/.aeternity/maindb:

    Additional resources

    • Threat Model

    below

    Update

    This document describes how to update an Aeternity node using a release binary:

    • Manual update;

    Manual update

    Ubuntu 18.04

    Be sure to have a backup of your files, don't remove your node database.

    Download the latest version of the æternity node

    Once done, stop your node by:

    Decompress your new node version overwriting the old version:

    And start your node again:

    Now check that your node is up and running by :

    bug_report

    Expected Behavior

    ...

    Actual Behavior

    ...

    About this release

    Fourth Lima release candidate.

    Changelog:

    • Fix Map.to_list crash for large maps in FATE VM.

    The node is able to start from a database produced by v4.* releases. For the rest, this release is not backward compatible with v4.* releases.

    Please join the mainnet by following the instructions in the documentation below, and let us know if you have any problems by . Troubleshooting of common issues is documented .

    About this release

    is a maintenance Lima release:

    • Fixes a bug in FATE VM where bytes(N) as the return type of a remote call would cause the VM to crash.

    • Fixes a bug in FATE where the stack could be modified by a remote contract.

    • Fixes a bug in FATE where hashing a map could cause the VM to crash.

    About this release

    is a maintenance Lima release.

    Please join the mainnet by following the instructions in the documentation below, and let us know if you have any problems by . Troubleshooting of common issues is documented .

    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to .

    About this release

    is a maintenance Lima release.

    • The metric which evaluates contract sizes has been disabled due to excessive computational impact.

    Please join the mainnet by following the instructions in the documentation below, and let us know if you have any problems by . Troubleshooting of common issues is documented .

    Documentation

    About this release

    is a maintenance Lima release.

    It:

    • Provides a finalized height of the blockchain. This further improves fork resistance. The old approach had a flaw that a node was susceptible to following a wrong fork when starting from an existing DB. This change fixes it with following the desired fork instead.

    Please join the mainnet by following the instructions in the documentation below, and let us know if you have any problems by . Troubleshooting of common issues is documented .

    About this release

    is an emergency Lima release.

    There had been a 51% attack on the network. This release is an expression of the ecosystem's desire to move from the attacker's fork to the community one. If you prefer staying on the former, please use release 5.6.0

    This release requires the node to be running without the GC being enabled. If your node has it enabled - the DB is not suitable and your node will likely crash on start. In this case please either sync from the genesis block or download a . Once on the community fork - you can enable the GC.

    Please join the mainnet by following the instructions in the documentation below, and let us know if you have any problems by . Troubleshooting of common issues is documented .

    Documentation

    bash <(curl -s https://install.aeternity.io/install.sh)
    mkdir -p ~/.aeternity/maindb
    docker pull aeternity/aeternity
    docker run -p 3013:3013 -p 3015:3015 \
        -v ~/.aeternity/maindb:/home/aeternity/node/data/mnesia \
        aeternity/aeternity
    mkdir %APPDATA%\aeternity\maindb
    docker pull aeternity/aeternity
    docker run -p 3013:3013 -p 3015:3015 -v %APPDATA%/aeternity/maindb:/home/aeternity/node/data/mnesia aeternity/aeternity
    rm -rf ~/.aeternity/maindb/ && mkdir -p ~/.aeternity/maindb/
    curl -o ~/.aeternity/mnesia_main_v-1_latest.tar.zst https://aeternity-database-backups.s3.eu-central-1.amazonaws.com/main_backup_v1_full_latest.tar.zst
    CHECKSUM=$(curl https://aeternity-database-backups.s3.eu-central-1.amazonaws.com/main_backup_v1_full_latest.tar.zst.md5)
    diff -qs <(echo $CHECKSUM) <(openssl md5 -r ~/.aeternity/mnesia_main_v-1_latest.tar.zst | awk '{ print $1; }')
    test $? -eq 0 && tar --use-compress-program=unzstd -xf ~/.aeternity/mnesia_main_v-1_latest.tar.zst -C ~/.aeternity/maindb/
    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to Aeternity node documentation.

    opening a ticket
    in the wiki

    Add assertion that checks that we are not using a Generalized account like a basic account, i.e. don't allow to use private key signature.

    The node is able to start from a database produced by v4.* releases, otherwise this release is not backward compatible.

    Please join the mainnet by following the instructions in the documentation below, and let us know if you have any problems by opening a ticket. Troubleshooting of common issues is documented in the wiki.

    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to Aeternity node documentation.

    This
    This
    opening a ticket
    in the wiki
    Aeternity node documentation
    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to Aeternity node documentation.
    This
    opening a ticket
    in the wiki
    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to Aeternity node documentation.

    This
    opening a ticket
    in the wiki

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to Aeternity node documentation.

    This
    DB backup
    opening a ticket
    in the wiki

    Hardware Requirements

    Hardware requirements may vary based in what mode the node is running, the network and it is supposed to run full sync or restore from database snapshot. Running a full node to do a full sync being the most resource intensive. Requirements would also vary based on the node configuration, API requests and eventually on future consensus protocol and features.

    This recommendations are for nodes part of the Aeternity Mainnet

    Last update: October 1, 2024

    Summary

    Running a full node with full sync now and then (i.e. once per month):

    • Intel(R) CPU 2 cores @ 3.0Ghz

    • 8GB of RAM

    • 500GB SSD storage

    • 500GB bandwidth

    Processor

    A recent generation of Intel(R) 2 CPU logical cores @ 2.5Ghz should cover normal operations. However, during initial full sync the process is also CPU bound, so more cores and higher frequency is recommended, for example 2 CPU cores @ 3.0GHz.

    Memory

    It is recommended to use at least 8GB RAM. However 4GB of RAM should be also good enough for modest cases.

    Storage

    During initial full sync the node is very disk I/O intensive. A disk with good I/O throughput is recommended in this case, that's usually a SSDs. However, after the initial sync the node can run perfectly fine on a commodity HDDs.

    Full Node

    Database size as of the moment of this writing is 270GB and grows with 13.5GB per month. So a reasonable disk space allocation for 1 year horizon would be 450GB.

    Lightweight Node

    Database size as of the moment of this writing is 60GB and grows with 3GB per month. So a reasonable disk space allocation for 1 year horizon would be 100GB.

    Bandwidth

    During the normal operations the node needs up to 30KB/s inbound and up to 30KB/s outbound traffic. That's about 78GB/mo per direction or 156GB/mo total.

    Notice that, fully utilized chain might go up to 300-500KB/s for gossip traffic.

    However during initial full sync this requirement goes as high as 1MB/s but 400KB/s on average inbound traffic.

    About this release

    This is a maintenance Lima release.

    Please join the mainnet by following the instructions in the documentation below, and let us know if you have any problems by opening a ticket. Troubleshooting of common issues is documented in the wiki.

    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to Aeternity node documentation.

    About this release

    This is an emergency Lima release.

    Please join the mainnet by following the instructions in the documentation below, and let us know if you have any problems by opening a ticket. Troubleshooting of common issues is documented in the wiki.

    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to Aeternity node documentation.

    CircleCI
    License
    Build Tool
    curl -Lf -o aeternity.tar.gz  https://releases.aeternity.io/aeternity-{version}-ubuntu-x86_64.tar.gz
    /path/to/your/node/bin/aeternity stop
    tar -xzf aeternity.tar.gz -C /path/to/your/node;
    Steps to Reproduce the Problem
    1. ...

    2. ...

    3. ...

    Configuration, logs, error output, etc.

    • aeternity.yaml configuration file

    • log/aeternity.log log file - plus other related logs, e.g. log/aeternity_sync.log, log/aeternity_mining.log; if it’s long, please paste to https://ghostbin.com/ and insert the link here.

    Specifications

    • Virtualization: [none / metal / container / VM]

    • Hardware specs:

      • RAM:

      • CPU:

    • OS: [distribution, version]

    • Node Version:

    /path/to/your/node/bin/aeternity daemon
    curl localhost:3013/v2/blocks/top
    ---
    REPLACEME
    some_config:
    REPLACEME lots of log lines

    About this release

    This is a maintenance Lima release.

    It:

    • An API method has been added for state channels that allows the client to tell the fsm to assume that minimum depth has been achieved for a certain tx hash. If used by both clients, it can make a state channel immediately available after creation (and after deposits/withdrawals). The minimum_depth confirmation message is reported as it arrives later.

    • Improves the gossiping of orphaned transactions. Now, as soon a transaction ends up on a micro fork, the node broadcasts it to one's peers, even if some of them are still syncing.

    Please join the mainnet by following the instructions in the documentation below, and let us know if you have any problems by opening a ticket. Troubleshooting of common issues is documented in the wiki.

    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to .

    About this release

    This is a maintenance Lima release.

    It:

    • Fixes an issue where some nodes are stuck and could not sync beyond a certain point.

    • Exports a function (aec_chain_state:grant_fees/5) in order to be used in the MDW while doing dry runs.

    • Improves the transaction pool to not allow in paying_for transactions that are incorrectly authenticated.

    • Improves node performance: use a dirty read when possible while checking a signed transaction

    • Introduces some refactoring that is a prerequisite in order to accommodate contract clone primitives.

    • Transaction lifecycle is: the transaction is being prepared and posted to a node, then if it is valid it lands in the mempool, it is gossiped to all peers in the network, it is picked by a miner and then included in a block. If a transaction stays in the pool for too long time (2 weeks) and is not included in a block, there might be an issue with it (ex. origin doesn't have enough tokens to spend) and it is garbage collected. There used to be a check ensuring GCed transactions do not end up in the mempool ever again. This PR disables this check.

    • An optional setting for transaction garbage collect TTL is available for the node operator to set. It is mempool.tx_ttl and its default value is 2 weeks.

    • The transaction pool is being protected by DDos attacks via a caching layer so only new transactions ever reach the pool. There is a new setting for the node operator to define the cache size in amount of transactions to keep. It is mempool.cache_size with a default value of 200.

    • Introduced key-header index and fast implementation offind_key_headers_and_hash_at_height using it. This greatly improves performance of BLOCKHASH opcode for both AEVM and FATE.

    • Fixes a bug when using HTTP API to fetch contract call data at an already GCed height.

    Please join the mainnet by following the instructions in the documentation below, and let us know if you have any problems by . Troubleshooting of common issues is documented .

    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to .

    About this release

    This is a maintenance Lima release.

    • Allow all TX types (except ga_meta_tx, paying_for_tx and offchain_tx) in dry-run

    • Added new metrics to ae.epoch.aemon namespace

      • block.propagation_time.key : Time until key-blocks reached this node in milliseconds

      • block.propagation_time.micro : Time until micro-blocks reached this node in milliseconds

      • block.time_since_prev.key : Time between key-blocks in milliseconds

      • block.time_since_prev.micro : Time between micro-blocks in milliseconds

      • chain.top.difficulty : Difficulty of the top block

      • forks.micro.count : Count of observed micro-forks

      • forks.micro.height : Height difference of observed micro-forks

    • Increased histogram timespan to 1 hour for some aemon metrics

    • Changed the default configuration handling of peers to always include the seed nodes (unless explicitly blocked). The idea is to make it harder to exclude the seed nodes by mistake.

    • Makes some peer pool parameters configurable:

      • gossiped_peers_count

      • select_verified_peer_probability

      • max_update_lapse

    • Sets default select_verified_peer_probability to 1.0 to make sure a peer is selected from the verified pool first.

    • Sets default max_update_lapse to 2592000000 (30 days).

    Please join the mainnet by following the instructions in the documentation below, and let us know if you have any problems by . Troubleshooting of common issues is documented .

    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to .

    About this release

    This is a maintenance Lima release focused on stability:

    • Adds support for community hard-forks. Miners will be able to signal if they support the new protocol version. Depending on the signalling result, the network will switch to a new protocol version or will stay with the current one.

    • Adds protocol activated by miner signalling to HTTP /status endpoint

    • Improving chain sync - avoid creating duplicate sync tasks.

    • Optimize sync, by being more aggressive and drop gossiped blocks that are far in the future. This also reduces the amount of noise in the console.

    • State Channels off-chain update requests can now all include meta information objects. This affects methods update, new_contract, contract_call, deposit and withdraw.

    • State Channel FSM: allows optionally setting the fee of all on-chain transactions.

    • State Channels: Changed calculation of block confirmation times in to be dynamic. Previously the confirmation times would be static for all relevant transactions in a channel. This has been changed to calculate the block confirmation time based on the chosen strategy. For more information check the protocol documentation.

    • Adds a functionality to reject updates in State Channel environment.

    • Improves stability of channel_force_progress_tx series before a solo closing sequence.

    • Improves stability of channel_slash_tx after a channel_close_solo_tx with a payload that had been preceded by a channel_force_progress_tx

    • Load regulation for state channel set up was corrected so that requests release the job scheduler sooner, thereby allowing for more channels than regulators:sc_ws_handler:counter. A config value,channels:max_count (default: 1000) is introduced, to limit the total number of active channels on a node.

    • Fixes rare crash in FATE VM when updating nested maps in the store.

    • Fixes internal API bug which manifests itself during sync on low io throughput devices

    Please join the mainnet by following the instructions in the documentation below, and let us know if you have any problems by . Troubleshooting of common issues is documented .

    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to .

    About this release

    This is a maintenance Lima release.

    • Fix docker database compatibility issue by bundling LZ4 and Snappy into RocksDB build

    Please join the mainnet by following the instructions in the documentation below, and let us know if you have any problems by opening a ticket. Troubleshooting of common issues is documented in the wiki.

    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to .

    About this release

    This is the second Iris release candidate.

    It:

    • Fixed a HTTP API issue: in /v2/ when fetching oracle queries, the client can specify if they want currently open, already closed or simply all queries for that oracle. If no parameter was provided, the endpoint crashed. Now if nothing is specified, all queries are returned as this is the default behaviour for /v3/.

    • Fixed a HTTP API issue: in /v3/ when fetching a transaction by hash, if the transaction is ga_attach_tx, the API crashed.

    • Fixed a HTTP API issue: in /v3/ when fetching a channel_create_tx, the API crashed.

    Please test the iris protocol by activating it in the configuration file as below:

    You can also join testnet, the hard fork kicked in there at .

    Please let us know if you have any problems by . Troubleshooting of common issues is documented .

    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to .

    About this release

    This is a maintenance Lima release.

    • Adds support in the State Channel FSM to detect and properly act upon unexpected channel_force_progress_tx on-chain

    • Fix check of contracts which prevented new nodes from syncing from scratch

    • When a State Channel responder acceptor times out (accept_timeout), it checks to see whether it should give up or keep trying. This logic was faulty and has now been fixed.

    Please join the mainnet by following the instructions in the documentation below, and let us know if you have any problems by . Troubleshooting of common issues is documented .

    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to .

    About this release

    This is a maintenance Lima release:

    • Cache calls to Contract.creator in FATE engine state.

    • Disable unused FATE operation INT_TO_ADDR.

    • Improves the checks and tests for close solo and force progress transactions.

    The node is able to start from a database produced by v4.* releases, otherwise this release is not backwards compatible.

    Please join the mainnet by following the instructions in the documentation below, and let us know if you have any problems by . Troubleshooting of common issues is documented .

    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to .

    About this release

    This is a maintenance Iris release.

    It:

    • Fixes an issue in FATE storage functionality: updating big maps is now even more optimized.

    Please join the mainnet by following the instructions in the documentation below, and let us know if you have any problems by opening a ticket. Troubleshooting of common issues is documented in the wiki.

    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to .

    About this release

    This is a maintenance Lima release.

    It:

    • Fixes broken swagger version. The version reported breaks semver.

    Please join the mainnet by following the instructions in the documentation below, and let us know if you have any problems by opening a ticket. Troubleshooting of common issues is documented in the wiki.

    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to .

    Installation

    This document describes how to install an Aeternity node using a release binary either by:

    • ;

    • .

    Welcome to Aeternity node documentation

    The documentation describes how to install, configure and operate an aeternity node. One can install it from a package, run a docker image or build it themselves. There is also additional documentation on mining with CUDA and build and/or join a Stratum pool.

    Index

    Fork resistance in Aeternity nodes

    The Aeternity consensus and sync protocols resolve forks according to the specification in . This means that 51% attacks are still possible, just as with other Proof-of-Work chains.

    The Aeternity node implementation offers a few ways to withstand 51% attacks.

    Fork resistance via gossip

    The configuration variable

    limits the height difference allowed for incoming blocks via gossip. This variable has a hard-coded default of 5, but can be changed via the aeternity_config.[yaml|json]

    Summary

    Getting Started

    About this release

    is a maintenance Lima release.

    It:

    • Bugfix: Exposes the State Channel force progress transaction call result to HTTP API

    • Bugfix: Under specific circumstances the store of a contract could be damaged by updating values in the wrong place. A transaction experiencing this would not be valid for peers which are not affected by this bug. The fix ensures the store update is correct.

      This bug affects nodes running v5.4.x and v5.5.x, therefore we advise to upgrade these nodes to prevent any issues from occurring.

    About this release

    is a maintenance Lima release.

    It:

    • Add helper function aeu_log:set_console_log_level/1. Use it to set the level to warning to remove info logs from the system's console.

    • The event and message history kept by the State Channel FSM can now be fetched using the WebSocket API method channels.history.fetch

    About this release

    Second Lima release candidate.

    Changelog:

    • Remove the rename_db migration command used to migrate Roma databases.

    • Remove the custom docker entrypoint. To run the docker image with extra arguments the default command should be used as well, e.g.:docker run aeternity/aeternity bin/aeternity console -noinput -network_id ae_uat see the corresponding docs for details. cat: docs/release-notes/next-lima/PT-168132312-new-name-hash: No such file or directory

    About this release

    is a maintenance Lima release.

    • Remove HTTP API endpoint v2/contracts/{hash}/store due to excessive computational impact.

    • State Channel FSM: fixes fee computation according to transaction size. Until now close mutual transactions were expecting a fee to be provided by the initiating party, or a default value of 20 000 gas would be used instead.

    • State Channel FSM: adds support for an optional gas_price

    About this release

    Fifth Lima release candidate.

    Changelog:

    • Fix bug in FATE gas computation for Bits operations.

    • Change top level namespace from .aet to .chain

    The node is able to start from a database produced by v4.* releases. For the rest, this release is not backward compatible with v4.* releases.

    Please join the mainnet by following the instructions in the documentation below, and let us know if you have any problems by . Troubleshooting of common issues is documented .

    About this release

    is a maintenance Lima release focused on stability:

    • SC clients will now receive a token which will be required for reestablishing a channel or reconnecting to an existing FSM, the token must be persisted and kept secret by the client.

    • Removes the user provided password from the state channel API

    • Removes the special channel reconnect transaction - reestablishing a channel may now result in reconnecting to an existing FSM

    About this release

    is a maintenance Lima release.

    It:

    • Upgrades the swagger definition to OAS3.

    • Introduces a new query param in relevant HTTP APIs. It is calledint-to-str and specifies that all integers in the response shall be represented as strings instead. This will allow SDKs to pick their preference for the data representation and will help them solve precision issues. This applies only for v3 API that supports oas3 and is not supported by the swagger v2 API

    About this release

    Sixth Lima release candidate.

    Changelog:

    • Fixes a bug in FATE VM - Call.caller was incorrectly set when returning from a remote contract call.

    The node is able to start from a database produced by v4.* releases. For the rest, this release is not backward compatible with v4.* releases.

    Please join the mainnet by following the instructions in the documentation below, and let us know if you have any problems by . Troubleshooting of common issues is documented .

    About this release

    is the third Iris release candidate.

    It:

    • Introduced a new HTTP endpoint: /dry-run. It is part of the external interface and should be preferred over the existing debug endpoint. It comes with some protections for the node: all transactions/calls provided are limited to a total amount of gas that they can consume. There is a new setting in the config where the node operator can change this according to their needs, the default value is 6 000 000 gas. The new endpoint is disabled by default and can be enabled via the new API group dry-run.

    About this release

    This release fixes an issue in v5.5.x which prevented nodes from validating blocks which include transactions which have performed failed remote contract calls. All nodes running v5.5.x should upgrade to this release.

    Please join the mainnet by following the instructions in the documentation below, and let us know if you have any problems by . Troubleshooting of common issues is documented .

    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to .

    About this release

    is the fourth Iris release candidate.

    It:

    • Fixed the default value of the gas limit for the external dry-run endpoint. It used to have a default of 1 000 000 gas per call and now it is 6 000 000 per call.

    • Set height for iris hard fork to happen on block 441444, on 10 June 2021, around 9:11am UTC

    You can join testnet

    About this release

    Third Lima release candidate.

    Changelog:

    • Added infrastructure for deploying contracts (with fresh tokens) during hard forks from Lima release. This will be used to finalize the token migration.

    • Added the migrated tokens in the Phase 3 of the token migration.

    • Adds one (1) percent of the total initial (ERC20) token supply to an account according to Pool D in https://hackmd.aepps.com/s/H1qF1w1j7#

    No error messages in contract call objects - they will end up under consensus. Run your contract in dry-run to get the detailed error message.

  • Name preclaims are no longer allowed to use 0 as salt value

  • New name hash computation

  • New governance function determining if a name is subject to direct claim or auction

  • New governance function determining initial price of a name

  • New name auction mechanism using subsequent claim transactions with salt equal to 0

  • State Channels: Changed configuration option name ws_handlers to sc_ws_handlers which correctly implies that the limit applies to SC websocket connections.

  • State Channels: It is now possible to abort a signing request by replying with an error code.

  • State Channels: The FSMs now stay alive until a Close Mutual (shutdown) has been confirmed on-chain It is also possible to abort/reject a Close Mutual by rejecting the signing request. See https://github.com/aeternity/protocol/blob/master/node/api/channel_ws_api.md#signing-error-replies

  • State Channels: On-chain tx monitoring was broken after leave/reestablish. This has been fixed.

  • State Channels: Enhances the FSM with the optional pinned environment for execution off-chain transactions. This is to improve reaching off-chain consensus as both parties share a common view of what is considered to be a fork-safe block hash.

  • State Channels: Introduces on-disk state cache encryption

    • When a user leaves a state channel the off-chain state will be persisted on disk and protected with a password. The password is provided by the user when opening a channel using the state_password parameter.

    • When re-establishing the channel the same password MUST be provided, otherwise the operation will fail with error code invalid_password.

    • The password MUST be at least 6 characters long. Providing a shorter password will fail with error code invalid_password.

    • The password may be changed anytime by the user through the websocket connection after the channel has been opened. Please consult the documentation for more details. This operation is only allowed when the channel is established. If the user has left the channel, the channel must be re-established first before changing the password.

    • Until the lima fork the password will be optional. By not providing a password a default value is used:correct horse battery staple. After the Lima fork the password will become mandatory. Pre-Lima off-chain states will be encrypted with the default password.

    • Because the password used for encrypting the persisted state cache is mandatory after the Lima fork, state channels which were opened before Lima use the default password. Not providing the password in the websocket connection will result in a missing_field error.

    • Keep in mind that an adversary with direct RAM access to the node may still steal the off-chain state. This change only protects the state against an adversary with direct disk access.

  • The node is able to start from a database produced by v4.* releases. For the rest, this release is not backward compatible with v4.* releases.

    Please join the mainnet by following the instructions in the documentation below, and let us know if you have any problems by opening a ticket. Troubleshooting of common issues is documented in the wiki.

    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to Aeternity node documentation.

  • Set Lima testnet hardfork height to 154300 (16th Oct 2019, 09:00 UTC)

  • Set Lima mainnet to 161150 (30th Oct 2019, 13:00 UTC)

  • Aligns AEVM store gas pricing with FATE.

  • ContractCallTX where the called contract uses FATE has a lower base cost (60% cheaper than a call to an AEVM contract).

  • State Channels: The support for state cache encryption (introduced in v5.0.0-rc.2) has been disabled. An improved approach is being developed which greatly improves API usability. This feature is expected to be released with v5.1.0.

  • The node is able to start from a database produced by v4.* releases. For the rest, this release is not backward compatible with v4.* releases.

    Please join the mainnet by following the instructions in the documentation below, and let us know if you have any problems by opening a ticket. Troubleshooting of common issues is documented in the wiki.

    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to Aeternity node documentation.

    Aeternity node documentation
    opening a ticket
    in the wiki
    Aeternity node documentation
  • standby_times

  • max_rejections

  • opening a ticket
    in the wiki
    Aeternity node documentation
    opening a ticket
    in the wiki
    Aeternity node documentation
    Aeternity node documentation
    opening a ticket
    in the wiki
    Aeternity node documentation
    opening a ticket
    in the wiki
    Aeternity node documentation
    Aeternity node documentation
    Aeternity node documentation
    Configuration
  • Hyperchains

  • Operation

  • Update

  • Docker

  • Build from source

  • CUDA Miner

  • Stratum

  • Network Monitoring

  • Fork Resistance

  • Garbage Collection

  • Node API

  • Testing

  • Hacking

  • Rebar Quick Guide

  • Installation

    Fixes a State Channel WebSocket API issue: if a user provided a fee, it was ignored

  • Fixes a State Channel WebSocket API issue: when participants try closing a channel with insufficient channel balance to cover the fee, a proper error is being sent.

  • Please join the mainnet by following the instructions in the documentation below, and let us know if you have any problems by opening a ticket. Troubleshooting of common issues is documented in the wiki.

    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to Aeternity node documentation.

    This

    State Channel FSM bugfix: when one party asks its FSM to create an unilateral transaction (ex. close solo) and while the FSM is waiting for it to be confirmed, the other party could create an off-chain update that would cause a conflict on both ends. This could deny the former party the possibility of a dispute. Fixed

  • Enhances FSM behaviour: when the initiator is offline, allows the responder to stay online waiting for it even if the timeout timer is reached.

  • Added CORS headers for error responses

  • Please join the mainnet by following the instructions in the documentation below, and let us know if you have any problems by opening a ticket. Troubleshooting of common issues is documented in the wiki.

    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to Aeternity node documentation.

    This
    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to Aeternity node documentation.

    opening a ticket
    in the wiki

    This release ships with backwards incompatible changes to the client WS API. Make sure a compatible SDK version is used when using state channels. Existing users of SC should close their pre v5.2.0 channels and reopen them after v5.2.0. After v5.2.0 reconnection requests won't require signing a transaction.

  • Add database write retry logic, to prevent immediate failure during temporary disk issues. The number of retries can be configured in the user configuration.

  • Avoid JSON-encoding errors by sending oracle query/response format as contract_bytearray also for ABI_FATE_SOPHIA_1 in /oracles/{pubkey} HTTP API endpoint.

  • Adds periodical log of number of connected peers

  • Adds the number of connected peers (inbound and outbound) to HTTP /status endpoint

  • Please join the mainnet by following the instructions in the documentation below, and let us know if you have any problems by opening a ticket. Troubleshooting of common issues is documented in the wiki.

    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to Aeternity node documentation.

    This
  • Allows passing strings instead of integers in post requests for debug APIs that are convenience for testing and developing SDKs.

  • Introduces a second HTTP specification. This is to provide the new OAS3 API under /v3/ while we keep the Swagger v2 API unchanged under /v2/. This aims to provide a smooth transition from old specification to the new one. The new API is to be finalized with iris hardfork, please do not depend on it yet.

  • Expands the /api endpoint with an option: while simply calling /api keeps the old behaviour, calling /api?oas3 will provide the new OAS3 spec instead.

  • Please join the mainnet by following the instructions in the documentation below, and let us know if you have any problems by opening a ticket. Troubleshooting of common issues is documented in the wiki.

    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to Aeternity node documentation.

    This
    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to Aeternity node documentation.

    opening a ticket
    in the wiki
    This
    opening a ticket
    in the wiki
    Aeternity node documentation
    , the hard fork kicked in there at
    .

    Please let us know if you have any problems by opening a ticket. Troubleshooting of common issues is documented in the wiki.

    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to Aeternity node documentation.

    This
    height 425900
    parameter for all on-chain transactions, including the channel create one. This
    gas_price
    is to be used in transaction fee computation: the fee is
    gas_price * transaction_gas_cost
    . The
    transaction_gas_cost
    is subject to a couple of parameters, one of which is the size, adding a bigger fee could lead to a bigger transaction and bigger fee expectations. This makes the fee computation not trivial and thus this functionality could be valuable for State Channel clients.
  • Changes which peers are propagated - only the peers from the verified pool are in the ping message now. Before there were peers from both verified and unverified pools.

  • Adds a periodic TCP check of peers from the unverified pool. If the TCP connection to a peer is established, it's considered alive and it's moved to the verified pool.

  • Updates default max_update_lapse to 10800000 ms (3 hours) - used to be 30 days.

  • Adds garbage collector for removing old account states to free up space on disk. By default the GC is disabled, as currently it is experimental feature. If it is enabled, the default (configurable) interval is 50000 blocks (roughly once in 3 months). Explicit configuration would look like:

  • Please join the mainnet by following the instructions in the documentation below, and let us know if you have any problems by opening a ticket. Troubleshooting of common issues is documented in the wiki.

    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to Aeternity node documentation.

    This
    height 425900
    opening a ticket
    in the wiki
    Aeternity node documentation
    Quick install

    Run below command to install latest version of aeternity node and follow the instructions:

    While this method is the easiest one it is not recommended for production systems.

    Tarball Install

    In order to install an Aeternity node from a tarball, you need to:

    • Retrieve the release tarball corresponding to your platform;

    • Install the required dependencies;

    • Deploy the node.

    Retrieve release tarball

    The release binaries are published on GitHub and are tested on the following platforms:

    • Ubuntu 18.04 LTS (x86-64);

    • macOS Big Sur 12.6.3 (arm64).

    Install dependencies

    Package dependencies are:

    • Libsodium v1.0.16/v1.0.19

    • Openssl v1.1

    Ubuntu dependencies

    Supported Ubuntu version is 18.04.

    The package requires libssl and libsodium v1.0.16 as libsodium.so.23 shared object/library. Ubuntu 18.04 ships with libssl 1.1 and libsodium 1.0.16, thus it can be installed with apt package manager:

    macOS dependencies

    Easiest way to install dependencies is using Homebrew:

    The macOS package has:

    • A hard dependency on OpenSSL v1.1 installed with Homebrew in its default path /usr/local/opt/openssl/lib/libcrypto.1.1.dylib;

    • A hard dependency on libsodium v1.0.19 installed with Homebrew in its default path /usr/local/opt/libsodium/lib/libsodium.26.dylib.

    In case you have installed either of them in a non-default path, you could use symlink(s) to work around the issue. You can create those symlinks by running the following commands:

    Deploy node

    In the instructions below, the node is deployed in directory ~/aeternity/node: you may prefer to deploy the node in an alternative location by amending the instructions accordingly.

    It is recommended that the partition where the node directory is has at least 100 GB free: this is needed for the chain and the log files.

    Open a Terminal window or get to the command line. Create a directory and unpack the downloaded package (you need to amend the directory and/or file name of the package):

    Quick install
    Install from a tarball
    file (see
    ). Any keyblock received via gossip will be rejected if its height is more than this value below the current top.

    Fork resistance via sync

    The normal way to introduce a long competing fork would be via the sync protocol. That is, a node goes off-line and mines a long chain, then reconnects to the network and syncs against other nodes: if the competing fork has a higher difficulty, it will supersede the chain on the network.

    The following configuration variable,

    will instruct the node to reject blocks received via sync whose height is more than <height> blocks below the current top. The default value is 100. A value of 0 disables the protection. In practice, this should mean that once a transaction has at least <height> keyblocks on top of it, the nodes will resist any competing fork trying to evict it.

    The fork resistance is activated once the node has synced with at least one other node. It is possible to enable fork resistance immediately, using the following setting:

    Note that configuration variables can be set both via the config file and via OS environment variables. This means that it's possible to instruct the node to resist forks at a given node start in the following way:

    (see the configuration documentation)

    Finalized depth

    When sync fork resistance (sync: sync_allowed_height_from_top) is active, the node will persist the height just below the fork resistance depth as finalized_height. If the node should restart and starts syncing with other nodes (recall that the dynamic fork resistance is not activated until the node has successfully synced with one peer), it will reject any chain that presents a key block hash at the finalized height which differs from what the node already has on record.

    This shores up the dynamic protection offered by sync_allowed_height_from_top to also defend against malicious nodes during node restarts. The function is automatic, once fork resistance has been configured. If fork resistance is later turned off, finalized height will not be enforced.

    Discussion

    When choosing a suitable fork resistance depth, it is important to consider some tradeoffs. Blockchains naturally rely on 'optimistic concurrency', that is, it is entirely possible that different nodes manage to produce keyblock candidates at roughly the same time. This means that keyblock forking can occur occasionally. The likelihood that it will happen repeatedly is extremely low, so such forks should resolve quickly, usually with the following keyblock.

    Note that even with very long competing forks, the chain will converge. Absent malice and unless the TTL has been set very low for some transactions, transactions evicted for being on a "losing fork" will be returned to the mempool and find their way back onto the main chain. The problem is when this behavior is exploited to evict specific high-value transactions (so-called "rollback", or "double-spend" attacks).

    Even if all transactions get returned to the chain, miners who have mined several blocks on a losing fork may have reason to feel cheated, as they lose their mining rewards.

    Network latency and network failures may increase the frequency and length of naturally competing forks, and setting the fork resistance too low might increase the risk of chain splits, where different nodes end up on different forks and cannot resolve the situation without manual intervention.

    From a user experience perspective, fork resistance sets an upper bound on the confirmation time needed to secure high-value transactions, since there is no need to wait longer than the configured fork resistance depth. Once the generation that contains a transaction is at or below the finalized depth, the transaction cannot be evicted, either accidentally or through a malicious attack. Using the default setting of 100, this would mean that a block confirmation time of 100 key blocks (5 hours) will be sufficient to protect any transaction amount.

    the aeternity Bitcoin-ng protocol
    the configuration instructions
    Please test the iris protocol by activating it in the configuration file as below:

    You can also join testnet, the hard fork kicked in there at height 425900.

    Please let us know if you have any problems by opening a ticket. Troubleshooting of common issues is documented in the wiki.

    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to Aeternity node documentation.

    This
      chain:
        hard_forks:
          "1": 0
          "5": 1
    
     fork_management:
        network_id: "my_test_iris"
        chain:
            ...
            garbage_collection:
                enabled: true
                interval: 50000
                history: 500
      chain:
        hard_forks:
          "1": 0
          "5": 1
    
     fork_management:
        network_id: "my_test_iris"
    bash <(curl -s https://install.aeternity.io/install.sh)
    sudo apt-get install libsodium23 libssl1.1
    brew update
    brew install openssl libsodium
    ln -s "$(brew --prefix openssl)"/lib/libcrypto.1.1.dylib /usr/local/opt/openssl/lib/libcrypto.1.1.dylib
    ln -s "$(brew --prefix libsodium)"/lib/libsodium.26.dylib /usr/local/opt/libsodium/lib/libsodium.26.dylib
    mkdir -p ~/aeternity/node
    cd ~/aeternity/node
    tar xf ~/Downloads/aeternity-<package_version>-macos-arm64.tar.gz
    sync:
        gossip_allowed_height_from_top : <height>
    sync:
        sync_allowed_height_from_top: <height>
    sync:
        resist_forks_from_start: true
    AE__SYNC__RESIST_FORKS_FROM_START=true bin/aeternity start

    Configuration

  • Hyperchains

  • Node Management

    • Operation

    • Update

    • Docker

    • Build from source

    Mining & Network

    • CUDA Miner

    • Stratum

    • Network Monitoring

    Advanced Topics

    • Fork Resistance

    • Garbage Collection

    • Node API

    • Testing

    Hardware Requirements
    Installation

    About this release

    This release is the fourth release candidate. It:

    • Enables signing of micro blocks when using configuration autostart: false

    • Makes the number of nodes to gossip to configurable

    This release does not introduce backward incompatible changes in the chain format.

    Please join the testnet by following the instructions below, and let us know if you have any problems by opening a ticket. Troubleshooting of common issues is documented in the wiki.

    The instructions below describe:

    • ;

    • ;

    • .

    Retrieve the software for running a node

    You can run a node by either:

    • Installing the published corresponding to your platform; or

    • Running the published ; or

    • .

    The user configuration is documented in the . For specifying configuration using the Docker image, please refer to .

    The node user API is documented:

    • HTTP API endpoints are specified ;

      • A JSON version of the same specification is located in the node at path lib/aehttp-0.1.0/priv/swagger.json.

      • The JSON version can be obtained from a running node using the endpoint /api.

    Install node

    The instructions for installing a node using a release binary are in .

    For installation of a node using the Docker image, please refer to .

    Join the testnet

    This section describes how to run a node as part of the testnet - the public test network of nodes - by using the release binary.

    For running a node as part of the testnet by using the Docker image, please consult in addition to this section.

    Inspect the testnet

    The core nodes of the public test network are accessible from the Internet.

    Information, e.g. height, of the top block of the longest chain as seen by these core nodes of the testnet can be obtained by opening in the browser any of the following URLs:

    • http://52.10.46.160:3013/v2/blocks/top

    • http://13.250.162.250:3013/v2/blocks/top

    • http://18.130.148.7:3013/v2/blocks/top

    Setup your node

    Setting up your node consists of:

    • Configuring your node - see instructions in ;

    • Starting your node and verifying it works as expected - see instructions in .

    About this release

    This is a maintenance Lima release candidate focused on stability:

    • Adds support for community hard-forks. Miners will be able to signal if they support the new protocol version. Depending on the signalling result, the network will switch to a new protocol version or will stay with the current one.

    • Adds protocol activated by miner signalling to HTTP /status endpoint

    • Improving chain sync - avoid creating duplicate sync tasks.

    • Optimize sync, by being more aggressive and drop gossiped blocks that are far in the future. This also reduces the amount of noise in the console.

    • State Channels off-chain update requests can now all include meta information objects. This affects methods update, new_contract, contract_call, deposit and withdraw.

    • State Channel FSM: allows optionally setting the fee of all on-chain transactions.

    • State Channels: Changed calculation of block confirmation times in to be dynamic. Previously the confirmation times would be static for all relevant transactions in a channel. This has been changed to calculate the block confirmation time based on the chosen strategy. For more information check the protocol documentation.

    • Adds a functionality to reject updates in State Channel environment.

    • Improves stability of channel_force_progress_tx series before a solo closing sequence.

    • Improves stability of channel_slash_tx after a channel_close_solo_tx with a payload that had been preceded by a channel_force_progress_tx

    • Load regulation for state channel set up was corrected so that requests release the job scheduler sooner, thereby allowing for more channels than regulators:sc_ws_handler:counter. A config value,channels:max_count (default: 1000) is introduced, to limit the total number of active channels on a node.

    • Fixes rare crash in FATE VM when updating nested maps in the store.

    • Fixes internal API bug which manifests itself during sync on low io throughput devices

    Please join the mainnet by following the instructions in the documentation below, and let us know if you have any problems by . Troubleshooting of common issues is documented .

    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to .

    About this release

    This is a Iris test release.

    It:

    • Fix buggy serialization of contract information - this means compiler version is actually stored on chain, and isn't replaced by "unknown".

    • Added AENS.update to FATE VM

    • Added AENS.lookup and Oracle.expiry lookup functions to FATE VM

    • Fixed bug regarding TTL of preclaims in FATE VM - it was incorrectly always set to 0, from VM_FATE_SOPHIA_2 it has the correct value.

    • Fixed bug in AENS.resolve in FATE VM - for invalid names VM_FATE_SOPHIA_1 will crash. From VM_FATE_SOPHIA_2 it will not crash, rather return None.

    • Changed Chain.block_hash - in VM_FATE_SOPHIA_2 it will returnSome(<blockhash>) for Chain.block_height (i.e. current generation) previously it returned None. With Bitcoin-NG we do have the block hash of the current generation, so no reason not to allow this.

    • Extend AENS name max expiration time from 50000 generations (~100 days) to 180000 generations (~375 days).

    • Changes how a meta transaction TTL's is being validated: so far it used to be the outermost transaction's ttl that was taken into account, now it is the innermost one instead. Meta transactions no longer have TTL.

    • Fixes a protocol issue: a valid force progress call with invalid CallData or failing call will result in on-chain transaction but tokens from the caller would still be moved to the forced contract. This is fixed and failed calls in successful force progress transactions result in rollback of the off-chain balances.

    • Improves the functionality of State Channel delegates: now they can providechannel_solo_snapshot_tx as well. This is really handy in cases one party is missing and the other is doing malicious force progress on-chain while the channel is still open.

    • Revisits the State Channel delegates: so far they were a shared list for both participants. From Iris on, delegates are per peer: there is a list of delegates for the initiator and another one for the responder. Old channel objects can still be used but users are strongly recommended to reset their delegates list if they had any. Note that the HTTP representations are changed accordingly.

    • Allows delegates to force progress on behalf of the user that authorized them to do so.

    • Improved garbage collector for all Fate contracts form Iris

    • Fate contracts of different versions can call each other (Fate1 can call Fate2 and vice-versa)

    • Opcode availability and behaviour depends on VM version of the contract (Fate2 opcodes are available both when Fate2 contract is called directly and when called by another (possibly Fate1) contract)

    Please test the iris protocol by activating it in the configuration file as below:

    Please let us know if you have any problems by . Troubleshooting of common issues is documented .

    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to .

    About this release

    This is a maintenance Lima release.

    It:

    • Enchances the p2p noise protocol with an optional setting to ask a peer for the version of their node. A node operator can set one's node to not respond to this message if one considers this a private information. This is to be used for monitoring the network's health.

    • Enhances FSM behaviour: when the initiator is offline, allows the responder to stay online waiting for it even if the timeout timer is reached.

    • Configuration values can now be set using OS environment variables, where the environment variable name is on the form AE__k1__k2, e.g. AE__CHAIN__PERSIST=true. Note that two underscores are used to separate each level. Structured values must be JSON-encoded. The prefix AE can not be customized. The environment variables are applied after reading an available config file, and all values are checked against the schema. See docs/configuration.md.

    • Introduces persistence of the peer pool: if the node flag for disc persistence is set, after a node restart old peers are loaded from the DB. Trusted peers are provided to the node from the config file so they are already persisted. Since the time being off is unknown, all peers are loaded asunverified, even if they had been verified before the node stop.

    • Changes the default value and significantly speeds up the TCP probes. Those used to be done roughly once every 2 minutes while now they are executed every second. Note that this is done only if there are peers to be checked: if a peer is missing, there is a grace period in which we mark it as 'suspended', waiting for its return. If all peers are checked, we wait longer - until either a new peer is added or there is a not-suspended peer. Basically the probes come on demand. Even despite the probes are fast, there is a maximum size of currently ongoing probes.

    • Fixes the process of probing verified peers. Until now we were probing only unverified peers. If a peer responds to the probe - we consider it verified. We downgrade a verified peer only after we fail connecting to it. This resulted in amounting peers that used to be verified at one point of time. This is fixed now as we probe verified peers as well. What is more is, that this PR plays really well with PR #3365. This means that if a peer goes down, we will find it significantly sooner and will downgrade it as an unverified one. This is important as a nodes shares to other nodes only peers one considers to be verified.

    • Added support for reporting chain events during contract evaluation. These events are published internally as 'tx_events' (available e.g. for plugins), and can also be fetched via the HTTP 'dry-run' method. The events are presented as 'dummy' transactions, unsigned, reflecting the details of the respective events.

    • Fixes a bug: there are special trusted peers that are never deleted nor downgraded. Those are quite unique as the node considered them to be available. One can pick their own set of trusted peers but this was not really effective: the default peers were always included as a bonus. This PR fixes it: if the new config flag is set to false - the defaults are omitted. The flag is called include_default_peers and by default it is true.

    • There used to be multiple copies of the same peers in peers pool. This resulted in propagation of same peers with different Peer IDs through the network. Now duplicates are cleaned up.

    • Some further peers fine tuning: we used to treat peers that refuse connecting to us as they were malicious. This was the case no matter if peers were active and part of the network and only simply refusing to open aenoise connection to our node (most likely because their inbound pool is staturated already). This is now changed and if the node is responding but refusing to open an enoise connection - we consider it still a valid and verified participant of the network.

    • Improves sync's peer propagation: peers are split into verified and unverified. We had allowed a grace period for peers to be down while the node still considers them as verified and broadcasts them as such. Once a verified peer is being detected as down, it enters a standby state that allows them to stay verified. This PR tightens the process - once a peer is being detected to be unreachable - it is being downgraded from verified to unverified immediately. The processing of unverified being deleted is left unchanged - they still enter the standby mode for a few times before being removed.

    • Fixes inconsistency of the /status endpoint

    • Provides some fine tuning to the supervision tree of the conductor. This will prevent the node making too many recovery attempts after a crash.

    • Enhances FSM behaviour: when the initiator is offline, allows the responder to stay online waiting for it even if the timeout timer is reached.

    • Adds an explicit settings for local_lima_testnet. So far those were implicit as Lima is the currently running release. The MDW though uses a macro to parse those and if there is no explicit function head - it fails. This aims at providing the MDW with capabilities to work with a local Lima test environment.

    • Due to MacOS High Sierra reaching EOL status we no longer build and provide release binaries for MacOS High Sierra. MacOS Mojave and above is supported.

    Please join the mainnet by following the instructions in the documentation below, and let us know if you have any problems by . Troubleshooting of common issues is documented .

    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to .

    About this release

    This is a maintenance Lima release.

    It:

    • Upgrades the swagger definition to OAS3.

    • Introduces a new query param in relevant HTTP APIs. It is calledint-to-str and specifies that all integers in the response shall be represented as strings instead. This will allow SDKs to pick their preference for the data representation and will help them solve precision issues. This applies only for v3 API that supports oas3 and is not supported by the swagger v2 API

    • Allows passing strings instead of integers in post requests for debug APIs that are convenience for testing and developing SDKs.

    • Introduces a second HTTP specification. This is to provide the new OAS3 API under /v3/ while we keep the Swagger v2 API unchanged under /v2/. This aims to provide a smooth transition from old specification to the new one. The new API is to be finalized with iris hardfork, please do not depend on it yet.

    • Expands the /api endpoint with an option: while simply calling /api keeps the old behaviour, calling /api?oas3 will provide the new OAS3 spec instead.

    Please join the mainnet by following the instructions in the documentation below, and let us know if you have any problems by . Troubleshooting of common issues is documented .

    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to .

    About this release

    This is a maintenance Lima release candidate.

    It:

    • Enchances the p2p noise protocol with an optional setting to ask a peer for the version of their node. A node operator can set one's node to not respond to this message if one considers this a private information. This is to be used for monitoring the network's health.

    • Enhances FSM behaviour: when the initiator is offline, allows the responder to stay online waiting for it even if the timeout timer is reached.

    • Configuration values can now be set using OS environment variables, where the environment variable name is on the form AE__k1__k2, e.g. AE__CHAIN__PERSIST=true. Note that two underscores are used to separate each level. Structured values must be JSON-encoded. The prefix AE can not be customized. The environment variables are applied after reading an available config file, and all values are checked against the schema. See docs/configuration.md.

    • Introduces persistence of the peer pool: if the node flag for disc persistence is set, after a node restart old peers are loaded from the DB. Trusted peers are provided to the node from the config file so they are already persisted. Since the time being off is unknown, all peers are loaded asunverified, even if they had been verified before the node stop.

    • Changes the default value and significantly speeds up the TCP probes. Those used to be done roughly once every 2 minutes while now they are executed every second. Note that this is done only if there are peers to be checked: if a peer is missing, there is a grace period in which we mark it as 'suspended', waiting for its return. If all peers are checked, we wait longer - until either a new peer is added or there is a not-suspended peer. Basically the probes come on demand. Even despite the probes are fast, there is a maximum size of currently ongoing probes.

    • Fixes the process of probing verified peers. Until now we were probing only unverified peers. If a peer responds to the probe - we consider it verified. We downgrade a verified peer only after we fail connecting to it. This resulted in amounting peers that used to be verified at one point of time. This is fixed now as we probe verified peers as well. What is more is, that this PR plays really well with PR #3365. This means that if a peer goes down, we will find it significantly sooner and will downgrade it as an unverified one. This is important as a nodes shares to other nodes only peers one considers to be verified.

    • Added support for reporting chain events during contract evaluation. These events are published internally as 'tx_events' (available e.g. for plugins), and can also be fetched via the HTTP 'dry-run' method. The events are presented as 'dummy' transactions, unsigned, reflecting the details of the respective events.

    • Fixes a bug: there are special trusted peers that are never deleted nor downgraded. Those are quite unique as the node considers them to be available. One can pick their own set of trusted peers but this was not really effective: the default peers were always included as a bonus. This PR fixes it: if the new config flag is set to false - the defaults are omitted. The flag is called include_default_peers and by default it is true.

    • There used to be multiple copies of the same peers in peers pool. This resulted in propagation of same peers with different Peer IDs through the network. Now duplicates are cleaned up.

    • Some further peers fine tuning: we used to treat peers that refuse connecting to us as they were malicious. This was the case no matter if peers were active and part of the network and only simply refusing to open aenoise connection to our node (most likely because their inbound pool is staturated already). This is now changed and if the node is responding but refusing to open an enoise connection - we consider it still a valid and verified participant of the network.

    • Improves sync's peer propagation: peers are split into verified and unverified. We had allowed a grace period for peers to be down while the node still considers them as verified and broadcasts them as such. Once a verified peer is being detected as down, it enters a standby state that allows them to stay verified. This PR tightens the process - once a peer is being detected to be unreachable - it is being downgraded from verified to unverified immediately. The processing of unverified being deleted is left unchanged - they still enter the standby mode for a few times before being removed.

    Please join the mainnet by following the instructions in the documentation below, and let us know if you have any problems by . Troubleshooting of common issues is documented .

    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to .

    About this release

    This is a maintenance Lima release.

    • Refactor fetching of (forward) generations. This avoids a slow check for chain inclusion and will speedup v2/generations/height/<height> andv2/generations/hash/<kh_...>

    • Added new metrics covering extended block information

      • ae.epoch.aemon.block.tx.total.micro : Number of transactions in a microblock

      • ae.epoch.aemon.block.gas.total.micro : Gas used per microblock

      • ae.epoch.aemon.block.gas.per_tx.micro : Gas used per transaction in a microblock

      • ae.epoch.aemon.block.size.per_tx.micro : Size of transactions in a microblock in bytes

      • ae.epoch.aecore.blocks.micro.txs_execution_time.success : Execution time of all transaction in a microblock in microseconds

      • ae.epoch.aecore.blocks.micro.txs_execution_time.error : Execution time of all transaction in a microblock in microseconds, when an error was encountered

      • ae.epoch.aecore.blocks.micro.insert_execution_time.success : Execution time of insertion of a microblock in microseconds

      • ae.epoch.aecore.blocks.micro.insert_execution_time.error : Execution time of failed insertion of a microblock in microseconds

      • ae.epoch.aecore.blocks.key.insert_execution_time.success : Execution time of insertion of a keyblock in microseconds

      • ae.epoch.aecore.blocks.key.insert_execution_time.error : Execution time of failed insertion of a keyblock in microseconds

    • Added new metrics covering contract call information The following names act as templates for multiple specific metrics. The placeholders in these names are (in order) for ABI version, VM version, return type and actual info type. The return type may be ok, return or revert. The info type may be gas_used, execution_time in microseconds,state_size or call_data_size, both in bytes.

    • Improve the algorithm in agree_on_height. It now starts looking near the top, and it keeps the right top hash during the whole algorithm.

    • The default configuration for the Erlang runtime system has been adapted to use less CPU cores and threads. This should improve CPU contention on systems with fewer cores and improve responsiveness. For systems with 4+ CPU cores the settings can be increased if the node is experiencing any form of CPU limitations.

    Please join the mainnet by following the instructions in the documentation below, and let us know if you have any problems by . Troubleshooting of common issues is documented .

    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to .

    About this release

    First Lima release candidate.

    Changelog:

    • We now have FATE. (The initial version of FATE is released as VM version 0x05).

    • The channel_close_mutual transaction can now be performed while the channel is not active on-chain (The channel solo closing sequence had been initiated and the channel is not yet closed), this is a consensus breaking change available after the Lima fork.

    • The state channel FSM after the Lima fork accepts a shutdown message while the channel is being closed unilaterally.

    • Introduces AEVM version 0x06, available from Lima consensus. This is a fine-tuned version of the AEVM version 0x04 introduced in the Fortuna consensus.

    • Extends transaction signing - also allow signatures of the transaction hash. The transaction serialization is potentially long, so signing the transaction hash means less cryptographic work.

    • Obsoletes the old State Channel off-chain transaction type which contained the list of updates that produced the latest state_hash. The new transaction type is available since Fortuna hard fork and the FSM is producing such transactions ever since. This detaches the off-chain protocol from the on-chain one and allows development of unique off-chain protocols that don't need their updates to be serializable on-chain.

    • For existing state channels where the latest co-authenticated state is an off-chain transaction based on the old version, it is suggested to make a new co-authenticated transaction which is using the new serialization. For currently existing state channels which latest co-authenticated state is an old version off-chain transaction is suggested to make a new co-authenticated transaction that is using the new serialization. If the other party refuses to authenticate a new round or is simply missing, one can use the solo closing sequence instead.

    • Metadata objects (of type binary) can now be added to an offchain update transfer request. These objects serve as comments and are not part of the signed transaction, nor do they affect the offchain state trees. This is an incompatible change in the serialization of offchain updates, but old offchain updates can still be deserialized. When creating a channel with a party running an older node version, add version_offchain_update=1 to the channel params.

    The node is able to start from a database produced by v4.* releases. For the rest, this release is not backward compatible with v4.* releases.

    Please join the mainnet by following the instructions in the documentation below, and let us know if you have any problems by . Troubleshooting of common issues is documented .

    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to .

    About this release

    This is a maintenance Lima release.

    It:

    • Introduces an external HTTP endpoint(/v2/status/chain-ends) which reports keyhashes for which no successor is present in the database. Useful for retrieving orphan blocks and tracking chain reorganizations.

    • Introduces configurable fork resistance (sync:sync_allowed_height_from_top), which lets a node reject long forks injected via the sync protocol. Documented in docs/fork-resistance.md

    • HTTP endpoint names/<name> now also returns a field owner containing the account owning the name.

    Please join the mainnet by following the instructions in the documentation below, and let us know if you have any problems by . Troubleshooting of common issues is documented .

    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to .

    Docker

    This document describes:

    • ;

    • ;

    • ;

    Rebar Quick Guide

    Rebar3 is the standard Erlang build tool

    Common commands are:

    • rebar3 help

    • rebar3 get-deps

    • rebar3 compile

    About this release

    is the first release candidate. It:

    • Adds response TTL to Oracle query response TX - a required parameter. This affects consensus.

    • Adds JSON-RPC support in the state channel WebSocket API. The previous API remains supported for now. Support for JSON-RPC request batches implemented but not yet tested.

    • Forbids certain prim-ops to be run in off-chain contracts

    About this release

    is the seventh release candidate. It:

    • Updates genesis accounts

    • Sets target for the genesis block

    • Increases the amount of nodes that new information is gossiped to

    About this release

    is a maintenance release. It:

    • Fine tunes the severity of the log message in case of invalid request on the user HTTP API - from warning to info.

    • Details the Sophia compiler error reason, returned in the HTTP response body of path /debug/contracts/code/compile. This is a backward compatible enhancement of the user HTTP API.

    • Fine tunes the validation of user API requests. The request body must be smaller than approx. 5 MB (was 8 MB) and must be received within 10 s (was 15 s).

    Build from source

    This document describes how to build an Aeternity node from source on:

    • Ubuntu 20.04 LTS

    • MacOS (latest)

    • Archlinux 20210404

    About this release

    is the sixth release candidate. It:

    • New error handling for smart contracts. This affects consensus.

    • Increase gossiping of created blocks.

    This release introduces backward incompatible changes in the chain format:

    • After upgrading your node, you will not have your previous balance (even if you keep your key pair);

    Hacking
    Rebar Quick Guide

    An interactive visualization of the same specification is available online.

  • WebSocket API endpoints are specified online;

  • The intended usage of the user API (HTTP and WebSocket) is documented online.

  • How to retrieve the released software for running a node
    How to install a node
    How to join the testnet
    release binary
    Docker image aeternity/epoch
    Building a release binary from source
    wiki
    its documentation
    online in swagger.yaml
    the dedicated separate document
    its documentation online
    its documentation
    the dedicated separate document
    the dedicated separate document
    opening a ticket
    in the wiki
    Aeternity node documentation
    opening a ticket
    in the wiki
    Aeternity node documentation
    opening a ticket
    in the wiki
    Aeternity node documentation
    opening a ticket
    in the wiki
    Aeternity node documentation
    ae.epoch.aecore.contracts._._.ga_meta._._
  • ae.epoch.aecore.contracts._._.ga_attach._._

  • ae.epoch.aecore.contracts._._.contract_call._._

  • ae.epoch.aecore.contracts._._.contract_create._._

  • opening a ticket
    in the wiki
    Aeternity node documentation
    opening a ticket
    in the wiki
    Aeternity node documentation
    opening a ticket
    in the wiki
    Aeternity node documentation
    opening a ticket
    in the wiki
    Aeternity node documentation
    How to run a local network using Docker.

    You must have docker installed on a host machine and be familiar how to operate docker containers.

    Mainnet

    The default node configuration is sufficient to join the mainnet:

    You should see the console output of the running node and a lot of information related to syncing with the network.

    Verify if your node is connected to mainnet.

    Testnet

    To join the testnet a network_id with value ae_uat argument must be passed:

    You should see the console output of the running node and a lot of information related to syncing with the network.

    See how to persist the blockchain data and how to enable mining below.

    Localnet

    To run small local network for development and testing purposes, please refer to the localnet repository

    Docker Image

    Docker image is automatically build and published on DockerHub.

    Please note that all the examples below:

    • use the Docker -P which publish all exposed ports to the host interfaces, for good network connectivity refer to networking documentation how to setup firewall and/or port mapping to the host machine

    • run the container in foreground mode for easier debugging (console output).

    Version

    All releases have their own docker image tag as well. Latest release is published behind latest docker image tag. Master branch of the source code is tagged as master.

    To pull the latest release docker image run:

    Always make sure you have the latest docker image prior running any of the below commands.

    Node Configuration

    Тo change the node configuration, a Docker bind mount should be used to mount the configuration file to a special path on the container (/home/aeternity/.aeternity/aeternity/aeternity.yaml). For example, assuming your configuration file is located at ~/.aeternity/myaeternity.yaml on the host machine:

    Configuration can also be changed by providing environment variables to the container:

    More details about node configuration can be found in configuration documentation.

    Persisting Data

    The blockchain data is persisted by default at /home/aeternity/node/data/mnesia, inside the Docker container. In order to persist the data in a directory on the host machine, use Docker volumes.

    Replace ~/.aeternity/myaedb with location of your choice where the data will be stored in.

    ** Note that you cannot switch networks using the same database **

    Mining

    Mining is disabled by default. If you want to mine with docker you have to enable it in the configuration:

    The example above uses the less memory intensive lean miner, if you want to use the default (memory intensive mean) miner, remove the mining.cuckoo section and increase the docker container memory at least 4GB.

    You also need to provide beneficiary account in the configuration, please refer to the beneficiary section in the configuration documentation how to create one if you don't have yet.

    For more information see miner configuration documentation.

    How to join the mainnet using Docker
    How to use the Docker image
    How to join the testnet using Docker
  • rebar3 eunit

  • rebar3 ct

  • rebar3 shell

  • rebar3 release

  • Configuration

    Rebar3 reads the rebar.config file to know what to do. This consists of one or more plain Erlang terms (tuples: {...}, lists: [...], symbols, numbers, and strings), each terminated by a full stop and newline, for example:

    This sets compilation options and other details, lists dependencies (other Erlang apps to be fetched automatically) in the deps section:

    defines how a Release is put together in the relx section:

    and specifies the different Rebar3 Profiles in the profiles section:

    In addition, the file rebar.config.script (an Erlang script) will be executed by Rebar3 if it exists, to perform dynamic configuration.

    Generated files

    Rebar3 does not write into the source directories, and instead outputs all generated files under a separate directory, by default _build/. It's always safe to delete the whole build directory and rebuild everything, if needed.

    Source files

    Rebar3 expects that applications follow the standard Erlang application structure with a src/ subdirectory etc. A Rebar3 project can be either a single application with a rebar.config file in the app directory, or it can consist of a collection of applications under a subdirectory named apps/ or lib/, with the main rebar.config in the root directory. Such a collection is called an "umbrella project".

    An umbrella application is usually published as a Release - a complete Erlang system to run on some target machine. Often, only a top level rebar.config file is needed, but individual apps (apps/app1/, apps/app2/, ...) may have their own rebar.config files in order to use specific build options, pre-build or post-build hooks, etc., for that app only.

    For a single application, it may also be published as a standalone library (that others can use as a dependency), or turned in to an escript (a standalone executable).

    Releases

    A release is a package that can be installed and run on a target machine, where the operator doesn't necessarily know anything about the implementation. When Rebar3 builds a release, typically rebar3 as prod release or rebar3 as prod tar, it puts the files under _build/$PROFILE/rel/$RELNAME (see Profiles below). A typical release specification looks something like this:

    A start script bin/$RELNAME will be generated automatically, providing standard commands like $RELNAME start. The listed Erlang apps will be included in the release package and will be started when the script runs, using the included sys_config and vm_args configuration files.

    External Dependencies

    Dependencies can be specified either just by name and version, as in {deps, [{gproc, "0.9.0"},...]}, in which case they are downloaded via the Hex package manager, or as a Git URL, as in {deps, [{cowboy, {git, "https://github.com/ninenines/cowboy.git", {tag,"2.11.0"}}},...]}, in which case they are checked out and built. See Profiles below for details about where the code ends up.

    Note that listing an app as a dependency does not automatically include it in the final Release package - for that to happen, it must also be included in the relx specification (see above). For instance, libraries only used for building or testing may be listed as dependencies but should not be in the release spec. Vice versa, just listing an app in the release spec does not tell Rebar3 how to download that app.

    The relx section does not however need to list every app that should be included in the Release. If an app a declares (in its *.app metadata file) that it has a runtime dependency on app b, then if Rebar3 includes a, it will automatically also include b, and so on, transitively, so that the Release package will contain all apps required for running.

    Dependency pinning

    When new dependencies have been fetched, Rebar3 updates the rebar.lock file with more exact information about the version, such as the Git hash, and not just the branch or tag name used in the deps declaration. This file should typically be kept under version control to ensure repeatable builds. See the Rebar3 documentation for details.

    Checkout dependencies

    You can also create a subdirectory or symbolic link named _checkouts, containing apps or links to apps that you have as local files, not yet published or committed, such as a library that you're currently making changes to. Apps found under _checkouts take precedence over any other apps with the same names, even if they already exist under _build.

    Profiles

    The default profile is just the basic rebar.config without any other profile applied. This is used if you e.g. just say rebar3 compile. To apply a profile to a command, say e.g. rebar3 as prod compile. You can use any profile names you like, but some names have special meaning to Rebar3:

    • The prod profile will automatically apply the prod mode (see below).

    • When running the commands rebar3 eunit or rebar3 ct, the profile named test will be automatically applied.

      • For example, if your tests require the meck library to run, you can add it as dependency to only the test profile, like this: {profiles, [{test, [{deps, [meck]}]}]}.

    When Rebar3 builds things, it puts the generated files under _build/$PROFILE/. For example, Erlang apps compiled with rebar3 compile go under _build/default/lib, but when compiled with rebar3 as prod compile the files are placed under _build/prod/lib.

    *Note that external dependencies, as specified in {deps, []}, are always built using their individual prod profiles, no matter what profile Rebar3 has been told to use currently. The files are however placed under _build/default/lib, not _build/prod/lib, because they should be available under the default profile.

    Also note that when Rebar builds other profiles than the default, it does not rebuild the external dependencies. Instead it creates symbolic links from _build/$PROFILE/lib into _build/default/lib. The exception is dependencies specified as part of an individual profile, as in {profiles, [{test, [{deps, [meck]}]}]}, which get stored under that profile (in this case _build/test/lib) since they should not be available under the default profile.

    These locations are typically not the final destination for the compiled files. Usually, they will later get copied into a Release package under _build/$PROFILE/rel for distribution as a tarball or similar.

    Modes

    Modes are shortcuts for some basic settings, for example {mode, prod} sets some typical options for production. The builtin modes are:

    • prod: Include the Erlang Runtime System in the release package, don't include source code, and strip any debug information. Copy files into the release package instead of using symbolic links.

    • minimal: Like prod but does not include the Erlang Runtime System.

    • dev: The inverse of prod.

    In particular, {mode, dev} implies the {dev_mode, true} option, which creates symbolic links instead of copying files when composing a release. This means that you don't need to rebuild the release when you make a small change during development; just recompiling is enough.

    openSUSE Leap 15.2

    While the package should build on most linux distributions that's not verified (in CI) for each release on other than the below platforms:

    • Ubuntu 18.04 LTS

    • MacOS (latest)

    The commands below assume you are logged in with sudo user.

    The node have couple of main dependencies that have to be installed to build it from source:

    • Erlang/OTP 24.3.4.15

    • Libsodium

    • Libgmp

    Dependencies

    Ubuntu 20.04

    Update package database, packages and install the common tools and libraries:

    Building with dynamically linked RocksDB

    To speed up build times, you can tell the RocksDB bindings to use dynamically loaded system libraries instead of building everything from source with static linking. You can do this by setting the following environment variable:

    You must then also install the corresponding libraries on your system: sudo apt install librocksdb-dev liblz4-dev libsnappy-dev.

    MacOS

    The easiest way to install package on MacOS is Homebrew, it can be installed by running:

    Then install the build dependencies using the brew command:

    If building on an m1 Mac homebrew does not automatically set up symlinks to system directories, so before running make set up the build path with:

    Archlinux

    Update package database, packages and install the common tools and libraries:

    openSUSE Leap 15.2

    Building

    The source code of the Aeternity node can be obtained by cloning the public GitHub repository:

    NOTE: By default git will checkout the master (default) branch of the source code. To build a particular version it should be checkout first:

    Production build

    One can create a production build by running:

    If prod-build went fine, configuration is in place, one should be able to navigate to the build artifacts directory and start the Aeternity node:

    See operation documentation for more details.

    Production package

    Alternatively a production package similar to what is distributed via GitHub releases can be created by running:

    Once the packaging is done, the package is created in the _build/prod/rel/aeternity/ directory, e.g. _build/prod/rel/aeternity/aeternity-X.Y.Z.tar.gz.

    To deploy the package for example in ~/aeternity/node one should just unarchive it to that directory:

    Then start the node in background mode:

    See operation documentation for more details.

      chain:
        hard_forks:
          "1": 0
          "2": 1
          "3": 2
          "4": 3
    
     fork_management:
        network_id: "my_test_iris"
    mkdir -p ~/.aeternity/maindb
    docker pull aeternity/aeternity
    docker run -p 3013:3013 -p 3015:3015 \
        -v ~/.aeternity/maindb:/home/aeternity/node/data/mnesia \
        aeternity/aeternity
    mkdir -p ~/.aeternity/testdb
    docker run -p 3013:3013 -p 3015:3015 \
        -e AE__FORK_MANAGEMENT__NETWORK_ID=ae_uat \
        -v ~/.aeternity/testdb:/home/aeternity/node/data/mnesia \
        aeternity/aeternity
    docker pull aeternity/aeternity
    docker run -p 3013:3013 -p 3015:3015 \
        -v ~/.aeternity/maindb:/home/aeternity/node/data/mnesia \
        -v ~/.aeternity/myaeternity.yaml:/home/aeternity/.aeternity/aeternity/aeternity.yaml \
        aeternity/aeternity
    mkdir -p ~/.aeternity/testdb
    docker run -p 3013:3013 -p 3015:3015 \
        -e AE__FORK_MANAGEMENT__NETWORK_ID=ae_uat \
        -v ~/.aeternity/testdb:/home/aeternity/node/data/mnesia \
        aeternity/aeternity
    mkdir -p ~/.aeternity/myaedb
    docker run -p 3013:3013 -p 3015:3015 \
      -v ~/.aeternity/myaedb:/home/aeternity/node/data/mnesia \
      aeternity/aeternity
    # ... SNIP
    mining:
        autostart: true
        beneficiary: "encoded_beneficiary_pubkey_to_be_replaced"
        cuckoo:
            miner:
                executable: lean29-generic
                extra_args: ""
                edge_bits: 29
    # SNIP ...
    {erl_opts, [debug_info]}.
    {deps, [{gproc, "0.9.0"},
            ...]}.
    {relx, [{release, { aeternity, ...},
            [ ... included-applications ... ]},
            ...
           ]}.
    {profiles, [{prod, [... prod-specific-options ...
                       ]},
                {test, [... test-specific-options ...
                       ]},
               ]}.
    {relx, [{release, { RELNAME, DEFAULT_VERSION_STRING },
             [app1, app2, ...]},
            {sys_config, "./config/sys.config"},
            {vm_args, "./config/vm.args"},
            {overlay, [{copy, "LICENSE" , "LICENSE"},
                       {copy, "docs/README.md", "docs/REAME.md"}
                      ]}
           ]}.
    sudo apt-get -qq update \
    && sudo apt-get -y upgrade \
    && sudo apt-get -qq -y install git autoconf libtool build-essential cmake erlang libsodium-dev libgmp-dev
    export ERLANG_ROCKSDB_OPTS="-DWITH_SYSTEM_ROCKSDB=ON -DWITH_LZ4=ON -DWITH_SNAPPY=ON"
    /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    brew update
    brew install erlang@24 openssl libsodium autoconf gmp cmake automake
    export PATH=/opt/homebrew/bin:$PATH
    export CFLAGS="-I/opt/homebrew/include"
    export CXXFLAGS="-I/opt/homebrew/include"
    export LDFLAGS="-L/opt/homebrew/lib"
    sudo pacman -Sy
    sudo pacman -S git base-devel cmake ncurses erlang23-nox libsodium gmp
    sudo zypper install -t pattern devel_basis
    sudo zypper install cmake gcc-c++ git erlang libsodium-devel gmp-devel
    git clone https://github.com/aeternity/aeternity.git aeternity_source && cd aeternity_source
    VERSION=X.Y.Z # set a particular version
    git checkout tags/v${VERSION:?}
    make prod-build
    cd _build/prod/rel/aeternity/
    bin/aeternity daemon
    make prod-package
    mkdir -p ~/aeternity/node
    tar xf _build/prod/rel/aeternity/aeternity-*.tar.gz -C ~/aeternity/node
    ~/aeternity/node/bin/aeternity daemon

    Introduces minimum gas prace validation and sets minimum gas price to 1.

  • Changes default state channel websocket listen address to 127.0.0.1 (previously 0.0.0.0)

  • Changes the keyblock target to be 4 bytes in serialization (was 8 bytes). This affects consensus.

  • Moves all charges in contract create transaction and contract call transaction to before the execution of the contract. The changed items are: gas in both create and call transactions (unused gas is refunded); fee in call transaction; deposit in create transaction. This affects consensus.

  • Removes internal websocket API (/websocket endpoint)

  • Avoids replay attacks by naming networks (forks) with network_id and including them in transaction signature

  • Optimizes the force progress transaction by turning the poi to a proper set of off-chain trees and removing the auxiliary addresses

  • Disallows reentrant calls (i.e. contract calls into a currently executing contract) in Sophia.

  • Improves the stability of the HTTP user API.

  • Charges gas also for calldata size/initial heap size when doing Sophia contract calls. This affects consensus.

  • Implements the Sophia abort primitive using the REVERT instruction in the aevm.

  • Refactors State Channel's approach to disputes. The block height timer between subsequent force progress transactions is removed. This greatly improves the speed of forcing of progress. A co-signed state still overwrites on-chain produced states. This impacts consesus.

  • Sets the return value of initial call in create contract transaction to the empty byte array "<<>>" in the call state tree. This affects consensus (state tree root has changes).

  • Increases the gas of the VM primitive operations that create or extend objects on the state trees, approximating that to a component proportional to the serialized equivalent transaction. This affects consensus.

  • Fixes gas available to VM primops contract to be the same as for other contracts. This affects consensus.

  • Charges gas for maps handling in return value. This affects consensus.

  • Restricts registrars in Naming Service, to allow only .test registrar

  • Introduces throw away keys for block mining and signing

  • Changes the API for constructing contract create and call transactions, allowing calls with user-defined types.

  • Changes calling convention in sophia and add type checking of remote calls. This makes the byte code smaller, the memory usage smaller, the contract calls more type safe. This affects consensus.

  • Introduces the vm_version field in oracles. This affects consensus.

  • Validates query and response formats in oracles. The nature of the check depends on the new vm version field.

  • Makes it possible for a contract to interact with oracles with plain string queries/responses.

  • This release introduces backward incompatible changes in the chain format:

    • After upgrading your node, you will not have your previous balance (even if you keep your key pair);

    • Please ensure that you do not reuse a persisted blockchain produced by the previous releases "v0.24.x".

    Please join the testnet by following the instructions below, and let us know if you have any problems by opening a ticket. Troubleshooting of common issues is documented in the wiki.

    The instructions below describe:

    • How to retrieve the released software for running a node;

    • How to install a node;

    • How to join the testnet.

    Retrieve the software for running a node

    You can run a node by either:

    • Installing the published release binary corresponding to your platform; or

    • Running the published Docker image aeternity/epoch; or

    • Building a release binary from source.

    The user configuration is documented in the wiki. For specifying configuration using the Docker image, please refer to its documentation.

    The node user API is documented:

    • HTTP API endpoints are specified online in swagger.yaml;

      • A JSON version of the same specification is located in the node at path lib/aehttp-0.1.0/priv/swagger.json.

      • The JSON version can be obtained from a running node using the endpoint /api.

      • An interactive visualization of the same specification is available .

    • WebSocket API endpoints are ;

    • The intended usage of the user API (HTTP and WebSocket) is .

    Install node

    The instructions for installing a node using a release binary are in the dedicated separate document.

    For installation of a node using the Docker image, please refer to its documentation online.

    Join the testnet

    This section describes how to run a node as part of the testnet - the public test network of nodes - by using the release binary.

    For running a node as part of the testnet by using the Docker image, please consult its documentation in addition to this section.

    Inspect the testnet

    The core nodes of the public test network are accessible from the Internet.

    Information, e.g. height, of the top block of the longest chain as seen by these core nodes of the testnet can be obtained by opening in the browser any of the following URLs:

    • http://52.10.46.160:3013/v2/blocks/top

    • http://13.250.162.250:3013/v2/blocks/top

    • http://18.130.148.7:3013/v2/blocks/top

    Setup your node

    Setting up your node consists of:

    • Configuring your node - see instructions in the dedicated separate document;

    • Starting your node and verifying it works as expected - see instructions in the dedicated separate document.

    This release
    Restricts the listen address of the operations TCP port (Distributed Erlang) to localhost (127.0.0.1).

    This release introduces backward incompatible changes in the chain format:

    • After upgrading your node, you will not have your previous balance (even if you keep your key pair);

    • Please ensure that you do not reuse a persisted blockchain produced by the previous releases "v1.0.0-rc3,4,5,6".

    Please join the net by following the instructions below, and let us know if you have any problems by opening a ticket. Troubleshooting of common issues is documented in the wiki.

    The instructions below describe:

    • How to retrieve the released software for running a node;

    • How to install a node;

    • How to join the net.

    Retrieve the software for running a node

    You can run a node by either:

    • Installing the published release binary corresponding to your platform; or

    • Running the published Docker image aeternity/epoch; or

    • Building a release binary from source.

    The user configuration is documented in the wiki. For specifying configuration using the Docker image, please refer to its documentation.

    The node user API is documented:

    • HTTP API endpoints are specified online in swagger.yaml;

      • A JSON version of the same specification is located in the node at path lib/aehttp-0.1.0/priv/swagger.json.

      • The JSON version can be obtained from a running node using the endpoint /api.

      • An interactive visualization of the same specification is available .

    • WebSocket API endpoints are ;

    • The intended usage of the user API (HTTP and WebSocket) is .

    Install node

    The instructions for installing a node using a release binary are in the dedicated separate document.

    For installation of a node using the Docker image, please refer to its documentation online.

    Join the net

    This section describes how to run a node as part of the net - the public network of nodes - by using the release binary.

    For running a node as part of the net by using the Docker image, please consult its documentation in addition to this section.

    Inspect the net

    The core nodes of the public network are accessible from the Internet.

    Information, e.g. height, of the top block of the longest chain as seen by these core nodes of the net can be obtained by opening in the browser any of the following URLs:

    • http://35.178.61.73:3013/v2/blocks/top

    • http://35.177.192.219:3013/v2/blocks/top

    • http://18.136.37.63:3013/v2/blocks/top

    • http://52.220.198.72:3013/v2/blocks/top

    Setup your node

    Setting up your node consists of:

    • Configuring your node - see instructions in the dedicated separate document;

    • Starting your node and verifying it works as expected - see instructions in the dedicated separate document.

    This release
  • Fine tunes the severity of the log message in case of unexpected validation result of user HTTP API request - from error to warning.

  • Adds network_id to /status endpoint. This is a backward compatible enhancement of the user HTTP API.

  • Disables mining autostart by default, and makes beneficiary optional when mining is not enabled.

  • Re-designs how the node interacts with the miner. Passing the nonce as a separate option.

  • Introduces the repeats option to mining to allow the miner to make several attempts in one context.

  • Adds support for multiple mining workers inside the node. Also adds the configuration instances: N to allow for multi (GPU) mining.

  • Ships Linux CUDA GPU miners (cuda29, lcuda29) in the Ubuntu release package.

  • This release is backward compatible with v1.0.*.

    Please join the Roma network by following the instructions below, and let us know if you have any problems by opening a ticket. Troubleshooting of common issues is documented in the wiki.

    The instructions below describe:

    • How to retrieve the released software for running a node;

    • How to install a node;

    • How to join the roma network.

    • How to join the testnet.

    Retrieve the software for running a node

    You can run a node by either:

    • Installing the published release binary corresponding to your platform; or

    • Running the published Docker image aeternity/epoch; or

    • Building a release binary from source.

    The user configuration is documented in the wiki. For specifying configuration using the Docker image, please refer to its documentation.

    The node user API is documented:

    • HTTP API endpoints are specified online in swagger.yaml;

      • A JSON version of the same specification is located in the node at path lib/aehttp-0.1.0/priv/swagger.json.

      • The JSON version can be obtained from a running node using the endpoint /api.

      • An interactive visualization of the same specification is available .

    • WebSocket API endpoints are ;

    • The intended usage of the user API (HTTP and WebSocket) is .

    Install node

    The instructions for installing a node using a release binary are in the dedicated separate document.

    For installation of a node using the Docker image, please refer to its documentation online.

    Join Roma network

    Roma network seed nodes

    The release package comes preconfigured with seed nodes. Here is example subset of the seed nodes:

    • aenode://pp_5mmzrsoPh9owYMfKhZSkUihufDTB6TuayD173Ng464ukVm9xU@35.178.61.73:3015

    • aenode://pp_2KWhoNRdythXAmgCbM6QxFo95WM4XXGq2pjcbKitXFpUHnPQc3@35.177.192.219:3015

    • aenode://pp_2L8A5vSjnkLtfFNpJNgP9HbmGLD7ZAGFxoof47N8L4yyLAyyMi@18.136.37.63:3015

    • aenode://pp_2gPZjuPnJnTVEbrB9Qgv7f4MdhM4Jh6PD22mB2iBA1g7FRvHTk@52.220.198.72:3015

    • aenode://pp_frAKABjDnM3QZCUygbkaFvbd8yhv6xdufazDFLgJRc4fnGy3s@52.56.252.75:3015

    • aenode://[email protected]:3015

    • aenode://pp_2mwr9ikcyUDUWTeTQqdu8WJeQs845nYPPqjafjcGcRWUx4p85P@3.17.30.101:3015

    • aenode://pp_FLpSUrKwgBAu5uVRnB2iWKtwGAHZckxvtCbjVPeeCA3j33t3J@52.56.66.124:3015

    • aenode://pp_2CAJwwmM2ZVBHYFB6na1M17roQNuRi98k6WPFcoBMfUXvsezVU@13.58.177.66:3015

    Inspect Roma network

    Here are example nodes that can be used to inspect current top block and see information about e.g. height or target:

    • http://35.178.61.73:3013/v2/blocks/top

    • http://35.177.192.219:3013/v2/blocks/top

    • http://18.136.37.63:3013/v2/blocks/top

    • http://52.220.198.72:3013/v2/blocks/top

    Join the testnet

    This section describes how to run a node as part of the testnet - the public test network of nodes - by using the release binary.

    For running a node as part of the testnet by using the Docker image, please consult its documentation in addition to this section.

    Testnet seed nodes

    In order to join testnet reconfigure seed nodes in the release package:

    • aenode://pp_QU9CvhAQH56a2kA15tCnWPRJ2srMJW8ZmfbbFTAy7eG4o16Bf@52.10.46.160:3015

    • aenode://pp_27xmgQ4N1E3QwHyoutLtZsHW5DSW4zneQJ3CxT5JbUejxtFuAu@13.250.162.250:3015

    • aenode://pp_nt5N7fwae3DW8Mqk4kxkGAnbykRDpEZq9dzzianiMMPo4fJV7@18.130.148.7:3015

    Inspect the testnet

    The core nodes of the public test network are accessible from the Internet.

    Information, e.g. height, of the top block of the longest chain as seen by these core nodes of the testnet can be obtained by opening in the browser any of the following URLs:

    • http://52.10.46.160:3013/v2/blocks/top

    • http://13.250.162.250:3013/v2/blocks/top

    • http://18.130.148.7:3013/v2/blocks/top

    Setup your node

    Setting up your node consists of:

    • Configuring your node - see instructions in the dedicated separate document;

    • Starting your node and verifying it works as expected - see instructions in the dedicated separate document.

    This
  • Please ensure that you do not reuse a persisted blockchain produced by the previous releases "v1.0.0-rc3,4,5".

  • Please join the testnet by following the instructions below, and let us know if you have any problems by opening a ticket. Troubleshooting of common issues is documented in the wiki.

    The instructions below describe:

    • How to retrieve the released software for running a node;

    • How to install a node;

    • How to join the testnet.

    Retrieve the software for running a node

    You can run a node by either:

    • Installing the published release binary corresponding to your platform; or

    • Running the published Docker image aeternity/epoch; or

    • Building a release binary from source.

    The user configuration is documented in the wiki. For specifying configuration using the Docker image, please refer to its documentation.

    The node user API is documented:

    • HTTP API endpoints are specified online in swagger.yaml;

      • A JSON version of the same specification is located in the node at path lib/aehttp-0.1.0/priv/swagger.json.

      • The JSON version can be obtained from a running node using the endpoint /api.

      • An interactive visualization of the same specification is available .

    • WebSocket API endpoints are ;

    • The intended usage of the user API (HTTP and WebSocket) is .

    Install node

    The instructions for installing a node using a release binary are in the dedicated separate document.

    For installation of a node using the Docker image, please refer to its documentation online.

    Join the testnet

    This section describes how to run a node as part of the testnet - the public test network of nodes - by using the release binary.

    For running a node as part of the testnet by using the Docker image, please consult its documentation in addition to this section.

    Inspect the testnet

    The core nodes of the public test network are accessible from the Internet.

    Information, e.g. height, of the top block of the longest chain as seen by these core nodes of the testnet can be obtained by opening in the browser any of the following URLs:

    • http://52.10.46.160:3013/v2/blocks/top

    • http://13.250.162.250:3013/v2/blocks/top

    • http://18.130.148.7:3013/v2/blocks/top

    Setup your node

    Setting up your node consists of:

    • Configuring your node - see instructions in the dedicated separate document;

    • Starting your node and verifying it works as expected - see instructions in the dedicated separate document.

    This release

    About this release

    This release is the third release candidate. It:

    • Include the Network ID in the P2P Handshake to avoid that differently configured nodes talk to each other by mistake. This affects P2P communication and this version is not able to talk to earlier versions.

    This release introduces backward incompatible changes in the chain format:

    • After upgrading your node, you will not have your previous balance (even if you keep your key pair);

    • Please ensure that you do not reuse a persisted blockchain produced by the previous releases "v1.0.0-rc2".

    Please join the testnet by following the instructions below, and let us know if you have any problems by . Troubleshooting of common issues is documented .

    The instructions below describe:

    • ;

    • ;

    • .

    Retrieve the software for running a node

    You can run a node by either:

    • Installing the published corresponding to your platform; or

    • Running the published ; or

    • .

    The user configuration is documented in the . For specifying configuration using the Docker image, please refer to .

    The node user API is documented:

    • HTTP API endpoints are specified ;

      • A JSON version of the same specification is located in the node at path lib/aehttp-0.1.0/priv/swagger.json.

      • The JSON version can be obtained from a running node using the endpoint /api.

    Install node

    The instructions for installing a node using a release binary are in .

    For installation of a node using the Docker image, please refer to .

    Join the testnet

    This section describes how to run a node as part of the testnet - the public test network of nodes - by using the release binary.

    For running a node as part of the testnet by using the Docker image, please consult in addition to this section.

    Inspect the testnet

    The core nodes of the public test network are accessible from the Internet.

    Information, e.g. height, of the top block of the longest chain as seen by these core nodes of the testnet can be obtained by opening in the browser any of the following URLs:

    • http://52.10.46.160:3013/v2/blocks/top

    • http://13.250.162.250:3013/v2/blocks/top

    • http://18.130.148.7:3013/v2/blocks/top

    Setup your node

    Setting up your node consists of:

    • Configuring your node - see instructions in ;

    • Starting your node and verifying it works as expected - see instructions in .

    Stratum

    Introduction

    Please note that this application is in alpha state.

    By setting the configuration value stratum > enabled to true, the node starts Aestratum app. Aestratum app is an implementation of server side part of the stratum protocol suited for Aeternity network [https://github.com/aeternity/protocol/blob/master/STRATUM.md]. The purpose of the protocol is to formalize the coordination of information exchange between pool server and pool clients.

    Aestratum app is part of the Aeternity node, but in the future we may move this functionality to a separate executable. Enabling stratum server causes that the node doesn't mine the solutions for proof of work locally, but allows user to form mining pools and act as a pool operator. For providing the pool to individual miners, a pool operator can specifying the percentage of the reward they withhold from mined block rewards.

    An Aestratum client [https://github.com/aeternity/aestratum_client] connects to operator pool node (Stratum server), and solves cryptographic puzzles. The server sends jobs to clients, they try to solve them and send their results (called shares) back. The server keeps targets for each client in line with its computational power and distributes rewards accordingly. When miner finds the result artefacts of the Cuckoo Cycle algorithm - nonce and proof of work, the miner is awarded a share in a mining epoch happening between two subsequent key blocks of the chain. A share can be understood as a smallest unit of eligible right to be paid out if the share was created in the mining epoch to be rewarded. If the difficulty of the solution matches the difficulty of the main network, we can combine the block candidate with the computed nonce and proof of work, construct a next block and publish it.

    If the network accepts our new block, the node which constructed that next block will receive a mining reward. This reward will be used for paying out the participants which submitted shares during mining epochs. When stratum app notices that the latest keyblock has changed, stratum looks back 180 (BENEFICIARY_REWARD_DELAY) epochs behind the top keyblock and locates two (configurable) subsequent mining epochs. Miners who contributed their shares to these mining epochs will be paid out proportionally to their contribution, with miner difficulty also taken into account. The rewarding scheme is called PPLNS - Pay Per Last N Shares [https://virtopia.ca/what-is-pplns/].

    The payout of the rewards to pool operators and miners is executed by payout contract deployed to the main net at [https://explorer.aepps.com/#/tx/th_2raHdPQ8xtbE6oKh3z1pFmUpyFC5H7ZTBkNB8TuVydJjwedduL]. Submitting of contract call transaction to the operator node invokes the contract functionality and changes the balances of the rewarded participants. The contract's source code can be seen here: [https://github.com/aeternity/aeternity/blob/master/apps/aestratum/priv/Payout.aes]

    The frequency of payments depends on how often the clients of the pool find a share with the same difficulty as the main net. Ideally, miners with CUDA hardware are mining for the pool, as that significantly increases a chance to find a solution with acceptable difficulty.

    Several improvements are planned for Aestratum, also depending on the feedback from community:

    • proxy for miners (for a miner with multiple mining devices)

    • separation of Aestratum from Aeternity Node

    • simple web based gui for better insight

    Configuration

    Example configuration section in your aeternity.yaml configuration file could look as follows:

    The mining > autostart must be set to true.

    Since mining locally and enabled stratum are mutually exclusive, the mining > beneficiary is not used when stratum is enabled. Instead, the stratum > reward > beneficiaries will receive the rewards from operating of the pool.

    When stratum is started for the first time and no keypair is found in the configured location (stratum > reward > keys > dir), the keypair is automatically generated and placed in the configured location for next time.

    It is advised to backup this keypair, as it may hold some tokens received in the last 180 keyblocks.

    Do not forget to put your accounts in stratum > reward > beneficiaries.

    Connection

    host - (optional) - used only for identification of the pool (default "localhost")

    port - (optional) - denotes what port should clients connect to (default 9999)

    max_connections - (optional) - max number of connected mining clients (default 1024)

    num_acceptors - (optional) - max number of active acceptor processes handling clients requests (default 100)

    transport - (optional) - what mode of transport for data to use (default "tcp", to be tested: "ssl")

    Session

    extra_nonce_bytes - (optional) - nonce (a number) has 8 bytes, and is composed of two parts - extra nonce and miner nonce. Extra nonce is a randomly chosen (unique) number by the stratum server. When a client connects to stratum, it receives an extra nonce and tries to find a miner nonce. There is an interdependence among max_connections and extra_nonce_bytes: max_connections must be at most (2^(extra_nonce_bytes * 8)) / 2. For example - if you set extra_nonce_bytes to 1, max_connections shouldn't exceed 128. (1 byte can represent 256 numbers, and since we need to choose from them, we divide that range by 2). (default 4)

    skip_num_blocks - (optional) - a new keyblock candidate is generated roughly every 3 seconds. skip_num_blocks determines how many of these candidates are skipped before a new job is sent to miner. (default 10)

    initial_share_target - when a miner connects, we cannot immediately determine his mining power. For this reason, we give this new miner a job with the lowest difficulty (highest target).

    max_share_target - maximal target (or, minimal difficulty) of the shares a pool accepts. If you lower the target, you raise the minimal difficulty which puts a strain on miners with weaker hardware.

    desired_solve_time - (optional) - is the amount of time (in seconds) the server expects a miner to send a mined share. If this time is too short for a miner to produce a result, the server adjusts difficulty of the next job sent to the miner. (default 30)

    max_solve_time - (optional) - specifies a time limit (in seconds) stratum app understands as time needed for producing a share, even when miner didn't submit a share at all. (default 60)

    share_target_diff_threshold - (optional) - stratum app measures how long it took a miner to produce a share, or, uses max_solve_time in case no share was submitted. For the succeeding jobs being sent to the miner, a recalculation of the difficulty is in order. If the difference between the new difficulty and previous difficulty is larger than share_target_diff_threshold (in percentages), the new difficulty is used for succeeding jobs sent to miner. This is done by sending set_target notification to the miner. If the difference is smaller than the threshold, the previous difficulty is used for the following jobs. (default 5.0)

    edge_bits - (optional) - a proof of work algorithm we use, called Cuckoo Cycle, looks for a cycle in randomly generated graph. edge_bits determines how long this cycle should be. You should only change this value if you plan to deploy your own network, because in order for this change to work, you will need to distribute a new mining client. (default 29)

    max_jobs - (optional) - max number of jobs kept in queue for each client. Lower number of max_jobs results in more frequent changes via set_target notification. (default 20)

    max_workers - (optional) - max number of workers for one connection. This is not fully implemented yet, will be required for a proxy implementation. (default 20)

    msg_timeout - (optional) - timeout (in milliseconds) guards transitions between miner states (connected, configured, subscribed). If a transition doesn't happen within a specified time, the client session is closed. (default 15)

    Reward

    reward_last_rounds - (optional) - denoted how many epochs between keyblocks are rewarded out of the received mining reward. Higher number of epochs would cause that the mining reward will be distributed to more shares, but each partial reward will be smaller. Higher number incentivizes loyalty among miners, by raising a chance of rewarding miners who contributed shares for a longer period of time. (default 2)

    beneficiaries - is a list in format "account_address:percent_share" - denotes the pool operator addresses with their respective shares. The sum of shares must be less than or equal to 100. The sum of shares equal to 100 effectively means that all rewards coming from mining are distributed to pool operators, while miners don't receive any reward.

    keys > dir - points to a location where to a stratum account keypair is stored. Since we want to send tokens to miners from this account, we need to have access to its private key. The stratum account holds reward(s) from mining which are scheduled to be paid out via a payment contract. While it may sound tempting, stratum account should never have any significant accumulated wealth since it only serves as a temporary place for holding rewards received, before they are distributed to the miners. This is happening regularly and funds are not accumulated in this account for longer periods of time. If dir represents a relative path, the directory will be in priv directory of estratum app. Providing an absolute path allows storing a keypair outside the aestratum app.

    About this release

    This is the stable Minerva release. It contains:

    • The finalization of the Minerva consensus protocol version - in mainnet.

    • Feature refinements.

    Please refer to the notes below for details and backward compatibility.

    Regarding the Minerva consensus protocol upgrade on mainnet, this release:

    • Sets the Minerva mainnet hard fork height to block 47800 (approximately 6th Mar 2019 1pm CET).

    • Adds all tokens migrated in phase 1 of the token migration. This takes effect at the Minerva mainnet hardfork height.

    Regarding feature refinements:

    • More consistent handling of defaults for state channel on-chain transactions

    • If a fee is specified for an on-chain state channel tx, but is too low, an error will be raised. If no fee is specified, a default fee 10% above the minimum is chosen.

    • If a channel shutdown is requested, but the balances are insufficient to cover the transaction fee, the shutdown request will be rejected right away.

    • Introduce a configuration parameter for miners - the minimum gas price that they are willing to accept.

    This release is backward compatible with v2.0.0-rc.1.

    Please join the mainnet by following the instructions below, and let us know if you have any problems by . Troubleshooting of common issues is documented .

    The instructions below describe:

    • ;

    • ;

    • .

    • .

    Retrieve the software for running a node

    You can run a node by either:

    • Installing the published corresponding to your platform; or

    • Running the published ; or

    • .

    The instructions for configuring the node using the Docker image are in .

    The node user API is documented:

    • HTTP API endpoints are specified ;

      • A JSON version of the same specification is located in the node at path lib/aehttp-*/priv/swagger.json (you will need to amend the wildcard * placeholder in the path with the version).

      • The JSON version can be obtained from a running node using the endpoint /api.

    Install node

    The instructions for installing a node using a release binary are in .

    For installation of a node using the Docker image, please refer to .

    Join the mainnet

    Mainnet seed nodes

    The release package comes preconfigured with seed nodes. Here is example subset of the seed nodes:

    • aenode://pp_2L8A5vSjnkLtfFNpJNgP9HbmGLD7ZAGFxoof47N8L4yyLAyyMi@18.136.37.63:3015

    • aenode://pp_2gPZjuPnJnTVEbrB9Qgv7f4MdhM4Jh6PD22mB2iBA1g7FRvHTk@52.220.198.72:3015

    • aenode://[email protected]:3015

    • aenode://pp_2mwr9ikcyUDUWTeTQqdu8WJeQs845nYPPqjafjcGcRWUx4p85P@3.17.30.101:3015

    Inspect the mainnet

    Here are example nodes that can be used to inspect current top block and see information about e.g. height or target:

    • http://18.136.37.63:3013/v2/blocks/top

    • http://52.220.198.72:3013/v2/blocks/top

    • http://13.53.114.199:3013/v2/blocks/top

    • http://13.53.149.181:3013/v2/blocks/top

    Join the testnet

    This section describes how to run a node as part of the testnet - the public test network of nodes - by using the release binary.

    For running a node as part of the testnet by using the Docker image, please consult in addition to this section.

    Testnet seed nodes

    In order to join testnet reconfigure seed nodes in the release package:

    • aenode://pp_QU9CvhAQH56a2kA15tCnWPRJ2srMJW8ZmfbbFTAy7eG4o16Bf@52.10.46.160:3015

    • aenode://pp_27xmgQ4N1E3QwHyoutLtZsHW5DSW4zneQJ3CxT5JbUejxtFuAu@13.250.162.250:3015

    • aenode://pp_DMLqy7Zuhoxe2FzpydyQTgwCJ52wouzxtHWsPGo51XDcxc5c8@13.53.161.215:3015

    Inspect the testnet

    The core nodes of the public test network are accessible from the Internet.

    Information, e.g. height, of the top block of the longest chain as seen by these core nodes of the testnet can be obtained by opening in the browser any of the following URLs:

    • http://52.10.46.160:3013/v2/blocks/top

    • http://13.250.162.250:3013/v2/blocks/top

    • http://13.53.161.215:3013/v2/blocks/top

    Setup your node

    Setting up your node consists of:

    • Configuring your node - see instructions in ;

    • Starting your node and verifying it works as expected - see instructions in .

    About this release

    This is a maintenance release. It contains stability improvements so all users are encouraged to upgrade.

    It:

    • Makes the cleanup of the UPnP/NAT-PMP port mapping when the operator stops the node more robust.

    • Enhances the stability of the Noise-based connections used for syncing and gossiping blocks.

    • Enhances the stability of state channels.

    This release is backward compatible with v1.3.*, v1.2.*, v1.1.* and v1.0.*.

    Please join the Roma network by following the instructions below, and let us know if you have any problems by . Troubleshooting of common issues is documented .

    The instructions below describe:

    • ;

    • ;

    • .

    • .

    Retrieve the software for running a node

    You can run a node by either:

    • Installing the published corresponding to your platform; or

    • Running the published ; or

    • .

    The instructions for configuring the node using the Docker image are in .

    The node user API is documented:

    • HTTP API endpoints are specified ;

      • A JSON version of the same specification is located in the node at path lib/aehttp-*/priv/swagger.json (you will need to amend the wildcard * placeholder in the path with the version).

      • The JSON version can be obtained from a running node using the endpoint /api.

    Install node

    The instructions for installing a node using a release binary are in .

    For installation of a node using the Docker image, please refer to .

    Join Roma network

    Roma network seed nodes

    The release package comes preconfigured with seed nodes. Here is example subset of the seed nodes:

    • aenode://pp_5mmzrsoPh9owYMfKhZSkUihufDTB6TuayD173Ng464ukVm9xU@35.178.61.73:3015

    • aenode://pp_2KWhoNRdythXAmgCbM6QxFo95WM4XXGq2pjcbKitXFpUHnPQc3@35.177.192.219:3015

    • aenode://pp_2L8A5vSjnkLtfFNpJNgP9HbmGLD7ZAGFxoof47N8L4yyLAyyMi@18.136.37.63:3015

    • aenode://pp_2gPZjuPnJnTVEbrB9Qgv7f4MdhM4Jh6PD22mB2iBA1g7FRvHTk@52.220.198.72:3015

    Inspect Roma network

    Here are example nodes that can be used to inspect current top block and see information about e.g. height or target:

    • http://35.178.61.73:3013/v2/blocks/top

    • http://35.177.192.219:3013/v2/blocks/top

    • http://18.136.37.63:3013/v2/blocks/top

    • http://52.220.198.72:3013/v2/blocks/top

    Join the testnet

    This section describes how to run a node as part of the testnet - the public test network of nodes - by using the release binary.

    For running a node as part of the testnet by using the Docker image, please consult in addition to this section.

    Testnet seed nodes

    In order to join testnet reconfigure seed nodes in the release package:

    • aenode://pp_QU9CvhAQH56a2kA15tCnWPRJ2srMJW8ZmfbbFTAy7eG4o16Bf@52.10.46.160:3015

    • aenode://pp_27xmgQ4N1E3QwHyoutLtZsHW5DSW4zneQJ3CxT5JbUejxtFuAu@13.250.162.250:3015

    • aenode://pp_nt5N7fwae3DW8Mqk4kxkGAnbykRDpEZq9dzzianiMMPo4fJV7@18.130.148.7:3015

    Inspect the testnet

    The core nodes of the public test network are accessible from the Internet.

    Information, e.g. height, of the top block of the longest chain as seen by these core nodes of the testnet can be obtained by opening in the browser any of the following URLs:

    • http://52.10.46.160:3013/v2/blocks/top

    • http://13.250.162.250:3013/v2/blocks/top

    • http://18.130.148.7:3013/v2/blocks/top

    Setup your node

    Setting up your node consists of:

    • Configuring your node - see instructions in ;

    • Starting your node and verifying it works as expected - see instructions in .

    About this release

    This is a maintenance release. It:

    • Reduces the parameters required when reestablishing a state channel from the WebSocket user API. The node retrieves the rest of the parameters from the on-chain channel indicated by the specified channel identifier parameter. Please refer to the documentation of the intended usage of the user API for details.

    This release is backward compatible with previous v2.3.* and v2.2.* releases.

    Please join the mainnet by following the instructions below, and let us know if you have any problems by opening a ticket. Troubleshooting of common issues is documented in the wiki.

    The instructions below describe:

    • ;

    • ;

    • .

    • .

    Retrieve the software for running a node

    You can run a node by either:

    • Installing the published corresponding to your platform; or

    • Running the published ; or

    • .

    The instructions for configuring the node using the Docker image are in .

    The node user API is documented:

    • HTTP API endpoints are specified ;

      • A JSON version of the same specification is located in the node at path lib/aehttp-*/priv/swagger.json (you will need to amend the wildcard * placeholder in the path with the version).

      • The JSON version can be obtained from a running node using the endpoint /api.

    Install node

    The instructions for installing a node using a release binary are in .

    For installation of a node using the Docker image, please refer to .

    Join the mainnet

    Mainnet seed nodes

    The release package comes preconfigured with seed nodes. Here is example subset of the seed nodes:

    • aenode://pp_2L8A5vSjnkLtfFNpJNgP9HbmGLD7ZAGFxoof47N8L4yyLAyyMi@18.136.37.63:3015

    • aenode://pp_2gPZjuPnJnTVEbrB9Qgv7f4MdhM4Jh6PD22mB2iBA1g7FRvHTk@52.220.198.72:3015

    • aenode://[email protected]:3015

    • aenode://pp_2mwr9ikcyUDUWTeTQqdu8WJeQs845nYPPqjafjcGcRWUx4p85P@3.17.30.101:3015

    Inspect the mainnet

    Here are example nodes that can be used to inspect current top block and see information about e.g. height or target:

    • http://18.136.37.63:3013/v2/blocks/top

    • http://52.220.198.72:3013/v2/blocks/top

    • http://13.53.114.199:3013/v2/blocks/top

    • http://13.53.149.181:3013/v2/blocks/top

    Join the testnet

    This section describes how to run a node as part of the testnet - the public test network of nodes - by using the release binary.

    For running a node as part of the testnet by using the Docker image, please consult in addition to this section.

    Testnet seed nodes

    In order to join testnet reconfigure seed nodes in the release package:

    • aenode://pp_QU9CvhAQH56a2kA15tCnWPRJ2srMJW8ZmfbbFTAy7eG4o16Bf@52.10.46.160:3015

    • aenode://pp_27xmgQ4N1E3QwHyoutLtZsHW5DSW4zneQJ3CxT5JbUejxtFuAu@13.250.162.250:3015

    • aenode://pp_DMLqy7Zuhoxe2FzpydyQTgwCJ52wouzxtHWsPGo51XDcxc5c8@13.53.161.215:3015

    Inspect the testnet

    The core nodes of the public test network are accessible from the Internet.

    Information, e.g. height, of the top block of the longest chain as seen by these core nodes of the testnet can be obtained by opening in the browser any of the following URLs:

    • http://52.10.46.160:3013/v2/blocks/top

    • http://13.250.162.250:3013/v2/blocks/top

    • http://13.53.161.215:3013/v2/blocks/top

    Setup your node

    Setting up your node consists of:

    • Configuring your node - see instructions in ;

    • Starting your node and verifying it works as expected - see instructions in .

    About this release

    This is a backwards-compatible bug fix release for the Fortuna release 3.0.0. It:

    • Solves an issue with loading old serialization ofchannel_force_progress_tx from the database and updating it to the new serialization format.

    Please join the mainnet by following the instructions below, and let us know if you have any problems by opening a ticket. Troubleshooting of common issues is documented in the wiki.

    The instructions below describe:

    • How to retrieve the released software for running a node;

    • ;

    • .

    • .

    Retrieve the software for running a node

    You can run a node by either:

    • Installing the published corresponding to your platform; or

    • Running the published ; or

    • .

    The instructions for configuring the node using the Docker image are in .

    The node user API is documented:

    • HTTP API endpoints are specified ;

      • A JSON version of the same specification is located in the node at path lib/aehttp-*/priv/swagger.json (you will need to amend the wildcard * placeholder in the path with the version).

      • The JSON version can be obtained from a running node using the endpoint /api.

    Install node

    The instructions for installing a node using a release binary are in .

    For installation of a node using the Docker image, please refer to .

    Join the mainnet

    Mainnet seed nodes

    The release package comes preconfigured with seed nodes. Here is example subset of the seed nodes:

    • aenode://pp_2L8A5vSjnkLtfFNpJNgP9HbmGLD7ZAGFxoof47N8L4yyLAyyMi@18.136.37.63:3015

    • aenode://pp_2gPZjuPnJnTVEbrB9Qgv7f4MdhM4Jh6PD22mB2iBA1g7FRvHTk@52.220.198.72:3015

    • aenode://[email protected]:3015

    • aenode://pp_2mwr9ikcyUDUWTeTQqdu8WJeQs845nYPPqjafjcGcRWUx4p85P@3.17.30.101:3015

    Inspect the mainnet

    Here are example nodes that can be used to inspect current top block and see information about e.g. height or target:

    • http://18.136.37.63:3013/v2/blocks/top

    • http://52.220.198.72:3013/v2/blocks/top

    • http://13.53.114.199:3013/v2/blocks/top

    • http://13.53.149.181:3013/v2/blocks/top

    Join the testnet

    This section describes how to run a node as part of the testnet - the public test network of nodes - by using the release binary.

    For running a node as part of the testnet by using the Docker image, please consult in addition to this section.

    Testnet seed nodes

    In order to join testnet reconfigure seed nodes in the release package:

    • aenode://pp_QU9CvhAQH56a2kA15tCnWPRJ2srMJW8ZmfbbFTAy7eG4o16Bf@52.10.46.160:3015

    • aenode://pp_27xmgQ4N1E3QwHyoutLtZsHW5DSW4zneQJ3CxT5JbUejxtFuAu@13.250.162.250:3015

    • aenode://pp_DMLqy7Zuhoxe2FzpydyQTgwCJ52wouzxtHWsPGo51XDcxc5c8@13.53.161.215:3015

    Inspect the testnet

    The core nodes of the public test network are accessible from the Internet.

    Information, e.g. height, of the top block of the longest chain as seen by these core nodes of the testnet can be obtained by opening in the browser any of the following URLs:

    • http://52.10.46.160:3013/v2/blocks/top

    • http://13.250.162.250:3013/v2/blocks/top

    • http://13.53.161.215:3013/v2/blocks/top

    Setup your node

    Setting up your node consists of:

    • Configuring your node - see instructions in ;

    • Starting your node and verifying it works as expected - see instructions in .

    Network Monitoring

    This document describes how to configure network monitoring within the node provided by aemon application.

    Configuration

    By default monitoring is disabled. To turn it on monitoring.publisher.pubkey and monitoring.active = true need to be setup. To start posting transaction setup monitoring.publisher.autostart to true.

    To post transactions account's public and private key is needed. For online processing only public key needs to be configured. Offline post-processing can be done by filtering transaction by publisher public key.

    Metrics configuration

    Monitoring uses statsd backend provided by apps/aecore/src/aec_metrics.erl. See metrics metrics.* configuration keys in apps/aeutils/priv/aeternity_config_schema.json

    Metrics

    Each metric uses ae.epoch.aemon. prefix.

    Name
    Type
    Description

    How to read metrics

    confirmation.delay

    represents network latency. A high number might imply a busy network or unfair leaders.

    forks.micro & gen_stats.microblocks.total

    forks.micro represents the length of microfork. It shows a minimum number observed by monitoring, not an exact one. Based on behaviour observed in mainnet in the first half of 2019, roughly 33% of microblocks transactions are rewritten to the next generation. Use gen_stats.microblocks.total as a reference.

    gen_stats.microblocks.total and gen_stats.tx.{monitoring,total}

    Statistic metrics can be used to measure network saturation

    publisher.post_tx.*

    Metrics can be used to monitor mempool's transaction propagation. When publisher.post_tx.nonce_too_high is preset you might want to check mempool.nonce_offset configuration/

    publisher.queue.*

    For further network transaction propagation investigation. All transactions accepted by mempool are tracked by *.size. Over time it should correlate with gen_stats.tx.monitoring.

    *.ttl_expired might imply low transaction fee or busy network.

    About this release

    This release is the fifth release candidate. It:

    • Fixes the content of the /key-blocks/pending API in case autostart: false.

    This release does not introduce backward incompatible changes in the chain format.

    Please join the testnet by following the instructions below, and let us know if you have any problems by opening a ticket. Troubleshooting of common issues is documented in the wiki.

    The instructions below describe:

    • ;

    • ;

    • .

    Retrieve the software for running a node

    You can run a node by either:

    • Installing the published corresponding to your platform; or

    • Running the published ; or

    • .

    The user configuration is documented in the . For specifying configuration using the Docker image, please refer to .

    The node user API is documented:

    • HTTP API endpoints are specified ;

      • A JSON version of the same specification is located in the node at path lib/aehttp-0.1.0/priv/swagger.json.

      • The JSON version can be obtained from a running node using the endpoint /api.

    Install node

    The instructions for installing a node using a release binary are in .

    For installation of a node using the Docker image, please refer to .

    Join the testnet

    This section describes how to run a node as part of the testnet - the public test network of nodes - by using the release binary.

    For running a node as part of the testnet by using the Docker image, please consult in addition to this section.

    Inspect the testnet

    The core nodes of the public test network are accessible from the Internet.

    Information, e.g. height, of the top block of the longest chain as seen by these core nodes of the testnet can be obtained by opening in the browser any of the following URLs:

    • http://52.10.46.160:3013/v2/blocks/top

    • http://13.250.162.250:3013/v2/blocks/top

    • http://18.130.148.7:3013/v2/blocks/top

    Setup your node

    Setting up your node consists of:

    • Configuring your node - see instructions in ;

    • Starting your node and verifying it works as expected - see instructions in .

    About this release

    This is the first Iris release candidate.

    It:

    • Fixed buggy serialization of contract information - this means the compiler version is actually stored on chain, and isn't replaced by "unknown".

    • Added AENS.update to FATE VM

    • Added AENS.lookup and Oracle.expiry lookup functions to FATE VM

    • Fixed bug regarding TTL of preclaims in FATE VM - it was incorrectly always set to 0, from VM_FATE_SOPHIA_2 it has the correct value.

    • Fixed a bug in AENS.resolve in FATE VM - for invalid names VM_FATE_SOPHIA_1 will crash. From VM_FATE_SOPHIA_2 it will not crash, rather return None.

    • Changed Chain.block_hash - in VM_FATE_SOPHIA_2 it will returnSome(<blockhash>) for Chain.block_height (i.e. current generation) previously it returned None. With Bitcoin-NG we do have the block hash of the current generation, so no reason not to allow this.

    • Extended AENS name max expiration time from 50000 generations (~100 days) to 180000 generations (~375 days).

    • Changed how a meta transaction TTL's is being validated: so far it used to be the outermost transaction's ttl that was taken into account, now it is the innermost one instead. Meta transactions no longer have TTL.

    • Fixed a protocol issue: a valid force progress call with invalid CallData or failing call would result in on-chain transaction but tokens from the caller would still be moved to the forced contract. This is fixed and failed calls in successful force progress transactions result in rollback of the off-chain balances.

    • Improved the functionality of State Channel delegates: now they can providechannel_solo_snapshot_tx as well. This is really handy in cases one party is missing and the other is doing malicious force progress on-chain while the channel is still open.

    • Revisited the State Channel delegates: so far they were a shared list for both participants. From Iris on, delegates are per peer: there is a list of delegates for the initiator and another one for the responder. Old channel objects can still be used but users are strongly recommended to reset their delegates list if they had any. Note that the HTTP representations are changed accordingly.

    • Allowed delegates to force progress on behalf of the user that authorized them to do so.

    • Improved garbage collector for all Fate contracts form Iris

    • Fate contracts of different versions can now call each other (Fate1 can call Fate2 and vice-versa)

    • Opcode availability and behaviour now depends on VM version of the contract (Fate2 opcodes are available both when Fate2 contract is called directly and when called by another (possibly Fate1) contract)

    • Generalized accounts, allow access to the signed transaction within the authentication context:

    This enables more use-cases, for example in combination with PayingForTx.

    • Added more crypto primitives (mainly pairing operations) for BLS12-381. This enables for example Zero-knowledge proofs and more multi-signature schemes.

    • Added functions related to strings. It introduces to_list and from_list primitives that enables flexible string manipulation. Strings.aes standard library functions include many useful string functions.

    • Added the possibility to query a an oracle by name hash. A name pointer can map oracle_pubkey

    Please test the iris protocol by activating it in the configuration file as below:

    You can also join testnet, the hard fork will happen there at .

    Please let us know if you have any problems by . Troubleshooting of common issues is documented .

    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to .

    Operation

    This document describes how to start your Aeternity node installed using a release binary, verify that it mines and verify that it joined the configured public network of nodes (e.g. testnet).

    The instructions below assume that:

    • The node is deployed in directory ~/aeternity/node;

    • beneficiary account is set under mining > beneficiary in the config (see configuration documentation);

    • No custom peers are specified under the peers: key in the config. If the peers: key is undefined, the testnet or mainnet seed peers (built-in in the package source) are used.

    • The external HTTP endpoint of the user API of the node can be contacted at 127.0.0.1 port 3013.

    • The location of the keys is set under keys > dir in the config (see ).

    If any of the assumptions does not hold, you need to amend the instructions accordingly.

    Start the node

    It is recommended that the node has at least 4 GB of memory available.

    When it starts, the node checks the maximum number of open files (ulimit -n) and warns if below the recommended limit: proper max number of open files is essential to managing network connections and you should make sure you configure it in the session where you start the node.

    Start the node:

    (You can stop the node by running bin/aeternity stop from the same directory.)

    Verify the node is up, by inspecting the current top of the blockchain as seen by the node:

    If the node is unresponsive, inspect the log directory for errors.

    Back up the peer key pair:

    Mainnet connection

    To verify that node is connected to the mainnet, your node should see the same longest blockchain as the mainnet.

    Inspect the current top of the blockchain as seen by the mainnet:

    Inspect the current top of the blockchain as seen by your node:

    Verify that the height is the same; it may take a few minutes for your node to catch up with the mainnet blockchain.

    Mining

    To verify that node mines, inspect the mining log file of the node:

    If the node is mining, you shall read log entries like the following:

    If the node successfully mines a block, you shall read log entries like the following:

    Mainnet mining

    After the node is successfully connected to the mainnet, you could verify that it is mining on the same chain as the rest of the network. You can validate it observing the hash of the /headers/top of the remote nodes:

    This is the hash of the block being at the top of the chain of the node and the previous key hash should be same as the hash in prev_key_hash of the block you're currently mining:

    Height would be +1 of what is in the /headers/top of the remote node but this is not as strong guarantee as the prev_key_hash.

    Maintenance mode

    It is possible to start the node in "maintenance mode", where mining, sync and HTTP endpoints are disabled. To do so, start the node with AE__SYSTEM__MAINTENANCE_MODE=true. This can be useful when debugging or performing maintenance tasks on the system.

    Offline mode

    It is possible to start the node in "offline mode", where mining and sync endpoints are disabled. To do so, start the node with AE__SYSTEM__OFFLINE_MODE=true. This can be useful when debugging or performing rosetta-cli testing on the system.

    Garbage Collection

    This document describes how garbage collection works in the Aeternity node, and how to use it.

    What is garbage collection?

    Blockchains act as "append-only" repositories, i.e. you can only add data, not modify it. At any given block height, the "state" of the blockchain is the set of current values of accounts, contract and oracle states, registered names and ongoing name auctions and active state channels. For any state object, it is possible to inspect its history by fetching its value relative to previous block heights. The "root hash" of a block header identifies a slice of the blockchain state trees representing all the live state and values that were current at that point in time.

    The drawback of this is of course that the size of the blockchain keeps growing. Ultimately, it becomes impractical to keep the entire chain on a local computer.

    Garbage collection is a way to "prune" the history of states, that is we keep the state of a number of blocks beneath the top, but delete the ones beneath that. Importantly, all the latest values of all accessible state is always kept. What is deleted is the state that has been overwritten at some point.

    Configuration

    An example setting for a very compact chain state size of around ~40 GB in 2023 would be:

    Please note that this might come with sync performance implications, as the garbage collection is performed in addition to the sync.

    Garbage collection can be customized with the following configuration options:

    chain:garbage_collection:enabled

    type: boolean default: false

    This is the master switch, controlling whether or not garbage collection is active.

    chain:garbage_collection:during_sync

    type: boolean default: false

    If true, garbage collection will not wait for chain sync to complete. Garbage-collecting during chain sync will slow down the sync process - exactly how much depends on the settings, but around 30 % is a reasonable expectation. The upside is that the on-disk footprint stays small.

    Note that the node cannot be sure when sync is fully completed. Garbage collection will wait (if during_sync: false) for the first indication that sync has completed given the information available. New information may arrive when other peers are found, but the garbage collector will not go back to waiting, once activated.

    chain:garbage_collection:minimum_height

    type: integer (non-negative) default: 0

    If set to a value > 0, garbage collection will not kick in until this height is reached. This could be used to speed up sync (when used together with during_sync: true), since chain sync can proceed at full speed until the given height is reached.

    chain:garbage_collection:history

    type: integer (minimum: 50) default: 15000 (ca 31 days)

    Determines how much history to keep. The unit is number of key blocks.

    chain:garbage_collection:trees

    type: array default: all the trees

    Makes it possible to garbage-collect only a subset of the state trees. This would be touched mainly if there is a requirement to actually keep the history of a given state (e.g. accounts), but still reduce the space requirement somewhat. It could also possibly be a way to reduce the overhead of garbage collection (also getting less space reduction).

    **Example: ["accounts", "ns"] (the two largest state trees)

    The array may not be empty. An empty array would mean that nothing is garbage-collected. This effect is better achieved using enabled: false.

    regulators:gc_scan

    type: object

    This group allows for configuration of the load regulation of the garbage-collection scans. You should not touch this unless you are knowledgeable of the node internals and willing to experiment. The way garbage collection works is that sets of A/B database table pairs are switched at a given height, and a scan is started for each tree, ensuring that all reachable state is promoted into the current "A" table. Once the scan has been completed, AND the history depth has been reached since the last switch, a clear-and-switch operation can be performed. This means that there is normally ample time to perform the sweeps, and the load regulation parameters can be set quite low.

    The situation is a little different during sync, as the history depth is likely to be reached very quickly. It is therefore possible that the load regulation becomes the factor determining how frequently data can be cleared.

    It is important to know that file system IO capacity can easily become the bottleneck, and trying to run faster, can lead to write stalls and internal timeouts.

    The unit of regulation is a "chunk" of 100 state tree object lookups. That is, the scanner will touch 100 trie nodes, then pause until the regulator gives permission to continue. Each tree has its own scanner process, running concurrently with the others.

    regulators:gc_scan:counter

    type: integer (minimum: 0 - meaning no counter regulation) default: 1

    This controls how many scanner chunks can be actively processed at the same time. Increasing this value may not increase performance. It could even have the opposite effect.

    regulators:gc_scan:rate

    type: integer (minimum: 0 - meaning no counter regulation) default: 50

    This controls how many chunks per second are allowed to run. Increasing this value may not increase performance, but lowering it, should lower the overhead of garbage collection, possibly at the cost of effective space reduction.

    CUDA Miner

    The Ubuntu release packages ships with a CUDA miner. This documentation describes how to use the CUDA miner shipped in the Ubuntu release package, how to build it yourself (if you prefer to do so), and the related configuration of the Aeternity node.

    The documentation below assumes that an Aeternity node is already installed either by or , thus its dependencies are also installed. The documentation below assumes that the Aeternity node's source code resides in ~/aeternity/node directory.

    Pre-built miner

    This section describes how to use the CUDA miner shipped in the Ubuntu release package.

    About this release

    is the second release candidate. It:

    • Changes package versioning scheme to follow the

    • Changes encoding from base58 to base64 for all binary data in the api that is not identifiers (e.g., accounts, contracts, etc). The base64 encoded string uses the same check as the checked base58c (i.e., the first 4 bytes of the twice sha256 hashed byte array is appended last before base64 encoding the data).

    • Adds Sophia syntax for map lookup and update with default values.

    About this release

    is a maintenance release. It:

    • Introduces additional Garbage Collection of transactions, based on new transaction {origin/account, nonce} cache.

    • Adds new metrics to monitor mempool GC - ae,epoch,aecore,tx_pool,gced and ae,epoch,aecore,tx_pool,origin_gced.

    About this release

    is stable Roma release.

    This release is backward compatible with v1.0.0-rc7. The genesis block is based on ERC20 contract balances that joined migration process. The prev field of genesis block points to hash of contributors messages and recent bitcoin block hash. We also adjusted target to stabilize initial mining process.

    Please join the Roma network by following the instructions below, and let us know if you have any problems by . Troubleshooting of common issues is documented .

    The instructions below describe:

    • ;

    About this release

    is a maintenance release. It:

    • Improves scheduling of Ping:s - make sure we keep/restart pinging after synchronization is done.

    • Adds support for responding of ping messages in State Channels' WebSocket protocol. Because of browser compatibility issues, the keep alive functionality is being built on data frames instead of using the control frames.

    • Enhances the HTTP endpoint for channel creation transaction to accept an optional list of delegates.

    About this release

    is a maintenance release. It:

    • Adds network monitoring capability to the node. This is disabled by default. Please refer to the document for the intended usage.

    This release is backward compatible with previous v2.4.*, v2.3.* and v2.2.* releases.

    Please join the mainnet by following the instructions below, and let us know if you have any problems by . Troubleshooting of common issues is documented .

    The instructions below describe:

    About this release

    is a maintenance release. It:

    • Makes State Channel FSM more robust to timeouts. If one of the peers refuses signing the closing transaction while the channel is not active then the request may timeout without killing the FSM.

    • Improves State Channel FSM to compute transaction fees in a dynamic manner. This will usually result in smaller fees being paid by participants.

    • Enhances the State Channel user experience adding info regarding timeouts. The process that handles the state for the State Channel client in the node has a list of different timeouts. They define different time frames for certain events to be completed. Running out of time is a violation of the off-chain protocol so if it happens - the connection is closed and it is up to the State Channel client how to proceed next. This enhances user experience adding a new info message for the timeouts.

    About this release

    is a maintenance release. It:

    • Fixes build of Windows package:

      • includes the new Minerva accounts file,

      • uses proper data directory.

    About this release

    is the stable Fortuna release. It:

    • Adds all tokens migrated in phase 2 of the token migration. This takes effect at the Fortuna mainnet hardfork height.

    • Disables usage of provided StateChannels WebSocket API for generalized accounts. This is done because FSM is not fully aware of generalized accounts. It is highly recommended for state channels' users not to upgrade their accounts to generalized ones as it might impact their state channels' user experience.

    • Sets the Fortuna mainnet hard fork height to block 90800 (approximately Wed 5th June 11am CEST).

    About this release

    is a maintenance release. It includes the following changes:

    • Localnet setup (docker-compose) has been improved by adding node API compatibility of the internal endpoints, e.g. /v2/debug is now available without prefix. The /internal prefix is now deprecated.

    • Off-chain updates can now still be completed even if one of the Websocket clients is off-line. If the originator manages to get the initial update request co-signed 'out-of-band', the responding FSM will proceed as if it received a successful signing response from the client.

    About this release

    is a maintenance release. It:

    • Fixes issue when blocks and transactions were forwarded to unconnected peers; changed to select a subset of the connected peers to guarantee propagation.

    This release is backward compatible with v1.0.0.

    Please join the Roma network by following the instructions below, and let us know if you have any problems by . Troubleshooting of common issues is documented .

    The instructions below describe:

    • ;

    gen_stats.tx.monitoring

    histogram

    Number of monitoring transactions in a generation

    gen_stats.tx.total

    histogram

    Number of transactions in a generation

    publisher.balance

    gauge

    Publisher balance

    publisher.post_tx.max_adjustment

    counter

    Transaction posting error:

    publisher.post_tx.nonce_too_high

    counter

    Transaction posting error:

    publisher.post_tx.nonce_too_low

    counter

    Transaction posting error:

    publisher.post_tx.success

    counter

    Successful transaction posts

    publisher.queue.size

    histogram

    Number of transactions posted but not signed on chain

    publisher.queue.ttl_expired

    histogram

    Number of transactions with expired ttl

    block.propagation_time.key

    histogram

    Time until key-blocks reached this node in milliseconds

    block.propagation_time.micro

    histogram

    Time until micro-blocks reached this node in milliseconds

    block.time_since_prev.key

    histogram

    Time between key-blocks in milliseconds

    block.time_since_prev.micro

    histogram

    Time between micro-blocks in milliseconds

    block.tx.total.micro

    histogram

    Number of transactions in a microblock

    block.gas.total.micro

    histogram

    Gas used per microblock

    block.gas.per_tx.micro

    histogram

    Gas used per transaction in a microblock

    block.size.per_tx.micro

    histogram

    Size of transactions in a microblock in bytes

    chain.top.difficulty

    gauge

    Difficulty of the top block

    confirmation.delay

    histogram

    Number of keyblock created before signing transaction

    forks.micro.count

    counter

    Count of observed micro-forks

    forks.micro.height

    histogram

    Height difference of observed micro-forks

    gen_stats.microblocks.total

    histogram

    Number of microblocks in a generation

    online
    specified online
    documented online
    online
    specified online
    documented online
    online
    specified online
    documented online
    online
    specified online
    documented online

    An interactive visualization of the same specification is available online.

  • WebSocket API endpoints are specified online;

  • The intended usage of the user API (HTTP and WebSocket) is documented online.

  • opening a ticket
    in the wiki
    How to retrieve the released software for running a node
    How to install a node
    How to join the testnet
    release binary
    Docker image aeternity/epoch
    Building a release binary from source
    wiki
    its documentation
    online in swagger.yaml
    the dedicated separate document
    its documentation online
    its documentation
    the dedicated separate document
    the dedicated separate document

    An interactive visualization of the same specification is available online.

  • WebSocket API endpoints are specified online;

  • The intended usage of the user API (HTTP and WebSocket) is documented online.

  • aenode://pp_2CAJwwmM2ZVBHYFB6na1M17roQNuRi98k6WPFcoBMfUXvsezVU@13.58.177.66:3015

  • aenode://pp_7N7dkCbg39MYzQv3vCrmjVNfy6QkoVmJe3VtiZ3HRncvTWAAX@13.53.114.199:3015

  • aenode://pp_22FndjTkMMXZ5gunCTUyeMPbgoL53smqpM4m1Jz5fVuJmPXm24@13.53.149.181:3015

  • aenode://pp_Xgsqi4hYAjXn9BmrU4DXWT7jURy2GoBPmrHfiCoDVd3UPQYcU@13.53.164.121:3015

  • aenode://[email protected]:3015

  • opening a ticket
    in the wiki
    How to retrieve the released software for running a node
    How to install a node
    How to join the mainnet
    How to join the testnet
    release binary
    Docker image aeternity/aeternity
    Building a release binary from source
    the dedicated separate document
    online in swagger.yaml
    the dedicated separate document
    its documentation online
    its documentation
    the dedicated separate document
    the dedicated separate document

    An interactive visualization of the same specification is available online.

  • WebSocket API endpoints are specified online;

  • The intended usage of the user API (HTTP and WebSocket) is documented online.

  • aenode://pp_frAKABjDnM3QZCUygbkaFvbd8yhv6xdufazDFLgJRc4fnGy3s@52.56.252.75:3015

  • aenode://[email protected]:3015

  • aenode://pp_2mwr9ikcyUDUWTeTQqdu8WJeQs845nYPPqjafjcGcRWUx4p85P@3.17.30.101:3015

  • aenode://pp_FLpSUrKwgBAu5uVRnB2iWKtwGAHZckxvtCbjVPeeCA3j33t3J@52.56.66.124:3015

  • aenode://pp_2CAJwwmM2ZVBHYFB6na1M17roQNuRi98k6WPFcoBMfUXvsezVU@13.58.177.66:3015

  • opening a ticket
    in the wiki
    How to retrieve the released software for running a node
    How to install a node
    How to join the roma network
    How to join the testnet
    release binary
    Docker image aeternity/aeternity
    Building a release binary from source
    the dedicated separate document
    online in swagger.yaml
    the dedicated separate document
    its documentation online
    its documentation
    the dedicated separate document
    the dedicated separate document

    An interactive visualization of the same specification is available online.

  • WebSocket API endpoints are specified online;

  • The intended usage of the user API (HTTP and WebSocket) is documented online.

  • aenode://pp_2CAJwwmM2ZVBHYFB6na1M17roQNuRi98k6WPFcoBMfUXvsezVU@13.58.177.66:3015

  • aenode://pp_7N7dkCbg39MYzQv3vCrmjVNfy6QkoVmJe3VtiZ3HRncvTWAAX@13.53.114.199:3015

  • aenode://pp_22FndjTkMMXZ5gunCTUyeMPbgoL53smqpM4m1Jz5fVuJmPXm24@13.53.149.181:3015

  • aenode://pp_Xgsqi4hYAjXn9BmrU4DXWT7jURy2GoBPmrHfiCoDVd3UPQYcU@13.53.164.121:3015

  • aenode://[email protected]:3015

  • How to retrieve the released software for running a node
    How to install a node
    How to join the mainnet
    How to join the testnet
    release binary
    Docker image aeternity/aeternity
    Building a release binary from source
    the dedicated separate document
    online in swagger.yaml
    the dedicated separate document
    its documentation online
    its documentation
    the dedicated separate document
    the dedicated separate document

    An interactive visualization of the same specification is available online.

  • WebSocket API endpoints are specified online;

  • The intended usage of the user API (HTTP and WebSocket) is documented online.

  • aenode://pp_2CAJwwmM2ZVBHYFB6na1M17roQNuRi98k6WPFcoBMfUXvsezVU@13.58.177.66:3015

  • aenode://pp_7N7dkCbg39MYzQv3vCrmjVNfy6QkoVmJe3VtiZ3HRncvTWAAX@13.53.114.199:3015

  • aenode://pp_22FndjTkMMXZ5gunCTUyeMPbgoL53smqpM4m1Jz5fVuJmPXm24@13.53.149.181:3015

  • aenode://pp_Xgsqi4hYAjXn9BmrU4DXWT7jURy2GoBPmrHfiCoDVd3UPQYcU@13.53.164.121:3015

  • aenode://[email protected]:3015

  • How to install a node
    How to join the mainnet
    How to join the testnet
    release binary
    Docker image aeternity/aeternity
    Building a release binary from source
    the dedicated separate document
    online in swagger.yaml
    the dedicated separate document
    its documentation online
    its documentation
    the dedicated separate document
    the dedicated separate document

    An interactive visualization of the same specification is available online.

  • WebSocket API endpoints are specified online;

  • The intended usage of the user API (HTTP and WebSocket) is documented online.

  • How to retrieve the released software for running a node
    How to install a node
    How to join the testnet
    release binary
    Docker image aeternity/epoch
    Building a release binary from source
    wiki
    its documentation
    online in swagger.yaml
    the dedicated separate document
    its documentation online
    its documentation
    the dedicated separate document
    the dedicated separate document
    to a an oracle to enable query by name hash.
  • Added a new transaction to the protocol. PayingForTx allows an account to pay for a transaction on behalf of someone else. This means paying for fees and gas cost, but it will not cover the amount spent by the transaction just the "the cost of the transaction" (and the extra size added by wrapping the original transaction).

  • Fixed a bug in the contract store garbage collector causing maps to be more expensive than they should be.

  • Added support for protected contract calls. Making a contract call with the named argument protected set to true wraps the result of the call in anoption type, returning Some(res) if the call succeeds with result res and None if the call fails for any reason. If the call fails, any side-effects it performed are rolled back.

  • AENS pointers are now limited, this is enforced when updating a name:

    • No duplicate pointer keys.

    • Pointer keys are not longer than 256 bytes.

    • A name can not have more than 32 pointers. When a name is updated, or looked up, inside a Sophia contract keys that are no longer valid are automatically removed.

  • Added support for CREATE opcode

  • Added support for CLONE opcode

  • Added support for CLONE_G opcode

  • Added support for BYTECODE_HASH opcode

  • Included full FATE 2 code with init in state trees. This also applies to off-chain contracts in state channels

  • Changed comparison and MAP_TO_LIST FATE opcodes to follow ordering as defined in aebytecode

  • Added a new FEE opcode that returns call transaction fee

  • Fixed STR_REVERSE to reverse on unicode codepoints instead of raw bytes

  • Deprecated Ubuntu 16.04 support. EOL Apr 2021.

  • Introduced a new HTTP API for asking the node to provide a correctpaying_for_tx. It is marked as debug and it is intended to be used while developing tools that produce that transaction. This API must not be used in real-life scenarios. Since the inner transaction has a specificnetwork_id, a proper check has been added to the API so attempts to create an erroneous paying_for_tx will fail.

  • Revisited gas prices and gas charging mechanism. The main change is that gas will, in some cases, be charged earlier - i.e. contracts run out of gas before expensive operations rather than after. This should make the FATE VM more efficient. Gas prices have also been adjusted and new operations have been calibrated.

  • height 425900
    opening a ticket
    in the wiki
    Aeternity node documentation
    configuration documentation
    CUDA Driver installation

    In order to use the CUDA miner shipped in the Ubuntu release package, you need to install the CUDA driver version 10.

    Please refer to the NVIDIA documentation for how to download and install the CUDA driver.

    Configuration of the pre-built CUDA miner

    Once the CUDA driver is installed, one should change the node configuration to start using the CUDA miner. The mining.cuckoo.miner section of ~/aeternity/node/aeternity.yaml should be changed to:

    Notice the executable_group.

    After configuration the node could be started (or restarted if it's already running):

    Available executables are: cuda29, lcuda29.

    Building

    This section describes how to build the CUDA miner yourself.

    The Ubuntu release package ships with a CUDA miner that is already built, so you do not need to built the CUDA miner. Advanced users may prefer to build the CUDA miner themselves, though most users do not need to and can therefore skip this section.

    You can build the CUDA miner yourself by following these steps:

    • CUDA toolkit installation

    • CUDA miner install

    • Aeternity node configuration

    The documentation in this section is tested on:

    • Aeternity node version 2.0.0-rc.1

    • CUDA toolkit version 9.2

    • AWS p2.xlarge instance with 16GB EBS

    • Ubuntu 16.04.4

    • non-root user with ALL sudo privileges

    Make sure the Aeternity node is stopped to speedup the installation process.

    CUDA toolkit installation

    Download the official CUDA repository package and install it. A sudo user should be used:

    After the apt repository is set, install CUDA:

    Miner install

    At this point the CUDA toolkit is installed. Next step is to build the cuckoo CUDA miner.

    The source code of the CUDA miner is in aecuckoo git repository:

    Cuckoo CUDA build assumes CUDA compiler (nvcc) is install in PATH, however it is installed by the above steps in /usr/local/cuda-9.2/bin which is not in the PATH by default. To add CUDA compiler to the PATH environment variable run:

    Compilation of CUDA miner is done in aecuckoo_source directory by invoking:

    Finally the actual installation of the miner binary is copying it to the node corresponding path, the documentation assumes the Aeternity node is installed in ~/aeternity/node directory.

    The exact path where to copy the binary depends on the version of the node: you can find it by calling ls -d ~/aeternity/node/lib/aecuckoo-*/priv/bin. E.g. it may be something like ~/aeternity/node/lib/aecuckoo-1.0.0/priv/bin: the following assumes this path though you may need to adapt it.

    Configuration of the manually built CUDA miner

    Once the CUDA miner is in place, one should change the node configuration to start using it. The mining.cuckoo.miner section of ~/aeternity/node/aeternity.yaml should be changed to:

    After updating the configuration, the node should be started (or restarted if it's already running):

    Configuration

    The examples in this section use the CUDA miner that is shipped in the release package. If you prefer to use a manually built CUDA miner, please amend the configuration accordingly.

    Mining efficiency

    There is quite a bit of overhead starting the GPU miner, thus running single mining attempts is not the best option. Therefore there is the configuration option repeats: N which will make multiple mining attempts (with different nonces) in one miner context. However, this option has to be used with CAUTION, the total run-time of the miner should preferably not exceed 5 seconds. The reason being that with the short block interval of BitCoin NG micro blocks (3 seconds) - we risk mining on old blocks otherwise. (And thereby missing out on the reward collected from the transaction fees in the micro blocks.)

    To fine tune the parameter, you should try running the miner in a shell

    Here it took 4.6s, which is rather close to 5s, so maybe 4 is the best value for this node.

    Repeats are configured like this:

    Don't be tempted to use -r as extra_args the Aeternity node will not handle nonces correctly in this case.

    Multiple GPU devices

    The address of a GPU device used by the miner can be set with -d argument, for example to set device with address 0:

    The address of the device can be obtained by running nvidia-smi

    However, if you want to use multiple cards for GPU mining you can add another configuration option, instances, for example if you have two (2) GPU-cards:

    Note: You should not have -d in extra_args if you are using the instances configuration option, it will be added automatically by the node.

    Note: If you are combining repeats and instances, it is the number of repeats per instance that is configured! I.e. with 2 instances and repeats 5 each GPU will run 5 attempts per run.

    Multiple GPU miners

    If you want to address different GPU-cards with different miners' configurations, you can set up multiple miners in the config. For example, if you have 4 GPU-cards, and you want to address 0 and 1 with different config than 2 and 3, you can use the following config:

    References

    • NVIDIA CUDA Installation Guide for Linux

    • CUDA Downloads

    • Cuckoo Cycle Documentation

    release package
    from source
    stratum:
        enabled: true
        connection:
            port: 9999
            max_connections: 1024
            num_acceptors: 100
        session:
            extra_nonce_bytes: 4
            initial_share_target: 115790322390251417039241401711187164934754157181743688420499462401711837019160
            max_share_target: 115790322390251417039241401711187164934754157181743688420499462401711837020160
            desired_solve_time: 30
            max_solve_time: 60
            share_target_diff_threshold: 5.0
            max_jobs: 20
            msg_timeout: 15
        reward:
            reward_last_rounds: 2  # how many mining epochs to reward
            beneficiaries: ["ak_2hJJGh3eJA2v9yLz73To7P8LvoHdz3arku3WXvgbCfwQyaL4nK:3.3",
                            "ak_241xf1kQiexbSvWKfn5uve7ugGASjME93zDbr6SGQzYSCMTeQS:2.2"]
            keys:
                dir: stratum_keys
    switch(Auth.tx)
      Spend(from, to, amount, payload) => ...
      AENSTransfer(from, to, name) => ...
      ...
      chain:
        hard_forks:
          "1": 0
          "5": 1
    
     fork_management:
        network_id: "my_test_iris"
    cd ~/aeternity/node
    bin/aeternity start
    curl http://127.0.0.1:3013/v3/headers/top
    cp -pr ~/aeternity/node/data/aecore/keys ~/my_aeternity_keys
    curl https://mainnet.aeternity.io/v3/headers/top
    curl http://127.0.0.1:3013/v3/headers/top
    less ~/aeternity/node/log/aeternity_mining.log
    ... Creating key block candidate on the top
    ... Created key block candidate ...
    ... Starting miner ...
    ... Starting miner ...
    ... Block mined: Height = 1; Hash = ...
    $ curl https://mainnet.aeternity.io/v3/headers/top
    {"hash":"mh_2bZx1kGy5uqJRDzDQ8zyJwrQgeDah5k36u2AtHcUE3tSTJ9QyY","height":935925,...,
    "prev_key_hash":"kh_26W973ssbCk6kaNdhMpwqA5xtyHF5DD7VxKqUZiTRcQz2BSbv4",...}
    $ curl http://127.0.0.1:3013/v3/key-blocks/pending
    {...,"height":..., "prev_key_hash":"kh_26W973ssbCk6kaNdhMpwqA5xtyHF5DD7VxKqUZiTRcQz2BSbv4", ...}
    chain:
        garbage_collection:
           during_sync: true
           history: 500
    mining:
        cuckoo:
            edge_bits: 29
            miners:
                - executable_group: aecuckooprebuilt
                  executable: cuda29
                  extra_args: ""
                  hex_encoded_header: true
    ~/aeternity/node/bin/aeternity start
    cd ~
    wget https://developer.nvidia.com/compute/cuda/9.2/Prod/local_installers/cuda-repo-ubuntu1604-9-2-local_9.2.88-1_amd64
    sudo dpkg -i cuda-repo-ubuntu1604-9-2-local_9.2.88-1_amd64
    sudo apt-key add /var/cuda-repo-9-2-local/7fa2af80.pub
    sudo apt-get update && sudo apt-get install cuda
    cd ~
    git clone https://github.com/aeternity/aecuckoo.git aecuckoo_source && cd aecuckoo_source
    git checkout fa3d13e   # This commit is used in Aeternity node
    export PATH=/usr/local/cuda-9.2/bin${PATH:+:${PATH}}
    make cuda29
    cp priv/bin/cuda29 ~/aeternity/node/lib/aecuckoo-1.0.0/priv/bin
    mining:
        cuckoo:
            edge_bits: 29
            miners:
                - executable: cuda29
                  extra_args: ""
                  hex_encoded_header: true
    ~/aeternity/node/bin/aeternity start
    $ time ~/aeternity/node/lib/aecuckooprebuilt-*/priv/cuda29 -r 5
    ...
    real 0m4.634s
    user ...
    sys  ...
    mining:
        cuckoo:
            edge_bits: 29
            miners:
                - executable_group: aecuckooprebuilt
                  executable: cuda29
                  repeats: 4
                  extra_args: ""
                  hex_encoded_header: true
    mining:
        cuckoo:
            edge_bits: 29
            miners:
                - executable_group: aecuckooprebuilt
                  executable: cuda29
                  extra_args: "-d 0"
                  hex_encoded_header: true
    mining:
        cuckoo:
            edge_bits: 29
            miners:
                - executable_group: aecuckooprebuilt
                  executable: cuda29
                  extra_args: ""
                  hex_encoded_header: true
                  instances: [0,1]
                  repeats: 5
    mining:
        cuckoo:
            edge_bits: 29
            miners:
                - executable_group: aecuckooprebuilt
                  executable: cuda29
                  extra_args: ""
                  hex_encoded_header: true
                  addressed_instances: [0,1]
                  repeats: 2
                - executable_group: aecuckooprebuilt
                  executable: cuda29
                  extra_args: ""
                  hex_encoded_header: true
                  addressed_instances: [2,3]
                  repeats: 5

    Refunds value transfers on failed contract calls. This affects consensus.

  • Adds a minimal transaction fee check to mempool and micro block validation. The minimal fee is computed from transaction gas and minimal gas price. This affects consensus.

  • Fixes micro blocks signing when key block is posted by /key-blocks HTTP API

  • Aligns the gas cost of the AEVM instructions to the ones in recent Byzantium EVM for preventing known potential denial-of-service attack vectors. This affects consensus.

  • No longer stores call objects for calls from another contract. This affects consensus.

  • Stores contributors messages file in repo and puts its hash in the genesis block (in prev_hash field). This affects consensus.

  • Changes naming scheme for miner executables. Used to be lean/mean/cuda<node-bits>, this is changed tolean/mean/cuda<edge-bits> to align with upstream cuckoo. An upstream sync is also performed. NOTE: changes in epoch.yaml are necessary (i.e. mean30-generic -> mean29-generic, etc.). Does not affect consensus.

  • Fixes the deserialization of name transfer transactions with name as recipient. This deserialization is exercised when such a transaction is exchanged among network peers or is posted by the user from the user API.

  • Fixes validation of minimum gas price in state channel force progress transaction, preventing sender of force progress (on-chain) transaction from not paying the gas of the call. This affects consensus.

  • Charges gas for serialization of Sophia values in the VM. This affects consensus.

  • Requires the sender of the oracle response transaction to have enough balance for paying for the transaction fee without considering the to-be-awarded oracle query fee. This aligns the balance required for the oracle response transaction to the other transactions. This affects consensus.

  • Fixes a bug in channels on-chain mechanics. This impacts consensus.

  • Increases the gas of oracle transactions by adding a TTL state gas. Therefore, the fees for oracle transactions are higher. This affects consensus.

  • Introduces a dry-run API where a list of SpendTx, ContractCreateTx and ContractCallTx can be sent for off-chain evaluation. At the same time disables the broken off-chain (<<"sophia">> ABI) call through debug/contracts/code/call.

  • Disables the Solidity EVM. It was very useful while developing, but it is not tested enough to be part of consensus, so it is disabled. This affects consensus.

  • Changes mining rewards by height to match inflation curve. This affects consensus.

  • Adds a slow start of mining rewards to stabilize before the full rewards are given.

  • Fixes a performance problem with contract state containing large maps. This affects consensus.

  • Details the error reason in the contract call object in case of illegal instruction. This affects consensus.

  • Disables unsupported instructions from Sophia VM. These include: CREATE, SELFDESTRUCT, CALLCODE, DELEGATECALL, calldata-related opcodes, returndata-related opcodes, store-related opcodes. This affects consensus.

  • Changes behaviour of Name Claim, State Channels Close Mutual and State Channels Settle transactions so that they do not burn tokens, and send tokens to a special account without private key access instead. This affects consensus.

  • Changes behaviour in miner reward distribution: when a proof of fraud is received - the fraudelent does not receive any reward and the poster of the proof of fraud gets a fraction of it. In order for this not to skew the inflation, excess tokens are sent to a special account without private key access instead. This affects consensus.

  • This release introduces backward incompatible changes in the chain format:

    • After upgrading your node, you will not have your previous balance (even if you keep your key pair);

    • Please ensure that you do not reuse a persisted blockchain produced by the previous releases "v0.25.x".

    Please join the testnet by following the instructions below, and let us know if you have any problems by opening a ticket. Troubleshooting of common issues is documented in the wiki.

    The instructions below describe:

    • How to retrieve the released software for running a node;

    • How to install a node;

    • How to join the testnet.

    Retrieve the software for running a node

    You can run a node by either:

    • Installing the published release binary corresponding to your platform; or

    • Running the published Docker image aeternity/epoch; or

    • Building a release binary from source.

    The user configuration is documented in the wiki. For specifying configuration using the Docker image, please refer to its documentation.

    The node user API is documented:

    • HTTP API endpoints are specified online in swagger.yaml;

      • A JSON version of the same specification is located in the node at path lib/aehttp-0.1.0/priv/swagger.json.

      • The JSON version can be obtained from a running node using the endpoint /api.

      • An interactive visualization of the same specification is available .

    • WebSocket API endpoints are ;

    • The intended usage of the user API (HTTP and WebSocket) is .

    Install node

    The instructions for installing a node using a release binary are in the dedicated separate document.

    For installation of a node using the Docker image, please refer to its documentation online.

    Join the testnet

    This section describes how to run a node as part of the testnet - the public test network of nodes - by using the release binary.

    For running a node as part of the testnet by using the Docker image, please consult its documentation in addition to this section.

    Inspect the testnet

    The core nodes of the public test network are accessible from the Internet.

    Information, e.g. height, of the top block of the longest chain as seen by these core nodes of the testnet can be obtained by opening in the browser any of the following URLs:

    • http://52.10.46.160:3013/v2/blocks/top

    • http://13.250.162.250:3013/v2/blocks/top

    • http://18.130.148.7:3013/v2/blocks/top

    Setup your node

    Setting up your node consists of:

    • Configuring your node - see instructions in the dedicated separate document;

    • Starting your node and verifying it works as expected - see instructions in the dedicated separate document.

    This release
    https://semver.org

    Adds channels.update.new_contract_from_onchain method to channel websocket API.

  • Exposes setting minimum_depth in WebSocket connection creation in State Channels WebSocket API

  • Unifies State Channel's WebSocket API timeouts: open fallbacks to idle.

  • Improves the stability of the State Channels WebSocket API.

  • Deprecates the log field in the contract object in the user HTTP API.

  • Adds beta support for new database backend leveled.

    • Enable by setting the configuration chain->db_backend in aeternity.yaml to leveled.

    • When first enabling a new database backend you must rename your database folder, or delete it, and resynchronize the chain.

  • This release is backward compatible with previous v2.2.* releases.

    Please join the mainnet by following the instructions below, and let us know if you have any problems by opening a ticket. Troubleshooting of common issues is documented in the wiki.

    The instructions below describe:

    • How to retrieve the released software for running a node;

    • How to install a node;

    • How to join the mainnet.

    • How to join the testnet.

    Retrieve the software for running a node

    You can run a node by either:

    • Installing the published release binary corresponding to your platform; or

    • Running the published Docker image aeternity/aeternity; or

    • Building a release binary from source.

    The instructions for configuring the node using the Docker image are in the dedicated separate document.

    The node user API is documented:

    • HTTP API endpoints are specified online in swagger.yaml;

      • A JSON version of the same specification is located in the node at path lib/aehttp-*/priv/swagger.json (you will need to amend the wildcard * placeholder in the path with the version).

      • The JSON version can be obtained from a running node using the endpoint /api.

      • An interactive visualization of the same specification is available .

    • WebSocket API endpoints are ;

    • The intended usage of the user API (HTTP and WebSocket) is .

    Install node

    The instructions for installing a node using a release binary are in the dedicated separate document.

    For installation of a node using the Docker image, please refer to its documentation online.

    Join the mainnet

    Mainnet seed nodes

    The release package comes preconfigured with seed nodes. Here is example subset of the seed nodes:

    • aenode://pp_2L8A5vSjnkLtfFNpJNgP9HbmGLD7ZAGFxoof47N8L4yyLAyyMi@18.136.37.63:3015

    • aenode://pp_2gPZjuPnJnTVEbrB9Qgv7f4MdhM4Jh6PD22mB2iBA1g7FRvHTk@52.220.198.72:3015

    • aenode://[email protected]:3015

    • aenode://pp_2mwr9ikcyUDUWTeTQqdu8WJeQs845nYPPqjafjcGcRWUx4p85P@3.17.30.101:3015

    • aenode://pp_2CAJwwmM2ZVBHYFB6na1M17roQNuRi98k6WPFcoBMfUXvsezVU@13.58.177.66:3015

    • aenode://pp_7N7dkCbg39MYzQv3vCrmjVNfy6QkoVmJe3VtiZ3HRncvTWAAX@13.53.114.199:3015

    • aenode://pp_22FndjTkMMXZ5gunCTUyeMPbgoL53smqpM4m1Jz5fVuJmPXm24@13.53.149.181:3015

    • aenode://pp_Xgsqi4hYAjXn9BmrU4DXWT7jURy2GoBPmrHfiCoDVd3UPQYcU@13.53.164.121:3015

    • aenode://[email protected]:3015

    Inspect the mainnet

    Here are example nodes that can be used to inspect current top block and see information about e.g. height or target:

    • http://18.136.37.63:3013/v2/blocks/top

    • http://52.220.198.72:3013/v2/blocks/top

    • http://13.53.114.199:3013/v2/blocks/top

    • http://13.53.149.181:3013/v2/blocks/top

    Join the testnet

    This section describes how to run a node as part of the testnet - the public test network of nodes - by using the release binary.

    For running a node as part of the testnet by using the Docker image, please consult its documentation in addition to this section.

    Testnet seed nodes

    In order to join testnet reconfigure seed nodes in the release package:

    • aenode://pp_QU9CvhAQH56a2kA15tCnWPRJ2srMJW8ZmfbbFTAy7eG4o16Bf@52.10.46.160:3015

    • aenode://pp_27xmgQ4N1E3QwHyoutLtZsHW5DSW4zneQJ3CxT5JbUejxtFuAu@13.250.162.250:3015

    • aenode://pp_DMLqy7Zuhoxe2FzpydyQTgwCJ52wouzxtHWsPGo51XDcxc5c8@13.53.161.215:3015

    Inspect the testnet

    The core nodes of the public test network are accessible from the Internet.

    Information, e.g. height, of the top block of the longest chain as seen by these core nodes of the testnet can be obtained by opening in the browser any of the following URLs:

    • http://52.10.46.160:3013/v2/blocks/top

    • http://13.250.162.250:3013/v2/blocks/top

    • http://13.53.161.215:3013/v2/blocks/top

    Setup your node

    Setting up your node consists of:

    • Configuring your node - see instructions in the dedicated separate document;

    • Starting your node and verifying it works as expected - see instructions in the dedicated separate document.

    This
    How to install a node;
  • How to join the roma network.

  • How to join the testnet.

  • Retrieve the software for running a node

    You can run a node by either:

    • Installing the published release binary corresponding to your platform; or

    • Running the published Docker image aeternity/epoch; or

    • Building a release binary from source.

    The user configuration is documented in the wiki. For specifying configuration using the Docker image, please refer to its documentation.

    The node user API is documented:

    • HTTP API endpoints are specified online in swagger.yaml;

      • A JSON version of the same specification is located in the node at path lib/aehttp-0.1.0/priv/swagger.json.

      • The JSON version can be obtained from a running node using the endpoint /api.

      • An interactive visualization of the same specification is available .

    • WebSocket API endpoints are ;

    • The intended usage of the user API (HTTP and WebSocket) is .

    Install node

    The instructions for installing a node using a release binary are in the dedicated separate document.

    For installation of a node using the Docker image, please refer to its documentation online.

    Join Roma network

    Roma network seed nodes

    The release package comes preconfigured with seed nodes. Here is example subset of the seed nodes:

    • aenode://pp_5mmzrsoPh9owYMfKhZSkUihufDTB6TuayD173Ng464ukVm9xU@35.178.61.73:3015

    • aenode://pp_2KWhoNRdythXAmgCbM6QxFo95WM4XXGq2pjcbKitXFpUHnPQc3@35.177.192.219:3015

    • aenode://pp_2L8A5vSjnkLtfFNpJNgP9HbmGLD7ZAGFxoof47N8L4yyLAyyMi@18.136.37.63:3015

    • aenode://pp_2gPZjuPnJnTVEbrB9Qgv7f4MdhM4Jh6PD22mB2iBA1g7FRvHTk@52.220.198.72:3015

    • aenode://pp_frAKABjDnM3QZCUygbkaFvbd8yhv6xdufazDFLgJRc4fnGy3s@52.56.252.75:3015

    • aenode://[email protected]:3015

    • aenode://pp_2mwr9ikcyUDUWTeTQqdu8WJeQs845nYPPqjafjcGcRWUx4p85P@3.17.30.101:3015

    • aenode://pp_FLpSUrKwgBAu5uVRnB2iWKtwGAHZckxvtCbjVPeeCA3j33t3J@52.56.66.124:3015

    • aenode://pp_2CAJwwmM2ZVBHYFB6na1M17roQNuRi98k6WPFcoBMfUXvsezVU@13.58.177.66:3015

    Inspect Roma network

    Here are example nodes that can be used to inspect current top block and see information about e.g. height or target:

    • http://35.178.61.73:3013/v2/blocks/top

    • http://35.177.192.219:3013/v2/blocks/top

    • http://18.136.37.63:3013/v2/blocks/top

    • http://52.220.198.72:3013/v2/blocks/top

    Join the testnet

    This section describes how to run a node as part of the testnet - the public test network of nodes - by using the release binary.

    For running a node as part of the testnet by using the Docker image, please consult its documentation in addition to this section.

    Testnet seed nodes

    In order to join testnet reconfigure seed nodes in the release package:

    • aenode://pp_QU9CvhAQH56a2kA15tCnWPRJ2srMJW8ZmfbbFTAy7eG4o16Bf@52.10.46.160:3015

    • aenode://pp_27xmgQ4N1E3QwHyoutLtZsHW5DSW4zneQJ3CxT5JbUejxtFuAu@13.250.162.250:3015

    • aenode://pp_nt5N7fwae3DW8Mqk4kxkGAnbykRDpEZq9dzzianiMMPo4fJV7@18.130.148.7:3015

    Inspect the testnet

    The core nodes of the public test network are accessible from the Internet.

    Information, e.g. height, of the top block of the longest chain as seen by these core nodes of the testnet can be obtained by opening in the browser any of the following URLs:

    • http://52.10.46.160:3013/v2/blocks/top

    • http://13.250.162.250:3013/v2/blocks/top

    • http://18.130.148.7:3013/v2/blocks/top

    Setup your node

    Setting up your node consists of:

    • Configuring your node - see instructions in the dedicated separate document;

    • Starting your node and verifying it works as expected - see instructions in the dedicated separate document.

    This release
    opening a ticket
    in the wiki
    How to retrieve the released software for running a node
  • Introduces State Channel fsm-assisted solo-close and slash, and continuous chain monitoring.

    • The state channel chain watcher now watches the chain continuously.

    • The state channel FSM stays open during the closing phase.

    • Client WS API for solo-closing, slash and settle.

    • SC FSM automatically detects when a slash is needed.

    • SC FSM reports to client any time the on-chain channel state changes.

    • The SC watcher is now fork-aware.

  • This release is backward compatible with the previous v3.0.1 release.

    Please join the mainnet by following the instructions below, and let us know if you have any problems by opening a ticket. Troubleshooting of common issues is documented in the wiki.

    The instructions below describe:

    • How to retrieve the released software for running a node;

    • How to install a node;

    • How to join the mainnet.

    • How to join the testnet.

    Retrieve the software for running a node

    You can run a node by either:

    • Installing the published release binary corresponding to your platform; or

    • Running the published Docker image aeternity/aeternity; or

    • Building a release binary from source.

    The instructions for configuring the node using the Docker image are in the dedicated separate document.

    The node user API is documented:

    • HTTP API endpoints are specified online in swagger.yaml;

      • A JSON version of the same specification is located in the node at path lib/aehttp-*/priv/swagger.json (you will need to amend the wildcard * placeholder in the path with the version).

      • The JSON version can be obtained from a running node using the endpoint /api.

      • An interactive visualization of the same specification is available .

    • WebSocket API endpoints are ;

    • The intended usage of the user API (HTTP and WebSocket) is .

    Install node

    The instructions for installing a node using a release binary are in the dedicated separate document.

    For installation of a node using the Docker image, please refer to its documentation online.

    Join the mainnet

    Mainnet seed nodes

    The release package comes preconfigured with seed nodes. Here is example subset of the seed nodes:

    • aenode://pp_2L8A5vSjnkLtfFNpJNgP9HbmGLD7ZAGFxoof47N8L4yyLAyyMi@18.136.37.63:3015

    • aenode://pp_2gPZjuPnJnTVEbrB9Qgv7f4MdhM4Jh6PD22mB2iBA1g7FRvHTk@52.220.198.72:3015

    • aenode://[email protected]:3015

    • aenode://pp_2mwr9ikcyUDUWTeTQqdu8WJeQs845nYPPqjafjcGcRWUx4p85P@3.17.30.101:3015

    • aenode://pp_2CAJwwmM2ZVBHYFB6na1M17roQNuRi98k6WPFcoBMfUXvsezVU@13.58.177.66:3015

    • aenode://pp_7N7dkCbg39MYzQv3vCrmjVNfy6QkoVmJe3VtiZ3HRncvTWAAX@13.53.114.199:3015

    • aenode://pp_22FndjTkMMXZ5gunCTUyeMPbgoL53smqpM4m1Jz5fVuJmPXm24@13.53.149.181:3015

    • aenode://pp_Xgsqi4hYAjXn9BmrU4DXWT7jURy2GoBPmrHfiCoDVd3UPQYcU@13.53.164.121:3015

    • aenode://[email protected]:3015

    Inspect the mainnet

    Here are example nodes that can be used to inspect current top block and see information about e.g. height or target:

    • http://18.136.37.63:3013/v2/blocks/top

    • http://52.220.198.72:3013/v2/blocks/top

    • http://13.53.114.199:3013/v2/blocks/top

    • http://13.53.149.181:3013/v2/blocks/top

    Join the testnet

    This section describes how to run a node as part of the testnet - the public test network of nodes - by using the release binary.

    For running a node as part of the testnet by using the Docker image, please consult its documentation in addition to this section.

    Testnet seed nodes

    In order to join testnet reconfigure seed nodes in the release package:

    • aenode://pp_QU9CvhAQH56a2kA15tCnWPRJ2srMJW8ZmfbbFTAy7eG4o16Bf@52.10.46.160:3015

    • aenode://pp_27xmgQ4N1E3QwHyoutLtZsHW5DSW4zneQJ3CxT5JbUejxtFuAu@13.250.162.250:3015

    • aenode://pp_DMLqy7Zuhoxe2FzpydyQTgwCJ52wouzxtHWsPGo51XDcxc5c8@13.53.161.215:3015

    Inspect the testnet

    The core nodes of the public test network are accessible from the Internet.

    Information, e.g. height, of the top block of the longest chain as seen by these core nodes of the testnet can be obtained by opening in the browser any of the following URLs:

    • http://52.10.46.160:3013/v2/blocks/top

    • http://13.250.162.250:3013/v2/blocks/top

    • http://13.53.161.215:3013/v2/blocks/top

    Setup your node

    Setting up your node consists of:

    • Configuring your node - see instructions in the dedicated separate document;

    • Starting your node and verifying it works as expected - see instructions in the dedicated separate document.

    This
  • How to retrieve the released software for running a node;

  • How to install a node;

  • How to join the mainnet.

  • How to join the testnet.

  • Retrieve the software for running a node

    You can run a node by either:

    • Installing the published release binary corresponding to your platform; or

    • Running the published Docker image aeternity/aeternity; or

    • Building a release binary from source.

    The instructions for configuring the node using the Docker image are in the dedicated separate document.

    The node user API is documented:

    • HTTP API endpoints are specified online in swagger.yaml;

      • A JSON version of the same specification is located in the node at path lib/aehttp-*/priv/swagger.json (you will need to amend the wildcard * placeholder in the path with the version).

      • The JSON version can be obtained from a running node using the endpoint /api.

      • An interactive visualization of the same specification is available .

    • WebSocket API endpoints are ;

    • The intended usage of the user API (HTTP and WebSocket) is .

    Install node

    The instructions for installing a node using a release binary are in the dedicated separate document.

    For installation of a node using the Docker image, please refer to its documentation online.

    Join the mainnet

    Mainnet seed nodes

    The release package comes preconfigured with seed nodes. Here is example subset of the seed nodes:

    • aenode://pp_2L8A5vSjnkLtfFNpJNgP9HbmGLD7ZAGFxoof47N8L4yyLAyyMi@18.136.37.63:3015

    • aenode://pp_2gPZjuPnJnTVEbrB9Qgv7f4MdhM4Jh6PD22mB2iBA1g7FRvHTk@52.220.198.72:3015

    • aenode://[email protected]:3015

    • aenode://pp_2mwr9ikcyUDUWTeTQqdu8WJeQs845nYPPqjafjcGcRWUx4p85P@3.17.30.101:3015

    • aenode://pp_2CAJwwmM2ZVBHYFB6na1M17roQNuRi98k6WPFcoBMfUXvsezVU@13.58.177.66:3015

    • aenode://pp_7N7dkCbg39MYzQv3vCrmjVNfy6QkoVmJe3VtiZ3HRncvTWAAX@13.53.114.199:3015

    • aenode://pp_22FndjTkMMXZ5gunCTUyeMPbgoL53smqpM4m1Jz5fVuJmPXm24@13.53.149.181:3015

    • aenode://pp_Xgsqi4hYAjXn9BmrU4DXWT7jURy2GoBPmrHfiCoDVd3UPQYcU@13.53.164.121:3015

    • aenode://[email protected]:3015

    Inspect the mainnet

    Here are example nodes that can be used to inspect current top block and see information about e.g. height or target:

    • http://18.136.37.63:3013/v2/blocks/top

    • http://52.220.198.72:3013/v2/blocks/top

    • http://13.53.114.199:3013/v2/blocks/top

    • http://13.53.149.181:3013/v2/blocks/top

    Join the testnet

    This section describes how to run a node as part of the testnet - the public test network of nodes - by using the release binary.

    For running a node as part of the testnet by using the Docker image, please consult its documentation in addition to this section.

    Testnet seed nodes

    In order to join testnet reconfigure seed nodes in the release package:

    • aenode://pp_QU9CvhAQH56a2kA15tCnWPRJ2srMJW8ZmfbbFTAy7eG4o16Bf@52.10.46.160:3015

    • aenode://pp_27xmgQ4N1E3QwHyoutLtZsHW5DSW4zneQJ3CxT5JbUejxtFuAu@13.250.162.250:3015

    • aenode://pp_DMLqy7Zuhoxe2FzpydyQTgwCJ52wouzxtHWsPGo51XDcxc5c8@13.53.161.215:3015

    Inspect the testnet

    The core nodes of the public test network are accessible from the Internet.

    Information, e.g. height, of the top block of the longest chain as seen by these core nodes of the testnet can be obtained by opening in the browser any of the following URLs:

    • http://52.10.46.160:3013/v2/blocks/top

    • http://13.250.162.250:3013/v2/blocks/top

    • http://13.53.161.215:3013/v2/blocks/top

    Setup your node

    Setting up your node consists of:

    • Configuring your node - see instructions in the dedicated separate document;

    • Starting your node and verifying it works as expected - see instructions in the dedicated separate document.

    This
    docs/monitoring.md
    opening a ticket
    in the wiki
  • Enables State Channels Websocket clients to reconnect and to re-attach to the FSM, using a special signed offchain transaction. While the client is disconnected, the corresponding FSM will reject requests that require signatures.

  • This release is backward compatible with previous v4.* releases.

    Please join the mainnet by following the instructions below, and let us know if you have any problems by opening a ticket. Troubleshooting of common issues is documented in the wiki.

    The instructions below describe:

    • How to retrieve the released software for running a node;

    • How to install a node;

    • How to join the mainnet.

    • How to join the testnet.

    Retrieve the software for running a node

    You can run a node by either:

    • Installing the published release binary corresponding to your platform; or

    • Running the published Docker image aeternity/aeternity; or

    • Building a release binary from source.

    The instructions for configuring the node using the Docker image are in the dedicated separate document.

    The node user API is documented:

    • HTTP API endpoints are specified online in swagger.yaml;

      • A JSON version of the same specification is located in the node at path lib/aehttp-*/priv/swagger.json (you will need to amend the wildcard * placeholder in the path with the version).

      • The JSON version can be obtained from a running node using the endpoint /api.

      • An interactive visualization of the same specification is available .

    • WebSocket API endpoints are ;

    • The intended usage of the user API (HTTP and WebSocket) is .

    Install node

    The instructions for installing a node using a release binary are in the dedicated separate document.

    For installation of a node using the Docker image, please refer to the documentation online.

    Join the mainnet

    In order to join the mainnet follow the operation instructions to run the node with default configuration as mainnet is the default network.

    To join the mainnet by using the Docker image, please refer to docker documentation.

    Mainnet seed nodes

    The release package comes preconfigured with seed nodes. Here is example subset of the seed nodes:

    • aenode://pp_2L8A5vSjnkLtfFNpJNgP9HbmGLD7ZAGFxoof47N8L4yyLAyyMi@18.136.37.63:3015

    • aenode://pp_2gPZjuPnJnTVEbrB9Qgv7f4MdhM4Jh6PD22mB2iBA1g7FRvHTk@52.220.198.72:3015

    • aenode://[email protected]:3015

    • aenode://pp_2mwr9ikcyUDUWTeTQqdu8WJeQs845nYPPqjafjcGcRWUx4p85P@3.17.30.101:3015

    • aenode://pp_2CAJwwmM2ZVBHYFB6na1M17roQNuRi98k6WPFcoBMfUXvsezVU@13.58.177.66:3015

    • aenode://pp_7N7dkCbg39MYzQv3vCrmjVNfy6QkoVmJe3VtiZ3HRncvTWAAX@13.53.114.199:3015

    • aenode://pp_22FndjTkMMXZ5gunCTUyeMPbgoL53smqpM4m1Jz5fVuJmPXm24@13.53.149.181:3015

    • aenode://pp_Xgsqi4hYAjXn9BmrU4DXWT7jURy2GoBPmrHfiCoDVd3UPQYcU@13.53.164.121:3015

    • aenode://[email protected]:3015

    Inspect the mainnet

    Here are example nodes that can be used to inspect current top block and see information about e.g. height or target:

    • http://18.136.37.63:3013/v2/blocks/top

    • http://52.220.198.72:3013/v2/blocks/top

    • http://13.53.114.199:3013/v2/blocks/top

    • http://13.53.149.181:3013/v2/blocks/top

    Join the testnet

    In order to join the testnet change the Network ID in node configuration file to ae_uat.

    To join the testnet by using the Docker image, please refer to the docker documentation.

    Testnet seed nodes

    The release package comes preconfigured with testnet seed nodes, this is the list:

    • aenode://pp_QU9CvhAQH56a2kA15tCnWPRJ2srMJW8ZmfbbFTAy7eG4o16Bf@52.10.46.160:3015

    • aenode://pp_27xmgQ4N1E3QwHyoutLtZsHW5DSW4zneQJ3CxT5JbUejxtFuAu@13.250.162.250:3015

    • aenode://pp_DMLqy7Zuhoxe2FzpydyQTgwCJ52wouzxtHWsPGo51XDcxc5c8@13.53.161.215:3015

    Inspect the testnet

    The core nodes of the public test network are accessible from the Internet.

    Information, e.g. height, of the top block of the longest chain as seen by these core nodes of the testnet can be obtained by opening in the browser any of the following URLs:

    • http://52.10.46.160:3013/v2/blocks/top

    • http://13.250.162.250:3013/v2/blocks/top

    • http://13.53.161.215:3013/v2/blocks/top

    Setup your node

    Setting up your node consists of:

    • Configuring your node - see instructions in the dedicated separate document;

    • Starting your node and verifying it works as expected - see instructions in the dedicated separate document.

    This

    Fixes syncing field in /status endpoint.

  • Adds sync_progress field to /status external endpoint (sync_progress metric is also reported every 30 seconds during sync process).

  • Exposes logged events (as the field log) in ContractCallObject in the HTTP API.

  • Improves stability of state channel's FSM

  • Adds a new WebSocket method for dry-running off-chain contracts: channels.dry_run.call_contract

  • This release is backward compatible with v2.0.*.

    Please join the mainnet by following the instructions below, and let us know if you have any problems by opening a ticket. Troubleshooting of common issues is documented in the wiki.

    The instructions below describe:

    • How to retrieve the released software for running a node;

    • How to install a node;

    • How to join the mainnet.

    • How to join the testnet.

    Retrieve the software for running a node

    You can run a node by either:

    • Installing the published release binary corresponding to your platform; or

    • Running the published Docker image aeternity/aeternity; or

    • Building a release binary from source.

    The instructions for configuring the node using the Docker image are in the dedicated separate document.

    The node user API is documented:

    • HTTP API endpoints are specified online in swagger.yaml;

      • A JSON version of the same specification is located in the node at path lib/aehttp-*/priv/swagger.json (you will need to amend the wildcard * placeholder in the path with the version).

      • The JSON version can be obtained from a running node using the endpoint /api.

      • An interactive visualization of the same specification is available .

    • WebSocket API endpoints are ;

    • The intended usage of the user API (HTTP and WebSocket) is .

    Install node

    The instructions for installing a node using a release binary are in the dedicated separate document.

    For installation of a node using the Docker image, please refer to its documentation online.

    Join the mainnet

    Mainnet seed nodes

    The release package comes preconfigured with seed nodes. Here is example subset of the seed nodes:

    • aenode://pp_2L8A5vSjnkLtfFNpJNgP9HbmGLD7ZAGFxoof47N8L4yyLAyyMi@18.136.37.63:3015

    • aenode://pp_2gPZjuPnJnTVEbrB9Qgv7f4MdhM4Jh6PD22mB2iBA1g7FRvHTk@52.220.198.72:3015

    • aenode://[email protected]:3015

    • aenode://pp_2mwr9ikcyUDUWTeTQqdu8WJeQs845nYPPqjafjcGcRWUx4p85P@3.17.30.101:3015

    • aenode://pp_2CAJwwmM2ZVBHYFB6na1M17roQNuRi98k6WPFcoBMfUXvsezVU@13.58.177.66:3015

    • aenode://pp_7N7dkCbg39MYzQv3vCrmjVNfy6QkoVmJe3VtiZ3HRncvTWAAX@13.53.114.199:3015

    • aenode://pp_22FndjTkMMXZ5gunCTUyeMPbgoL53smqpM4m1Jz5fVuJmPXm24@13.53.149.181:3015

    • aenode://pp_Xgsqi4hYAjXn9BmrU4DXWT7jURy2GoBPmrHfiCoDVd3UPQYcU@13.53.164.121:3015

    • aenode://[email protected]:3015

    Inspect the mainnet

    Here are example nodes that can be used to inspect current top block and see information about e.g. height or target:

    • http://18.136.37.63:3013/v2/blocks/top

    • http://52.220.198.72:3013/v2/blocks/top

    • http://13.53.114.199:3013/v2/blocks/top

    • http://13.53.149.181:3013/v2/blocks/top

    Join the testnet

    This section describes how to run a node as part of the testnet - the public test network of nodes - by using the release binary.

    For running a node as part of the testnet by using the Docker image, please consult its documentation in addition to this section.

    Testnet seed nodes

    In order to join testnet reconfigure seed nodes in the release package:

    • aenode://pp_QU9CvhAQH56a2kA15tCnWPRJ2srMJW8ZmfbbFTAy7eG4o16Bf@52.10.46.160:3015

    • aenode://pp_27xmgQ4N1E3QwHyoutLtZsHW5DSW4zneQJ3CxT5JbUejxtFuAu@13.250.162.250:3015

    • aenode://pp_DMLqy7Zuhoxe2FzpydyQTgwCJ52wouzxtHWsPGo51XDcxc5c8@13.53.161.215:3015

    Inspect the testnet

    The core nodes of the public test network are accessible from the Internet.

    Information, e.g. height, of the top block of the longest chain as seen by these core nodes of the testnet can be obtained by opening in the browser any of the following URLs:

    • http://52.10.46.160:3013/v2/blocks/top

    • http://13.250.162.250:3013/v2/blocks/top

    • http://13.53.161.215:3013/v2/blocks/top

    Setup your node

    Setting up your node consists of:

    • Configuring your node - see instructions in the dedicated separate document;

    • Starting your node and verifying it works as expected - see instructions in the dedicated separate document.

    This
  • Changes the default database persistency behaviour (user configuration key chain > persist), persisting it by default.

  • This release is backward compatible with v3.0.0-rc.1 except for the protocol in the state channels WebSocket and Noise endpoints.

    Please join the mainnet by following the instructions below, and let us know if you have any problems by opening a ticket. Troubleshooting of common issues is documented in the wiki.

    The instructions below describe:

    • How to retrieve the released software for running a node;

    • How to install a node;

    • How to join the mainnet.

    • How to join the testnet.

    Retrieve the software for running a node

    You can run a node by either:

    • Installing the published release binary corresponding to your platform; or

    • Running the published Docker image aeternity/aeternity; or

    • Building a release binary from source.

    The instructions for configuring the node using the Docker image are in the dedicated separate document.

    The node user API is documented:

    • HTTP API endpoints are specified online in swagger.yaml;

      • A JSON version of the same specification is located in the node at path lib/aehttp-*/priv/swagger.json (you will need to amend the wildcard * placeholder in the path with the version).

      • The JSON version can be obtained from a running node using the endpoint /api.

      • An interactive visualization of the same specification is available .

    • WebSocket API endpoints are ;

    • The intended usage of the user API (HTTP and WebSocket) is .

    Install node

    The instructions for installing a node using a release binary are in the dedicated separate document.

    For installation of a node using the Docker image, please refer to its documentation online.

    Join the mainnet

    Mainnet seed nodes

    The release package comes preconfigured with seed nodes. Here is example subset of the seed nodes:

    • aenode://pp_2L8A5vSjnkLtfFNpJNgP9HbmGLD7ZAGFxoof47N8L4yyLAyyMi@18.136.37.63:3015

    • aenode://pp_2gPZjuPnJnTVEbrB9Qgv7f4MdhM4Jh6PD22mB2iBA1g7FRvHTk@52.220.198.72:3015

    • aenode://[email protected]:3015

    • aenode://pp_2mwr9ikcyUDUWTeTQqdu8WJeQs845nYPPqjafjcGcRWUx4p85P@3.17.30.101:3015

    • aenode://pp_2CAJwwmM2ZVBHYFB6na1M17roQNuRi98k6WPFcoBMfUXvsezVU@13.58.177.66:3015

    • aenode://pp_7N7dkCbg39MYzQv3vCrmjVNfy6QkoVmJe3VtiZ3HRncvTWAAX@13.53.114.199:3015

    • aenode://pp_22FndjTkMMXZ5gunCTUyeMPbgoL53smqpM4m1Jz5fVuJmPXm24@13.53.149.181:3015

    • aenode://pp_Xgsqi4hYAjXn9BmrU4DXWT7jURy2GoBPmrHfiCoDVd3UPQYcU@13.53.164.121:3015

    • aenode://[email protected]:3015

    Inspect the mainnet

    Here are example nodes that can be used to inspect current top block and see information about e.g. height or target:

    • http://18.136.37.63:3013/v2/blocks/top

    • http://52.220.198.72:3013/v2/blocks/top

    • http://13.53.114.199:3013/v2/blocks/top

    • http://13.53.149.181:3013/v2/blocks/top

    Join the testnet

    This section describes how to run a node as part of the testnet - the public test network of nodes - by using the release binary.

    For running a node as part of the testnet by using the Docker image, please consult its documentation in addition to this section.

    Testnet seed nodes

    In order to join testnet reconfigure seed nodes in the release package:

    • aenode://pp_QU9CvhAQH56a2kA15tCnWPRJ2srMJW8ZmfbbFTAy7eG4o16Bf@52.10.46.160:3015

    • aenode://pp_27xmgQ4N1E3QwHyoutLtZsHW5DSW4zneQJ3CxT5JbUejxtFuAu@13.250.162.250:3015

    • aenode://pp_DMLqy7Zuhoxe2FzpydyQTgwCJ52wouzxtHWsPGo51XDcxc5c8@13.53.161.215:3015

    Inspect the testnet

    The core nodes of the public test network are accessible from the Internet.

    Information, e.g. height, of the top block of the longest chain as seen by these core nodes of the testnet can be obtained by opening in the browser any of the following URLs:

    • http://52.10.46.160:3013/v2/blocks/top

    • http://13.250.162.250:3013/v2/blocks/top

    • http://13.53.161.215:3013/v2/blocks/top

    Setup your node

    Setting up your node consists of:

    • Configuring your node - see instructions in the dedicated separate document;

    • Starting your node and verifying it works as expected - see instructions in the dedicated separate document.

    This

    Localnet (docker-compose) configuration has ben moved out to its own repository https://github.com/aeternity/localnet

    This release is backward compatible with previous v4.* releases.

    Please join the mainnet by following the instructions below, and let us know if you have any problems by opening a ticket. Troubleshooting of common issues is documented in the wiki.

    The instructions below describe:

    • How to retrieve the released software for running a node;

    • How to install a node;

    • How to join the mainnet.

    • How to join the testnet.

    Retrieve the software for running a node

    You can run a node by either:

    • Installing the published release binary corresponding to your platform; or

    • Running the published Docker image aeternity/aeternity; or

    • Building a release binary from source.

    The instructions for configuring the node using the Docker image are in the dedicated separate document.

    The node user API is documented:

    • HTTP API endpoints are specified online in swagger.yaml;

      • A JSON version of the same specification is located in the node at path lib/aehttp-*/priv/swagger.json (you will need to amend the wildcard * placeholder in the path with the version).

      • The JSON version can be obtained from a running node using the endpoint /api.

      • An interactive visualization of the same specification is available .

    • WebSocket API endpoints are ;

    • The intended usage of the user API (HTTP and WebSocket) is .

    Install node

    The instructions for installing a node using a release binary are in the dedicated separate document.

    For installation of a node using the Docker image, please refer to the documentation online.

    Join the mainnet

    In order to join the mainnet follow the operation instructions to run the node with default configuration as mainnet is the default network.

    To join the mainnet by using the Docker image, please refer to docker documentation.

    Mainnet seed nodes

    The release package comes preconfigured with seed nodes. Here is example subset of the seed nodes:

    • aenode://pp_2L8A5vSjnkLtfFNpJNgP9HbmGLD7ZAGFxoof47N8L4yyLAyyMi@18.136.37.63:3015

    • aenode://pp_2gPZjuPnJnTVEbrB9Qgv7f4MdhM4Jh6PD22mB2iBA1g7FRvHTk@52.220.198.72:3015

    • aenode://[email protected]:3015

    • aenode://pp_2mwr9ikcyUDUWTeTQqdu8WJeQs845nYPPqjafjcGcRWUx4p85P@3.17.30.101:3015

    • aenode://pp_2CAJwwmM2ZVBHYFB6na1M17roQNuRi98k6WPFcoBMfUXvsezVU@13.58.177.66:3015

    • aenode://pp_7N7dkCbg39MYzQv3vCrmjVNfy6QkoVmJe3VtiZ3HRncvTWAAX@13.53.114.199:3015

    • aenode://pp_22FndjTkMMXZ5gunCTUyeMPbgoL53smqpM4m1Jz5fVuJmPXm24@13.53.149.181:3015

    • aenode://pp_Xgsqi4hYAjXn9BmrU4DXWT7jURy2GoBPmrHfiCoDVd3UPQYcU@13.53.164.121:3015

    • aenode://[email protected]:3015

    Inspect the mainnet

    Here are example nodes that can be used to inspect current top block and see information about e.g. height or target:

    • http://18.136.37.63:3013/v2/blocks/top

    • http://52.220.198.72:3013/v2/blocks/top

    • http://13.53.114.199:3013/v2/blocks/top

    • http://13.53.149.181:3013/v2/blocks/top

    Join the testnet

    In order to join the testnet change the Network ID in node configuration file to ae_uat.

    To join the testnet by using the Docker image, please refer to the docker documentation.

    Testnet seed nodes

    The release package comes preconfigured with testnet seed nodes, this is the list:

    • aenode://pp_QU9CvhAQH56a2kA15tCnWPRJ2srMJW8ZmfbbFTAy7eG4o16Bf@52.10.46.160:3015

    • aenode://pp_27xmgQ4N1E3QwHyoutLtZsHW5DSW4zneQJ3CxT5JbUejxtFuAu@13.250.162.250:3015

    • aenode://pp_DMLqy7Zuhoxe2FzpydyQTgwCJ52wouzxtHWsPGo51XDcxc5c8@13.53.161.215:3015

    Inspect the testnet

    The core nodes of the public test network are accessible from the Internet.

    Information, e.g. height, of the top block of the longest chain as seen by these core nodes of the testnet can be obtained by opening in the browser any of the following URLs:

    • http://52.10.46.160:3013/v2/blocks/top

    • http://13.250.162.250:3013/v2/blocks/top

    • http://13.53.161.215:3013/v2/blocks/top

    Setup your node

    Setting up your node consists of:

    • Configuring your node - see instructions in the dedicated separate document;

    • Starting your node and verifying it works as expected - see instructions in the dedicated separate document.

    This
  • How to install a node;

  • How to join the roma network.

  • How to join the testnet.

  • Retrieve the software for running a node

    You can run a node by either:

    • Installing the published release binary corresponding to your platform; or

    • Running the published Docker image aeternity/epoch; or

    • Building a release binary from source.

    The user configuration is documented in the wiki. For specifying configuration using the Docker image, please refer to its documentation.

    The node user API is documented:

    • HTTP API endpoints are specified online in swagger.yaml;

      • A JSON version of the same specification is located in the node at path lib/aehttp-0.1.0/priv/swagger.json.

      • The JSON version can be obtained from a running node using the endpoint /api.

      • An interactive visualization of the same specification is available .

    • WebSocket API endpoints are ;

    • The intended usage of the user API (HTTP and WebSocket) is .

    Install node

    The instructions for installing a node using a release binary are in the dedicated separate document.

    For installation of a node using the Docker image, please refer to its documentation online.

    Join Roma network

    Roma network seed nodes

    The release package comes preconfigured with seed nodes. Here is example subset of the seed nodes:

    • aenode://pp_5mmzrsoPh9owYMfKhZSkUihufDTB6TuayD173Ng464ukVm9xU@35.178.61.73:3015

    • aenode://pp_2KWhoNRdythXAmgCbM6QxFo95WM4XXGq2pjcbKitXFpUHnPQc3@35.177.192.219:3015

    • aenode://pp_2L8A5vSjnkLtfFNpJNgP9HbmGLD7ZAGFxoof47N8L4yyLAyyMi@18.136.37.63:3015

    • aenode://pp_2gPZjuPnJnTVEbrB9Qgv7f4MdhM4Jh6PD22mB2iBA1g7FRvHTk@52.220.198.72:3015

    • aenode://pp_frAKABjDnM3QZCUygbkaFvbd8yhv6xdufazDFLgJRc4fnGy3s@52.56.252.75:3015

    • aenode://[email protected]:3015

    • aenode://pp_2mwr9ikcyUDUWTeTQqdu8WJeQs845nYPPqjafjcGcRWUx4p85P@3.17.30.101:3015

    • aenode://pp_FLpSUrKwgBAu5uVRnB2iWKtwGAHZckxvtCbjVPeeCA3j33t3J@52.56.66.124:3015

    • aenode://pp_2CAJwwmM2ZVBHYFB6na1M17roQNuRi98k6WPFcoBMfUXvsezVU@13.58.177.66:3015

    Inspect Roma network

    Here are example nodes that can be used to inspect current top block and see information about e.g. height or target:

    • http://35.178.61.73:3013/v2/blocks/top

    • http://35.177.192.219:3013/v2/blocks/top

    • http://18.136.37.63:3013/v2/blocks/top

    • http://52.220.198.72:3013/v2/blocks/top

    Join the testnet

    This section describes how to run a node as part of the testnet - the public test network of nodes - by using the release binary.

    For running a node as part of the testnet by using the Docker image, please consult its documentation in addition to this section.

    Testnet seed nodes

    In order to join testnet reconfigure seed nodes in the release package:

    • aenode://pp_QU9CvhAQH56a2kA15tCnWPRJ2srMJW8ZmfbbFTAy7eG4o16Bf@52.10.46.160:3015

    • aenode://pp_27xmgQ4N1E3QwHyoutLtZsHW5DSW4zneQJ3CxT5JbUejxtFuAu@13.250.162.250:3015

    • aenode://pp_nt5N7fwae3DW8Mqk4kxkGAnbykRDpEZq9dzzianiMMPo4fJV7@18.130.148.7:3015

    Inspect the testnet

    The core nodes of the public test network are accessible from the Internet.

    Information, e.g. height, of the top block of the longest chain as seen by these core nodes of the testnet can be obtained by opening in the browser any of the following URLs:

    • http://52.10.46.160:3013/v2/blocks/top

    • http://13.250.162.250:3013/v2/blocks/top

    • http://18.130.148.7:3013/v2/blocks/top

    Setup your node

    Setting up your node consists of:

    • Configuring your node - see instructions in the dedicated separate document;

    • Starting your node and verifying it works as expected - see instructions in the dedicated separate document.

    This
    opening a ticket
    in the wiki
    How to retrieve the released software for running a node

    Introduction

    This document describes how to build an Aeternity node from source on Windows usingMSYS2.

    NOTES:

    • Only 64-bit versions of Windows 10 and Windows Server 2016 or later are supported and tested.

    • Make sure you pull with git config --global autocrlf input as windows scripts might not work

    • Administrative privileges are recommended.

    Dependencies

    You will need (minimal required):

    • Visual Studio CLI Build tools (Community Edition 2017+)

    • Msys2

    • Erlang/OTP (20.1 or 20.3 is officially supported)

    • Java/OpenJDK (11.0.2+)

    Note: You might consider easier to use package manager to install the requirements

    First you will need to install Visual Studio in its default installation path, else the next steps will fail.

    To install only the required components of Visual Studio 2019 Community Edition using run:

    or manually

    Download:

    Make sure to include the following components (use the VCTools workload as base):

    • Command-line compiler support

    • Windows 10 SDK

    Alternatively you can use to reduce install size (no GUI).

    Note: Visual Studio 2017 Community Edition or later is supported

    Quick install of MSYS2, Erlang/OTP, Java

    The easiest way to setup the environment is to run scripts/windows/msys2_prepare.bat.

    It will install any missing tools to their default locations, except Visual Studio.

    If you do so, you may skip to

    Custom install of dependencies

    (optional)

    Note: If you don't want to install manually, the preparation script will do it automatically for you.

    Else you can use the provided helper script scripts\windows\install_msys2.bat.

    It will download and install all the dependencies and will dump the ENV vars used by the build scripts. You may optionally provide installation path as an argument.

    The default <install_path> could be specified in WIN_MSYS2_ROOT env var or fallback to "C:\tools\msys64"

    Or if you prefer you can install Msys2 using

    or manually

    Download:

    • Execute installer and follow instructions

    • Keep note of the install folder

    Note: You will need to set properly the var (e.g.):

    Note: Odd quoting is not a typo

    (optional)

    If you don't want to install manually, the preparation script will do it automatically for you.

    Else you can use scripts\windows\install_erlang.bat.

    It will download and install Erlang/OTP and will dump the ENV vars used by the build scripts

    Alternatively you can install Erlang/OTP using

    or manually

    Download:

    • Execute installer and follow instructions

    • Keep note of install folder

    Note: You will need to set properly the vars (e.g.):

    (not required)

    JDK in no longer essential for building Aeternity and will not be installed by the preparation script.

    Setup

    Now the environment needs to be prepared. This can be done automatically by the helper script scripts/windows/msys2_prepare. It will set the environment variables and download any missing essential tools.

    This script uses the following environment variables and default values:

    Note: Odd quoting is used to escape any spaces in the values. Make sure paths do not include quotes and trailing slashes.

    If your local setup differs, you need to set the proper values yourself before running the preparation script.

    It is recommend to persist these vars into the user registry, so you don't need to set it every session, e.g.:

    Note: In contrast of SET, do not put quotes in SETX commands, as they will end up in the values

    First time installation

    The helper scripts will try to detect where msys2.exe is installed searching WIN_MSYS2_ROOT or the system paths (%PATH%). If the detection fails, install_msys2 script will be used to install it.

    Similarly, if Erlang/OTP is missing it will be installed using install_erlang script.

    After that script will download, install and update the Msys2 dependencies and tools. Any consecutive runs will check for new updates.

    Additional environment config (optional)

    Msys2 specific paths can be specified in MSYS_INCLUDE_PATH which are in POSIX(Unix-style) form, separated by ":".

    For instance, to add Java in msys2 you have to set the path to its bin directory (the one that includes java.exe)

    You can execute the script directly in a cmd window.

    Building

    Open a shell with the proper paths set.

    Use the helper script scripts/windows/msys2_shell.bat to do so.

    That script uses the following environment variables (defaults):

    In the opened shell (MinGW64) go into your build directory and build the system like on any other UNIX system:

    NOTE: Disk drives are mounted in the root folder (i.e. C: is /c)

    Note: For a release package build you can use .circleci\windows\build.cmd which will build and produce ready-to-install packages

    Refer to docs/build.md for more information on how to build.

    About this release

    This is the first Fortuna release candidate. It marks the freeze of the Fortuna consensus protocol and of the user API.

    Please refer to the notes below for details and backward compatibility.

    Regarding the Fortuna consensus protocol upgrade in testnet, this release:

    • Sets the Fortuna testnet hard fork height to block 82900 (approximately Mon 20th May 2019 at 3:30am CEST).

    Regarding the Block Reward Initiative, this release:

    • Introduces a mechanism to split mining reward and send to predefined address. This is consensus breaking.

    Regarding introduction of generalized accounts from the Fortuna consensus protocol, this release:

    • Adds generalized accounts. See for a description of the new feature.

    • Changes the HTTP API for /transactions/info This HTTP endpoint used to just return a contract call object, but now returns <<"call_info">> => ContractCallObject instead, i.e. an extra tag is added. Additional tag provided is <<"ga_info">> which is what this endpoint returns when the provided transaction hash points to a generalized accounts transaction.

    • Changes the HTTP API for /transactions by giving the kind of account of the owner of the transaction Either a basic account (as before) or a generalized account Signatures are only provided for inner transactions with basic accounts.

    Regarding state channels, this release:

    • Introduces a pinned environment in State Channels noise protocol (off-chain), by introducing a block_hash field in some of the messages. This is not backwards compatible.

    • Changes the structure of off-chain transactions: off-chain updates are moved out of it so the on-chain world is agnostic to the off-chain update protocol being used as long as force progress expectations are met. This impacts consensus and takes action in Fortuna hard fork.

    • Introduces off-chain updates to State Channels noise session protocol. This impacts off-chain protocol.

    Regarding the Sophia language, this release:

    • Adds Address.is_contract, Address.is_oracle, Oracle.check and Oracle.check_query to Sophia and AEVM.

    • Adds Contract.creator to Sophia and AEVM.

    Regarding feature refinements, this release:

    • Changes some HTTP API fields from plain string to encoded strings. See swagger.yaml for details.

    • Fixes the mempool minimum gas price (configured by miner) entrancy check for contract transactions, they incorrectly included the gas in the calculation before.

    • Avoids creating empty contract accounts when contract creation failed. This is consensus breaking and starts from Fortuna hard fork.

    Regarding removal of deprecated functionalities, this release:

    • Removes deprecated compiler HTTP APIs (debug/contracts/[create/compute, call/compute, code/compile, code/call, decode-data, encode-calldata]).

    • Removes backwards compatibility w.r.t. abi_version/vm_version in HTTP API.

    • Removes legacy StateChannels WebSocket protocol.

    The node is able to start from a database produced by v2.5.*, v2.4.*, v2.3.* and v2.2.* releases. For the rest, this release is not backward compatible with v2.* releases.

    Please join the testnet by following the instructions below, and let us know if you have any problems by . Troubleshooting of common issues is documented .

    The instructions below describe:

    • ;

    • ;

    • .

    • .

    Retrieve the software for running a node

    You can run a node by either:

    • Installing the published corresponding to your platform; or

    • Running the published ; or

    • .

    The instructions for configuring the node using the Docker image are in .

    The node user API is documented:

    • HTTP API endpoints are specified ;

      • A JSON version of the same specification is located in the node at path lib/aehttp-*/priv/swagger.json (you will need to amend the wildcard * placeholder in the path with the version).

      • The JSON version can be obtained from a running node using the endpoint /api.

    Install node

    The instructions for installing a node using a release binary are in .

    For installation of a node using the Docker image, please refer to .

    Join the mainnet

    Mainnet seed nodes

    The release package comes preconfigured with seed nodes. Here is example subset of the seed nodes:

    • aenode://pp_2L8A5vSjnkLtfFNpJNgP9HbmGLD7ZAGFxoof47N8L4yyLAyyMi@18.136.37.63:3015

    • aenode://pp_2gPZjuPnJnTVEbrB9Qgv7f4MdhM4Jh6PD22mB2iBA1g7FRvHTk@52.220.198.72:3015

    • aenode://[email protected]:3015

    • aenode://pp_2mwr9ikcyUDUWTeTQqdu8WJeQs845nYPPqjafjcGcRWUx4p85P@3.17.30.101:3015

    Inspect the mainnet

    Here are example nodes that can be used to inspect current top block and see information about e.g. height or target:

    • http://18.136.37.63:3013/v2/blocks/top

    • http://52.220.198.72:3013/v2/blocks/top

    • http://13.53.114.199:3013/v2/blocks/top

    • http://13.53.149.181:3013/v2/blocks/top

    Join the testnet

    This section describes how to run a node as part of the testnet - the public test network of nodes - by using the release binary.

    For running a node as part of the testnet by using the Docker image, please consult in addition to this section.

    Testnet seed nodes

    In order to join testnet reconfigure seed nodes in the release package:

    • aenode://pp_QU9CvhAQH56a2kA15tCnWPRJ2srMJW8ZmfbbFTAy7eG4o16Bf@52.10.46.160:3015

    • aenode://pp_27xmgQ4N1E3QwHyoutLtZsHW5DSW4zneQJ3CxT5JbUejxtFuAu@13.250.162.250:3015

    • aenode://pp_DMLqy7Zuhoxe2FzpydyQTgwCJ52wouzxtHWsPGo51XDcxc5c8@13.53.161.215:3015

    Inspect the testnet

    The core nodes of the public test network are accessible from the Internet.

    Information, e.g. height, of the top block of the longest chain as seen by these core nodes of the testnet can be obtained by opening in the browser any of the following URLs:

    • http://52.10.46.160:3013/v2/blocks/top

    • http://13.250.162.250:3013/v2/blocks/top

    • http://13.53.161.215:3013/v2/blocks/top

    Setup your node

    Setting up your node consists of:

    • Configuring your node - see instructions in ;

    • Starting your node and verifying it works as expected - see instructions in .

    About this release

    This is a maintenance release. It contains feature refinements, in addition to renaming of the canonical location and name of the software. Please refer to the notes below for details and backward compatibility.

    Regarding renaming, this release:

    • Deprecates Docker Hub repository aeternity/epoch in favor of aeternity/aeternity. Older images have been migrated to aeternity/aeternity. The latest tag of aeternity/epoch will always point to 1.3.0 until the repository is deleted in the future.

      • Users fetching the Docker image must fetch it from the new Docker Hub repo aeternity/aeternity.

    • Changes Docker images username (and home path) to aeternity.

      • Users specifying for the Docker image a custom user configuration or persisting the chain data must update how they use the image. Please refer to the dedicated for details.

    • Updates package names to use aeternity prefix e.g. aeternity-1.3.0-ubuntu-x86_64.tar.gz instead of epoch-1.3.0-ubuntu-x86_64.tar.gz.

      • Users retrieving the published release binaries for this release and following must update their scripts.

    • Renames OSX/macOS package name to use macos-x86_64 suffix e.g. aeternity-1.3.0-macos-x86_64.tar.gz instead of epoch-1.3.0-osx-10.13.6.tar.gz.

      • Users retrieving the published macOS release binaries for this release and following must update their scripts.

    • Deprecates the bin/epoch binary for operating the node in favor of bin/aeternity. The bin/epoch binary prints a deprecation warning to standard error then redirects the invocation to the bin/aeternity one until aeternity/epoch is deleted at the next major version.

    • Deprecates GitHub repository aeternity/epoch in favor of aeternity/aeternity. Traffic is from aeternity/epoch to aeternity/aeternity.

    Regarding feature refinements, this release:

    • Disables internal debug API endpoints by default. To enable setup epoch.yaml http > internal > debug_endpoints to true.

    • Marks http > endpoints > debug and http > debug configuration params as deprecated.

    • Introduces new configuration parameter sync

    This release is backward compatible with v1.2.*, v1.1.* and v1.0.*.

    Please join the Roma network by following the instructions below, and let us know if you have any problems by . Troubleshooting of common issues is documented .

    The instructions below describe:

    • ;

    • ;

    • .

    • .

    Retrieve the software for running a node

    You can run a node by either:

    • Installing the published corresponding to your platform; or

    • Running the published ; or

    • .

    The user configuration is documented in the . For specifying configuration using the Docker image, please refer to .

    The node user API is documented:

    • HTTP API endpoints are specified ;

      • A JSON version of the same specification is located in the node at path lib/aehttp-*/priv/swagger.json (you will need to amend the wildcard * placeholder in the path with the version).

      • The JSON version can be obtained from a running node using the endpoint /api.

    Install node

    The instructions for installing a node using a release binary are in .

    For installation of a node using the Docker image, please refer to .

    Join Roma network

    Roma network seed nodes

    The release package comes preconfigured with seed nodes. Here is example subset of the seed nodes:

    • aenode://pp_5mmzrsoPh9owYMfKhZSkUihufDTB6TuayD173Ng464ukVm9xU@35.178.61.73:3015

    • aenode://pp_2KWhoNRdythXAmgCbM6QxFo95WM4XXGq2pjcbKitXFpUHnPQc3@35.177.192.219:3015

    • aenode://pp_2L8A5vSjnkLtfFNpJNgP9HbmGLD7ZAGFxoof47N8L4yyLAyyMi@18.136.37.63:3015

    • aenode://pp_2gPZjuPnJnTVEbrB9Qgv7f4MdhM4Jh6PD22mB2iBA1g7FRvHTk@52.220.198.72:3015

    Inspect Roma network

    Here are example nodes that can be used to inspect current top block and see information about e.g. height or target:

    • http://35.178.61.73:3013/v2/blocks/top

    • http://35.177.192.219:3013/v2/blocks/top

    • http://18.136.37.63:3013/v2/blocks/top

    • http://52.220.198.72:3013/v2/blocks/top

    Join the testnet

    This section describes how to run a node as part of the testnet - the public test network of nodes - by using the release binary.

    For running a node as part of the testnet by using the Docker image, please consult in addition to this section.

    Testnet seed nodes

    In order to join testnet reconfigure seed nodes in the release package:

    • aenode://pp_QU9CvhAQH56a2kA15tCnWPRJ2srMJW8ZmfbbFTAy7eG4o16Bf@52.10.46.160:3015

    • aenode://pp_27xmgQ4N1E3QwHyoutLtZsHW5DSW4zneQJ3CxT5JbUejxtFuAu@13.250.162.250:3015

    • aenode://pp_nt5N7fwae3DW8Mqk4kxkGAnbykRDpEZq9dzzianiMMPo4fJV7@18.130.148.7:3015

    Inspect the testnet

    The core nodes of the public test network are accessible from the Internet.

    Information, e.g. height, of the top block of the longest chain as seen by these core nodes of the testnet can be obtained by opening in the browser any of the following URLs:

    • http://52.10.46.160:3013/v2/blocks/top

    • http://13.250.162.250:3013/v2/blocks/top

    • http://18.130.148.7:3013/v2/blocks/top

    Setup your node

    Setting up your node consists of:

    • Configuring your node - see instructions in ;

    • Starting your node and verifying it works as expected - see instructions in .

    Testing

    Unit Testing

    In Erlang you would typically call three things a unit in the context of unit testing: a function, a module and a process (or rather the code a process runs). A Unit test suite is a collection of tests that describe which unit they address and then provide a reasonable coverage over that unit. If the unit depends on other parts, such as file system, libraries, etc, then those might be mocked (i.e., be replaced by code that is predictable and repeatable).

    We aim for having a unit test suite for each module, because very often our functions are too little and simple to spend a complete unit test suite on and our processes are mainly contained in one module with some library modules to build upon.

    If a unit test fails, then we know that the error is in that module

    Best practice is when unit tests are side effect free. That is, when you run the test, you always get the same result. That means that one may need to mock the parts that can influence the outcome of a test. For side-effect free, or pure, functions, this is no issue. For processes however, or functions that interact with the operating system or other parts of the system, this is highly relevant.

    Running unit tests

    We place our unit tests in a directory called test, for example, unit tests for modules in the aecore application are in .

    Running all unit tests in the project can be done by

    It will automatically search in all apps/*/test directories after files named *_tests.erl which are considered containing Eunit tests. Note that it is important to name the unit tests with the same name as the Erlang module in order to have the tool chain recognize them. Thus an Erlang module called M.erl in apps/*/src/ shall have a module called M_tests.erl in apps/*/test/.

    Unit tests can be run per tests file, for example

    will run the unit tests in .

    Note that we also have a directory on the top level. One should NOT put Eunit tests in there, but only test suites run with common test that test interaction between the different applications in apps. In short, this directory is meant for application integration tests.

    Integration Testing

    The purpose of integration testing is to ensure that newly added code does not break the system. We run some basic tests on three Erlang nodes These nodes should be able to perform the basic operations, such as mining blocks, synchronizing blocks, handling transactions, etc.

    For each application there might be some integration tests provided that focus on the integration of processes in that application. The vision is to have tests that integrate a number of different applications in the top level test directory.

    Integration tests are executed by common test and are therefore stored in files named *_SUITE.erl. Running all integration tests is done by

    Since the complete collection of integration tests is run at each pull request of new software, the tests have to be able to run in a reasonably short time interval (aim for running the complete suite to completion in 15 minutes or less).

    The API used in these tests are Erlang functions, typically the API of gen servers and the like. We mock the mining algorithm or use one that can mine very fast, such as lean16 or so.

    Running Specific Tests

    To run a specific suite, group or test case, you can use the environment variables SUITE, GROUP and TEST. Examples:

    The environment variables can be combined to narrow the scope of which tests to run, however SUITE must always be used when GROUP and/or TEST is used. The prefix _SUITE is automatically added to the specified suite name. Note that we need to specify the full path to the suite, as the code is divided into apps in subfolders.

    The DIR environment variable can be used to run all the tests in a specific directory (or directories - most of the test related flags above accept comma separated lists):

    Typical Requirements to Test

    1. Each node should be able to mine a block and add it to the chain of the system.

    2. If a fork is created then discarded the fork with lowest PoW (exact requirements to be added)

    3. We are able to post a spend transaction that is occurring in the chain.

    4. We are able to pay a fee for a spend transaction.

    System Testing

    The purpose of system testing is to make sure the system as a whole works. That means that we want at least 3 nodes running, preferably on different platforms (OS and architecture). These nodes should be able to perform the basic operations, such as mining blocks, synchronizing blocks, handling transactions, etc.

    We establish this using docker. First read the information on .

    The API used in these tests (apart from building and starting) is purely the web interface. We use a mining algorithm that can mine very fast, such as lean16 or so. In the the real miner will be tested.

    How to run the system tests:

    How to keep the docker containers and networks created during the tests:

    Running Specific Tests

    To run a specific suite, group or test case, you can use the environment variables SUITE, GROUP and TEST. Examples:

    The environment variables can be combined to narrow the scope of which tests to run, however SUITE must always be used when GROUP and/or TEST is used. The prefix _SUITE is automatically added to the specified suite name.

    Running Special Groups of Test Suites

    How to run a fast subset of the system tests:

    How to run the system tests meant to be run only locally i.e. not run by CI:

    Typical Requirements to Test

    1. The nodes in the system should be able to connect to its peers.

      • If the node has been back-listed by the peers before, then we are able to re-connect after X

    2. Each node should be able to mine a block and add it to the chain of the system.

    3. If one node disconnects, a fork is created, that is:

    System Testing on Continuous Integration Infrastructure

    On branch master:

    • System tests (make system-test) are run twice a day.

    • No system tests are run whenever a pull request is merged.

    On "normal" branches (i.e. not env/*, not system-tests):

    • System smoke tests are run (make smoke-test-run).

    On branch system-tests:

    • System tests (make system-test) are run.

    On tags:

    • No system tests are run.

    User Acceptance Testing

    Although the terminology might be a bit confusing, we test system requirements in the user acceptance testing phase (see Testing-general).

    The purpose of this test is to make sure that when users download our software, they can start working with it the way they expect. This also includes that they are able to install it according to the release notes and other documents describing what to do. However, automation of these tasks is out of reach and therefore this is not done systematically.

    For the user acceptance test we need an infrastructure with quite some miners, but few enough to make sure we can contribute with a mined block in, say, an hour. We refer to this as the uat-net. If we can connect our updated miner software to a uat-net in a user acceptable way, then we assume it will also work for the main net. It is important that the uat-net has miners that run the same release software as miners on the main net as well as some other versions (which is also possible on the main net).

    The API used in these tests (apart from building and starting) is purely the web interface.

    Typical requirements we should test:

    1. A user clone or pull of the master branch of the repository should build using make without errors.

    2. A user clone or pull of the master branch of the repository should run make test without errors.

    3. A user downloaded or created production package (make prod-package) that is correctly configured against the uat-net:

    About this release

    This is a maintenance release. It:

    • Ensures that synchronous jsonrpc calls to asynchronous methods get an "ok" response instead of timing out.

    • Fine-tunes error handling of slash and settle in the WebSocket channels API.

    • Automatically configures testnet seed peers and BRI beneficiary accounts based on network_id configuration.

    • Enables configuring the network in the console by passing -network_id argument i.e. bin/aeternity start -network_id ae_uat.

    • Adds public peer key to status API endpoint.

    • Adds top block height and top key block hash to status API endpoint.

    This release is backward compatible with previous v3.1.* and v3.0.1 releases.

    Please join the mainnet by following the instructions below, and let us know if you have any problems by . Troubleshooting of common issues is documented .

    The instructions below describe:

    • ;

    • ;

    • .

    • .

    Retrieve the software for running a node

    You can run a node by either:

    • Installing the published corresponding to your platform; or

    • Running the published ; or

    • .

    The instructions for configuring the node using the Docker image are in .

    The node user API is documented:

    • HTTP API endpoints are specified ;

      • A JSON version of the same specification is located in the node at path lib/aehttp-*/priv/swagger.json (you will need to amend the wildcard * placeholder in the path with the version).

      • The JSON version can be obtained from a running node using the endpoint /api.

    Install node

    The instructions for installing a node using a release binary are in .

    For installation of a node using the Docker image, please refer to the .

    Join the mainnet

    In order to join the mainnet follow the to run the node with default configuration as mainnet is the default network.

    To join the mainnet by using the Docker image, please refer to .

    Mainnet seed nodes

    The release package comes preconfigured with seed nodes. Here is example subset of the seed nodes:

    • aenode://pp_2L8A5vSjnkLtfFNpJNgP9HbmGLD7ZAGFxoof47N8L4yyLAyyMi@18.136.37.63:3015

    • aenode://pp_2gPZjuPnJnTVEbrB9Qgv7f4MdhM4Jh6PD22mB2iBA1g7FRvHTk@52.220.198.72:3015

    • aenode://[email protected]:3015

    • aenode://pp_2mwr9ikcyUDUWTeTQqdu8WJeQs845nYPPqjafjcGcRWUx4p85P@3.17.30.101:3015

    Inspect the mainnet

    Here are example nodes that can be used to inspect current top block and see information about e.g. height or target:

    • http://18.136.37.63:3013/v2/blocks/top

    • http://52.220.198.72:3013/v2/blocks/top

    • http://13.53.114.199:3013/v2/blocks/top

    • http://13.53.149.181:3013/v2/blocks/top

    Join the testnet

    In order to join the testnet change the in node configuration file to ae_uat.

    To join the testnet by using the Docker image, please refer to the .

    Testnet seed nodes

    The release package comes preconfigured with testnet seed nodes, this is the list:

    • aenode://pp_QU9CvhAQH56a2kA15tCnWPRJ2srMJW8ZmfbbFTAy7eG4o16Bf@52.10.46.160:3015

    • aenode://pp_27xmgQ4N1E3QwHyoutLtZsHW5DSW4zneQJ3CxT5JbUejxtFuAu@13.250.162.250:3015

    • aenode://pp_DMLqy7Zuhoxe2FzpydyQTgwCJ52wouzxtHWsPGo51XDcxc5c8@13.53.161.215:3015

    Inspect the testnet

    The core nodes of the public test network are accessible from the Internet.

    Information, e.g. height, of the top block of the longest chain as seen by these core nodes of the testnet can be obtained by opening in the browser any of the following URLs:

    • http://52.10.46.160:3013/v2/blocks/top

    • http://13.250.162.250:3013/v2/blocks/top

    • http://13.53.161.215:3013/v2/blocks/top

    Setup your node

    Setting up your node consists of:

    • Configuring your node - see instructions in ;

    • Starting your node and verifying it works as expected - see instructions in .

    About this release

    This is a maintenance release. It includes the following changes:

    • Change to a generic error message for the inner transaction of a GAMetaTX.

    • Long overdue bump of info-field in key block header from pre-fortuna value.

    • Fix incorrect values of Call.origin and Call.caller in state channels off-chain contract calls.

    This release is backward compatible with previous v4.* releases.

    Please join the mainnet by following the instructions below, and let us know if you have any problems by . Troubleshooting of common issues is documented .

    The instructions below describe:

    • ;

    • ;

    • .

    • .

    Retrieve the software for running a node

    You can run a node by either:

    • Installing the published corresponding to your platform; or

    • Running the published ; or

    • .

    The instructions for configuring the node using the Docker image are in .

    The node user API is documented:

    • HTTP API endpoints are specified ;

      • A JSON version of the same specification is located in the node at path lib/aehttp-*/priv/swagger.json (you will need to amend the wildcard * placeholder in the path with the version).

      • The JSON version can be obtained from a running node using the endpoint /api.

    Install node

    The instructions for installing a node using a release binary are in .

    For installation of a node using the Docker image, please refer to the .

    Join the mainnet

    In order to join the mainnet follow the to run the node with default configuration as mainnet is the default network.

    To join the mainnet by using the Docker image, please refer to .

    Mainnet seed nodes

    The release package comes preconfigured with seed nodes. Here is example subset of the seed nodes:

    • aenode://pp_2L8A5vSjnkLtfFNpJNgP9HbmGLD7ZAGFxoof47N8L4yyLAyyMi@18.136.37.63:3015

    • aenode://pp_2gPZjuPnJnTVEbrB9Qgv7f4MdhM4Jh6PD22mB2iBA1g7FRvHTk@52.220.198.72:3015

    • aenode://[email protected]:3015

    • aenode://pp_2mwr9ikcyUDUWTeTQqdu8WJeQs845nYPPqjafjcGcRWUx4p85P@3.17.30.101:3015

    Inspect the mainnet

    Here are example nodes that can be used to inspect current top block and see information about e.g. height or target:

    • http://18.136.37.63:3013/v2/blocks/top

    • http://52.220.198.72:3013/v2/blocks/top

    • http://13.53.114.199:3013/v2/blocks/top

    • http://13.53.149.181:3013/v2/blocks/top

    Join the testnet

    In order to join the testnet change the in node configuration file to ae_uat.

    To join the testnet by using the Docker image, please refer to the .

    Testnet seed nodes

    The release package comes preconfigured with testnet seed nodes, this is the list:

    • aenode://pp_QU9CvhAQH56a2kA15tCnWPRJ2srMJW8ZmfbbFTAy7eG4o16Bf@52.10.46.160:3015

    • aenode://pp_27xmgQ4N1E3QwHyoutLtZsHW5DSW4zneQJ3CxT5JbUejxtFuAu@13.250.162.250:3015

    • aenode://pp_DMLqy7Zuhoxe2FzpydyQTgwCJ52wouzxtHWsPGo51XDcxc5c8@13.53.161.215:3015

    Inspect the testnet

    The core nodes of the public test network are accessible from the Internet.

    Information, e.g. height, of the top block of the longest chain as seen by these core nodes of the testnet can be obtained by opening in the browser any of the following URLs:

    • http://52.10.46.160:3013/v2/blocks/top

    • http://13.250.162.250:3013/v2/blocks/top

    • http://13.53.161.215:3013/v2/blocks/top

    Setup your node

    Setting up your node consists of:

    • Configuring your node - see instructions in ;

    • Starting your node and verifying it works as expected - see instructions in .

    About this release

    This is a maintenance release.

    It finalized renaming process of the software.

    Please refer to the notes below for details and backward compatibility.

    Regarding renaming, this release:

    • Changes Erlang node name from epoch@localhost to aeternity@localhost. This impacts persisted database (the node name is stored in it). In order to use persisted database created before this release, new tool - rename_db - must be used.

      • The tool rename_db is included in the release. It takes one argument - path to database directory. Path to your database directory is chain > db_path parameter in your user config. If it is undefined, data (default directory) should be passed as argument.

      • Example usage of the tool:

        • Using absolute path of database directory -

    For the rest, this release:

    • Adds channels.get.offchain_state method to channel websocket API.

    • Adds a channels.get.contract method to channel WebSocket API.

    • Refines the error message returned by the user API /debug/contracts/code/decode-data when decoding Sophia data.

    Apart from the database change (described above in the renaming section), this release is backward compatible with previous v2.*.* releases.

    Please join the mainnet by following the instructions below, and let us know if you have any problems by . Troubleshooting of common issues is documented .

    The instructions below describe:

    • ;

    • ;

    • .

    • .

    Retrieve the software for running a node

    You can run a node by either:

    • Installing the published corresponding to your platform; or

    • Running the published ; or

    • .

    The instructions for configuring the node using the Docker image are in .

    The node user API is documented:

    • HTTP API endpoints are specified ;

      • A JSON version of the same specification is located in the node at path lib/aehttp-*/priv/swagger.json (you will need to amend the wildcard * placeholder in the path with the version).

      • The JSON version can be obtained from a running node using the endpoint /api.

    Install node

    The instructions for installing a node using a release binary are in .

    For installation of a node using the Docker image, please refer to .

    Join the mainnet

    Mainnet seed nodes

    The release package comes preconfigured with seed nodes. Here is example subset of the seed nodes:

    • aenode://pp_2L8A5vSjnkLtfFNpJNgP9HbmGLD7ZAGFxoof47N8L4yyLAyyMi@18.136.37.63:3015

    • aenode://pp_2gPZjuPnJnTVEbrB9Qgv7f4MdhM4Jh6PD22mB2iBA1g7FRvHTk@52.220.198.72:3015

    • aenode://[email protected]:3015

    • aenode://pp_2mwr9ikcyUDUWTeTQqdu8WJeQs845nYPPqjafjcGcRWUx4p85P@3.17.30.101:3015

    Inspect the mainnet

    Here are example nodes that can be used to inspect current top block and see information about e.g. height or target:

    • http://18.136.37.63:3013/v2/blocks/top

    • http://52.220.198.72:3013/v2/blocks/top

    • http://13.53.114.199:3013/v2/blocks/top

    • http://13.53.149.181:3013/v2/blocks/top

    Join the testnet

    This section describes how to run a node as part of the testnet - the public test network of nodes - by using the release binary.

    For running a node as part of the testnet by using the Docker image, please consult in addition to this section.

    Testnet seed nodes

    In order to join testnet reconfigure seed nodes in the release package:

    • aenode://pp_QU9CvhAQH56a2kA15tCnWPRJ2srMJW8ZmfbbFTAy7eG4o16Bf@52.10.46.160:3015

    • aenode://pp_27xmgQ4N1E3QwHyoutLtZsHW5DSW4zneQJ3CxT5JbUejxtFuAu@13.250.162.250:3015

    • aenode://pp_DMLqy7Zuhoxe2FzpydyQTgwCJ52wouzxtHWsPGo51XDcxc5c8@13.53.161.215:3015

    Inspect the testnet

    The core nodes of the public test network are accessible from the Internet.

    Information, e.g. height, of the top block of the longest chain as seen by these core nodes of the testnet can be obtained by opening in the browser any of the following URLs:

    • http://52.10.46.160:3013/v2/blocks/top

    • http://13.250.162.250:3013/v2/blocks/top

    • http://13.53.161.215:3013/v2/blocks/top

    Setup your node

    Setting up your node consists of:

    • Configuring your node - see instructions in ;

    • Starting your node and verifying it works as expected - see instructions in .

    About this release

    This is a maintenance release. It:

    • Fix incorrectly typed fields in JSON responses for /transactions/{hash}/info endpoint. abi_version andvm_version should be integer values, but for some transactions they were (hex-)strings.

    • Adds an extra check to reject normal TX signed by GA in mempool. The check is cheap so let's avoid cluttering the mempool with bad transactions.

    • Deliver alpha version of AESTRATUM application implementing Stratum protocol for Aeternity node

    • Add support for HTTP API cache headers (Expires and ETag). It can be enabled by settinghttp -> cache -> enabled to true. Refer to the configuration schema for more options.

    • State Channels responders can use the same listen port for different channels (only one responder Id per listen port).

    This release is backward compatible with previous v3.* releases.

    Please join the mainnet by following the instructions below, and let us know if you have any problems by . Troubleshooting of common issues is documented .

    The instructions below describe:

    • ;

    • ;

    • .

    • .

    Retrieve the software for running a node

    You can run a node by either:

    • Installing the published corresponding to your platform; or

    • Running the published ; or

    • .

    The instructions for configuring the node using the Docker image are in .

    The node user API is documented:

    • HTTP API endpoints are specified ;

      • A JSON version of the same specification is located in the node at path lib/aehttp-*/priv/swagger.json (you will need to amend the wildcard * placeholder in the path with the version).

      • The JSON version can be obtained from a running node using the endpoint /api.

    Install node

    The instructions for installing a node using a release binary are in .

    For installation of a node using the Docker image, please refer to the .

    Join the mainnet

    In order to join the mainnet follow the to run the node with default configuration as mainnet is the default network.

    To join the mainnet by using the Docker image, please refer to .

    Mainnet seed nodes

    The release package comes preconfigured with seed nodes. Here is example subset of the seed nodes:

    • aenode://pp_2L8A5vSjnkLtfFNpJNgP9HbmGLD7ZAGFxoof47N8L4yyLAyyMi@18.136.37.63:3015

    • aenode://pp_2gPZjuPnJnTVEbrB9Qgv7f4MdhM4Jh6PD22mB2iBA1g7FRvHTk@52.220.198.72:3015

    • aenode://[email protected]:3015

    • aenode://pp_2mwr9ikcyUDUWTeTQqdu8WJeQs845nYPPqjafjcGcRWUx4p85P@3.17.30.101:3015

    Inspect the mainnet

    Here are example nodes that can be used to inspect current top block and see information about e.g. height or target:

    • http://18.136.37.63:3013/v2/blocks/top

    • http://52.220.198.72:3013/v2/blocks/top

    • http://13.53.114.199:3013/v2/blocks/top

    • http://13.53.149.181:3013/v2/blocks/top

    Join the testnet

    In order to join the testnet change the in node configuration file to ae_uat.

    To join the testnet by using the Docker image, please refer to the .

    Testnet seed nodes

    The release package comes preconfigured with testnet seed nodes, this is the list:

    • aenode://pp_QU9CvhAQH56a2kA15tCnWPRJ2srMJW8ZmfbbFTAy7eG4o16Bf@52.10.46.160:3015

    • aenode://pp_27xmgQ4N1E3QwHyoutLtZsHW5DSW4zneQJ3CxT5JbUejxtFuAu@13.250.162.250:3015

    • aenode://pp_DMLqy7Zuhoxe2FzpydyQTgwCJ52wouzxtHWsPGo51XDcxc5c8@13.53.161.215:3015

    Inspect the testnet

    The core nodes of the public test network are accessible from the Internet.

    Information, e.g. height, of the top block of the longest chain as seen by these core nodes of the testnet can be obtained by opening in the browser any of the following URLs:

    • http://52.10.46.160:3013/v2/blocks/top

    • http://13.250.162.250:3013/v2/blocks/top

    • http://13.53.161.215:3013/v2/blocks/top

    Setup your node

    Setting up your node consists of:

    • Configuring your node - see instructions in ;

    • Starting your node and verifying it works as expected - see instructions in .

    About this release

    is a major Fortuna release, mainly aimed at easing development of applications using state channels in the presence of generic accounts. It:

    • Introduces State Channel FSM Generalized Accounts awareness. It now fully supports creation of meta transactions and verifies them.

    • Changes WebSocket API regarding signing transactions: now sign requests provide a signed transaction to be signed. Old approach was sending unsigned transactions.

    • Changes channel reestablish checks: for on-chain transactions authentication can not always be checked at current chain top. Check is done, if the last transaction is an on-chain one, it must be present in on-chain.

    About this release

    is the stable Iris release.

    It:

    • Set height for iris hard fork to happen on block 441444, on 10 June 2021, around 9:11am UTC

    • Fixed buggy serialization of contract information - this means the compiler version is actually stored on chain, and isn't replaced by "unknown".

    online
    specified online
    documented online
    online
    specified online
    documented online
    online
    specified online
    documented online
    online
    specified online
    documented online
    online
    specified online
    documented online
    online
    specified online
    documented online
    online
    specified online
    documented online
    online
    specified online
    documented online
    online
    specified online
    documented online
    online
    specified online
    documented online
    Adds a mining configuration parameter max_auth_fun_gas - that limits the amount of gas that can be provided to the authentication function in a GAMetaTx.
    Revisits JSON serialization of off-chain updates to be in sync with the corresponding messages for updates' creation. This impacts API.
  • Adds a serialization for the code element of the off-chain update for creating a new off-chain contract.

  • Increases the base price for force progress transactions to be in a correspondence with contract call base price.

  • Adjusts StateChannels WebSocket API broken_encoding errors.

  • Fixes bug that caused crash when contract call had just not enough gas to pay for the memory to store the result.

  • Overhauls the swagger.yaml file, including checking the integer valued parameters for correctness.

  • Removes the deprecated bin/epoch operational script.

  • Removes the deprecated log field from the contract object in the user APIs.

  • An interactive visualization of the same specification is available online.

  • WebSocket API endpoints are specified online;

  • The intended usage of the user API (HTTP and WebSocket) is documented online.

  • aenode://pp_2CAJwwmM2ZVBHYFB6na1M17roQNuRi98k6WPFcoBMfUXvsezVU@13.58.177.66:3015

  • aenode://pp_7N7dkCbg39MYzQv3vCrmjVNfy6QkoVmJe3VtiZ3HRncvTWAAX@13.53.114.199:3015

  • aenode://pp_22FndjTkMMXZ5gunCTUyeMPbgoL53smqpM4m1Jz5fVuJmPXm24@13.53.149.181:3015

  • aenode://pp_Xgsqi4hYAjXn9BmrU4DXWT7jURy2GoBPmrHfiCoDVd3UPQYcU@13.53.164.121:3015

  • aenode://[email protected]:3015

  • here
    opening a ticket
    in the wiki
    How to retrieve the released software for running a node
    How to install a node
    How to join the mainnet
    How to join the testnet
    release binary
    Docker image aeternity/aeternity
    Building a release binary from source
    the dedicated separate document
    online in swagger.yaml
    the dedicated separate document
    its documentation online
    its documentation
    the dedicated separate document
    the dedicated separate document
    >
    upnp_enabled
    , which (if true) starts UPnP/NAT-PMP service to handle UPnP/NAT-PMP discovery and automatic port mappings.

    An interactive visualization of the same specification is available online.

  • WebSocket API endpoints are specified online;

  • The intended usage of the user API (HTTP and WebSocket) is documented online.

  • aenode://pp_frAKABjDnM3QZCUygbkaFvbd8yhv6xdufazDFLgJRc4fnGy3s@52.56.252.75:3015

  • aenode://[email protected]:3015

  • aenode://pp_2mwr9ikcyUDUWTeTQqdu8WJeQs845nYPPqjafjcGcRWUx4p85P@3.17.30.101:3015

  • aenode://pp_FLpSUrKwgBAu5uVRnB2iWKtwGAHZckxvtCbjVPeeCA3j33t3J@52.56.66.124:3015

  • aenode://pp_2CAJwwmM2ZVBHYFB6na1M17roQNuRi98k6WPFcoBMfUXvsezVU@13.58.177.66:3015

  • page
    redirected
    opening a ticket
    in the wiki
    How to retrieve the released software for running a node
    How to install a node
    How to join the roma network
    How to join the testnet
    release binary
    Docker image aeternity/aeternity
    Building a release binary from source
    wiki
    its documentation
    online in swagger.yaml
    the dedicated separate document
    its documentation online
    its documentation
    the dedicated separate document
    the dedicated separate document

    An interactive visualization of the same specification is available online.

  • WebSocket API endpoints are specified online;

  • The intended usage of the user API (HTTP and WebSocket) is documented online.

  • aenode://pp_2CAJwwmM2ZVBHYFB6na1M17roQNuRi98k6WPFcoBMfUXvsezVU@13.58.177.66:3015

  • aenode://pp_7N7dkCbg39MYzQv3vCrmjVNfy6QkoVmJe3VtiZ3HRncvTWAAX@13.53.114.199:3015

  • aenode://pp_22FndjTkMMXZ5gunCTUyeMPbgoL53smqpM4m1Jz5fVuJmPXm24@13.53.149.181:3015

  • aenode://pp_Xgsqi4hYAjXn9BmrU4DXWT7jURy2GoBPmrHfiCoDVd3UPQYcU@13.53.164.121:3015

  • aenode://[email protected]:3015

  • opening a ticket
    in the wiki
    How to retrieve the released software for running a node
    How to install a node
    How to join the mainnet
    How to join the testnet
    release binary
    Docker image aeternity/aeternity
    Building a release binary from source
    the dedicated separate document
    online in swagger.yaml
    the dedicated separate document
    documentation online
    operation instructions
    docker documentation
    Network ID
    docker documentation
    the dedicated separate document
    the dedicated separate document

    An interactive visualization of the same specification is available online.

  • WebSocket API endpoints are specified online;

  • The intended usage of the user API (HTTP and WebSocket) is documented online.

  • aenode://pp_2CAJwwmM2ZVBHYFB6na1M17roQNuRi98k6WPFcoBMfUXvsezVU@13.58.177.66:3015

  • aenode://pp_7N7dkCbg39MYzQv3vCrmjVNfy6QkoVmJe3VtiZ3HRncvTWAAX@13.53.114.199:3015

  • aenode://pp_22FndjTkMMXZ5gunCTUyeMPbgoL53smqpM4m1Jz5fVuJmPXm24@13.53.149.181:3015

  • aenode://pp_Xgsqi4hYAjXn9BmrU4DXWT7jURy2GoBPmrHfiCoDVd3UPQYcU@13.53.164.121:3015

  • aenode://[email protected]:3015

  • opening a ticket
    in the wiki
    How to retrieve the released software for running a node
    How to install a node
    How to join the mainnet
    How to join the testnet
    release binary
    Docker image aeternity/aeternity
    Building a release binary from source
    the dedicated separate document
    online in swagger.yaml
    the dedicated separate document
    documentation online
    operation instructions
    docker documentation
    Network ID
    docker documentation
    the dedicated separate document
    the dedicated separate document
    ./bin/aeternity rename_db '/node/aeternity/node/my-old-db-path'
    ;
  • Using relative path of database directory (or when chain > db_path is not set in the config) - ./bin/aeternity rename_db data;

  • On Windows using absolute path of database directory - .\usr\lib\aeternity\bin\aeternity.cmd rename_db C:\node\aeternity\node\my-old-db-path;

  • If you are running a node using Docker (assuming you either don't have db_path set in your config, or it is set to /home/aeternity/node/data) - docker run --entrypoint=/bin/bash -v ~/.aeternity/myaedb:/home/aeternity/node/data/mnesia -v ~/.aeternity/myaeternity.yaml:/home/aeternity/.aeternity/aeternity/aeternity.yaml aeternity/aeternity -c "/home/aeternity/node/bin/aeternity rename_db /home/aeternity/node/data"

  • Please use rename_db tool when your node is not running.

  • Note that, for some environments (e.g. Docker), the node may not be able to start for the first time after database renaming. If that is the case, please retry to start a node, and the node should manage to start at the second attempt.

  • Before renaming process is conducted, rename_db tool automatically creates schema.DAT.backup file, next to the original schema.DAT file. The file schema.DAT.backup contains the backup of schema.DAT. If rename_db tool is interrupted, and your schema.DAT file gets corrupted, please restore from the backup by simply replacing corrupted schema.DAT with schema.DAT.backup. Then re-run rename_db tool.

  • In case your database gets badly corrupted during the process (this should not happen though), please remove all the files from your database directory, and sync again.

  • Moves the quick installer in its own repository https://github.com/aeternity/installer

    An interactive visualization of the same specification is available online.

  • WebSocket API endpoints are specified online;

  • The intended usage of the user API (HTTP and WebSocket) is documented online.

  • aenode://pp_2CAJwwmM2ZVBHYFB6na1M17roQNuRi98k6WPFcoBMfUXvsezVU@13.58.177.66:3015

  • aenode://pp_7N7dkCbg39MYzQv3vCrmjVNfy6QkoVmJe3VtiZ3HRncvTWAAX@13.53.114.199:3015

  • aenode://pp_22FndjTkMMXZ5gunCTUyeMPbgoL53smqpM4m1Jz5fVuJmPXm24@13.53.149.181:3015

  • aenode://pp_Xgsqi4hYAjXn9BmrU4DXWT7jURy2GoBPmrHfiCoDVd3UPQYcU@13.53.164.121:3015

  • aenode://[email protected]:3015

  • opening a ticket
    in the wiki
    How to retrieve the released software for running a node
    How to install a node
    How to join the mainnet
    How to join the testnet
    release binary
    Docker image aeternity/aeternity
    Building a release binary from source
    the dedicated separate document
    online in swagger.yaml
    the dedicated separate document
    its documentation online
    its documentation
    the dedicated separate document
    the dedicated separate document

    An interactive visualization of the same specification is available online.

  • WebSocket API endpoints are specified online;

  • The intended usage of the user API (HTTP and WebSocket) is documented online.

  • aenode://pp_2CAJwwmM2ZVBHYFB6na1M17roQNuRi98k6WPFcoBMfUXvsezVU@13.58.177.66:3015

  • aenode://pp_7N7dkCbg39MYzQv3vCrmjVNfy6QkoVmJe3VtiZ3HRncvTWAAX@13.53.114.199:3015

  • aenode://pp_22FndjTkMMXZ5gunCTUyeMPbgoL53smqpM4m1Jz5fVuJmPXm24@13.53.149.181:3015

  • aenode://pp_Xgsqi4hYAjXn9BmrU4DXWT7jURy2GoBPmrHfiCoDVd3UPQYcU@13.53.164.121:3015

  • aenode://[email protected]:3015

  • opening a ticket
    in the wiki
    How to retrieve the released software for running a node
    How to install a node
    How to join the mainnet
    How to join the testnet
    release binary
    Docker image aeternity/aeternity
    Building a release binary from source
    the dedicated separate document
    online in swagger.yaml
    the dedicated separate document
    documentation online
    operation instructions
    docker documentation
    Network ID
    docker documentation
    the dedicated separate document
    the dedicated separate document
    Chocolatey
    Install Visual Studio 2019
    Chocolatey
    Visual Studio 2019 Installer
    vs_buildtools.exe
    Setup
    Install MSYS2
    MSYS2
    Chocolatey
    MSYS2 Windows Installer
    Erlang/OTP 20.3
    Erlang/OTP
    Chocolatey
    Erlang/OTP 20.3 Windows Installer
    Java Development Kit 11+
    MSYS2
    MSYS2

    We collect a transaction fee by mining.

  • We can start and restart the applications.

  • Discarded when re-connecting to the other nodes if other chain has more PoW (exact requirements to be added)

  • Accepted by the other nodes if this fork has a larger PoW (exact requirements to be added)

  • Each node is able to:

    1. Post a spend transaction that is occurring in the chain.

    2. Pay a fee for a spend transaction.

    3. Collect a transaction fee by mining.

  • We can access all endpoints specified in the swagger.yaml file with expected results. (This needs further refinement)

  • A node that is stopped for 5 minutes (enough to create additional blocks on the chain) should be able to restart and satisfy 1, 2 and 5 above.

  • A node that sends invalid data to other nodes is black-listed.

  • Should be able to connect to the uat-net and show the correct top block of the uat-net.

  • Should be able to mine a block and add it to the chain of the uat-net (within an hour).

  • If disconnected from the uat-net, a fork is created, that is discarded when re-connecting to the uat-net (we assume the uat-net to have more mining power than a single miner).

  • A user downloaded or created production package is, by running for one hour, able to:

    1. Post a spend transaction that is occurring in the uat-net chain.

    2. Pay a fee for a spend transaction.

    3. Collect a transaction fee by mining.

  • A user can access all endpoints specified in the swagger.yaml file with expected results. (This needs further refinement)

  • A user should be able to stop the miner and restart it after 15 minutes with the effect that 3.i, 3.ii and 5 above hold.

  • A user should be able to update the software and continue with the saved chain as starting point. In that case 3, 4 and 5 above should be fulfilled.

  • apps/aecore/test
    apps/aecore/test/aec_peers_tests.erl
    test
    how to work with our docker images
    User Acceptance Test
    Added AENS.update to FATE VM
  • Added AENS.lookup and Oracle.expiry lookup functions to FATE VM

  • Fixed bug regarding TTL of preclaims in FATE VM - it was incorrectly always set to 0, from VM_FATE_SOPHIA_2 it has the correct value.

  • Fixed a bug in AENS.resolve in FATE VM - for invalid names VM_FATE_SOPHIA_1 will crash. From VM_FATE_SOPHIA_2 it will not crash, rather return None.

  • Changed Chain.block_hash - in VM_FATE_SOPHIA_2 it will returnSome(<blockhash>) for Chain.block_height (i.e. current generation) previously it returned None. With Bitcoin-NG we do have the block hash of the current generation, so no reason not to allow this.

  • Extended AENS name max expiration time from 50000 generations (~100 days) to 180000 generations (~375 days).

  • Changed how a meta transaction TTL's is being validated: so far it used to be the outermost transaction's ttl that was taken into account, now it is the innermost one instead. Meta transactions no longer have TTL.

  • Fixed a protocol issue: a valid force progress call with invalid CallData or failing call would result in on-chain transaction but tokens from the caller would still be moved to the forced contract. This is fixed and failed calls in successful force progress transactions result in rollback of the off-chain balances.

  • Improved the functionality of State Channel delegates: now they can providechannel_solo_snapshot_tx as well. This is really handy in cases one party is missing and the other is doing malicious force progress on-chain while the channel is still open.

  • Revisited the State Channel delegates: so far they were a shared list for both participants. From Iris on, delegates are per peer: there is a list of delegates for the initiator and another one for the responder. Old channel objects can still be used but users are strongly recommended to reset their delegates list if they had any. Note that the HTTP representations are changed accordingly.

  • Allowed delegates to force progress on behalf of the user that authorized them to do so.

  • Improved garbage collector for all Fate contracts form Iris

  • Fate contracts of different versions can now call each other (Fate1 can call Fate2 and vice-versa)

  • Opcode availability and behaviour now depends on VM version of the contract (Fate2 opcodes are available both when Fate2 contract is called directly and when called by another (possibly Fate1) contract)

  • Generalized accounts, allow access to the signed transaction within the authentication context:

  • This enables more use-cases, for example in combination with PayingForTx.

    • Added more crypto primitives (mainly pairing operations) for BLS12-381. This enables for example Zero-knowledge proofs and more multi-signature schemes.

    • Added functions related to strings. It introduces to_list and from_list primitives that enables flexible string manipulation. Strings.aes standard library functions include many useful string functions.

    • Added the possibility to query an oracle by name hash. A name pointer can map oracle_pubkey to an oracle to enable query by name hash.

    • Added a new transaction to the protocol. PayingForTx allows an account to pay for a transaction on behalf of someone else. This means paying for fees and gas cost, but it will not cover the amount spent by the transaction just the "the cost of the transaction" (and the extra size added by wrapping the original transaction).

    • Fixed a bug in the contract store garbage collector causing maps to be more expensive than they should be.

    • Added support for protected contract calls. Making a contract call with the named argument protected set to true wraps the result of the call in anoption type, returning Some(res) if the call succeeds with result res and None if the call fails for any reason. If the call fails, any side-effects it performed are rolled back.

    • AENS pointers are now limited, this is enforced when updating a name:

      • No duplicate pointer keys.

      • Pointer keys are not longer than 256 bytes.

      • A name can not have more than 32 pointers. When a name is updated, or looked up, inside a Sophia contract keys that are no longer valid are automatically removed.

    • Added support for CREATE opcode

    • Added support for CLONE opcode

    • Added support for CLONE_G opcode

    • Added support for BYTECODE_HASH opcode

    • Included full FATE 2 code with init in state trees. This also applies to off-chain contracts in state channels

    • Changed comparison and MAP_TO_LIST FATE opcodes to follow ordering as defined in aebytecode

    • Added a new FEE opcode that returns call transaction fee

    • Fixed STR_REVERSE to reverse on unicode codepoints instead of raw bytes

    • Deprecated Ubuntu 16.04 support. EOL Apr 2021.

    • Introduced a new HTTP API for asking the node to provide a correctpaying_for_tx. It is marked as debug and it is intended to be used while developing tools that produce that transaction. This API must not be used in real-life scenarios. Since the inner transaction has a specificnetwork_id, a proper check has been added to the API so attempts to create an erroneous paying_for_tx will fail.

    • Revisited gas prices and gas charging mechanism. The main change is that gas will, in some cases, be charged earlier - i.e. contracts run out of gas before expensive operations rather than after. This should make the FATE VM more efficient. Gas prices have also been adjusted and new operations have been calibrated.

    • Introduced a new HTTP endpoint: /dry-run. It is part of the external interface and should be preferred over the existing debug endpoint. It comes with some protections for the node: all transactions/calls provided are limited to a total amount of gas that they can consume. There is a new setting in the config where the node operator can change this according to their needs, the default value is 6 000 000 gas. The new endpoint is disabled by default and can be enabled via the new API group dry-run.

    Please join the mainnet by following the instructions in the documentation below, and let us know if you have any problems by opening a ticket. Troubleshooting of common issues is documented in the wiki.

    Documentation

    For an overview of the installation process for different platforms, building the package from source, configuration and operation of the Aeternity node please refer to Aeternity node documentation.

    This
    > choco install -y visualstudio2019-workload-vctools --params "--add Microsoft.VisualStudio.Component.VC.CLI.Support --locale en-US"
    > scripts\windows\install_msys2.bat C:\tools\msys64
    choco install -y msys2
    > SET "WIN_MSYS2_ROOT=C:\tools\msys64"
    > scripts\windows\install_erlang.bat 20.3 C:\tools\erl9.3
    ...
    SET "WIN_OTP_PATH=C:\tools\erl9.3"
    SET OTP_VERSION=20.3
    SET ERTS_VERSION=9.3
    choco install -y erlang --version=20.3
    SET "WIN_OTP_PATH=C:\Program Files\erl9.3"
    SET OTP_VERSION=20.3
    SET ERTS_VERSION=9.3
    SET "WIN_MSYS2_ROOT=C:\tools\msys64"
    SET "WIN_OTP_PATH=C:\tools\erl21.3"
    SET ERTS_VERSION=10.3
    SET OTP_VERSION=21.3
    SETX WIN_MSYS2_ROOT C:\tools\msys64
    SETX WIN_OTP_PATH C:\Program Files\erl9.3
    SET "MSYS_INCLUDE_PATH=/c/Program Files/OpenJDK/jdk-12.0.2/bin:%MSYS_INCLUDE_PATH%"
    WIN_MSYS2_ROOT=C:\tools\msys64
    WIN_OTP_PATH=C:\tools\erl21.3
    PLATFORM=x64
    ERTS_VERSION=10.3
    OTP_VERSION=21.3
    cd PATH_TO_REPO_CHECKOUT
    make
    make eunit-latest
    make eunit-latest TEST=aec_peers
    make ct-latest
    $ make ct-latest SUITE=apps/aecore/test/aecore_sync
    $ make ct-latest SUITE=apps/aehttp/test/aehttp_integration GROUP=external_endpoints
    $ make ct-latest SUITE=apps/aehttp/test/aehttp_integration GROUP=external_endpoints TEST=get_transaction
    $ make ct-latest DIR=apps/aehttp/test
    $ make ct-latest DIR=apps/aehttp/test,apps/aecore/test
    $ make system-test-deps
    $ make system-test
    $ EPOCH_DISABLE_NODE_CLEANUP=1 make system-test
    $ make system-test SUITE=aest_sync
    $ make system-test SUITE=aest_perf GROUP=long_chain
    $ make system-test SUITE=aest_sync TEST=new_node_joins_network
    $ make system-smoke-test-deps
    $ make smoke-test-run
    $ make local-system-test
    switch(Auth.tx)
      Spend(from, to, amount, payload) => ...
      AENSTransfer(from, to, name) => ...
      ...
  • Changes the off-chain protocol to accommodate Generalized Account authentication methods. This is off-chain noise protocol breaking change.

  • Enhances the state Channels WebSocket API, that now supports starting a responder with "initiator_id": "any". The responder instance will get the proper initiator Id from the channel_open message once a connection is established.

  • Enables multiple different State Channel responder pubkeys to share the same listen port.

  • Changes the channel_open and channel_accept messages to contain both the initiator and responder public keys. This is not backwards compatible for the noise protocol.

  • Enhances State Channel's WebSocket API with providing more meaningful messages when failing to open a channel because of invalid opening arguments.

  • Makes State Channel WebSocket API more consistent regarding the usage ofcaller and contract vs caller_id and contract_id. This is an API breaking change.

  • Allows sending and receiving generic messages in State Channels in any FSM state. Until this - generic messages were allowed only in open state.channel_id is part of the message body and if it is unknown - the temporary one is used instead. This is not backwards compatible for thenoise protocol. This enhances the WebSocket API accordingly.

  • Fixes the value of the discriminator field (type) for the oracle response transaction in the user API paths returning transactions (e.g. path /transactions/{hash}).

  • Enhances the response of the dry-run API (path /debug/transactions/dry-run) for contract create transaction by adding the information for the call of the initialization function e.g. the gas used. This makes the response of the dry-run for the contract create transaction analogous to the one for the contract call transaction.

  • This release introduces backward incompatibilities in the channels user WebSocket API and in the channels external Noise endpoint protocol. For the rest, this release is backward compatible with previous v3.* releases.

    Please join the mainnet by following the instructions below, and let us know if you have any problems by opening a ticket. Troubleshooting of common issues is documented in the wiki.

    The instructions below describe:

    • How to retrieve the released software for running a node;

    • How to install a node;

    • How to join the mainnet.

    • How to join the testnet.

    Retrieve the software for running a node

    You can run a node by either:

    • Installing the published release binary corresponding to your platform; or

    • Running the published Docker image aeternity/aeternity; or

    • Building a release binary from source.

    The instructions for configuring the node using the Docker image are in the dedicated separate document.

    The node user API is documented:

    • HTTP API endpoints are specified online in swagger.yaml;

      • A JSON version of the same specification is located in the node at path lib/aehttp-*/priv/swagger.json (you will need to amend the wildcard * placeholder in the path with the version).

      • The JSON version can be obtained from a running node using the endpoint /api.

      • An interactive visualization of the same specification is available .

    • WebSocket API endpoints are ;

    • The intended usage of the user API (HTTP and WebSocket) is .

    Install node

    The instructions for installing a node using a release binary are in the dedicated separate document.

    For installation of a node using the Docker image, please refer to the documentation online.

    Join the mainnet

    In order to join the mainnet follow the operation instructions to run the node with default configuration as mainnet is the default network.

    To join the mainnet by using the Docker image, please refer to docker documentation.

    Mainnet seed nodes

    The release package comes preconfigured with seed nodes. Here is example subset of the seed nodes:

    • aenode://pp_2L8A5vSjnkLtfFNpJNgP9HbmGLD7ZAGFxoof47N8L4yyLAyyMi@18.136.37.63:3015

    • aenode://pp_2gPZjuPnJnTVEbrB9Qgv7f4MdhM4Jh6PD22mB2iBA1g7FRvHTk@52.220.198.72:3015

    • aenode://[email protected]:3015

    • aenode://pp_2mwr9ikcyUDUWTeTQqdu8WJeQs845nYPPqjafjcGcRWUx4p85P@3.17.30.101:3015

    • aenode://pp_2CAJwwmM2ZVBHYFB6na1M17roQNuRi98k6WPFcoBMfUXvsezVU@13.58.177.66:3015

    • aenode://pp_7N7dkCbg39MYzQv3vCrmjVNfy6QkoVmJe3VtiZ3HRncvTWAAX@13.53.114.199:3015

    • aenode://pp_22FndjTkMMXZ5gunCTUyeMPbgoL53smqpM4m1Jz5fVuJmPXm24@13.53.149.181:3015

    • aenode://pp_Xgsqi4hYAjXn9BmrU4DXWT7jURy2GoBPmrHfiCoDVd3UPQYcU@13.53.164.121:3015

    • aenode://[email protected]:3015

    Inspect the mainnet

    Here are example nodes that can be used to inspect current top block and see information about e.g. height or target:

    • http://18.136.37.63:3013/v2/blocks/top

    • http://52.220.198.72:3013/v2/blocks/top

    • http://13.53.114.199:3013/v2/blocks/top

    • http://13.53.149.181:3013/v2/blocks/top

    Join the testnet

    In order to join the testnet change the Network ID in node configuration file to ae_uat.

    To join the testnet by using the Docker image, please refer to the docker documentation.

    Testnet seed nodes

    The release package comes preconfigured with testnet seed nodes, this is the list:

    • aenode://pp_QU9CvhAQH56a2kA15tCnWPRJ2srMJW8ZmfbbFTAy7eG4o16Bf@52.10.46.160:3015

    • aenode://pp_27xmgQ4N1E3QwHyoutLtZsHW5DSW4zneQJ3CxT5JbUejxtFuAu@13.250.162.250:3015

    • aenode://pp_DMLqy7Zuhoxe2FzpydyQTgwCJ52wouzxtHWsPGo51XDcxc5c8@13.53.161.215:3015

    Inspect the testnet

    The core nodes of the public test network are accessible from the Internet.

    Information, e.g. height, of the top block of the longest chain as seen by these core nodes of the testnet can be obtained by opening in the browser any of the following URLs:

    • http://52.10.46.160:3013/v2/blocks/top

    • http://13.250.162.250:3013/v2/blocks/top

    • http://13.53.161.215:3013/v2/blocks/top

    Setup your node

    Setting up your node consists of:

    • Configuring your node - see instructions in the dedicated separate document;

    • Starting your node and verifying it works as expected - see instructions in the dedicated separate document.

    This

    About this release

    This is a maintenance release. It contains stability improvements so all users are encouraged to upgrade.

    This release:

    • Adds operators mod, ++, bsl, bsr, and ^ to the Sophia compiler.

    • Adds function String.sha3 to the Sophia compiler.

    • Changes cuckoo miner config and processing to allow multiple simultaneous miners. This impacts mining configuration:

      • changes mining > cuckoo > miner param to mining > cuckoo > miners and makes mining > cuckoo

    • Adds Events to the Sophia compiler

    • Adds builtin functions Int.to_str and Address.to_str to the Sophia compiler

    • Adds native Windows build support.

      • Follow the instructions from /docs/build-windows.md to build and run a node on Windows.

    • Improves the handling of errors in contract create and contract call transactions.

    • Enhances the Sophia compiler, that now correctly rejects some programs that resulted in incorrect bytecode before.

    The Sophia compiler has been moved to a .

    This release is backward compatible with v1.1.* and v1.0.*.

    Please join the Roma network by following the instructions below, and let us know if you have any problems by . Troubleshooting of common issues is documented .

    The instructions below describe:

    • ;

    • ;

    • .

    • .

    Retrieve the software for running a node

    You can run a node by either:

    • Installing the published corresponding to your platform; or

    • Running the published ; or

    • .

    The user configuration is documented in the . For specifying configuration using the Docker image, please refer to .

    The node user API is documented:

    • HTTP API endpoints are specified ;

      • A JSON version of the same specification is located in the node at path lib/aehttp-*/priv/swagger.json (you will need to amend the wildcard * placeholder in the path with the version).

      • The JSON version can be obtained from a running node using the endpoint /api.

    Install node

    The instructions for installing a node using a release binary are in .

    For installation of a node using the Docker image, please refer to .

    Join Roma network

    Roma network seed nodes

    The release package comes preconfigured with seed nodes. Here is example subset of the seed nodes:

    • aenode://pp_5mmzrsoPh9owYMfKhZSkUihufDTB6TuayD173Ng464ukVm9xU@35.178.61.73:3015

    • aenode://pp_2KWhoNRdythXAmgCbM6QxFo95WM4XXGq2pjcbKitXFpUHnPQc3@35.177.192.219:3015

    • aenode://pp_2L8A5vSjnkLtfFNpJNgP9HbmGLD7ZAGFxoof47N8L4yyLAyyMi@18.136.37.63:3015

    • aenode://pp_2gPZjuPnJnTVEbrB9Qgv7f4MdhM4Jh6PD22mB2iBA1g7FRvHTk@52.220.198.72:3015

    Inspect Roma network

    Here are example nodes that can be used to inspect current top block and see information about e.g. height or target:

    • http://35.178.61.73:3013/v2/blocks/top

    • http://35.177.192.219:3013/v2/blocks/top

    • http://18.136.37.63:3013/v2/blocks/top

    • http://52.220.198.72:3013/v2/blocks/top

    Join the testnet

    This section describes how to run a node as part of the testnet - the public test network of nodes - by using the release binary.

    For running a node as part of the testnet by using the Docker image, please consult in addition to this section.

    Testnet seed nodes

    In order to join testnet reconfigure seed nodes in the release package:

    • aenode://pp_QU9CvhAQH56a2kA15tCnWPRJ2srMJW8ZmfbbFTAy7eG4o16Bf@52.10.46.160:3015

    • aenode://pp_27xmgQ4N1E3QwHyoutLtZsHW5DSW4zneQJ3CxT5JbUejxtFuAu@13.250.162.250:3015

    • aenode://pp_nt5N7fwae3DW8Mqk4kxkGAnbykRDpEZq9dzzianiMMPo4fJV7@18.130.148.7:3015

    Inspect the testnet

    The core nodes of the public test network are accessible from the Internet.

    Information, e.g. height, of the top block of the longest chain as seen by these core nodes of the testnet can be obtained by opening in the browser any of the following URLs:

    • http://52.10.46.160:3013/v2/blocks/top

    • http://13.250.162.250:3013/v2/blocks/top

    • http://18.130.148.7:3013/v2/blocks/top

    Setup your node

    Setting up your node consists of:

    • Configuring your node - see instructions in ;

    • Starting your node and verifying it works as expected - see instructions in .

    debian_ubuntu_packaging

    Debian and Ubuntu as its derivative both provide in depth documentation about creating packages for software. As such, this guide will not attempt to serve as a replacement. The steps provided here are meant as a brief introduction into packaging for Debian (and Ubuntu) and the issues one might came across. Most of the focus of this document is towards issues related to packaging Aeternity code.

    Note:

    Following the official Debian documentation for packaging, the information here might refer to Debian (packaging), but it is implied that the same applies to Ubuntu as a Debian derivative. All the steps are tested on 18.04.

    For full documentation about Debian packages, please review the following documents:

    online
    specified online
    documented online
    >
    miner
    param deprecated
  • moves mining > cuckoo > miner > edge_bits param to mining > cuckoo section

  • An interactive visualization of the same specification is available online.

  • WebSocket API endpoints are specified online;

  • The intended usage of the user API (HTTP and WebSocket) is documented online.

  • aenode://pp_frAKABjDnM3QZCUygbkaFvbd8yhv6xdufazDFLgJRc4fnGy3s@52.56.252.75:3015

  • aenode://[email protected]:3015

  • aenode://pp_2mwr9ikcyUDUWTeTQqdu8WJeQs845nYPPqjafjcGcRWUx4p85P@3.17.30.101:3015

  • aenode://pp_FLpSUrKwgBAu5uVRnB2iWKtwGAHZckxvtCbjVPeeCA3j33t3J@52.56.66.124:3015

  • aenode://pp_2CAJwwmM2ZVBHYFB6na1M17roQNuRi98k6WPFcoBMfUXvsezVU@13.58.177.66:3015

  • separate repository
    opening a ticket
    in the wiki
    How to retrieve the released software for running a node
    How to install a node
    How to join the roma network
    How to join the testnet
    release binary
    Docker image aeternity/epoch
    Building a release binary from source
    wiki
    its documentation
    online in swagger.yaml
    the dedicated separate document
    its documentation online
    its documentation
    the dedicated separate document
    the dedicated separate document

    Debian Policy

  • Ubuntu Packaging Guide

  • High-level overview

    Debian provides various tools for packaging that have solutions for most issues, a package maintainer might encounter. All of them solve the same issue - some on higher level, other on more lower level. At the lowest level of operation they all rely on the same low-level tools.

    All tools require additional files to be added to the source code for the generation of packages. Those files usually have strict format, and could be observed as a meta-config files. One exception is the rules file of a package, that in essence is a Makefile.

    All files required generally reside in the debian/ directory in the software source tree.

    The steps on this guide use the debuild command for packaging.

    Erlang packaging notes

    For the purpose of packaging, Debian provides tools (Debian helpers ; dh-*) for many languages to ease the task.

    For software programmed in Erlang and using rebar, there exists a helper dh-rebar. However this cannot be used with the current Aeternity Erlang code-base.

    The dh-rebar helper uses rebar 2.x, while Aeternity's code-base requires rebar3. Additionally, during the creation of this guide no official in-detail Debian documentation and best practises were found related to packaging Erlang software (with or without rebar), however there is an official Debian packaging Erlang team and project.

    The approach taken by this guide might not be the best approach to package simple Erlang package that uses rebar, which might be easier to package with the dh-rebar helper.

    Having that in mind, packaging is achieved following the officialbuilding documentation around the make prod-build Makefile rules. In that way, the automated Debian packaging process is overridden to fine-tune some steps, while using make prod-build as a base for building the binary.

    Requirements

    The packaging tools attempt to generate robust packages and as such, try to follow best practises, and check a lot of details of the final package. This includes shared libraries and dependencies checks, packaging config files issues etc.

    To be able to build packages, the devscripts package is required. It provides various tools needed for the packaging process.

    To build the source code of Aeternity, Erlang is also required.

    Erlang version

    A suitable version of Erlang should be installed from the package repositories that Erlang Solutions provides.

    However simply adding a repository source in Debian or Ubuntu will not work in this case. To avoid specifying the exact version of every Erlang related package, required, an apt preference and pinning is required.

    Create an apt preference file, that will constrain the version to all Erlang packages.

    /etc/apt/preferences.d/erlang

    Install the https apt transport:

    Add the additional package repository for Erlang.

    /etc/apt/sources.list.d/erlangsolutions.list

    Add the repository key to apt

    Update the sources:

    General requirements

    The rest of the steps should work on Ubuntu 18.04.

    To install all build and packaging dependencies run:

    Package internals

    Create the Debian package directory in the source directory structure

    Create debhelper compatibility file and level

    debian/compat [1]

    Note: Level 8 is deprecated according to Debian standards.

    It should not be used for new packages. However there are issues in levels 9 and 10 with Aeternity Erlang node code-base, which require a lot of patching in all dependencies. Debian package wrappers set compiler flags for hardening the code (against memory attacks for example).

    Those prevent building the code and all dependencies. Disabling with counter flags (-Wno-error=some-warning-flag) is error-prone, so the older compatibility level approach was chosen for an easier start.

    control file

    debian/control [1] [2]

    This file defines the package meta-information such as name, dependencies, build dependencies.

    rules file

    debian/rules [1] [2]

    This file is the main recipe that creates a package. It specifies how to build (compile) the source and can provide rules to override standard packaging steps (if required). It is a Makefile in essence. An empty rule skips a step completely.

    install file

    debian/package_name.install [1]

    Create debian/package-name.install if the package source does not have a make install rule. Packaging wrappers rely on make install to collect the files required for the package.

    Every line contains a source file or directory and a destination separated by space. The file supports wildcards.

    docs file

    debian/pacakge_name.docs [1] Create debian/package-name.docs file if there are documentation files to be included in the package. Those usually go in/usr/share/doc/package-name in Debian and Ubuntu.

    In the case of the Erlang implementation of Aeternity, documentation files are not installed in that directory. However a symbolic link is created in /usr/share/docs/aeternity-node/docs to point to the files in /opt/aeternity/node/docs/. This is required since the install file does not provide a robust way to separate or exclude directories.

    links file

    debian/pacakge_name.links [1]

    Create debian/package-name.links if symbolic links are required for some reason (purely aesthetic or for operation purposes).

    changelog file

    debian/changelog [1] [2]

    Create debian/changelog file. This one is essential to package building. Packaging policy requires this file to be present to track changes introduced in newer versions and requires a special format. It is not advisable to try to create it by hand. It is best to see man dch or man debchange.

    Example:

    Generating changelog file.

    Debian New Maintainers' Guide andDebian Policy require an up to date changelog file.

    The best solution would be to add the changes for every Aeternity release to the changelog file. However there is no easy way to do it from existing data, as the changelog file has a special format.

    One way would be to use Git commit messages and the git-buildpackage tools. However this is not very practical for Aeternity codebase. This would require special branches in the Git repository and this is something that (potentially) should be avoided.

    Another approach would be to convert the RELEASE-NOTES file for every release into a Debian changelog file. However this is impractical. The RELEASE-NOTES file is a Markdown file with vague formatting (sections, topics etc.) and can't be converted to a Debian changelog file straight-forward.

    The simplest solution is to add a single comment in the Debian changelog file pointing to the RELEASE-NOTES file on disk (in the package) for the release. Even it might not be strictly in sync with the Debian changelog file policy. This is the approach used.

    Using dch

    Both commands are required and cannot be combined. The -v option adds a new version to the changelog file. The -r option finalizes the release (version) in the changelog file.

    Building binary package.

    Debian (and Ubuntu as its derivative) provide several tools to build a package from higher to low level. For our purposes debuild is used.

    If all the required files in the debian/ directory are present, building the package requires only running debuild.

    This command will build the binary package and will skip signing with GPG the changes (-uc) file and source package (-us). This is useful during the initial Debianization and when testing changes.

    Debuild calls additional tools to prepare the package. The -us and-uc options are for the dpkg-buildpackage command.

    Note: Command line options passed to debuild have strict order.

    First are debuild arguments, then dpkg-buildpackage ones, and last options to lintian. For full description and workflow checkdebuild documentation (man debuild).**

    To build a source package, change the -b option to -S

    Building source package

    The Makefile in the root of the source tree provides a rule to easily create a package. It runs all the necessary commands.

    TODO:

    Distributing packages

    PPA creation (Launchpad)

    [1][2]

    Launchpad cannot be used for Debian package building with the current Aeternity codebase. Source code building requires external dependencies from GitHub. Launchpad accepts only source Debian packages and builds them. However Launchpad is restricted (DNS) for obvious reasons and cannot build our packages.

    Debian New Maintainers' Guide
    Package: erlang* esl-erlang
    Pin: version 1:20.2-1*
    Pin-Priority: 501
    sudo apt-get install apt-transport-https
    
    deb https://packages.erlang-solutions.com/ubuntu xenial contrib
    cd /tmp
    wget https://packages.erlang-solutions.com/ubuntu/erlang_solutions.asc
    sudo apt-key add erlang_solutions.asc
    sudo apt-get update
    sudo apt-get install wget ncurses-dev libssl-dev libsodium-dev git curl debhelper apt-transport-https autoconf build-essential devscripts erlang debhelper dh-autoreconf
      cd ae_node_code/
      mkdir debian
    echo 8 > debian/compat
    Source: aeternity-node
    Section: misc
    Priority: optional
    Maintainer: Full Name <[email protected]>
    Build-Depends: erlang ( >=1:20.2-1),  erlang-base ( >=1:20.2-1), erlang-dev ( >=1:20.2-1),
                   erlang-edoc ( >=1:20.2-1), ncurses-dev, libssl-dev, git, curl
    
    Package: aeternity-node
    Architecture: any
    Depends: ${shlibs:Depends}, ${misc:Depends}
    Description: Aeternity blockchain implementation in Erlang.
     Optimized for scalability via smart contracts inside
     state-channels. Has a built-in oracle for integration with real-world
     data.
    #!/usr/bin/make -f
    # -*- makefile -*-
    
    # Uncomment this to turn on verbose mode.
    export DH_VERBOSE=1
    
    export DEB_BUILD_MAINT_OPTIONS=hardening=-all
    
    %:
            dh $@
    
    override_dh_auto_build:
            $(MAKE) prod-build
    
    override_dh_auto_clean:
           $(MAKE) prod-clean
           $(MAKE) clean
           $(MAKE) distclean
    
    override_dh_auto_test:
    _build/prod/rel/aeternity/* /opt/aeternity/node/
    _build/prod/rel/*/docs/
    
    var/log/aeternity/node opt/aeternity/node/log
    opt/aeternity/node/docs usr/share/doc/aeternity-node/docs
    aeternity-node (1.1.0) unstable; urgency=medium
    
      * Initial Debianization
    
     -- Full Name <[email protected]>  Tue, 18 Dec 2018 09:43:00 +0200
    cd ae_node_source/
    [email protected]
    DEBFULLNAME="Aeternity Team"
    AE_DEB_PKG_NAME="aeternity-node"
    AE_DEB_PKG_VERSION=$(cat VERSION)
    AE_DEB_DCH_REL_NOTE="Release notes are available in /usr/share/doc/aeternity-node/docs/release-notes/RELEASE-NOTES-${AE_DEB_PKG_VERSION}.md"
    dch --create --package=$AE_DEB_PKG_NAME -v $AE_DEB_PKG_VERSION $AE_DEB_DCH_REL_NOTE
    dch -r $(AE_DEB_DCH_REL_NOTE)
    debuild -b -uc -us
    debuild -S -uc -us
    make prod-deb-package

    About this release

    This is the first Minerva release candidate. It contains:

    • Refinements in the seed nodes of the environments.

    • Changes reflecting the canonical name of the software.

    • The implementation of the Minerva consensus protocol version - testnet-only in this release.

    • Improvements in the Sophia language and the usage of its compiler.

    • Feature refinements.

    Please refer to the notes below for details and backward compatibility.

    Regarding the seed nodes of the environments:

    • Testnet seed node 18.130.148.7 has been replaced by 13.53.161.215

    • Roma network seed nodes have been replaced according to the following table:

      Old seed nodes
      New seed nodes

    Regarding the canonical name of the software (from epoch to aeternity - started in release 1.3.0), this release:

    • Changes user config discovery paths, i.e. the node is looking for the user config in:

      • AETERNITY_CONFIG environment variable instead of EPOCH_CONFIG,

      • ~/.aeternity/aeternity/aeternity.yaml file instead of ~/.epoch/epoch/epoch.yaml,

      • ${AETERNITY_TOP}/aeternity.yaml file instead of ${AETERNITY_TOP}/epoch.yaml. Backwards compatibility is kept for now, so user config defined in old locations will be working until the next major release.

    Regarding the Minerva consensus protocol upgrade on testnet, this release:

    • Sets the MINERVA testnet (UAT) hard fork height to block 40900

    • Adds token migration support for the hard fork

    • Adds an optional info field to the key block/header that is allowed from the Minerva consensus version.

    • Adds the info field to all key block/headers returned by the API

    Regarding the Sophia language and the usage of its compiler:

    • Introduces a new AEVM version to contain consensus breaking changes and optimizations.

    • Removes references to old planned VM versions that will not be implemented.

    • Splits the old VM-version into VM-version and ABI-version. Contract calls and Oracles only deal with ABI-version. This changes the HTTP API. We have two VM-versions (SOPHIA_1 = Roma, and SOPHIA_2 = Minerva), but only one ABI-version.

    • Adds Crypto.ecverify

    Regarding feature refinements:

    • Add debug API endpoint for getting the token supply at height

    • Add api endpoint for getting the state of an account at a given height

    • The utility command ./bin/aeternity keys_gen does not compress spaces in the password itself anymore. Only spaces at the beginning or end of a given password are trimmed.

    • Moves mining related code into a separate git repository -

    The database is backward compatible with v1.*. For the rest, this release is not backward compatible with v1.*.

    Please join the testnet by following the instructions below, and let us know if you have any problems by . Troubleshooting of common issues is documented .

    The instructions below describe:

    • ;

    • ;

    • .

    • .

    Retrieve the software for running a node

    You can run a node by either:

    • Installing the published corresponding to your platform; or

    • Running the published ; or

    • .

    The instructions for configuring the node using the Docker image are in .

    The node user API is documented:

    • HTTP API endpoints are specified ;

      • A JSON version of the same specification is located in the node at path lib/aehttp-*/priv/swagger.json (you will need to amend the wildcard * placeholder in the path with the version).

      • The JSON version can be obtained from a running node using the endpoint /api.

    Install node

    The instructions for installing a node using a release binary are in .

    For installation of a node using the Docker image, please refer to .

    Join Roma network

    Roma network seed nodes

    The release package comes preconfigured with seed nodes. Here is example subset of the seed nodes:

    • aenode://pp_2L8A5vSjnkLtfFNpJNgP9HbmGLD7ZAGFxoof47N8L4yyLAyyMi@18.136.37.63:3015

    • aenode://pp_2gPZjuPnJnTVEbrB9Qgv7f4MdhM4Jh6PD22mB2iBA1g7FRvHTk@52.220.198.72:3015

    • aenode://[email protected]:3015

    • aenode://pp_2mwr9ikcyUDUWTeTQqdu8WJeQs845nYPPqjafjcGcRWUx4p85P@3.17.30.101:3015

    Inspect Roma network

    Here are example nodes that can be used to inspect current top block and see information about e.g. height or target:

    • http://18.136.37.63:3013/v2/blocks/top

    • http://52.220.198.72:3013/v2/blocks/top

    • http://13.53.114.199:3013/v2/blocks/top

    • http://13.53.149.181:3013/v2/blocks/top

    Join the testnet

    This section describes how to run a node as part of the testnet - the public test network of nodes - by using the release binary.

    For running a node as part of the testnet by using the Docker image, please consult in addition to this section.

    Testnet seed nodes

    In order to join testnet reconfigure seed nodes in the release package:

    • aenode://pp_QU9CvhAQH56a2kA15tCnWPRJ2srMJW8ZmfbbFTAy7eG4o16Bf@52.10.46.160:3015

    • aenode://pp_27xmgQ4N1E3QwHyoutLtZsHW5DSW4zneQJ3CxT5JbUejxtFuAu@13.250.162.250:3015

    • aenode://pp_DMLqy7Zuhoxe2FzpydyQTgwCJ52wouzxtHWsPGo51XDcxc5c8@13.53.161.215:3015

    Inspect the testnet

    The core nodes of the public test network are accessible from the Internet.

    Information, e.g. height, of the top block of the longest chain as seen by these core nodes of the testnet can be obtained by opening in the browser any of the following URLs:

    • http://52.10.46.160:3013/v2/blocks/top

    • http://13.250.162.250:3013/v2/blocks/top

    • http://13.53.161.215:3013/v2/blocks/top

    Setup your node

    Setting up your node consists of:

    • Configuring your node - see instructions in ;

    • Starting your node and verifying it works as expected - see instructions in .

    52.56.252.75

    13.53.164.121

    52.56.66.124

    13.53.77.98

    3.8.105.183

    13.53.213.137

    3.8.30.66

    13.53.51.175

    35.177.165.232

    13.53.161.210

    35.177.212.38

    13.53.162.212

    35.176.217.240

    13.53.89.32

    18.130.106.60

    13.53.78.163

    If you don't explicitly configure those nodes IP/keys, you don't need to do anything, otherwise update your configuration, because all old nodes will be shutdown in short period of time

  • Renames the log files:

    Old file name
    New file name

    "epoch.log"

    "aeternity.log"

    "epoch_mining.log"

    "aeternity_mining.log"

    "epoch_sync.log"

    "aeternity_sync.log"

    "epoch_pow_cuckoo.log"

    "aeternity_pow_cuckoo.log"

  • Adds the info field as required in the key block post API used for mining pools.

  • Set the minimum gas price to 1000000 in order to make transactions more reasonably priced.

  • as a Primop for the aevm and in the compiler.
  • Adds generic hash functions to Sophia.

  • Adds bytecode instructions for bit shift (SHL, SHR, and SAR) to VM_AEVM_SOPHIA_2

  • Changes AEVM semantics of arithmetic operations to fail on over/underflow.

  • Replaces Sophia bit arithmetic operations with a new builtin bit field type.

  • Fix Sophia Call.origin to return the original caller

  • Fixes the size check applied for individual Map elements in Sophia/AEVM, previously it could give out of gas for not-too-big elements. Applies in VM_AEVM_SOPHIA_2.

  • Deprecates all HTTP APIs that interface with the compiler. The compiler will be provided separately as a standalone "tool".

  • Lock the compiler backend for (deprecated) HTTP APIs to the ROMA compiler.

  • Oracle query and response formats are checked on register in the minerva protocol

  • A new version for contract serialization has been added that contains the compiler name/version used to compile the contract. This serialization is only valid after Minerva hard-fork height has been reached.

  • Avoid bumping nonces in for contract primops unless it is needed (from Minerva protocol)

  • aeternity/aeminer
    . The Aeternity node uses the repository as a dependency (and other projects can use it as a dependency, too).
  • Add utility command support for ./bin/aeternity UTILITY_COMMAND on Windows. These commands were previously non-functional on Windows.

  • Increases the maximum size of generic state channel messages to 65535 bytes.

  • Add api endpoint for getting the state of an account at a block hash

  • An interactive visualization of the same specification is available online.

  • WebSocket API endpoints are specified online;

  • The intended usage of the user API (HTTP and WebSocket) is documented online.

  • aenode://pp_2CAJwwmM2ZVBHYFB6na1M17roQNuRi98k6WPFcoBMfUXvsezVU@13.58.177.66:3015

  • aenode://pp_7N7dkCbg39MYzQv3vCrmjVNfy6QkoVmJe3VtiZ3HRncvTWAAX@13.53.114.199:3015

  • aenode://pp_22FndjTkMMXZ5gunCTUyeMPbgoL53smqpM4m1Jz5fVuJmPXm24@13.53.149.181:3015

  • aenode://pp_Xgsqi4hYAjXn9BmrU4DXWT7jURy2GoBPmrHfiCoDVd3UPQYcU@13.53.164.121:3015

  • aenode://[email protected]:3015

  • 35.178.61.73

    13.53.114.199

    35.177.192.219

    13.53.149.181

    opening a ticket
    in the wiki
    How to retrieve the released software for running a node
    How to install a node
    How to join the roma network
    How to join the testnet
    release binary
    Docker image aeternity/aeternity
    Building a release binary from source
    the dedicated separate document
    online in swagger.yaml
    the dedicated separate document
    its documentation online
    its documentation
    the dedicated separate document
    the dedicated separate document

    Configuration

    This document describes how to configure your Aeternity node installed using a release binary for joining a public network of nodes (e.g. testnet) knowing an initial network peer to join.

    User-provided configuration

    The aeternity system supports user-provided parameters via a JSON- or YAML-formatted config file.

    File name and location

    The format of the config file is determined from the file extension: .json for JSON, or .yaml for YAML.

    The location of the file can be specified in a few different ways, in order of priority:

    1. The OS environment variable AETERNITY_CONFIG contains a filename

    2. The Erlang/OTP environment variable -aecore config contains a filename

    3. A file named aeternity.{yaml,json} exists in ${HOME}/.aeternity/aeternity/

    If all above checks fail, no user configuration is applied.

    Validation

    The contents of the config file will be validated against a JSON-Schema, located in the node at path data/aeternity_config_schema.json. If any parameters violate the schema, the node will fail to start.

    Environment variables

    It is possible to set configuration values from the command line or shell scripts using OS environment variables. The variable names correspond to a path in the config schema, using the name prefix AE__ and with each level name, converted to uppercase, separated by two underscores. Any hyphen ("-") is replaced by an underscore ("_").

    Examples:

    AE__PEERS corresponds to {"peers": ...} AE__HTTP__CORS__MAX_AGE corresponds to {"http": {"cors": {"max_age": ...}}} AE__HTTP__ENDPOINTS__DRY_RUN corresponds to {"http": {"endpoints": {"dry-run": ...}}}

    Simple configuration values (integers, strings, booleans) are given as-is. Structured values (arrays, objects) need to be encoded as JSON data.

    Example: AE__MEMPOOL='{"tx_ttl":17,"sync_interval":4777}'

    It is possible to provide an object definition and then override some specific value, as the variable names are processed in alphabetical order:

    Example:

    The OS environment variables are applied after reading any provided config file, so can be used to override a static user configuration.

    Notable parameters

    Peer-to-peer network

    It is very important that a node not only can connect to other nodes, but that can accept incoming connections as well: the more peer connections (both inbound+outbound) the node has, the better its overall p2p network latency (i.e. block propagation time) will be.

    By default node listen on TCP port 3015. It can be changed by sync > port parameter in the configuration file in case for some reason that port cannot be used (e.g. already used by other service).

    Firewalls

    Example setup: node (firewall) <-> firewall <-> Internet

    If the node is behind a firewall that port (default 3015 or the one set in the configuration) should be opened for inbound TCP connections.

    Note that the port may need to be opened both on the host machine running the node and any external device (firewall/router) that route the network traffic. Unfortunately all firewall configurations are different and common steps cannot be provided here, one should follow the documentation of their equipment/software "how to open firewall port".

    NAT

    Example setup: node <-> NAT (router) <-> Internet

    If the node is behind NAT (e.g. home router) the port should be forwarded on that device to accept incoming connections from Internet and route it to the node.

    Unfortunately all router configurations are different and common steps cannot be provided here, one should follow the documentation of their equipment/software "how to forward ports".

    Advanced NAT

    This is advanced configuration and should be used with caution because it can cause node misconfiguration and bad p2p connectivity. In case the sync port (3015 by default) cannot be used as external forwarding port the sync > external_port configuration parameter can be used to change it. This is the port that the node will advertise to the network to be reached over Internet.

    Example scheme: node (sync > port) <-> router (sync > external_port) <-> Internet

    UPnP/NAT-PMP

    If you don't have port forwarding configured in your router, but your router supports UPnP or NAT-PMP, the node provides UPnP/NAT-PMP service to streamline network configuration.

    In order to start UPnP/NAT-PMP service:

    • make sure UPnP/NAT-PMP is enabled on your router;

    • in your user configuration file, set sync > upnp_enabled parameter to true.

    Then, the node will automatically create appropriate port mapping based on the configuration parameters.

    Port Check

    After you have started the node, you can verify the validity of your setup and configuration correctness by, for example, running the external node port check (assuming the default port 3015):

    Example output:

    Where the IP address shown in the output is the external IP address of the node under test.

    Channels

    The node provides an infrastructure for using state channels. There are two distinct protocols involved:

    • WebSocket client one

    • Noise encoded one

    The later is not subject to this document.

    Channels' WebSocket client setup

    In order to connect as a WebSocket client, one must set up a port and a host the service is to listen at. This is a private node setting that is left for the node operator to secure its access. The TCP port can be set using websocket > channel > port parameter. The address the service is to be listening can be set using the websocket > channel > listen_address parameter. Note that this address has a default value of 127.0.0.1 and thus the WebSocket endpoint is not exposed.

    Network ID

    The network that the node connects to can be changed by setting fork_management > network_id in the configuration file. The default network that the node package is preconfigured with is mainnet with ID ae_mainnet.

    The testnet (internally called UAT) has the network ID ae_uat. To join the testnet set network_id to ae_uat in the configuration:

    Hardforks

    Hardforks allow the specification of consensus protocol versions with their respective heights for custom chains. Optionally, prefunded account and contract files can be specified which will be effective at these heights. The files can be specified using the absolute path or a path relative to the home of the node in the directory data/aecore.

    It is also possible to set the configuration in an environment variable.

    Example: AE__CHAIN__HARD_FORKS='{"1":{"accounts_file": "hf_dir/genesis/accounts.json", "height":0}}'

    Peers

    Peers is a list of nodes that node tries to connect to.

    If the peers key is undefined (not set in the configuration file), the list of peers is automatically determined based on the configuration value. This works both for mainnet and testnet.

    To prevent the node to initialize outgoing connections to any peers, set it to empty list:

    Please note that this do not prevent incoming connections, thus the node still might be connected to a network if its address is already known in that network.

    Miner configuration

    The instructions below assume that you already know your beneficiary account public key (if you don't, see ).

    If you want to use your node to mine, you can use the default mining by setting

    in the aeternity.yaml configuration file.

    Make sure you replace mining > beneficiary parameter with your public key!

    Note that in order to improve sync performance, before configuring your miner, you should start a node with autostart: false. Change this value to autostart: true when you are in sync, then restart the node.

    Your mining setup needs to meet your hardware capacity. Therefore, you need to make a choice in how you want to configure your miner. You can read the documentation on setting up CUDA mining, or you can use all but one of the cores on your computer to mine (keep one core available for transaction gossiping, synchronising, etc). If you have 16 cores, you could (loosely spoken) assign 14 of them to mining using the following configuration:

    Combining different miners

    Your mining setup may also contain multiple miners, which will be run simultaneously by your node. For example, to combine CPU miner with CUDA miner the following configuration can be used:

    For more details on CUDA mining go to .

    Beneficiary account

    In order to configure who receives fees from mining on a node, you must configure a beneficiary public key.

    If you don't have your public key yet, you can generate a public/private key pair by using any one of the following tools:

    • .

    If stratum is enabled, a beneficiary accounts from the stratum configuration are used instead, as stratum disables local mining.

    For configuring stratum, please consult .

    Generating a beneficiary account for testing purposes only

    An alternative tool keys_gen for generating a public-private key pair for testing purposes only is included in the package.

    The key pair will be encrypted with a password that you shall pass to keys_gen tool (below assumes the node is deployed in directory ~/aeternity/node). Generated public-private key pair will be located in ~/aeternity/node/generated_keys, and public key is to be put in the configuration file (mining > beneficiary parameter).

    Do make sure you back up ~/aeternity/node/generated_keys (and remember the password): if you destroy the node, you can setup a new node and use the same account (public key) as a beneficiary. You shall not share the private key (or the password) with anyone.

    e.g.

    In the example the generated public key is ak_2D9REvQsrAgnJgmdwPq585D8YksJC8PSAA8MscQdxinbkFC7rq, but do not use it in your config! This is just an example value to show what public key format you should expect after running bin/aeternity keys_gen command.

    Example

    The example below assume that:

    • The node is deployed in directory ~/aeternity/node;

    • You are aiming at joining mainnet.

    If any of the assumptions does not hold, you need to amend the instructions accordingly.

    Create the config file with the below content. Place the config file in one of the locations specified in the . Make sure you amend the sync > port parameter with your actual value.

    The node automatically creates the directory db_path, for storing the blockchain, if not present.

    The above sample config has mining > autostart set to false, so mining will not start automatically. To configure your node to mine, go to the .

    Note that YAML files have significant whitespace so make sure that you indent the file correctly and that the file ends with a newline.

    You can validate the configuration file before starting the node:

    You shall read output like the following:

    If the file is valid YAML but does not contain a valid configuration, it prints a helpful output.

    Database backend

    Aeternity nodes support several types of database persistence backends:

    • RocksDB (default for Unix, supported by Unix)

    • Mnesia (default for Win32, supported by all OS'es)

    You may choose the database backend by setting chain.db_backend to the corresponding value rocksdb, mnesia

    RocksDB is only available under Unix compatible systems (including OS X and WSL) and is used there by default. RocksDB does not work with NTFS volumes.

    Mnesia is the DB backend that is distributed with Erlang/OTP but is considered less performant than the other two. It is currently the default database when RocksDB is not available (i.e. Win32)

    Notes:

    • If using RocksDB, db_path should not point to an NTFS volume (like a mapped windows drive in WSL or volume mounts in Docker for Windows).

    • You can not switch the backend of an existing DB.

    • Upgrading a node will automatically upgrade the DB structure. Downgrades would require an empty db and a full blockchain sync.

    • Nodes can not simultaneously work with the same DB files. However it is possible to make snapshots which could be used to speed up syncing of new nodes.

    RocksDB-related settings

    Two configuration settings modify how the RocksDB backend operates, shown below with their default values:

    The chain:db_commit_bypass option allows for turning off a special optimization used to speed up and make atomic updates to rocksdb tables from a mnesia transaction commit. This optimization is active by default, and should only be turned off if it's suspected to cause problems.

    The chain:db_direct_access option makes the Aeternity node use a different API, mrdb, for all database accesses. This API is faster and should have better safety properties, but since it is new, it isn't yet the default when using the RocksdbDB backend.

    The db_migrate script

    When initializing a new node using the RocksDB backend in current or future releases, mnesia tables are created as 'column families' - a form of logical tables supported by recent versions of RocksDB. This should improve both speed and consistency, as well as drastically lower the number of open file descriptors.

    If using an existing database, the old model with one database instance per table will be kept, until the bin/aeternity db_migrate script is executed. This script, which will activate maintenance mode during its operation, will convert all tables to column families. It will take a while, but should complete within ca 2 hours.

    Troubleshooting

    If an error occurs during migration, you will need to address the error and try to complete the migration, as the system is unlikely to work correctly after a partial migration. The script should leave the node in 'maintenance mode' after a failed migration. If the node died, try starting the node using e.g. AE__SYSTEM__MAINTENANCE_MODE=true bin/aeternity console and re-run the db_migrate script. If this doesn't work, fall back to synching the node from scratch, or download a good database snapshot and restart from there.

    About this release

    This is the stable Lima release that introduces FATE VM, as well as improving state channels

    Changelog:

    • We now have FATE. The initial version of FATE is released as VM version 0x05.

    • The channel_close_mutual transaction can now be performed while the channel is not active on-chain (The channel solo closing sequence had been initiated and the channel is not yet closed), this is a consensus breaking change available after the Lima fork.

    • The state channel FSM after the Lima fork accepts a shutdown message while the channel is being closed unilaterally.

    • Introduces AEVM version 0x06, available from Lima consensus. This is a fine-tuned version of the AEVM version 0x04 introduced in the Fortuna consensus.

    • Extends transaction signing - also allow signatures of the transaction hash. The transaction serialization is potentially long, so signing the transaction hash means less cryptographic work.

    • Obsoletes the old State Channel off-chain transaction type which contained the list of updates that produced the latest state_hash. The new transaction type is available since Fortuna hard fork and the FSM is producing such transactions ever since. This detaches the off-chain protocol from the on-chain one and allows development of unique off-chain protocols that don't need their updates to be serializable on-chain.

    • For existing state channels where the latest co-authenticated state is an off-chain transaction based on the old version, it is suggested to make a new co-authenticated transaction which is using the new serialization. For currently existing state channels which latest co-authenticated state is an old version off-chain transaction is suggested to make a new co-authenticated transaction that is using the new serialization. If the other party refuses to authenticate a new round or is simply missing, one can use the solo closing sequence instead.

    • Metadata objects (of type binary) can now be added to an offchain update transfer request. These objects serve as comments and are not part of the signed transaction, nor do they affect the offchain state trees. This is an incompatible change in the serialization of offchain updates, but old offchain updates can still be deserialized. When creating a channel with a party running an older node version, add version_offchain_update=1 to the channel params.

    • Remove the rename_db migration command used to migrate Roma databases.

    • Remove the custom docker entrypoint. To run the docker image with extra arguments the default command should be used as well, e.g.:docker run aeternity/aeternity bin/aeternity console -noinput -network_id ae_uat see the corresponding docs for details. cat: docs/release-notes/next-lima/PT-168132312-new-name-hash: No such file or directory

    • No error messages in contract call objects - they will end up under consensus. Run your contract in dry-run to get the detailed error message.

    • Name preclaims are no longer allowed to use 0 as salt value

    • New name hash computation

    • New governance function determining if a name is subject to direct claim or auction

    • New governance function determining initial price of a name

    • New name auction mechanism using subsequent claim transactions with salt equal to 0

    • State Channels: Changed configuration option name ws_handlers to sc_ws_handlers which correctly implies that the limit applies to SC websocket connections.

    • State Channels: It is now possible to abort a signing request by replying with an error code.

    • State Channels: The FSMs now stay alive until a Close Mutual (shutdown) has been confirmed on-chain It is also possible to abort/reject a Close Mutual by rejecting the signing request. See https://github.com/aeternity/protocol/blob/master/node/api/channel_ws_api.md#signing-error-replies

    • State Channels: On-chain tx monitoring was broken after leave/reestablish. This has been fixed.

    • State Channels: Enhances the FSM with the optional pinned environment for execution off-chain transactions. This is to improve reaching off-chain consensus as both parties share a common view of what is considered to be a fork-safe block hash.

    • State Channels: Introduces on-disk state cache encryption

      • When a user leaves a state channel the off-chain state will be persisted on disk and protected with a password. The password is provided by the user when opening a channel using the state_password parameter.

      • When re-establishing the channel the same password MUST be provided, otherwise the operation will fail with error code invalid_password.

    • Added infrastructure for deploying contracts (with fresh tokens) during hard forks from Lima release. This will be used to finalize the token migration.

    • Added the migrated tokens in the Phase 3 of the token migration.

    • Adds one (1) percent of the total initial (ERC20) token supply to an account according to Pool D in https://hackmd.aepps.com/s/H1qF1w1j7#

    • Set Lima testnet hardfork height to 154300 (16th Oct 2019, 09:00 UTC)

    • Set Lima mainnet to 161150 (30th Oct 2019, 13:00 UTC)

    • Aligns AEVM store gas pricing with FATE.

    • ContractCallTX where the called contract uses FATE has a lower base cost (60% cheaper than a call to an AEVM contract).

    • State Channels: The support for state cache encryption (introduced in v5.0.0-rc.2) has been disabled. An improved approach is being developed which greatly improves API usability. This feature is expected to be released with v5.1.0.

    • Change top level namespace from .aet to .chain

    • Better handling of some errors w.r.t. illegal_salt_value

    • From Lima, catch crashes when processing inner transaction in GAMetaTx; the user should pay for a successful authentication despite the inner Tx crashing.

    The node is able to start from a database produced by v4.* releases, otherwise this release is not backward compatible.

    Please join the mainnet by following the instructions below, and let us know if you have any problems by . Troubleshooting of common issues is documented .

    The instructions below describe:

    • ;

    • ;

    • .

    • .

    Retrieve the software for running a node

    You can run a node by either:

    • Installing the published corresponding to your platform; or

    • Running the published ; or

    • .

    The instructions for configuring the node using the Docker image are in .

    The node user API is documented:

    • An interactive visualization of the specification is available .

    • HTTP API endpoints are specified ;

      • A copy is located in the node at path usr/lib/aeternity/lib/aehttp-5.0.0/priv/swagger.yaml.

    Install a node

    The instructions for installing a node using a release binary are in .

    For installation of a node using the Docker image, please refer to the .

    Join the mainnet

    In order to join the mainnet follow the to run the node with default configuration as mainnet is the default network.

    To join the mainnet by using the Docker image, please refer to .

    Mainnet seed nodes

    The default that the node package is preconfigured with is mainnet with id ae_mainnet.

    The release package comes preconfigured with seed nodes. Here is an example subset of the seed nodes:

    Inspect the mainnet

    Here are example nodes that can be used to inspect current top block and see information about e.g. height or target:

    • http://18.136.37.63:3013/v2/blocks/top

    • http://52.220.198.72:3013/v2/blocks/top

    • http://13.53.114.199:3013/v2/blocks/top

    • http://13.53.149.181:3013/v2/blocks/top

    Join the testnet

    In order to join the testnet change the in the node configuration file to ae_uat.

    To join the testnet by using the Docker image, please refer to the .

    Testnet seed nodes

    The release package comes preconfigured with testnet seed nodes, this is the list:

    Inspect the testnet

    The core nodes of the public test network are accessible from the Internet.

    Information, e.g. height, of the top block of the longest chain as seen by these core nodes of the testnet can be obtained by opening in the browser any of the following URLs:

    • http://52.10.46.160:3013/v2/blocks/top

    • http://13.250.162.250:3013/v2/blocks/top

    • http://13.53.161.215:3013/v2/blocks/top

    Setup your node

    Setting up your node consists of:

    • Configuring your node - see instructions in ;

    • Starting your node and verifying it works as expected - see instructions in .

    "epoch_metrics.log"

    "aeternity_metrics.log"

    A file named aeternity.{yaml,json} exists in ${AETERNITY_TOP}/

  • Initial sync might take a lot of time and that heavily depends on the available CPU/IOPS.

  • Restarting a node might be slow on certain configurations due to intensive DB consistency checks.

  • Network ID
    Beneficiary account section
    dedicated CUDA miner documentation
    AirGap wallet
    stratum operator user guide
    File name and location section
    Miner configuration section

    The password MUST be at least 6 characters long. Providing a shorter password will fail with error code invalid_password.

  • The password may be changed anytime by the user through the websocket connection after the channel has been opened. Please consult the documentation for more details. This operation is only allowed when the channel is established. If the user has left the channel, the channel must be re-established first before changing the password.

  • Until the lima fork the password will be optional. By not providing a password a default value is used:correct horse battery staple. After the Lima fork the password will become mandatory. Pre-Lima off-chain states will be encrypted with the default password.

  • Because the password used for encrypting the persisted state cache is mandatory after the Lima fork, state channels which were opened before Lima use the default password. Not providing the password in the websocket connection will result in a missing_field error.

  • Keep in mind that an adversary with direct RAM access to the node may still steal the off-chain state. This change only protects the state against an adversary with direct disk access.

  • The JSON version can be obtained from a running node using the endpoint /api.
  • WebSocket API endpoints are specified online;

  • The intended usage of the user API (HTTP and WebSocket) is documented online.

  • opening a ticket
    in the wiki
    How to retrieve the released software for running a node
    How to install a node
    How to join the mainnet
    How to join the testnet
    release binary
    Docker image aeternity/aeternity
    Building a release binary from source
    the dedicated separate document
    online
    in swagger.yaml
    the dedicated document
    documentation online
    operation instructions
    docker documentation
    network_id
    network_id
    docker documentation
    the dedicated separate document
    the dedicated separate document
    AE__MEMPOOL='{"tx_ttl":17,"sync_interval":4777}'
    AE__MEMPOOL__SYNC_INTERVAL=9999
    nc -zv $(curl -s https://api.ipify.org) 3015
    Connection to 203.0.113.27 3015 port [tcp/*] succeeded!
    fork_management:
        network_id: ae_uat
    chain:
        persist: true
        hard_forks:
            "genesis":
                "height": 0
                "accounts_file": hf_dir/genesis/accounts.json
                "contracts_file": hf_dir/genesis/contracts.json
            "first":
                "height": 1800
                "accounts_file": hf_dir/first/accounts.json
            "second":
                "height": 1100
    peers: []
    mining:
        beneficiary: "beneficiary_pubkey_to_be_replaced"
        autostart: true
    mining:
        beneficiary: "beneficiary_pubkey_to_be_replaced"
        cuckoo:
            edge_bits: 29
            miners:
                - executable: mean29-avx2
                  extra_args: -t 14
    mining:
        beneficiary: "beneficiary_pubkey_to_be_replaced"
        cuckoo:
            edge_bits: 29
            miners:
                - executable: mean29-generic
                  extra_args: -t 2
                - executable_group: aecuckooprebuilt
                  executable: cuda29
                  extra_args: -t 1
                  hex_encoded_header: true
    cd ~/aeternity/node
    bin/aeternity keys_gen my_secret_password ## This way of generating a key-pair is only for testing purpose, use a proper wallet/mechanism for your mainnet tokens: e.g., [AirGap wallet](https://airgap.it/).
    Generated keypair with encoded pubkey: ak_2D9REvQsrAgnJgmdwPq585D8YksJC8PSAA8MscQdxinbkFC7rq
    
    ---
    sync:
        port: 3015
    
    keys:
        dir: keys
        peer_password: "secret"
    
    http:
        external:
            port: 3013
        internal:
            port: 3113
    
    websocket:
        channel:
            port: 3014
    
    mining:
        autostart: false
    
    chain:
        persist: true
        db_path: ./my_db
    
    fork_management:
        network_id: ae_mainnet
    
    cd ~/aeternity/node
    bin/aeternity check_config aeternity.yaml
    OK
    chain:
        db_commit_bypass: true
        db_direct_access: false
    aenode://pp_2L8A5vSjnkLtfFNpJNgP9HbmGLD7ZAGFxoof47N8L4yyLAyyMi@18.136.37.63:3015
    aenode://pp_2gPZjuPnJnTVEbrB9Qgv7f4MdhM4Jh6PD22mB2iBA1g7FRvHTk@52.220.198.72:3015
    aenode://[email protected]:3015
    aenode://pp_2mwr9ikcyUDUWTeTQqdu8WJeQs845nYPPqjafjcGcRWUx4p85P@3.17.30.101:3015
    aenode://pp_2CAJwwmM2ZVBHYFB6na1M17roQNuRi98k6WPFcoBMfUXvsezVU@13.58.177.66:3015
    aenode://pp_7N7dkCbg39MYzQv3vCrmjVNfy6QkoVmJe3VtiZ3HRncvTWAAX@13.53.114.199:3015
    aenode://pp_22FndjTkMMXZ5gunCTUyeMPbgoL53smqpM4m1Jz5fVuJmPXm24@13.53.149.181:3015
    aenode://pp_Xgsqi4hYAjXn9BmrU4DXWT7jURy2GoBPmrHfiCoDVd3UPQYcU@13.53.164.121:3015
    aenode://[email protected]:3015
    aenode://pp_QU9CvhAQH56a2kA15tCnWPRJ2srMJW8ZmfbbFTAy7eG4o16Bf@52.10.46.160:3015
    aenode://pp_27xmgQ4N1E3QwHyoutLtZsHW5DSW4zneQJ3CxT5JbUejxtFuAu@13.250.162.250:3015
    aenode://pp_DMLqy7Zuhoxe2FzpydyQTgwCJ52wouzxtHWsPGo51XDcxc5c8@13.53.161.215:3015

    Hacking the Aeternity Codebase

    Building

    See for details.

    • Dependencies

    Ubuntu: sudo apt install autoconf build-essential cmake erlang libsodium-dev libgmp-dev
  • Mac OS: brew install erlang@24 openssl libsodium autoconf gmp cmake automake

  • The Aeternity build system uses Rebar3 to do the heavy work, and wraps this in a Makefile for ease of use. To hack on Aeternity you need some basic knowledge about Rebar3. See Quick Guide to Rebar for a comprehensive introduction.

    Configuration files

    • You can use either .json or .yaml to specify the user-level configuration. By default, the system looks for~/.aeternity/aeternity/aeternity.{json,yaml} oraeternity.{json,yaml} in the top directory. You can also set environment variables on the form AE__..., e.g.AE__HTTP__CORS__MAX_AGE. See [docs/configuration.md] for details.

    • The system first reads the usual Erlang system configuration files (specific per release, in _build/prod/rel/aeternity/releases/*/). These are generated from the corresponding source files under config/:

      • vm.args for Erlang VM options.

      • sys.config for overriding the Erlang application defaults (the .app files).

    Running

    See Operation for details.

    Starting the system with an Erlang terminal prompt

    Opening an Erlang shell for running a unit or integration test

    Rebar lets you open an Erlang shell with one or more profiles applied, such as test. This sets up paths to test apps, etc., which will not be available in the default profile. By default all apps listed in the release spec will be started; to avoid this, specify --apps "":

    or for system testing

    The system can then be started manually from the Erlang shell like this:

    after which you can do your testing. To clean up the temporary directory that was created, do:

    Aeternity Code structure

    • Main applications (in reverse start order), most under the main repo (github.com/aeternity/aeternity.git) under the apps directory; the rest will be found under _build/default/lib:

      • aedevmode

        • (Something about keypairs for testing. Runs aedevmode_emitter.)

      • aesync

        • The aesync app just launches aec_connection_sup, which exists under the aecore application. It is a "supervisor for servers dealing with inter node communication"

      • aestratum

        • An implementation of server side part of the Stratum protocol. The purpose of the protocol is to formalize the coordination of information exchange between pool server and pool clients. See [docs/stratum.md]

      • aemon

        • Network monitoring (disabled by default). Uses statsd backend provided by aec_metrics.erl. See [docs/monitoring.md]

      • aehttp

        • The HTTP API. This app doesn't have any actual child processes of its own. It just starts Cowboy endpoints.

        • The Cowboy setup is done in aehttp_app which callsaehttp_api_router to get the endpoint data.

      • aechannel

        • State channels (aesc_...). The aesc_fsm.erl state machine is described by the PlantUML file [docs/state-channels/fsm.puml].

      • aeapi

        • A single facade module for the internal API functions. Does not launch any child processes, or even any supervisor.

      • aecore

        • The Core Aeternity Application supervisor tree. Runs theaec_worker_sup, aec_consensus_sup, and aec_conductor_sup. (It used to run the aec_connection_sup as well, before that was moved to the aesync app.)

      • aecli

        • The CLI, based on ecli. The supervisor is started with no children.

      • aefate

        • The FATE virtual machine. A library application, does not start any processes.

      • ecrecover (github.com/aeternity/ecrecover.git)

        • Library for verifying Ethereum signatures.

      • aega

        • Library for Generalized Accounts

      • aeprimop

        • Library for primitive operations to modify chain state objects.

      • aeoracle

        • Library for Oracles.

      • aens

        • Naming System library.

      • aecontract

        • Library for Contracts

      • aevm

        • Aethereum VM clone in Erlang.

      • aebytecode (github.com/aeternity/aebytecode.git)

        • Library and standalone assembler for Aeternity bytecode, supporting both AEVM bytecode and FATE bytecode.

      • aeserialization (github.com/aeternity/aeserialization.git)

        • Serialization helpers for Aeternity node.

      • aetx

        • Library for Transactions ADT

      • aeutils

        • Library with various utility functions. Starts a supervisor with no children.

      • aeminer (github.com/aeternity/aeminer.git)

        • Erlang library to work with CPU and CUDA cuckoo miners.

      • aecuckoo (github.com/aeternity/aecuckoo.git)

        • Cuckoo CPU miner binaries.

    Aeternity Data management

    • All persistent state is kept in a Mnesia database, using RocksDB as the storage level backend. The mnesia_rocksdb app provides the Mnesia-to-RocksDB integration, and the erlang-rocksdb app provides the Erlang-to-C++ RocksDB bindings. On platforms where RocksDB is not supported, like on Windows NTFS volumes, a standard Mnesia database is used.

      • The database is started from two $setup_hooks entries in aecore.app.src. The first calls aec_db:check_db(), which actually launches Mnesia (which is not started by the boot script) and ensures that the schema and tables exist, creating them if needed. The second hook calls aec_db:start_db(), which ensures the tables are loaded and ready. (Read about setup hooks in below.)

      • The aec_db:tables/1 function defines the database tables (the schema). The record definitions that specify the fields of the tables are found in aec_db.hrl.

      • Apps should generally not call mnesia functions directly, but always go via the wrapper functions in aec_db or a higher level module like aec_trees.

    Important tables

    • Tables are accessed via aec_db API functions. Normally the direct table operation wrappers like aec_db:read/2 are not used by application code. Instead, more abstract functions like aec_db:get_header() or aec_db:write_block() hide how the data is stored in the actual tables. A table name may correspond to a module name, like aec_blocks, with functions for manipulating the type of data in the table (but not for accessing the DB). Some things like blocks and headers are not manipulated directly, and are managed by higher level abstraction modules, such as aec_chain_state which refers to the blocks as "nodes".

      • aec_headers - stores the headers for each block; for a key block, the headers contain all the information - only microblocks have a payload

      • aec_blocks - stores the list of transactions that form the payload for each microblock

      • aec_signed_tx - stores the actual transactions referred to by the blocks

      • aec_block_state - stores additional information about blocks, such as difficulty, fees, forks, fraud, and the root hashes of the "state trees"

      • aec_chain_state - stores a mapping from key block height (and hash) to the headers, for cheap lookup, but also stores some additional information such as the genesis hash, the top block, garbage collection info, etc.

      • aec_tx_location - maps transaction hashes to the blocks where they occur

      • aec_tx_pool - tracks which transactions are in the memory pool

      • aec_peers - peer nodes persisted in the DB

      • State Tree tables (see aec_db:tree_table_name/1) and their corresponding "tree names". These are simple key/value tables, providing storage for the Merkle trees (see below). The module aec_trees defines a record structure that bundles the "handles" for these tables as a single object, making it easy to commit changes to all state tree tables via a single function call. The aec_block_state table stores the hashes that point from a block to its state trees.

        • accounts -> aec_account_state

    Merkle Patricia Trees

    • A Merkle tree is a tree where each leaf node is labelled with the hash of a data block, and every inner (non leaf) node is labelled with the hash of the hashes of its child nodes. This lets you verify the integrity of any subtree without needing to look at the rest of the tree.

    • A Patricia tree - or rather, "radix tree" - is a kind of prefix tree (or "trie") : the tree does not have to store the keys explicitly, and each entry is stored under the shortest key prefix path. E.g. if an entry has a key which in binary is 1011..., it is stored under the path right-left-right-right-... (with additional optimizations for keeping the tree as small as possible). Prefix trees are specialized for bitstring-like keys - in Aeternity the keys are hashes.

    • The aeu_mtrees implementation in Aeternity is used for the "state trees". They are parameterized so they can store the actual nodes either in a database table or in an in-memory data structure like a map or gb-tree. See aec_trees:new() to see how this is done. The module aeu_mp_trees_db is an abstract backend to be instantiated with a specific database and cache implementation. The module aec_db_backends defines which concrete backend and table is used for each of the tree tables above, creating backend instances which then get used by the aeu_mtrees.

    • An important feature of mtrees and its backends is that store operations do not perform any side effects right away - they just insert the changes in a write cache. Once ready, the cached changes can all get committed to the database via a single call; see aec_trees:commit_to_db().

    • The function aec_chain:get_block_state() reads the block state table entry to get the root hashes for the state trees of the block, then instantiates an aec_trees record with the corresponding root hash and correct backend for each state tree, via aec_trees:deserialize_from_db().

    How the system starts

    • There is no single function call to start the Aeternity system. There is a start script (_build/prod/rel/aeternity/bin/aeternity) which is generated by Rebar3 when you run e.g. make prod-build or make prod-package. The package would typically be installed under~/aeternity/node and it is assumed that you start the system from the install directory (or directly from the build directory). You typically run it as bin/aeternity daemon or bin/aeternity console.

      • The start script is a modified version of the "extended start script" that Rebar3 would normally generate from its standard template. The source file for the Aeternity version is located inscripts/aeternity_bin. This file should be kept up to date with changes in the upstream Rebar3 version (which is part of relx).

    • The start script starts Erlang with a custom boot file generated by Rebar3, named start.boot or aeternity.boot (in_build/prod/rel/aeternity/releases/*/). It is specific for each release and specifies exactly what processes and applications should be started when the Erlang system boots. (The .boot file is in a binary format that the system can read at boot time without needing to load any other modules such as for parsing text. To see what the boot file does, look at the corresponding source file start.script (or aeternity.script) instead.)

      • That the system starts from a boot file means that applications not listed in the boot script will not be available in the code path when the system is running, even if they are normally in the standard Erlang/OTP distribution; e.g.,

    • The .boot and .script files are generated automatically by the release-building tools of Rebar3, using the relx specification section of the rebar.config file. This is where you list all the Erlang applications that should be included in the release and started when the Aeternity system boots. (They will be "started" regardless of whether they actually start any processes. This loads the app configuration.) The start order in the .boot file is made to obey the application dependencies found in the individual *.app files (usually generated from *.app.src files) that provide the per-application metadata: for example, the apps/aehttp/src/aehttp.app.src file specifies thataecore must be started before

    • The (nonstandard) setup application, which is assumed to start very early in the boot sequence, provides extra startup configuration magic:

      • It scans all application configurations for entries with the key'$setup_hooks', specifying callback functions to be executed bysetup. (See e.g. aeutils.app.src.)

    • The (nonstandard) app_ctrl application provides additional control over the start order in the system. Normally, the applications are started in the order listed in the relx specification of rebar.config, modified to obey the dependencies listed in the individual .app.src files. This means that applications can specify that they must be started after other applications that they know about and depend on, but applicationx cannot specify that it needs to start before another applicationy which is unaware of x and whose dependencies (in its .app file) cannot be modified.

    • Logging is done via the Lager app. A handler aeu_lager_logger_handler for the standard OTP logger is also set up in the sys.config, which forwards standard log messages to Lager.

      • The aeutils.app.src file configures a hook for the setup app, making it call aeu_logging_env:adjust_log_levels() when setup starts. (Note that aeutils configuration must thus be loaded before

    Build
    git clone https://github.com/aeternity/aeternity.git
    cd aeternity
    make prod-build
    cd _build/prod/rel/aeternity`
    bin/aeternity console
    rebar3 as test shell --apps ""
    rebar3 as system_test shell --apps ""
        application:load(aecore),
        TempDir = aec_test_utils:create_temp_key_dir(),
        application:set_env(aecore, keys_dir, TempDir),
        application:set_env(aecore, password, <<"secret">>),
        application:ensure_all_started(aecore).
     aec_test_utils:remove_temp_key_dir(TempDir).

    The endpoints are specified in apps/aehttp/priv/oas3.yaml which is used to generate callback modules oas_endpoints, endpoints (the old Swagger version), and rosetta_endpoints.

  • aehttp_api_router calls these to get the data, and then filters it depending on what should be enabled. Note that the importantenabled_endpoint_groups setting is computed inaehttp_app:check_env(), which runs from a setup hook defined in aecore.app.src.

  • All endpoints enter via aehttp_api_handler:handle_request_json() which dispatches to one of the modules aehttp_dispatch_ext,aehttp_dispatch_int, or aehttp_dispatch_rosetta. These may reject a request if the system is overloaded, or put it in a run queue for later (see aec_jobs_queues). aehttp_api_handler also does the conversion between JSON-as-text and JSON-as-Erlang-terms for request inputs and outputs, using the jsx library.

    • For example, the request GetCurrentKeyBlockHeight is actually handled in the module aehttp_dispatch_ext, like this:

  • aec_worker_sup

    • Runs aec_metrics, aec_keys, and aec_tx_pool

  • aec_consensus_sup

    • Initially empty

  • aec_conductor_sup

    • Runs aec_conductor and aec_block_generator

      • The (micro)block generator server subscribes to new transactions and packs them into microblocks.

      • The conductor is the hub for adding blocks to the local chain. It orchestrates the mining and publishing of key blocks and signing of microblocks, and handles incoming events about synced blocks etc.

      • Important modules:

        • aec_chain - API for reading chain information, e.g. reading a block or header, finding the genesis block or the top block, etc.

        • aec_chain_state - ADT for modifying the chain state. See the comments in this module for more details about the chain and nodes and forks etc.

  • calls -> aec_call_state

  • channels -> aec_channel_state

  • contracts -> aec_contract_state

  • ns -> aec_name_service_state

  • oracles -> aec_oracle_state

  • debugger
    ,
    wx
    , or
    parsetools
    . If wanted, such extras must be added manually, or run from a separate Erlang instance.
  • Multiple releases can be installed alongside each other, and the code paths in the boot script typically name the versions of the applications (in the lib directory under the installation root), so e.g. release 1.1 could be using the version "lib/xyz-2.0.3" of application xyz, while release 1.2 uses the version"lib/xyz-2.1.1". The start script (bin/aeternity) picks the release version to use.

  • aehttp
    can start. Hence, when the Erlang system boots, it will launch all specified applications in a suitable order, and when all are running, the system is up. There is no specific single entry point to the system.
    • The boot script also includes the app configuration from the {env, ...} sections of the .app (or .app.src) files at build time, and sets these configurations as the system boots. Modifying the .app files in the installed system has no effect. Use the sys.config or command line options to override the build-time configuration.

    • Furthermore, Rebar3 doesn't rebuild dependency apps (under_build/default/lib) if they get modified, so updating e.g._build/default/lib/lager/src/lager.app.src will have no effect onlager.app (and hence not on the produced release build) - you must delete the existing _build/default/lib/lager/ebin/lager.app file to force Rebar3 to rebuild it.

    Because the boot script loads all application configurations and modules before it starts the first application, the full list of applications and their configuration is known when setup is started.
  • The Aeternity system uses these callbacks to read theaeternity.{yaml,json} (aeu_env:read_config()) file, inject overrides from OS environment variables AE__... (aeu_env:apply_os_env()), and load plugins (aeu_plugins:load_plugins()) before the rest of the system starts, as well as perform sanity checks on configurations (aecore_env:check_env(), etc.), and most importantly, start the database (aec_db:start_db()).

  • It has "smart" get_env() functions which can perform advanced variable expansion on the configuration values. E.g., if an applicationx has a configuration entry {log_dir, "$HOME/log"}, then callingsetup:get_env(x, log_dir) will return something like "/home/username/log". This only works on variables defined by setup itself, not operating system environment variables. Note in particular that $HOME does not mean the current user's home directory - it refers to the setup configuration key {home, Dir} meaning the root directory of the Aeternity system; if not set, the current directory is used.

  • Setup has a configuration option data_dir which the Aeternity system uses to know where its database is located. The directory needs to already exist and be populated at system start, else the startup fails.

  • The app_ctrl app hooks into the kernel application, which is always the first to start, by configuring app_ctrl_bootstrap to run as (dummy) handler of the logger functionality in the kernel. This is done in the sys.config. When the kernel app starts, this launches theapp_ctrl_server process (but not the app_ctrl application itself).

  • The app_ctrl_server looks for configuration both in the normalapp_ctrl app environment, and by scanning other applications for entries with the key '$app_ctrl' (using functionality from setup; see above). In Aeternity, this can be found in the aecore.app.src file.

  • The app_ctrl configuration can specify per application that the app needs to be started before certain other apps. It can also define "roles", which are sets of apps, and "modes", which are sets of roles. Applications that are not explicitly mentioned in the configuration are left to the standard application controller.

  • If you try to make an application in Aeternity depend on (start after) one of those applications that are managed by app_ctrl, such asaehttp, then you will get a crash during startup with error messages containing {orphans,[...]} and apps_not_found: [...]. To fix this you must also add your app to the same "roles" in the '$app_ctrl' section of aecore.app.src.

  • When the real app_ctrl application is finally started, it just sets up a supervisor and a worker process which acts as a proxy that links itself to the already running app_ctrl_server process, so that the application crashes if the server process crashes.

  • setup
    runs, which it will be when running from a boot script.) This will also call
    aeu_logging_env:expand_lager_log_root()
    to ensure that
    lager
    has its
    log_root
    configuration set, using
    setup:log_dir()
    as the default. Furthermore it rewrites the log root setting to be an absolute path, to ensure that the logging is not affected by changes to the current working directory of the Erlang VM during execution.
  • As soon as lager starts, it will create the log directory and all log files using its current configuration.

  • Since setup and lager don't know about each other's existence, their .app files do not specify any dependency between them. Their relative order in the relx specification thus decides their actual order in the boot script.

  • The lager configuration in sys.config sets up both a handler that writes to the console, and a handler that writes to theaeternity.log logfile. It also configures additional logging sinks, for which corresponding modules are generated dynamically, so that the sink whose name is epoch_mining_lager_event can be used by calling epoch_mining:info(...), and so on. Hence you will not find a source module named epoch_mining.erl in the codebase. Most of these extra sinks will not log to the console, only to log files.

  • How the system starts
    aec_db - Stores nodes and all other persistent data; see Aeternity Data management below
  • aec_sync - Synchronizes with other peers

  • aec_tx_poool - Pool of unconfirmed transactions

  • aec_consensus - Defines the consensus callback behaviour and provides utility functions such as get_genesis_hash().

  • handle_request_('GetCurrentKeyBlockHeight', Req, Context) ->
        TopBlock = aec_chain:top_block(),
        Height = aec_blocks:height(TopBlock),
        {200, [], #{height => Height}};

    hyperchains

    Introduction

    This document describes the Aeternity Hyperchain architecture and provides configuration guidance for deploying a Hyperchain node. It includes configuration parameters, setup requirements, and step-by-step deployment instructions.

    Hyperchains represent an evolution in blockchain architecture that combines Proof-of-Work (PoW) security with Proof-of-Stake (PoS) efficiency. Through a child chain that periodically synchronizes with a parent PoW chain, Hyperchains enable scalable blockchain networks while maintaining strong security guarantees. This hybrid approach significantly reduces energy consumption compared to traditional PoW systems.

    The 0.9 beta release provides developers who are already running Aeternity nodes with the foundation to test and validate Hyperchain functionality. This release focuses on establishing the parent-child chain relationship, implementing chain synchronization, and managing validator operations. This documentation will guide you through the essential configuration parameters and setup requirements needed to participate in the beta testing phase.

    Before You Begin

    This guide assumes you have:

    • A running Aeternity node (v6.7.0 or later)

    • Experience managing blockchain nodes

    • Access to sufficient funds for pinning operations

    • Understanding of node validator operations

    Important:

    • Back up your existing node configuration before making any changes

    • Store all private keys securely

    • Verify all prerequisites before proceeding

    Prerequisites Checklist

    Required Infrastructure

    • Running Aeternity node (v6.7.0 or later)

    • Minimum 4GB RAM dedicated to Hyperchain operations

    • 100GB available storage space

    • Stable internet connection with minimum 10Mbps upload/download

    Required Technical Knowledge

    • Experience running and maintaining Aeternity nodes

    • Basic understanding of blockchain concepts

    • Familiarity with command-line operations

    • Understanding of YAML configuration files

    Required Accounts and Keys

    • Access to parent chain (Aeternity) wallet with sufficient funds for pinning

    • Private key for hyperchain staking operations

    • Private key for parent chain pinning operations

    Setup Process Overview

    Time Investment

    • Initial setup: 2-3 hours

    • Configuration testing: 1-2 hours

    • Initial sync time: 2-4 hours (depends on network conditions)

    Resource Requirements

    • Parent chain wallet must maintain minimum balance of X AE for pinning operations

    • Continuous monitoring during first 24 hours of operation

    • Regular maintenance windows for updates and optimizations

    Implementation Steps

    1. Configure parent chain connection

    2. Set up and configure Hyperchain node

    3. Complete validation period (24-48 hours)

    4. Begin network participation

    Configuring Your Own Hyperchain Node

    Setting up a Hyperchain requires careful configuration and several specific steps. To simplify this process, Aeternity provides the hyperchain-starter-kit tool, which automates many of the complex configuration tasks. See (from Aeternity GitHub org)

    Please note that this tool is currently in development. While functional, you may encounter some warnings or minor issues as we continue to improve its stability and user experience

    Requirements:

    • A running Aeternity node installation (following the installation instructions)

    • version control system installed to download the starter kit code

    • installed to run the hyperchain-starter-kit

    • installed for JSON formatting

    Note: These instructions use Unix/Linux/MacOS shell commands. Windows users will need to adjust paths and commands accordingly.

    1. Install the Hyperchains Starter Kit

    2. Tool configuration

    Our Hyperchain (configuration) will be named hc_test for this example. A directory with the same name will be created in the root directory of the tool where generated files will end up.

    This command creates an init.yaml file in the root of your hc_test directory. It contains parameters and settings for your hyperchain. It looks like:

    This is the default setup that uses Aeternity testnet as parent chain and appropriate block time and epoch length for it. The configuration can be changed as needs following the rules in the .

    3. Set Up Contracts

    To prepare the Hyperchain contracts run the following:

    This will download the standard contracts from the latest Aeternity release and compile them in contracts sub-directory.

    4. Generate the Economy

    To generate your Hyperchain "economy" according to init.yaml run the following:

    This command will generate random keypairs for all accounts that are needed:

    • Faucet: can be used to fund other accounts in an automated way

    • Treasury: the same purpose as Faucet but manual funding

    • Validators: pre-funded (Stakers) accounts used to initialized the Hyperchain

    • Pinners: a list of accounts used for pinning

    Please note that you have to somehow fund all pinners accounts on the parent chain prior starting your node/validator.

    You can inspect the outcome of this in the hc_test/economy-unencrypted.yaml file:

    Example output:

    5. Generate Configuration Files

    To generate all the configuration files needed to run a Hyperchain, run:

    This will create 3 files in nodeConfig directory:

    • aeternity.yaml

    • hc_test_accounts.json

    • hc_test_contracts.json

    Don't forget to fund all pinners accounts on the parent chain prior starting your node/validator.

    IMPORTANT: If you used a known public chain (testnet or mainnet) as parent chain, the tool will set the start_height as current block + 10, that is 30 minutes in future. Keep that in mind when verifying your chain, either decrease the number or wait until that block is produced on the parent chain before you start transacting on the Hyperchain.

    6. Run a Node

    Docker

    To allow inter-container connections between nodes, i.e. adding more nodes to the setup later, a Docker network should be created first:

    A container name initiator is also used to allow docker network access to the container later.

    Use to install the configuration files and run the node at once:

    Verify your node is running with:

    Expected output:

    For more details refer to dedicated .

    Tarball Installation

    Copy all of the above files to their node corresponding directory, i.e. assuming it's in ~/aeternity/node:

    then run your node:

    Verify your node is running with:

    Expected output:

    If the output is Node is not running! check node logs for errors to debug it further.

    7. Begin Operations

    After your Hyperchain node is running and producing blocks, you can begin interacting with the chain. The recommended next steps are:

    1. Connect supporting tools to your chain:

      • Block explorer (e.g., Aescan)

      • Wallet interface (e.g., Superhero Wallet or Base app)

    2. Import your test accounts:

    You can now begin testing transactions and interactions with your Hyperchain deployment.

    Happy Hyperchaining :)

    Configuring New Validator

    NOTICE: This documentation covers beta functionality intended for testing purposes only.

    After establishing a Hyperchain, you can add additional validators or join an existing Hyperchain as a validator. This guide demonstrates how to configure a new validator on a Hyperchain using the Aeternity blockchain as the parent chain.

    Important Notes:

    • The process requires approximately 2 hours before the new validator begins producing blocks

    • A minimum stake of 1000000AE is required

    • Both a staker account (for the child chain) and a pinner account (for the parent chain) are needed

    Install Aeternity CLI

    The Aeternity Command Line Interface (CLI) is required to manage wallets and interact with smart contracts. Install it using npm:

    Account Setup

    Two accounts are required for validator operation:

    1. Staker Account: Holds funds for staking in the Hyperchain consensus (child chain)

    2. Pinner Account: Executes pinning transactions on the parent chain

    Create a Staker Account

    First we need to create a staker account, that's the account that will hold the funds used to stake in the Hyperchain PoS consensus.

    Expected output:

    Once the account is created, the private key should be extracted as it's needed in the node configuration afterwards:

    Expected output:

    Note the public and private keys of the account, it will be used below in CLI commands and node configuration.

    Create a Pinner Account

    Important: The pinner account must be funded on the parent chain before starting your validator node. For testnet deployment, use the .

    If the validator pinning is enabled, a parent chain account will be needed as well to execute it:

    Expected output:

    Once the account is created, the private key should be extracted as it's needed in the node configuration afterwards:

    Expected output:

    Note the public and private keys of the account, it will be used below in CLI commands and node configuration.

    Configure the Validator Node

    The new validator node needs at least one peer to connect to an existing Hyperchain network. As this example assuming an already running local node, the peer key can be obtained from its status API endpoint:

    Expected output:

    This example assumes your initiator runs in a docker container from the example above and its address would be initiator (the container name). If the initiator node runs outside docker container, the address will be localhost.

    So, the peer URL is: aenode://pp_2ZX5Pae6a9L5UFm8VcCNsB39pn3EK7ZQZpp3dfF1WDNFXZ9p3b@initiator:3015 That will be configured under the peers configuration key below.

    The accounts.json and contracts.json will be reused from the previous example, but one can duplicate them as well in new directory as needed.

    Copy the node configuration from the previous example:

    The validator2.yaml configuration must be changed to remove the initial stakers and pinners and replace it with the new accounts created above and add peers, everything else should stay intact:

    Note that account addresses, account keys and peer keys will be different on different runs, make sure to copy the correct ones!

    Start the Node

    This example assumes you have a Hyperchain validator node (initiator) already running on localhost in a Docker container within a network named hyperchain. Since the node's API ports are exposed to the host, we need to use alternative ports to prevent conflicts. In this example, we will remap port 3013 to 33013 while keeping the default port in the node configuration.

    Verify the new validator node is running with:

    Expected output:

    Make sure that:

    • genesis_key_block_hash is the same as the status output of the initiator node

    • network_id is the same as the status output of the initiator node

    • peer_count is more than 0

    The above should confirm the new validator is up, running and connected to the initiator Hyperchain network!

    Register New Validator

    Once the new node is running it's time to register it as validator with the Hyperchain consensus.

    CLI Node Config

    First the CLI have to be configured to work with the locally running Hyperchain network created in this example:

    Verify the configuration by running:

    Expected output:

    Funding

    The staker account must be funded with at least the minimum staking amount (1000000AE in this example) and some extra for transacting. In this example the treasury account can be used by loading it in a wallet

    With the help of the CLI the treasury secret key is imported then used to send tokens to the new staker account. The treasury private key can be found in hc_test/economy-unencrypted.yaml.

    Output:

    Verify the treasury balance:

    Output:

    Fund the staker account from the treasury wallet:

    Output:

    Validator Registration

    The registration happens with a contract call to the staking_contract address, in this example: ct_KJgjAXMtRF68AbT5A2aC9fTk8PA4WFv26cFSY27fXs6FtYQHK.

    For a reference (not shell command), the Sophia function signature that needs to be called is:

    The same address (ak_2hT1UTevtPkEpocjEcbbBi14gS1Ba1unHQBrtXupHnKHxk26kU) will be used for owner and sign_key, restake will be set to false.

    Output:

    Now the new validator is registered as part of the consensus! The return value ct_miCfZgeT2fEE9E7XpFikAUReP62QJtZizypJGvw38SYuXJNHN is the validator contact address.

    Please note that the new validator will start producing blocks after 4 epochs (2400 blocks), that's after 2 hours in this example!

    Configuration Explained

    An Aeternity Hyperchain node is built on a standard Aeternity release with specific consensus configuration. After completing the installation and basic configuration, you'll need to add the following Hyperchain-specific configurations to your aeternity.yaml or .json file. Please follow the and do . Then adopt and add the additional configuration below to your aternity.yaml or (.json).

    Parent chain

    To configure your parent chain connection, you'll need to specify several key parameters. Start by setting the chain connector to AE2AE and network ID to ae_uat. Next, configure your parent chain node address using the parent node's HTTP API port, not the external port. When setting the fetch interval, ensure it's frequent enough to capture all state changes on the parent chain. Finally, specify a future block height on the parent chain as your starting point. This height determines when your child chain will begin its operations, including block production and pinning. This configuration creates a deliberate delay, allowing for proper initialization and synchronization:

    Block times and epochs

    The initial "speed" of the Hyperchain is defined by the epoch and block production parameters. These will be different for each Hyperchain, depending on the desired transactional characteristics of the chain. The values below are useful for testing purposes, and when running on Aeternity testnet. Please see the for more information in how to optimize block and epoch parameters per application and parent chain characteristics.

    First a parent chain epoch length should be picked. That should be long enough to statistically easy any block time fluctuations. In this example with Aeternity testnet as parent chain, 10 blocks should be enough.

    This version of Hyperchains supports block times as low as 3 seconds for various reasons (i.e. network latency, disk latency, etc.) That can be set as (in milliseconds):

    And lastly, but very important is the child epoch length. It is mandatory to have equal parent and child epoch length in wall clock times:

    In this example the Aeternity testnet is having 180s block times, so:

    Stakers

    We define three stakers, that need to have accounts and funds to stake on the Hyperchain. Once a staker becomes leader, their private key is used to sign produced blocks by the node.

    Accounts

    When starting a Hyperchain it needs some pre-funded accounts as most other chains and types. At least the staker's accounts must be funded so that they can be registered with some initial stake to boot the consensus. In this example there are 3 stakers pre-funded with 3100000000000000000000000000 each so they can be registered at genesis time. Also some additional accounts like Faucet (ak_WNkJkmaEoyScVRaeZeDvvmCqLn1HkfNnQDy1oSJp6Jm5YPpAq) and Treasury (ak_CLTKb9tdvXGwpgUBW8GytW7kXv9r1eJyY4YtgKKWtKcY3poQf) are also funded for easing the chain usage.

    Contracts

    Hyperchains operate through FATE contracts which must be compiled and provided to the node. These contracts require initialization during the first (genesis) block of the Hyperchain, which involves specific contract calls. While this configuration can be manually set in contracts.json, the process is technically complex. We recommend using our purpose-built CLI tools to handle contract deployment and initialization.

    In this example two contracts are deployed: MainStaking.aes and HCElection.aes then there are three contract calls to register the stakers/validators, 3 in this example.

    Please refer to the above how to generate the files.

    Once the contracts are generated they have to be also added in the node consensus configuration. Current configuration expect 3 separate contracts:

    However, the current implementation is using the staking contract instance for rewards distribution, thus the addresses are the same.

    Finally the contract owner should be set the same as the owner of the contract deployment in the contracts.json:

    This ensures that the protocol methods can be called only by the protocol and not other accounts. In this example the so called "zero" address is used for that.

    Pinning

    Currently only a single pinning behavior is supported. Validators will automatically pin the Hyperchain state to the parent chain when they are leaders of the last block of the epoch using their mapped parent account credentials. It can be enabled by:

    That feature also needs pinning accounts configuration, it's map of staker to pinning account, for example:

    To encourage validators to pin epoch states to the parent chain, the system provides rewards in the Hyperchain's native currency. The reward amount for each successful pinning operation can be configured to align with your Hyperchain's economic model. This value represents the compensation validators receive for performing verifiable pinning operations for each epoch.

    Complete configuration example



    Addendum 1: Hyperchain-specific confguration reference

    chain.consensus: object

    The consensus algorithms used for validating blocks. Ignored if 'fork_management > network_id' has value 'ae_mainnet' or 'ae_uat'.

    Properties (Pattern)

    Name
    Type
    Description
    Required

    chain.consensus.<height>: object

    Configuration parameters for the selected consensus algorithm (Hyperchain).

    Properties

    Name
    Type
    Description
    Required

    Example

    chain.consensus.<height>.config: object

    Configuration for the given consensus algorithm

    Properties

    Name
    Type
    Description
    Required

    Example

    chain.consensus.<height>.config.parent_chain: object

    Details of how this node will connect to a parent chain if this is a hyperchain.

    Properties

    Name
    Type
    Description
    Required

    Additional Properties: not allowedExample

    chain.consensus.<height>.config.parent_chain.consensus: object

    Details of the parent chain.

    Properties

    Name
    Type
    Description
    Required

    Additional Properties: not allowedExample

    chain.consensus.<height>.config.parent_chain.polling: object

    Parent chain connection configuration

    Properties

    Name
    Type
    Description
    Required

    Additional Properties: not allowedExample

    chain.consensus.<height>.config.parent_chain.polling.nodes[]: array

    List of parent chain nodes to poll for new blocks

    Items

    URL address of the API - ://:@:

    Item Type: string

    chain.consensus.<height>.config.stakers[]: array

    List of hyperchain accounts

    Items

    Hyperchain account pair

    Item Properties

    Name
    Type
    Description
    Required

    Item Additional Properties: not allowedExample

    chain.consensus.<height>.config.stakers[].hyper_chain_account: object

    Hyper chain validator/staking account(s)

    Properties

    Name
    Type
    Description
    Required

    Additional Properties: not allowedExample

    chain.consensus.<height>.config.pinners[]: array

    List of parent chain accounts. Relevant only to Aeternity parent chains. For BTC and Doge, each node relies on a local wallet setup with accounts and funds.

    Items

    Hyperchain parent accounts.

    Item Properties

    Name
    Type
    Description
    Required

    Item Additional Properties: not allowedExample

    chain.consensus.<height>.config.pinners[].parent_chain_account: object

    Parent chain account for executing pinning (spend) transactions

    Properties

    Name
    Type
    Description
    Required

    Additional Properties: not allowedExample


    Addendum 2: Hyperchain-specific FATE/Contract behavior

    A HyperChain is a Proof-of-stake chain, and it is organized differently from Aeternity Mainnet. See the for details. This means that some of the chain-inspection operations (Chain.block\_hash, Chain.coinbase, and Chain.difficulty) can't work exactly the same. Here we summarize the differences and current state.

    Chain.block_hash

    Change: Chain.block\_hash(current_height) returns None

    The block hash (at height) in Sophia/FATE always refer to the hash of the key-block. (Most of the time in Bitcoin-NG there will be many micro-blocks at the same height, so it is not unique.) And, in a HyperChain the micro-block (where the contract calls happen) comes before the key-block, and thus there simply isn't a block hash to return.

    Chain.coinbase

    Calls to Chain.coinbase will fail and abort the execution.

    The same reason as for block hash, the key-block isn't yet produced so there is no (simple) place to find the information. It is always possible to call the consensus contract and check who is the producer of the current block/generation.

    Chain.difficulty

    Calls to Chain.difficulty will return 0.

    There is no mining, so no difficulty to keep track of. Internally, thedifficulty field is used for other purposes, but that number makes little sense in Sophia/FATE so no point returning it.

    Access the account mnemonics from hc_test/economy-unencrypted.yaml

  • Import these into your preferred wallet (e.g., Superhero Wallet)

  • Configure your wallet's network settings:

    • Node address (e.g., localhost)

    • HTTP API port (default: 3013)

    • Network ID (hc_test in this example)

  • top_block_height is more than 0
  • sync_progress is 100

  • genesis_start_time

    integer

    Timestamp for genesis Default: 0

    child_block_time

    integer

    The average time in milliseconds between two key blocks on the hyperchain Default: 3000

    child_block_production_time

    integer

    The time in milliseconds to produce a hyperchain block

    child_epoch_length

    integer

    The number of blocks in an epoch on the hyperchain

    pinning_reward_value

    integer

    The initial value of the Pinning reward. It can later be changed through consensus Default: 0

    default_pinning_behavior

    boolean

    Use the default pinning behavior, where in each epoch, if the last leader has defined pinning/parent chain credentials, they will pin Default: false

    fixed_coinbase

    integer

    The coinbase reward specifies the fixed amount of newly minted tokens allocated to block producers as an incentive for validating and adding blocks to the chain. Default: 0

    object

    Details of how this node will connect to a parent chain if this is a hyperchain.

    object[]

    List of hyperchain accounts

    object[]

    List of parent chain accounts

    acceptable_sync_offset

    integer

    The maximum amount of time the parent chain block generation can be off the expected time. Default: 60000

    object

    Details of the parent chain.

    object

    Parent chain connection configuration

    string[]

    List of parent chain nodes to poll for new blocks Default:

    <height>

    object

    Property name indicates minimum height at which the given

    consensus algorithm gets activated. By default from genesis Cuckoo cycle based BitcoinNG is used.

    yes

    type

    string

    The type of the consensus algorithm used at the given height (ex. pow_cuckoo, smart_contract

    or hyperchain) Default: "hyperchain"

    yes

    config

    object

    Configuration for the given consensus algorithm

    contract_owner

    string

    Owner of the smart contracts that controls the consensus.

    election_contract

    string

    The address of the smart contract that will be used for leader elections. For a new chain this contract should be loaded at genesis

    rewards_contract

    string

    The address of the smart contract that will be used for reward distributions. For a new chain this contract should be loaded at genesis

    start_height

    integer

    Height on the parent chain that this hyperchain will start posting commitments and start creating blocks Default: 0

    finality

    integer

    The number of blocks on the parent chain to reach finality.

    parent_epoch_length

    integer

    The number of blocks in an epoch on the parent chain.

    network_id

    string

    The network Id of the parent chain if it has one Default: "ae_mainnet"

    type

    string

    The type of parent network connection. Currently only AE, Bitcoin and Dogecoin are implemented Default: "AE2AE" Enum: "AE2AE", "AE2BTC", "AE2DOGE"

    fetch_interval

    integer

    The interval between polls of the parent chain looking for a new block (milliseconds) Default: 500

    retry_interval

    integer

    The amount of time in milliseconds to wait before retrying a check for a block on the parent chain. Default: 1000

    cache_size

    integer

    Size of local cache for parent chain Default: 200

    hyper_chain_account

    object

    Hyperchain staking account

    pub

    string

    Public key Default: ""

    priv

    string

    Private key Default: ""

    parent_chain_account

    object

    Parent chain pinning account

    pub

    string

    Public key Default: ""

    priv

    string

    Private key Default: ""

    owner

    string

    Public key of Hyperchain account owner. Needs to correspond to an account defined in stakers Default: ""

    hyperchain-starter-kit
    Git
    Node.js
    Jq
    Configuration Details
    Docker volumes
    Docker section
    testnet faucet
    installation instructions
    basic configuration
    main Hyperchain documentation
    hyperchain-starter-kit documentation
    whitepaper

    no

    git clone https://github.com/aeternity/hyperchain-starter-kit
    cd hyperchain-starter-kit
    npm install
    npm run dev
    npm run dev init hc_test
    childBlockTime: 3000
    childEpochLength: 600
    contractSourcesPrefix: 'https://raw.githubusercontent.com/aeternity/aeternity/refs/tags/v7.3.0-rc3/'
    enablePinning: true
    faucetInitBalance: 1000000000000000000000000000
    fixedCoinbase: 100000000000000000000
    networkId: 'hc_test'
    parentChain:
      epochLength: 10
      networkId: 'ae_uat'
      nodeURL: 'https://testnet.aeternity.io'
      type: 'AE2AE'
    pinningReward: 1000000000000000000000
    treasuryInitBalance: 1000000000000000000000000000000000000000000000000
    validators:
      balance: 3100000000000000000000000000
      count: 3
      validatorMinStake: 1000000000000000000000000
    npm run dev retrieve-contracts hc_test
    npm run dev gen-economy hc_test
    cat hc_test/economy-unencrypted.yaml
    faucet:
      account:
        addr: 'ak_WNkJkmaEoyScVRaeZeDvvmCqLn1HkfNnQDy1oSJp6Jm5YPpAq'
        index: 0
        mnemonic: 'alpha camp aunt tattoo gravity beach report run cube rude morning ahead elephant super team vague nut property surge erode total rhythm output perfect'
        privKey: 'd747348b11eff32d764a31e2a528fa5624fa6f18a4a6f99070d55ea77905ed2342b30be3a20307cb499230fa857611e5101b0682e57d23d21ca1f360705404d7'
      initialBalance: 1000000000000000000000000000
    pinners:
      - account:
          addr: 'ak_2cYQac22msS2BGxR44BiD3CSLDvG9Xuamn61y2gdb8qJXwd7or'
          index: 0
          mnemonic: 'grant comic beauty impose dance rate crash scorpion cream domain level have vessel tortoise fringe north profit loop enemy traffic outer loud version return'
          privKey: '9e2c28f2037e6d352a88137572255ed8af2e86dfb2c2949c4d805ff08bff2784d465bc1253fd1594ecc68e128bb2e241fb2fc0bd48a72e7d57af6dadad67b5dc'
        owner: 'ak_o9UXHESE3mDd9qeDKnxkRrfUS3eY17xkhshZX3VFqAbkVMUDV'
      - account:
          addr: 'ak_kU8HHb7raYHf5USrEv1zQ1WfFU8Fccrzp2nPM7gtoAvi3cFZh'
          index: 0
          mnemonic: 'mesh cousin december tank rival please march museum dragon peanut border tourist execute cash slush also two other casual vague curve verify trophy ceiling'
          privKey: 'c447e8e3159a57ebffb19f3bd7c63afd739e5c592d9bd20620dff61c58d842b062b2dd406ded9a12fb6e455ce2fe3eb1af96182f5a59697e04478e372c58c927'
        owner: 'ak_2uc64DEjX1XCe2dYtTaDBfGXqPDiv1Xcu29T4P2x5NzXnRerAA'
      - account:
          addr: 'ak_2LS9FZLu7v5mVHW8sHa8DxvVWzfKf39SHrHNmmvQseTWCbff5J'
          index: 0
          mnemonic: 'sweet green lizard auto science wreck destroy indicate roast garment cloth album fringe valley remain bike black purse antique annual until umbrella wealth gadget'
          privKey: 'a19771d213eadede7c3332244ddeaa5e2caaa8be4aae79eee8d425e47a237dffafd27c0d8b8485c6dab5ec083448f81e68de9202258ee9f5ec313874bb0e2537'
        owner: 'ak_BXprz9o24a8RYbvBRDsUCBdGpz2uULBnDw6BiYpG957BiEvVn'
    treasury:
      account:
        addr: 'ak_CLTKb9tdvXGwpgUBW8GytW7kXv9r1eJyY4YtgKKWtKcY3poQf'
        index: 0
        mnemonic: 'horror hunt card coconut wait snack clerk prepare process oval radar praise candy sting fury target fan nothing option pattern garden off when deer'
        privKey: '9ab3bb473a0ec30d4f75f877ee9de0145fbd883e07edab2e4555e156a729be5619bd0a236a9ebd4a47e5fc3961b59ea215515109c007e2ce844b1f543d4e9598'
      initialBalance: 1000000000000000000000000000000000000000000000000
    validators:
      - account:
          addr: 'ak_o9UXHESE3mDd9qeDKnxkRrfUS3eY17xkhshZX3VFqAbkVMUDV'
          index: 0
          mnemonic: 'seminar else board area mercy dune bottom wide move emotion fold goat recipe horror liquid spoon visa click hen benefit link lawn castle hospital'
          privKey: 'fca30982735665d39d52146c30837cc33cf1c11015accb5ce520065223872e3968c7c7dc1372514ada09eac4a433ee479bf980c6d9d8bbdc88284cb19e8b4cb6'
        initialBalance: 3100000000000000000000000000
      - account:
          addr: 'ak_2uc64DEjX1XCe2dYtTaDBfGXqPDiv1Xcu29T4P2x5NzXnRerAA'
          index: 0
          mnemonic: 'arrest friend excuse expect learn material differ fat fiscal subway ghost quick science balcony thing receive wage hold visa boy still close pull mutual'
          privKey: '43a889d992a923e195cecf0f4346e4f480cec0ef2f561e383cf6b367e4da8b3dfb245ed4f23bcc25205d1cba30c85ed3a9a3a10858e12a6944d81944d3277850'
        initialBalance: 3100000000000000000000000000
      - account:
          addr: 'ak_BXprz9o24a8RYbvBRDsUCBdGpz2uULBnDw6BiYpG957BiEvVn'
          index: 0
          mnemonic: 'orchard issue drip level knife mechanic dirt keep gas potato close path recall rice strong seminar tattoo alien wealth note soft cash include business'
          privKey: '30267f551a56954f654edaa3cb21a58a21898af0519503d3737f8cd5c8b913eb17e9b9a1f3f725b0de559f30276ff065a84cca01b5720df302e2044032acd6ba'
        initialBalance: 3100000000000000000000000000
    npm run dev gen-node-conf hc_test
    docker network create hyperchain
    docker run --rm -it -p 3013:3013 \
        --network=hyperchain --name initiator \
        -v ${PWD}/hc_test/nodeConfig/aeternity.yaml:/home/aeternity/.aeternity/aeternity/aeternity.yaml \
        -v ${PWD}/hc_test/nodeConfig/hc_test_accounts.json:/home/aeternity/node/data/aecore/hc_test_accounts.json \
        -v ${PWD}/hc_test/nodeConfig/hc_test_contracts.json:/home/aeternity/node/data/aecore/hc_test_contracts.json \
        aeternity/aeternity:v7.3.0-rc3
    curl -s localhost:3013/v3/status | jq
    {
      "difficulty": 0,
      "genesis_key_block_hash": "kh_7dm2zSo6NsnEDMYBYdXA9QvkJvvk7TenT68HxW5BSrRSz3WV6",
      "hashrate": 0,
      "listening": true,
      "network_id": "hc_test",
      "node_revision": "57bc00b760dbb3ccd10be51f447e33cb3a2f56e3",
      "node_version": "7.3.0-rc3",
      "peer_connections": {
        "inbound": 0,
        "outbound": 0
      },
      "peer_count": 0,
      "peer_pubkey": "pp_2ZX5Pae6a9L5UFm8VcCNsB39pn3EK7ZQZpp3dfF1WDNFXZ9p3b",
      "pending_transactions_count": 0,
      "protocols": [
        {
          "effective_at_height": 0,
          "version": 6
        }
      ],
      "solutions": 0,
      "sync_progress": 100,
      "syncing": false,
      "top_block_height": 2,
      "top_key_block_hash": "kh_2QCveiMjWXbuDzXkJmpposgmTrdSmPJnWBFpq33Xc6bZZnBXP4",
      "uptime": "6s.18"
    }
    cp ./hc_test/nodeConfig/aeternity.yaml ~/aeternity/node/
    cp ./hc_test/nodeConfig/hc_test_*.json ~/aeternity/node/data/aecore/
    ~/aeternity/node/bin/aeternity start
    ~/aeternity/node/bin/aeternity status
    Genesis block Hash          kh_7dm2zSo6NsnEDMYBYdXA9QvkJvvk7TenT68HxW5BSrRSz3WV6
    Difficulty                  0
    Syncing                     false
    Sync progress               100.0
    Node version                7.3.0-rc2
    Node revision               336f76030d86f3accce7e8611f36f7e7641e2695
    Peer count                  0
    Peer connections (inbound)  0
    Peer connections (outbound) 0
    Pending transactions count  0
    Network id                  hc_test
    Peer pubkey                 pp_rx9MgTnZdB5Vhmpe9iCsms7bESn2ACfJtNoVXGUWKdPhQXqco
    Top key block hash          kh_2DbFXJ5Uub5ogEXv7wVEhoiMMe5LDQTbYoU4x5D1jQp1XuzgE2
    Top block height            404
    Top block protocol          6 (ceres)
    npm install --global @aeternity/aepp-cli@7
    aecli --version
    aecli account create hc_test/wallets/staker.json
    ✔ Enter your password …
    Address  ak_2hT1UTevtPkEpocjEcbbBi14gS1Ba1unHQBrtXupHnKHxk26kU
    Path     /path/to/hyperchain-starter-kit/configs/hc_test/wallets/staker.json
    aecli account address --secretKey hc_test/wallets/staker.json
    ✔ Are you sure you want print your secret key? … yes
    ✔ Enter your password …
    Address            ak_2hT1UTevtPkEpocjEcbbBi14gS1Ba1unHQBrtXupHnKHxk26kU
    Secret Key         sk_2KaWrN7mJ5yfj5yikQwepSaPXksgjuYda7QoXtjfVhRfFVDJvs
    Secret Key in hex  ade11d353b3b02f9602aa7073683a1c2b2a5d95c73b99d8fc40eafa82b02e957df8a07444f1195795a2f92915e655696a3a6a330015c58673ae9f73a1abff374
    aecli account create hc_test/wallets/pinner.json
    ✔ Enter your password …
    Address  ak_2CQQctWm267tfHMUcZf7YX5uVHE6T9t3bg4UNpWnpn8qog6MZ
    Path     /path/to/hyperchain-starter-kit/configs/hc_test/wallets/pinner.json
    aecli account address --secretKey hc_test/wallets/pinner.json
    ✔ Are you sure you want print your secret key? … yes
    ✔ Enter your password …
    Address            ak_2CQQctWm267tfHMUcZf7YX5uVHE6T9t3bg4UNpWnpn8qog6MZ
    Secret Key         sk_X8YAj8XRzTEsAdQJZDt6n3baCcCs2mHRwiT4rtBYEE8baBLfX
    Secret Key in hex  4469eb651fa54025ccecf2bfe462a2051e690f7b2bb23ea0f49e6f77a7b1763c02b7910b1a543221b15f14b196ed1ba3212031d817a9c09ac200387ab5631a25
    curl -s localhost:3013/v3/status | jq -r '.peer_pubkey'
    pp_2ZX5Pae6a9L5UFm8VcCNsB39pn3EK7ZQZpp3dfF1WDNFXZ9p3b
    cp hc_test/nodeConfig/aeternity.yaml hc_test/nodeConfig/validator2.yaml
    peers:
      # Connect to existing Hyperchain network
      - aenode://pp_2ZX5Pae6a9L5UFm8VcCNsB39pn3EK7ZQZpp3dfF1WDNFXZ9p3b@initiator:3015
    chain:
      consensus:
        '0':
          config:
            child_block_time: 3000
            child_epoch_length: 600
            contract_owner: 'ak_11111111111111111111111111111115rHyByZ'
            default_pinning_behavior: true
            election_contract: 'ct_LRbi65kmLtE7YMkG6mvG5TxAXTsPJDZjAtsPuaXtRyPA7gnfJ'
            fixed_coinbase: 100000000000000000000
            parent_chain:
              consensus:
                network_id: 'ae_uat'
                type: 'AE2AE'
              parent_epoch_length: 10
              polling:
                fetch_interval: 500
                nodes:
                  - 'https://testnet.aeternity.io'
              start_height: 1064939
            pinners:
              - parent_chain_account:
                  owner: 'ak_2hT1UTevtPkEpocjEcbbBi14gS1Ba1unHQBrtXupHnKHxk26kU'
                  priv: '4469eb651fa54025ccecf2bfe462a2051e690f7b2bb23ea0f49e6f77a7b1763c02b7910b1a543221b15f14b196ed1ba3212031d817a9c09ac200387ab5631a25'
                  pub: 'ak_2CQQctWm267tfHMUcZf7YX5uVHE6T9t3bg4UNpWnpn8qog6MZ'
            pinning_reward_value: 1000000000000000000000
            rewards_contract: 'ct_KJgjAXMtRF68AbT5A2aC9fTk8PA4WFv26cFSY27fXs6FtYQHK'
            stakers:
              - hyper_chain_account:
                  priv: 'ade11d353b3b02f9602aa7073683a1c2b2a5d95c73b99d8fc40eafa82b02e957df8a07444f1195795a2f92915e655696a3a6a330015c58673ae9f73a1abff374'
                  pub: 'ak_2hT1UTevtPkEpocjEcbbBi14gS1Ba1unHQBrtXupHnKHxk26kU'
            staking_contract: 'ct_KJgjAXMtRF68AbT5A2aC9fTk8PA4WFv26cFSY27fXs6FtYQHK'
          type: 'hyperchain'
      hard_forks:
        '6':
          accounts_file: 'hc_test_accounts.json'
          contracts_file: 'hc_test_contracts.json'
          height: 0
    fork_management:
      network_id: 'hc_test'
    mining:
      autostart: true
    http:
      endpoints:
        dry-run: true
        hyperchain: true
    docker run --rm -it -p 33013:3013 \
        --network hyperchain \
        -v ${PWD}/hc_test/nodeConfig/validator2.yaml:/home/aeternity/.aeternity/aeternity/aeternity.yaml \
        -v ${PWD}/hc_test/nodeConfig/hc_test_accounts.json:/home/aeternity/node/data/aecore/hc_test_accounts.json \
        -v ${PWD}/hc_test/nodeConfig/hc_test_contracts.json:/home/aeternity/node/data/aecore/hc_test_contracts.json \
        aeternity/aeternity:v7.3.0-rc3
    curl -s localhost:33013/v3/status | jq
    {
      "difficulty": 0,
      "genesis_key_block_hash": "kh_7dm2zSo6NsnEDMYBYdXA9QvkJvvk7TenT68HxW5BSrRSz3WV6",
      "hashrate": 0,
      "listening": true,
      "network_id": "hc_test",
      "node_revision": "57bc00b760dbb3ccd10be51f447e33cb3a2f56e3",
      "node_version": "7.3.0-rc3",
      "peer_connections": {
        "inbound": 0,
        "outbound": 1
      },
      "peer_count": 1,
      "peer_pubkey": "pp_ENJfMAPXWbZruYgexnGCNEwCBwdLcEiR8F541CuzCkgtFQ5jt",
      "pending_transactions_count": 0,
      "protocols": [
        {
          "effective_at_height": 0,
          "version": 6
        }
      ],
      "solutions": 0,
      "sync_progress": 100,
      "syncing": false,
      "top_block_height": 35,
      "top_key_block_hash": "kh_FK7EvnCYsq9DdbZLtBpFPdD5UdTNYGWnWfQShNgVkbY6iyP3h",
      "uptime": "59s.448"
    }
    aecli select-node http://localhost:3013/
    aecli config
    Node http://localhost:3013/ network id hc_test, version 7.3.0-rc3, protocol 6 (Ceres)
    Compiler https://v8.compiler.aepps.com/ version 8.0.0
    aecli account create hc_test/wallets/treasury.js 9ab3bb473a0ec30d4f75f877ee9de0145fbd883e07edab2e4555e156a729be5619bd0a236a9ebd4a47e5fc3961b59ea215515109c007e2ce844b1f543d4e9598
    ✔ Enter your password …
    Address  ak_CLTKb9tdvXGwpgUBW8GytW7kXv9r1eJyY4YtgKKWtKcY3poQf
    Path     /path/to/hyperchain-starter-kit/configs/hc_test/wallets/treasury.js
    aecli inspect ak_CLTKb9tdvXGwpgUBW8GytW7kXv9r1eJyY4YtgKKWtKcY3poQf
    Account ID       ak_CLTKb9tdvXGwpgUBW8GytW7kXv9r1eJyY4YtgKKWtKcY3poQf
    Account balance  1000000000000000000000000000000ae
    Account nonce    0
    No pending transactions
    aecli spend hc_test/wallets/treasury.js ak_2hT1UTevtPkEpocjEcbbBi14gS1Ba1unHQBrtXupHnKHxk26kU 1000100ae
    Cost of SpendTx execution ≈ 1000100.0000169ae
    ✔ Enter your password …
    Transaction mined
    Transaction hash   th_2JLcgQkpD4Rz42L3rmKsLoZ2fomGuoVNpoJjnAMxTcbmoznjbb
    Block hash         mh_2uWKDfDj5evXncvJd6V7c76pQdhYuKWDUjxP2jqr5cj7BW9b99
    Block height       2052 (about now)
    Signatures         ["sg_BYKqfbZej3CPUHz9sJfHRM5o8YLevTjhoU3JAHivU8d8wv9L8TuA2kx74vm5xTHSmFQxo2d4uDBJKWuz9K5QmTDCUNDLc"]
    Transaction type   SpendTx (ver. 1)
    Sender address     ak_CLTKb9tdvXGwpgUBW8GytW7kXv9r1eJyY4YtgKKWtKcY3poQf
    Recipient address  ak_2hT1UTevtPkEpocjEcbbBi14gS1Ba1unHQBrtXupHnKHxk26kU
    Amount             1000100ae
    Payload            ba_Xfbg4g==
    Fee                0.0000169ae
    Nonce              1
    TTL                2053 (about now)
    payable stateful entrypoint new_validator(owner : address, sign_key : address, restake : bool) : StakingValidator
    aecli contract call new_validator '["ak_2hT1UTevtPkEpocjEcbbBi14gS1Ba1unHQBrtXupHnKHxk26kU", "ak_2hT1UTevtPkEpocjEcbbBi14gS1Ba1unHQBrtXupHnKHxk26kU", false]' hc_test/wallets/staker.json --contractAddress ct_KJgjAXMtRF68AbT5A2aC9fTk8PA4WFv26cFSY27fXs6FtYQHK --contractAci hc_test/contracts/MainStaking.aci.json --amount 1000000ae
    Cost of ContractCallTx execution ≈ 1000000.000236691ae
    ✔ Enter your password …
    Transaction hash  th_4VXdLJjpAXAnGMe7RRfwKtPguXGWJaLVLoKR7EgcVe1w2MGtk
    Block hash        mh_2XhasD3FXo4RSyKdrkUMw8NQdDx2bkXKhZJfV1idwXjUeFHPEk
    Block height      2512 (about now)
    Signatures        ["sg_R5STDGXkZyCejyiyahzJJLGN8GThrZsCH3hY6e7GkLb8eebz8sHbj8ECe21tscXw2Eh2zDvaryyuy9fnCvNX8wewciXER"]
    Transaction type  ContractCallTx (ver. 1)
    Caller address    ak_2hT1UTevtPkEpocjEcbbBi14gS1Ba1unHQBrtXupHnKHxk26kU
    Contract address  ct_KJgjAXMtRF68AbT5A2aC9fTk8PA4WFv26cFSY27fXs6FtYQHK
    Gas               53031 (0.000053031ae)
    Gas price         0.000000001ae
    Call data         cb_KxFuGm1JO58AoN+KB0RPEZV5Wi+SkV5lVpajpqMwAVxYZzrp9zoav/N0nwCg34oHRE8RlXlaL5KRXmVWlqOmozABXFhnOun3Ohq/83R/GCn/XQ==
    ABI version       3 (Fate)
    Amount            1000000ae
    Fee               0.00018366ae
    Nonce             1
    TTL               2514 (in 6 minutes)
    ----------------------Call info-----------------------
    Gas used                42425 (0.000042425ae)
    Return value (encoded)  cb_nwKgZYU1vdfnMJUPDrJIhcZ5xLhgivcS2Y7lZhl77npIApLx8dm1
    Return value (decoded)  ct_miCfZgeT2fEE9E7XpFikAUReP62QJtZizypJGvw38SYuXJNHN
    parent_chain:
      consensus:
        network_id: 'ae_uat'
        type: 'AE2AE'
      polling:
        fetch_interval: 500
        nodes:
          - 'http://localhost:6013'
      start_height: 1064531
    parent_chain:
      parent_epoch_length: 10
    child_block_time: 3000
    parent_block_time * parent_epoch_length = child_block_time * child_epoch_length
    (parent_block_time * parent_epoch_length)/child_block_time = child_epoch_length
    (180 * 10)/3 = 600
    child_epoch_length: 3000
    stakers:
      - hyper_chain_account:
          priv: 'fca30982735665d39d52146c30837cc33cf1c11015accb5ce520065223872e3968c7c7dc1372514ada09eac4a433ee479bf980c6d9d8bbdc88284cb19e8b4cb6'
          pub: 'ak_o9UXHESE3mDd9qeDKnxkRrfUS3eY17xkhshZX3VFqAbkVMUDV'
      - hyper_chain_account:
          priv: '43a889d992a923e195cecf0f4346e4f480cec0ef2f561e383cf6b367e4da8b3dfb245ed4f23bcc25205d1cba30c85ed3a9a3a10858e12a6944d81944d3277850'
          pub: 'ak_2uc64DEjX1XCe2dYtTaDBfGXqPDiv1Xcu29T4P2x5NzXnRerAA'
      - hyper_chain_account:
          priv: '30267f551a56954f654edaa3cb21a58a21898af0519503d3737f8cd5c8b913eb17e9b9a1f3f725b0de559f30276ff065a84cca01b5720df302e2044032acd6ba'
          pub: 'ak_BXprz9o24a8RYbvBRDsUCBdGpz2uULBnDw6BiYpG957BiEvVn'
      {
        "ak_CLTKb9tdvXGwpgUBW8GytW7kXv9r1eJyY4YtgKKWtKcY3poQf": 1000000000000000000000000000000000000000000000000,
        "ak_WNkJkmaEoyScVRaeZeDvvmCqLn1HkfNnQDy1oSJp6Jm5YPpAq": 1000000000000000000000000000,
        "ak_o9UXHESE3mDd9qeDKnxkRrfUS3eY17xkhshZX3VFqAbkVMUDV": 3100000000000000000000000000,
        "ak_2uc64DEjX1XCe2dYtTaDBfGXqPDiv1Xcu29T4P2x5NzXnRerAA": 3100000000000000000000000000,
        "ak_BXprz9o24a8RYbvBRDsUCBdGpz2uULBnDw6BiYpG957BiEvVn": 3100000000000000000000000000
      }
    {
      "contracts": [
        {
          "abi_version": 3,
          "vm_version": 8,
          "amount": 0,
          "nonce": 1,
          "call_data": "cb_KxFE1kQfG2+K08IbzsztoP//wBN1Y+0=",
          "code": "cb_+RooRgOgOUIJ6aG22mq1hxGo9uIfqnsWK5hy9d6LWKhQXT42NwfAuRn6uRM9....SNIP",
          "owner_pubkey": "ak_11111111111111111111111111111115rHyByZ",
          "pubkey": "ct_KJgjAXMtRF68AbT5A2aC9fTk8PA4WFv26cFSY27fXs6FtYQHK"
        },
        {
          "abi_version": 3,
          "vm_version": 8,
          "amount": 0,
          "nonce": 2,
          "call_data": "cb_KxFE1kQfG58CoCmQRGuzLDSzySG/5UcFOdoQ1iYy6a6fhJXVahjufrESSdmdMQ==",
          "code": "cb_+Q2cRgOgT4Um34MEjJkEOajx7RyKC+E7kWgbLSK4Hgf8VYE1Q4vAuQ1uuQoT/...SNIP",
          "owner_pubkey": "ak_11111111111111111111111111111115rHyByZ",
          "pubkey": "ct_LRbi65kmLtE7YMkG6mvG5TxAXTsPJDZjAtsPuaXtRyPA7gnfJ"
        }
      ],
      "calls": [
        {
          "abi_version": 3,
          "amount": 1000000000000000000000000,
          "call_data": "cb_KxFuGm1JO58AoGjHx9wTclFK2gnqxKQz7keb+YDG2di73IgoTLGei0y2nwCgaMfH3BNyUUraCerEpDPuR5v5gMbZ2LvciChMsZ6LTLZ/AEXInw==",
          "caller": "ak_o9UXHESE3mDd9qeDKnxkRrfUS3eY17xkhshZX3VFqAbkVMUDV",
          "contract_pubkey": "ct_KJgjAXMtRF68AbT5A2aC9fTk8PA4WFv26cFSY27fXs6FtYQHK",
          "nonce": 1,
          "fee": 1000000000000000,
          "gas": 1000000,
          "gas_price": 1000000000
        },
        {
          "abi_version": 3,
          "amount": 1000000000000000000000000,
          "call_data": "cb_KxFuGm1JO58AoPskXtTyO8wlIF0cujDIXtOpo6EIWOEqaUTYGUTTJ3hQnwCg+yRe1PI7zCUgXRy6MMhe06mjoQhY4SppRNgZRNMneFB/pplUGQ==",
          "caller": "ak_2uc64DEjX1XCe2dYtTaDBfGXqPDiv1Xcu29T4P2x5NzXnRerAA",
          "contract_pubkey": "ct_KJgjAXMtRF68AbT5A2aC9fTk8PA4WFv26cFSY27fXs6FtYQHK",
          "nonce": 1,
          "fee": 1000000000000000,
          "gas": 1000000,
          "gas_price": 1000000000
        },
        {
          "abi_version": 3,
          "amount": 1000000000000000000000000,
          "call_data": "cb_KxFuGm1JO58AoBfpuaHz9yWw3lWfMCdv8GWoTMoBtXIN8wLiBEAyrNa6nwCgF+m5ofP3JbDeVZ8wJ2/wZahMygG1cg3zAuIEQDKs1rp/TbwekQ==",
          "caller": "ak_BXprz9o24a8RYbvBRDsUCBdGpz2uULBnDw6BiYpG957BiEvVn",
          "contract_pubkey": "ct_KJgjAXMtRF68AbT5A2aC9fTk8PA4WFv26cFSY27fXs6FtYQHK",
          "nonce": 1,
          "fee": 1000000000000000,
          "gas": 1000000,
          "gas_price": 1000000000
        }
      ]
    }
    staking_contract: 'ct_KJgjAXMtRF68AbT5A2aC9fTk8PA4WFv26cFSY27fXs6FtYQHK'
    election_contract: 'ct_LRbi65kmLtE7YMkG6mvG5TxAXTsPJDZjAtsPuaXtRyPA7gnfJ'
    rewards_contract: 'ct_KJgjAXMtRF68AbT5A2aC9fTk8PA4WFv26cFSY27fXs6FtYQHK'
    contract_owner: 'ak_11111111111111111111111111111115rHyByZ'
    default_pinning_behavior: true
    pinners:
      - parent_chain_account:
          owner: 'ak_o9UXHESE3mDd9qeDKnxkRrfUS3eY17xkhshZX3VFqAbkVMUDV'
          priv: '9e2c28f2037e6d352a88137572255ed8af2e86dfb2c2949c4d805ff08bff2784d465bc1253fd1594ecc68e128bb2e241fb2fc0bd48a72e7d57af6dadad67b5dc'
          pub: 'ak_2cYQac22msS2BGxR44BiD3CSLDvG9Xuamn61y2gdb8qJXwd7or'
      - parent_chain_account:
          owner: 'ak_2uc64DEjX1XCe2dYtTaDBfGXqPDiv1Xcu29T4P2x5NzXnRerAA'
          priv: 'c447e8e3159a57ebffb19f3bd7c63afd739e5c592d9bd20620dff61c58d842b062b2dd406ded9a12fb6e455ce2fe3eb1af96182f5a59697e04478e372c58c927'
          pub: 'ak_kU8HHb7raYHf5USrEv1zQ1WfFU8Fccrzp2nPM7gtoAvi3cFZh'
      - parent_chain_account:
          owner: 'ak_BXprz9o24a8RYbvBRDsUCBdGpz2uULBnDw6BiYpG957BiEvVn'
          priv: 'a19771d213eadede7c3332244ddeaa5e2caaa8be4aae79eee8d425e47a237dffafd27c0d8b8485c6dab5ec083448f81e68de9202258ee9f5ec313874bb0e2537'
          pub: 'ak_2LS9FZLu7v5mVHW8sHa8DxvVWzfKf39SHrHNmmvQseTWCbff5J'
    pinning_reward_value: 1000000000000000000000
    chain:
      consensus:
        '0':
          config:
            child_block_time: 3000
            child_epoch_length: 600
            contract_owner: 'ak_11111111111111111111111111111115rHyByZ'
            default_pinning_behavior: true
            election_contract: 'ct_LRbi65kmLtE7YMkG6mvG5TxAXTsPJDZjAtsPuaXtRyPA7gnfJ'
            fixed_coinbase: 100000000000000000000
            fee_distribution: [30, 50, 20]
            parent_chain:
              consensus:
                network_id: 'ae_uat'
                type: 'AE2AE'
              parent_epoch_length: 10
              polling:
                fetch_interval: 500
                nodes:
                  - 'https://testnet.aeternity.io'
              start_height: 1064939
            pinners:
              - parent_chain_account:
                  owner: 'ak_o9UXHESE3mDd9qeDKnxkRrfUS3eY17xkhshZX3VFqAbkVMUDV'
                  priv: '9e2c28f2037e6d352a88137572255ed8af2e86dfb2c2949c4d805ff08bff2784d465bc1253fd1594ecc68e128bb2e241fb2fc0bd48a72e7d57af6dadad67b5dc'
                  pub: 'ak_2cYQac22msS2BGxR44BiD3CSLDvG9Xuamn61y2gdb8qJXwd7or'
              - parent_chain_account:
                  owner: 'ak_2uc64DEjX1XCe2dYtTaDBfGXqPDiv1Xcu29T4P2x5NzXnRerAA'
                  priv: 'c447e8e3159a57ebffb19f3bd7c63afd739e5c592d9bd20620dff61c58d842b062b2dd406ded9a12fb6e455ce2fe3eb1af96182f5a59697e04478e372c58c927'
                  pub: 'ak_kU8HHb7raYHf5USrEv1zQ1WfFU8Fccrzp2nPM7gtoAvi3cFZh'
              - parent_chain_account:
                  owner: 'ak_BXprz9o24a8RYbvBRDsUCBdGpz2uULBnDw6BiYpG957BiEvVn'
                  priv: 'a19771d213eadede7c3332244ddeaa5e2caaa8be4aae79eee8d425e47a237dffafd27c0d8b8485c6dab5ec083448f81e68de9202258ee9f5ec313874bb0e2537'
                  pub: 'ak_2LS9FZLu7v5mVHW8sHa8DxvVWzfKf39SHrHNmmvQseTWCbff5J'
            pinning_reward_value: 1000000000000000000000
            rewards_contract: 'ct_KJgjAXMtRF68AbT5A2aC9fTk8PA4WFv26cFSY27fXs6FtYQHK'
            stakers:
              - hyper_chain_account:
                  priv: 'fca30982735665d39d52146c30837cc33cf1c11015accb5ce520065223872e3968c7c7dc1372514ada09eac4a433ee479bf980c6d9d8bbdc88284cb19e8b4cb6'
                  pub: 'ak_o9UXHESE3mDd9qeDKnxkRrfUS3eY17xkhshZX3VFqAbkVMUDV'
              - hyper_chain_account:
                  priv: '43a889d992a923e195cecf0f4346e4f480cec0ef2f561e383cf6b367e4da8b3dfb245ed4f23bcc25205d1cba30c85ed3a9a3a10858e12a6944d81944d3277850'
                  pub: 'ak_2uc64DEjX1XCe2dYtTaDBfGXqPDiv1Xcu29T4P2x5NzXnRerAA'
              - hyper_chain_account:
                  priv: '30267f551a56954f654edaa3cb21a58a21898af0519503d3737f8cd5c8b913eb17e9b9a1f3f725b0de559f30276ff065a84cca01b5720df302e2044032acd6ba'
                  pub: 'ak_BXprz9o24a8RYbvBRDsUCBdGpz2uULBnDw6BiYpG957BiEvVn'
            staking_contract: 'ct_KJgjAXMtRF68AbT5A2aC9fTk8PA4WFv26cFSY27fXs6FtYQHK'
          type: 'hyperchain'
      hard_forks:
        '6':
          accounts_file: 'hc_test_accounts.json'
          contracts_file: 'hc_test_contracts.json'
          height: 0
    fork_management:
      network_id: 'hc_test'
    mining:
      autostart: true
    chain:
      consensus:
        '0':
          type: hyperchain
          config: ...
    config:
      genesis_start_time: 0
      child_block_time: 3000
      pinning_reward_value: 0
      default_pinning_behavior: false
      fixed_coinbase: 0
      fee_distribution: [30, 50, 20]
      parent_chain:
        start_height: 0
        acceptable_sync_offset: 60000
        consensus:
          network_id: ae_mainnet
          type: AE2AE
        polling:
          fetch_interval: 500
          retry_interval: 1000
          cache_size: 200
          nodes: []
      stakers:
        - []
      pinners:
        - []
    {
        "start_height": 0,
        "acceptable_sync_offset": 60000,
        "consensus": {
            "network_id": "ae_mainnet",
            "type": "AE2AE"
        },
        "polling": {
            "fetch_interval": 500,
            "retry_interval": 1000,
            "cache_size": 200,
            "nodes": []
        }
    }
    network_id: ae_mainnet
    type: AE2AE
    fetch_interval: 500
    retry_interval: 1000
    cache_size: 200
    nodes: []
    - []
    pub: ""
    priv: ""
    - []
    pub: ""
    priv: ""
    owner: ""
    parent_chain
    stakers
    pinners
    consensus
    polling
    nodes