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...
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
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 .
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.
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.
These are the policies for upholding our community's standards of conduct.
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.)
Remarks that moderators find inappropriate, whether listed in the code of conduct or not, are also not allowed.
Moderators will first respond to such remarks with a warning.
If the warning is unheeded, the user will be "kicked," i.e., kicked out of the communication channel to cool off.
If the user comes back and continues to make trouble, they will be banned, i.e., indefinitely excluded.
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.
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.
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
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
A clear and concise description of what you want to happen.
A clear and concise description of any alternative solutions or features you've considered.
Add any other context or screenshots about the feature request here.
Aeternity node API is documented in the protocol repository.
Swagger API documentation is available online at Aeternity node API documentation
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].
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.
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.
Linux / Mac
By using the installer to install the latest stable version:
See the documentation for starting and configuring the node.
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:
This document describes how to update an Aeternity node using a release binary:
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 :
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 .
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.
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 .
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 .
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 .
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 .
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 .
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/aeternitymkdir %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/aeternityrm -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/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.
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.
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.
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.
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.
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
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
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.
It is recommended to use at least 8GB RAM. However 4GB of RAM should be also good enough for modest cases.
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.
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.
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.
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.
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.
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 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.
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.
curl -Lf -o aeternity.tar.gz https://releases.aeternity.io/aeternity-{version}-ubuntu-x86_64.tar.gz/path/to/your/node/bin/aeternity stoptar -xzf aeternity.tar.gz -C /path/to/your/node;...
...
...
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.
Virtualization: [none / metal / container / VM]
Hardware specs:
RAM:
CPU:
OS: [distribution, version]
Node Version:
/path/to/your/node/bin/aeternity daemoncurl localhost:3013/v2/blocks/top---
REPLACEME
some_config:REPLACEME lots of log linesThis 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.
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 .
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 .
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 .
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 .
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 .
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 .
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 .
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.
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 .
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 .
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 .
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 .
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 .
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 .
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 .
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.
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 .
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.
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 .
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.
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]
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.
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
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
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
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 .
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
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
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 .
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.
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 .
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 .
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
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.
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.
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.
standby_times
max_rejections
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.
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.
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.
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.
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 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.
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.
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.
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.
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.
Please let us know if you have any problems by opening a ticket. Troubleshooting of common issues is documented 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.
gas_pricegas_price * transaction_gas_costtransaction_gas_costChanges 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.
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.
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.
In order to install an Aeternity node from a tarball, you need to:
Retrieve the release tarball corresponding to your platform;
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).
Package dependencies are:
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:
Easiest way to install dependencies is using Homebrew:
The macOS package has:
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:
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):
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:
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.
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.
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.
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.
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.1brew update
brew install openssl libsodiumln -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.dylibmkdir -p ~/aeternity/node
cd ~/aeternity/node
tar xf ~/Downloads/aeternity-<package_version>-macos-arm64.tar.gzsync:
gossip_allowed_height_from_top : <height>sync:
sync_allowed_height_from_top: <height>sync:
resist_forks_from_start: trueAE__SYNC__RESIST_FORKS_FROM_START=true bin/aeternity startThis 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:
;
;
.
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.
The instructions for installing a node using a release binary are in .
For installation of a node using the Docker image, please refer to .
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.
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
Setting up your node consists of:
Configuring your node - see instructions in ;
Starting your node and verifying it works as expected - see instructions in .
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 .
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 .
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 .
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 .
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 .
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 .
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 .
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 .
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 .
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 .
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 .
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 .
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 .
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 .
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 .
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 .
This document describes:
;
;
;
Rebar3 is the standard Erlang build tool
Common commands are:
rebar3 help
rebar3 get-deps
rebar3 compile
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
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
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).
This document describes how to build an Aeternity node from source on:
Ubuntu 20.04 LTS
MacOS (latest)
Archlinux 20210404
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);
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.
ae.epoch.aecore.contracts._._.ga_meta._._ae.epoch.aecore.contracts._._.ga_attach._._
ae.epoch.aecore.contracts._._.contract_call._._
ae.epoch.aecore.contracts._._.contract_create._._
You must have docker installed on a host machine and be familiar how to operate docker containers.
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.
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.
To run small local network for development and testing purposes, please refer to the localnet repository
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).
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.
Т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.
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 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.
rebar3 eunit
rebar3 ct
rebar3 shell
rebar3 release
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.
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.
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).
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.
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.
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.
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.
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 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.
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:
Update package database, packages and install the common tools and libraries:
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.
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:
Update package database, packages and install the common tools and libraries:
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:
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.
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/aeternitymkdir -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/aeternitydocker pull aeternity/aeternitydocker 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/aeternitymkdir -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/aeternitymkdir -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-devexport 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 automakeexport 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 gmpsudo zypper install -t pattern devel_basis
sudo zypper install cmake gcc-c++ git erlang libsodium-devel gmp-develgit clone https://github.com/aeternity/aeternity.git aeternity_source && cd aeternity_sourceVERSION=X.Y.Z # set a particular version
git checkout tags/v${VERSION:?}make prod-buildcd _build/prod/rel/aeternity/
bin/aeternity daemonmake prod-packagemkdir -p ~/aeternity/node
tar xf _build/prod/rel/aeternity/aeternity-*.tar.gz -C ~/aeternity/node~/aeternity/node/bin/aeternity daemonIntroduces 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:
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
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 .
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.
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.
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
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.
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:
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
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 .
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.
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.
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
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.
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:
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
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 .
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.
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
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
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.
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
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
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.
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:
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
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 .
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.
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.
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
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 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:
;
;
.
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.
The instructions for installing a node using a release binary are in .
For installation of a node using the Docker image, please refer to .
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.
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
Setting up your node consists of:
Configuring your node - see instructions in ;
Starting your node and verifying it works as expected - see instructions in .
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
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.
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")
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_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.
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:
;
;
.
.
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.
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 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
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
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.
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
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
Setting up your node consists of:
Configuring your node - see instructions in ;
Starting your node and verifying it works as expected - see instructions in .
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:
;
;
.
.
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.
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 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
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
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.
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
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
Setting up your node consists of:
Configuring your node - see instructions in ;
Starting your node and verifying it works as expected - see instructions in .
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:
;
;
.
.
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.
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 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
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
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.
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
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
Setting up your node consists of:
Configuring your node - see instructions in ;
Starting your node and verifying it works as expected - see instructions in .
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:
;
.
.
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.
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 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
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
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.
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
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
Setting up your node consists of:
Configuring your node - see instructions in ;
Starting your node and verifying it works as expected - see instructions in .
This document describes how to configure network monitoring within the node provided by aemon application.
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.
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
Each metric uses ae.epoch.aemon. prefix.
confirmation.delayrepresents network latency. A high number might imply a busy network or unfair leaders.
forks.micro & gen_stats.microblocks.totalforks.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.
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:
;
;
.
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.
The instructions for installing a node using a release binary are in .
For installation of a node using the Docker image, please refer to .
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.
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
Setting up your node consists of:
Configuring your node - see instructions in ;
Starting your node and verifying it works as expected - see instructions in .
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 .
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 .
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.
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:
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.
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:
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.
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.
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.
This document describes how garbage collection works in the Aeternity node, and how to use it.
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.
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:enabledtype: boolean default: false
This is the master switch, controlling whether or not garbage collection is active.
chain:garbage_collection:during_synctype: 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_heighttype: 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:historytype: integer (minimum: 50) default: 15000 (ca 31 days)
Determines how much history to keep. The unit is number of key blocks.
chain:garbage_collection:treestype: 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_scantype: 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:countertype: 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:ratetype: 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.
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.
This section describes how to use the CUDA miner shipped in the Ubuntu release package.
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.
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.
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:
;
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.
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:
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.
is a maintenance release. It:
Fixes build of Windows package:
includes the new Minerva accounts file,
uses proper data directory.
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).
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.
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
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.
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
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
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
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
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.
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.
In order to use the CUDA miner shipped in the Ubuntu release package, you need to install the CUDA driver version 10.
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.
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.
Download the official CUDA repository package and install it. A sudo user should be used:
After the apt repository is set, install CUDA:
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.
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):
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.
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.
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.
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:
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_keysswitch(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 startcurl http://127.0.0.1:3013/v3/headers/topcp -pr ~/aeternity/node/data/aecore/keys ~/my_aeternity_keyscurl https://mainnet.aeternity.io/v3/headers/topcurl http://127.0.0.1:3013/v3/headers/topless ~/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: 500mining:
cuckoo:
edge_bits: 29
miners:
- executable_group: aecuckooprebuilt
executable: cuda29
extra_args: ""
hex_encoded_header: true~/aeternity/node/bin/aeternity startcd ~
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.pubsudo apt-get update && sudo apt-get install cudacd ~
git clone https://github.com/aeternity/aecuckoo.git aecuckoo_source && cd aecuckoo_source
git checkout fa3d13e # This commit is used in Aeternity nodeexport PATH=/usr/local/cuda-9.2/bin${PATH:+:${PATH}}make cuda29cp priv/bin/cuda29 ~/aeternity/node/lib/aecuckoo-1.0.0/priv/binmining:
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: truemining:
cuckoo:
edge_bits: 29
miners:
- executable_group: aecuckooprebuilt
executable: cuda29
extra_args: "-d 0"
hex_encoded_header: truemining:
cuckoo:
edge_bits: 29
miners:
- executable_group: aecuckooprebuilt
executable: cuda29
extra_args: ""
hex_encoded_header: true
instances: [0,1]
repeats: 5mining:
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: 5Refunds 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:
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
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 .
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.
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.
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
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.
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:
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
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 .
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.
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
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
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.
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
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
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.
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
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 .
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.
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
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
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.
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
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
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.
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:
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
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 .
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.
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
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
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.
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
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
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.
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
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 .
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.
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
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
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.
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
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
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.
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:
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
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 .
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.
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.
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
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
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.
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
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
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.
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:
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
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 .
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.
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
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
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.
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
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
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.
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:
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
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 .
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.
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
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
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.
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
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
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.
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:
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
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 .
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.
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.
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
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
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.
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
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
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.
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
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 .
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.
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
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
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.
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
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
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 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.
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
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
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
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.):
JDK in no longer essential for building Aeternity and will not be installed by the preparation script.
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
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.
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.
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.
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:
;
;
.
.
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.
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 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
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
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.
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
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
Setting up your node consists of:
Configuring your node - see instructions in ;
Starting your node and verifying it works as expected - see instructions in .
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:
;
;
.
.
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.
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 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
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
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.
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
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
Setting up your node consists of:
Configuring your node - see instructions in ;
Starting your node and verifying it works as expected - see instructions in .
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.
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.
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.
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):
Each node should be able to mine a block and add it to the chain of the system.
If a fork is created then discarded the fork with lowest PoW (exact requirements to be added)
We are able to post a spend transaction that is occurring in the chain.
We are able to pay a fee for a spend transaction.
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:
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.
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:
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
Each node should be able to mine a block and add it to the chain of the system.
If one node disconnects, a fork is created, that is:
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.
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:
A user clone or pull of the master branch of the repository should build using make without errors.
A user clone or pull of the master branch of the repository should run make test without errors.
A user downloaded or created production package (make prod-package) that is correctly configured against the uat-net:
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:
;
;
.
.
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.
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 .
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 .
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
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
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 .
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
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
Setting up your node consists of:
Configuring your node - see instructions in ;
Starting your node and verifying it works as expected - see instructions in .
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:
;
;
.
.
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.
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 .
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 .
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
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
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 .
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
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
Setting up your node consists of:
Configuring your node - see instructions in ;
Starting your node and verifying it works as expected - see instructions in .
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:
;
;
.
.
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.
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 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
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
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.
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
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
Setting up your node consists of:
Configuring your node - see instructions in ;
Starting your node and verifying it works as expected - see instructions in .
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:
;
;
.
.
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.
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 .
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 .
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
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
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 .
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
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
Setting up your node consists of:
Configuring your node - see instructions in ;
Starting your node and verifying it works as expected - see instructions in .
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.
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".
max_auth_fun_gas - that limits the amount of gas that can be provided
to the authentication function in a GAMetaTx.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
upnp_enabledAn 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
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
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
./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
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
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:
Post a spend transaction that is occurring in the chain.
Pay a fee for a spend transaction.
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:
Post a spend transaction that is occurring in the uat-net chain.
Pay a fee for a spend transaction.
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.
AENS.update to FATE VMAdded 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.
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.
> choco install -y visualstudio2019-workload-vctools --params "--add Microsoft.VisualStudio.Component.VC.CLI.Support --locale en-US"> scripts\windows\install_msys2.bat C:\tools\msys64choco 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.3choco install -y erlang --version=20.3SET "WIN_OTP_PATH=C:\Program Files\erl9.3"
SET OTP_VERSION=20.3
SET ERTS_VERSION=9.3SET "WIN_MSYS2_ROOT=C:\tools\msys64"
SET "WIN_OTP_PATH=C:\tools\erl21.3"
SET ERTS_VERSION=10.3
SET OTP_VERSION=21.3SETX WIN_MSYS2_ROOT C:\tools\msys64
SETX WIN_OTP_PATH C:\Program Files\erl9.3SET "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.3cd PATH_TO_REPO_CHECKOUT
makemake eunit-latestmake eunit-latest TEST=aec_peersmake 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-testswitch(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:
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
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 .
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.
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.
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
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
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.
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
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
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 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:
;
;
.
.
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.
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 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
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
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.
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
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
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 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:
minermoves 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
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.
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.
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.
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:
The rest of the steps should work on Ubuntu 18.04.
To install all build and packaging dependencies run:
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.
This file defines the package meta-information such as name, dependencies, build dependencies.
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.
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.
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.
debian/pacakge_name.links [1]
Create debian/package-name.links if symbolic links are required for
some reason (purely aesthetic or for operation purposes).
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:
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.
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.
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
The Makefile in the root of the source tree provides a rule to easily create a package. It runs all the necessary commands.
TODO:
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.
Package: erlang* esl-erlang
Pin: version 1:20.2-1*
Pin-Priority: 501sudo apt-get install apt-transport-https
deb https://packages.erlang-solutions.com/ubuntu xenial contribcd /tmp
wget https://packages.erlang-solutions.com/ubuntu/erlang_solutions.asc
sudo apt-key add erlang_solutions.ascsudo apt-get updatesudo 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 debianecho 8 > debian/compatSource: 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/docsaeternity-node (1.1.0) unstable; urgency=medium
* Initial Debianization
-- Full Name <[email protected]> Tue, 18 Dec 2018 09:43:00 +0200cd 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 -usdebuild -S -uc -usmake prod-deb-packageThis 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:
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:
;
;
.
.
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.
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 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
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
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.
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
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
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:
"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.
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/aeminerAdd 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
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.
The aeternity system supports user-provided parameters via a JSON- or YAML-formatted config file.
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:
The OS environment variable AETERNITY_CONFIG contains a filename
The Erlang/OTP environment variable -aecore config contains a filename
A file named aeternity.{yaml,json} exists in ${HOME}/.aeternity/aeternity/
If all above checks fail, no user configuration is applied.
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.
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.
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).
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".
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
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.
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.
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.
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.
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 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 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.
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:
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 .
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 .
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.
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.
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.
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.
db_migrate scriptWhen 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.
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.
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:
;
;
.
.
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.
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 .
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 .
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:
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
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 .
The release package comes preconfigured with testnet seed nodes, this is the list:
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
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.
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.
/api.WebSocket API endpoints are specified online;
The intended usage of the user API (HTTP and WebSocket) is documented online.
AE__MEMPOOL='{"tx_ttl":17,"sync_interval":4777}'
AE__MEMPOOL__SYNC_INTERVAL=9999nc -zv $(curl -s https://api.ipify.org) 3015Connection to 203.0.113.27 3015 port [tcp/*] succeeded!fork_management:
network_id: ae_uatchain:
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": 1100peers: []mining:
beneficiary: "beneficiary_pubkey_to_be_replaced"
autostart: truemining:
beneficiary: "beneficiary_pubkey_to_be_replaced"
cuckoo:
edge_bits: 29
miners:
- executable: mean29-avx2
extra_args: -t 14mining:
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: truecd ~/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.yamlOKchain:
db_commit_bypass: true
db_direct_access: falseaenode://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]:3015aenode://pp_QU9CvhAQH56a2kA15tCnWPRJ2srMJW8ZmfbbFTAy7eG4o16Bf@52.10.46.160:3015
aenode://pp_27xmgQ4N1E3QwHyoutLtZsHW5DSW4zneQJ3CxT5JbUejxtFuAu@13.250.162.250:3015
aenode://pp_DMLqy7Zuhoxe2FzpydyQTgwCJ52wouzxtHWsPGo51XDcxc5c8@13.53.161.215:3015sudo apt install autoconf build-essential cmake erlang libsodium-dev libgmp-devMac 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.
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).
See Operation for details.
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:
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.
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.
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
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().
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
git clone https://github.com/aeternity/aeternity.git
cd aeternity
make prod-buildcd _build/prod/rel/aeternity`
bin/aeternity consolerebar3 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
debuggerwxparsetoolsMultiple 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.
aehttpThe 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.
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.
setupaeu_logging_env:expand_lager_log_root()lagerlog_rootsetup:log_dir()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.
aec_db - Stores nodes and all other persistent data; see Aeternity Data management belowaec_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}};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.
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
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
Experience running and maintaining Aeternity nodes
Basic understanding of blockchain concepts
Familiarity with command-line operations
Understanding of YAML configuration files
Access to parent chain (Aeternity) wallet with sufficient funds for pinning
Private key for hyperchain staking operations
Private key for parent chain pinning operations
Initial setup: 2-3 hours
Configuration testing: 1-2 hours
Initial sync time: 2-4 hours (depends on network conditions)
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
Configure parent chain connection
Set up and configure Hyperchain node
Complete validation period (24-48 hours)
Begin network participation
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
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.
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 .
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.
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:
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.
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.
After your Hyperchain node is running and producing blocks, you can begin interacting with the chain. The recommended next steps are:
Connect supporting tools to your chain:
Block explorer (e.g., Aescan)
Wallet interface (e.g., Superhero Wallet or Base app)
Import your test accounts:
You can now begin testing transactions and interactions with your Hyperchain deployment.
Happy Hyperchaining :)
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
The Aeternity Command Line Interface (CLI) is required to manage wallets and interact with smart contracts. Install it using npm:
Two accounts are required for validator operation:
Staker Account: Holds funds for staking in the Hyperchain consensus (child chain)
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.
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!
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!
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!
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).
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:
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:
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.
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.
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.
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.
The consensus algorithms used for validating blocks. Ignored if 'fork_management > network_id' has value 'ae_mainnet' or 'ae_uat'.
Properties (Pattern)
Configuration parameters for the selected consensus algorithm (Hyperchain).
Properties
Example
Configuration for the given consensus algorithm
Properties
Example
Details of how this node will connect to a parent chain if this is a hyperchain.
Properties
Additional Properties: not allowedExample
Details of the parent chain.
Properties
Additional Properties: not allowedExample
Parent chain connection configuration
Properties
Additional Properties: not allowedExample
List of parent chain nodes to poll for new blocks
Items
URL address of the API - ://:@:
Item Type: string
List of hyperchain accounts
Items
Hyperchain account pair
Item Properties
Item Additional Properties: not allowedExample
Hyper chain validator/staking account(s)
Properties
Additional Properties: not allowedExample
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
Item Additional Properties: not allowedExample
Parent chain account for executing pinning (spend) transactions
Properties
Additional Properties: not allowedExample
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.
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.
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.
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 0sync_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:
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
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
object
Hyperchain staking account
pub
string
Public key
Default: ""
priv
string
Private key
Default: ""
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: ""
no
git clone https://github.com/aeternity/hyperchain-starter-kit
cd hyperchain-starter-kit
npm install
npm run devnpm run dev init hc_testchildBlockTime: 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: 1000000000000000000000000npm run dev retrieve-contracts hc_testnpm run dev gen-economy hc_testcat hc_test/economy-unencrypted.yamlfaucet:
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: 3100000000000000000000000000npm run dev gen-node-conf hc_testdocker network create hyperchaindocker 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-rc3curl -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 statusGenesis 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 --versionaecli account create hc_test/wallets/staker.json✔ Enter your password …
Address ak_2hT1UTevtPkEpocjEcbbBi14gS1Ba1unHQBrtXupHnKHxk26kU
Path /path/to/hyperchain-starter-kit/configs/hc_test/wallets/staker.jsonaecli 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 ade11d353b3b02f9602aa7073683a1c2b2a5d95c73b99d8fc40eafa82b02e957df8a07444f1195795a2f92915e655696a3a6a330015c58673ae9f73a1abff374aecli account create hc_test/wallets/pinner.json✔ Enter your password …
Address ak_2CQQctWm267tfHMUcZf7YX5uVHE6T9t3bg4UNpWnpn8qog6MZ
Path /path/to/hyperchain-starter-kit/configs/hc_test/wallets/pinner.jsonaecli 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 4469eb651fa54025ccecf2bfe462a2051e690f7b2bb23ea0f49e6f77a7b1763c02b7910b1a543221b15f14b196ed1ba3212031d817a9c09ac200387ab5631a25curl -s localhost:3013/v3/status | jq -r '.peer_pubkey'pp_2ZX5Pae6a9L5UFm8VcCNsB39pn3EK7ZQZpp3dfF1WDNFXZ9p3bcp hc_test/nodeConfig/aeternity.yaml hc_test/nodeConfig/validator2.yamlpeers:
# 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: truedocker 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-rc3curl -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 configNode http://localhost:3013/ network id hc_test, version 7.3.0-rc3, protocol 6 (Ceres)
Compiler https://v8.compiler.aepps.com/ version 8.0.0aecli 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.jsaecli inspect ak_CLTKb9tdvXGwpgUBW8GytW7kXv9r1eJyY4YtgKKWtKcY3poQfAccount ID ak_CLTKb9tdvXGwpgUBW8GytW7kXv9r1eJyY4YtgKKWtKcY3poQf
Account balance 1000000000000000000000000000000ae
Account nonce 0
No pending transactionsaecli spend hc_test/wallets/treasury.js ak_2hT1UTevtPkEpocjEcbbBi14gS1Ba1unHQBrtXupHnKHxk26kU 1000100aeCost 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) : StakingValidatoraecli 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 1000000aeCost 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_miCfZgeT2fEE9E7XpFikAUReP62QJtZizypJGvw38SYuXJNHNparent_chain:
consensus:
network_id: 'ae_uat'
type: 'AE2AE'
polling:
fetch_interval: 500
nodes:
- 'http://localhost:6013'
start_height: 1064531parent_chain:
parent_epoch_length: 10child_block_time: 3000parent_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 = 600child_epoch_length: 3000stakers:
- 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: truepinners:
- 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: 1000000000000000000000chain:
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: truechain:
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: AE2AEfetch_interval: 500
retry_interval: 1000
cache_size: 200
nodes: []- []pub: ""
priv: ""- []pub: ""
priv: ""
owner: ""