All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog (modification: no type change headlines) and this project adheres to Semantic Versioning.
This release completes on Clique/PoA support (see also Clique/PoA related changes in v2.0.0
), see PR #1032. The chain configuration files (e.g. chains/goerli.json
) are extended by a consensus algorithm-specific config parameter section, here is a sample consensus
parameter section, note that the config
parameter dict must be named after the consensus algorithm:
{
"consensus": {
"type": "poa",
"algorithm": "clique",
"clique": {
"period": 15,
"epoch": 30000
}
}
}
For now this is done in a backwards-compatible way and the consensus
parameter section is still marked as optional. You nevertheless might want to add this section already to your custom chain files - even if you don't make usage of the parameters - to remain compatible in the future.
The new parameter section is complemented by a new Common.consensusConfig()
function to request these parameters in addition to the Common.consensusType()
and Common.consensusAlgorithm()
methods introduced in v2.0.0
.
There is now a more convenient and flexible way to integrate custom chains into Common instances complementing the existing Common.fromCustomChain()
static constructor, see PR #1034.
This new way adds a new customChains
constructor option and can be used as following:
import myCustomChain1 from './[PATH]/myCustomChain1.json'
import myCustomChain2 from './[PATH]/myCustomChain2.json'
// Add two custom chains, initial mainnet activation
const common1 = new Common({ chain: 'mainnet', customChains: [ myCustomChain1, myCustomChain2 ] })
// Somewhat later down the road...
common1.setChain('customChain1')
// Add two custom chains, activate customChain1
const common1 = new Common({ chain: 'customChain1', customChains: [ myCustomChain1, myCustomChain2 ] })
The README section on working with custom chains has been significantly expanded along the way and is a recommended read if you use common for custom chain initialization.
EIP-1459 introduces a way to discover nodes for an Ethereum network connection via DNS. This release adds a new optional chain config file parameter dnsNetworks
and an associated method Common.dnsNetworks()
to request DNS networks for a chain.
EIP-2565 introduces a new algorithm for ModExp precompile gas cost calculation. A new EIP file eips/2565.json
has been added along the work on PR #1026 with respective parameter updates.
Common
is now implemented as anEventEmitter
and emits ahardforkChanged
event upon a HF change, PR #1112- New
Common.isActivatedEIP()
method, PR #1125 - Updated
Goerli
bootnodes, PR #1031
Attention! This new version is part of a series of EthereumJS releases all moving to a new scoped package name format. In this case the library is renamed as follows:
ethereumjs-common
->@ethereumjs/common
Please update your library references accordingly or install with:
npm i @ethereumjs/common
Breaking: The constructor has been changed to require an options dict to be passed, PR #863
Example:
import Common from '@ethereumjs/common'
const common = new Common({ chain: 'mainnet', hardfork: 'muirGlacier' })
EIPs are now native citizens within the Common
library, see PRs #856, #869 and #872. Supported EIPs have their own configuration file like the eips/2537.json file for the BLS precompile EIP and EIP settings can be activated by passing supported EIP numbers to the constructor:
const c = new Common({ chain: 'mainnet', eips: [2537] })
The following EIPs are initially supported within this release:
EIPs provided are then activated and parameters requested with Common.param()
being present in these EIPs take precedence over the setting from the latest hardfork.
There are two new utility functions which return hardfork and EIP values respectively:
Common.paramByHardfork()
Common.paramByEIP()
Breaking: It is now not possible any more to pass a dedicated HF setting to Common.param()
. Please update your code to explicitly use Common.paramByHardfork()
for requesting a parameter for a HF deviating from the HF currently set within your Common
instance.
For setting and requesting active EIPs there is Common.setEIPs()
and Common.eips()
added to the mix.
There is also a new EIP-based hardfork file format which delegates parameter definition to dedicated EIP files (see PR #876). This is in preparation for an upcoming Yolo v2
testnet integration.
Side note: with this new structural setup it gets now possible for all EIPs still implicitly contained within the hardfork files to be extracted as an EIP parameter set within its own dedicated EIP file (which can then be activated via the eip
parameter on initialization) without loosing on functionality. If you have a need there feel free to open a PR!
Remaining gas base fees which still resided in the VM have been moved over to Common
along PR #806.
Gas fees for all hardforks up to MuirGlacier
are now completely present within the Common
library.
There is a new Common.forkHash()
method returning pre-calculated Forkhash values or alternatively use the internal Common._calcForkHash()
implementation to calculate a forkhash on the fly.
Forkhashes are used to uniquely identify a set of hardforks passed to be able to better differentiate between different dedicated chains. This is used for the Eth/64
devp2p protocol update and specificed in EIP-2124 to help improve the devp2p networking stack.
The following block and hardfork related utility functions have been added with PRs #863 and #805 respectively:
setHardforkByBlockNumber()
- Sets the hardfork determined by the block number passednextHardforkBlock()
- Returns the next HF block for a HF provided or setisNextHardforkBlock()
- Some convenience additional utility method, matching the existinghardforkBlock()
/isHardforkBlock()
method setuphardforkForForkHash()
- Returns the data available for a HF given a specific forkHash
The default hardfork has been added as an accessible readonly property DEFAULT_HARDFORK
, PR #863. This setting is used starting with the latest major releases of the monorepo libraries like the VM to keep the HF setting in sync across the different libraries.
Current default hardfork is set to istanbul
, PR #906.
We significantly updated our internal tool and CI setup along the work on PR #913 with an update to ESLint
from TSLint
for code linting and formatting and the introduction of a new build setup.
Packages now target ES2017
for Node.js builds (the main
entrypoint from package.json
) and introduce a separate ES5
build distributed along using the browser
directive as an entrypoint, see PR #921. This will result in performance benefits for Node.js consumers, see here for a releated discussion.
Changes and Refactoring
- Added consensus information to chains, new functions
Common.consensusType()
for consensus type access ("pow" or "poa") andCommon.consensusAlgorithm()
to get the associated algorithm or protocol (e.g. "ethash" PoW algorithm or "clique" PoA protocol), see PR #937 - Removed old
consensus
andfinality
fields, PR #758 - Removed old
casper
andsharding
fields, PR #762 - Updated
ethereumjs-util
to v7, PR #748
This is the first release candidate towards a final library release, see beta.2 and especially beta.1 release notes for an overview on the full changes since the last publicly released version.
No changes since beta.2
release.
This is the second beta release towards a final library release, see beta.1 release notes for an overview on the full changes since the last publicly released version.
- Added consensus information to chains, new functions
Common.consensusType()
for consensus type access ("pow" or "poa") andCommon.consensusAlgorithm()
to get the associated algorithm or protocol (e.g. "ethash" PoW algorithm or "clique" PoA protocol), see PR #937
Attention! This new version is part of a series of EthereumJS releases all moving to a new scoped package name format. In this case the library is renamed as follows:
ethereumjs-common
->@ethereumjs/common
Please update your library references accordingly or install with:
npm i @ethereumjs/common
Breaking: The constructor has been changed to require an options dict to be passed, PR #863
Example:
import Common from '@ethereumjs/common'
const common = new Common({ chain: 'mainnet', hardfork: 'muirGlacier' })
EIPs are now native citizens within the Common
library, see PRs #856, #869 and #872. Supported EIPs have their own configuration file like the eips/2537.json file for the BLS precompile EIP and EIP settings can be activated by passing supported EIP numbers to the constructor:
const c = new Common({ chain: 'mainnet', eips: [2537] })
The following EIPs are initially supported within this release:
EIPs provided are then activated and parameters requested with Common.param()
being present in these EIPs take precedence over the setting from the latest hardfork.
There are two new utility functions which return hardfork and EIP values respectively:
Common.paramByHardfork()
Common.paramByEIP()
Breaking: It is now not possible any more to pass a dedicated HF setting to Common.param()
. Please update your code to explicitly use Common.paramByHardfork()
for requesting a parameter for a HF deviating from the HF currently set within your Common
instance.
For setting and requesting active EIPs there is Common.setEIPs()
and Common.eips()
added to the mix.
There is also a new EIP-based hardfork file format which delegates parameter definition to dedicated EIP files (see PR #876). This is in preparation for an upcoming Yolo v2
testnet integration.
Side note: with this new structural setup it gets now possible for all EIPs still implicitly contained within the hardfork files to be extracted as an EIP parameter set within its own dedicated EIP file (which can then be activated via the eip
parameter on initialization) without loosing on functionality. If you have a need there feel free to open a PR!
Remaining gas base fees which still resided in the VM have been moved over to Common
along PR #806.
Gas fees for all hardforks up to MuirGlacier
are now completely present within the Common
library.
There is a new Common.forkHash()
method returning pre-calculated Forkhash values or alternatively use the internal Common._calcForkHash()
implementation to calculate a forkhash on the fly.
Forkhashes are used to uniquely identify a set of hardforks passed to be able to better differentiate between different dedicated chains. This is used for the Eth/64
devp2p protocol update and specificed in EIP-2124 to help improve the devp2p networking stack.
The following block and hardfork related utility functions have been added with PRs #863 and #805 respectively:
setHardforkByBlockNumber()
- Sets the hardfork determined by the block number passednextHardforkBlock()
- Returns the next HF block for a HF provided or setisNextHardforkBlock()
- Some convenience additional utility method, matching the existinghardforkBlock()
/isHardforkBlock()
method setuphardforkForForkHash()
- Returns the data available for a HF given a specific forkHash
The default hardfork has been added as an accessible readonly property DEFAULT_HARDFORK
, PR #863. This setting is used starting with the latest major releases of the monorepo libraries like the VM to keep the HF setting in sync across the different libraries.
Current default hardfork is set to istanbul
, PR #906.
We significantly updated our internal tool and CI setup along the work on
PR #913 with an update to ESLint
from TSLint
for code linting and formatting and the introduction of a new build setup.
Packages now target ES2017
for Node.js builds (the main
entrypoint from package.json
) and introduce
a separate ES5
build distributed along using the browser
directive as an entrypoint, see
PR #921. This will result
in performance benefits for Node.js consumers, see here for a releated discussion.
Changes and Refactoring
- Removed old
consensus
andfinality
fields, PR #758 - Removed old
casper
andsharding
fields, PR #762 - Updated
ethereumjs-util
to v7, PR #748
This is a maintenance release.
- Updates Goerli chain ID, PR #792.
1.5.1 - 2020-05-04
This is a maintenance release.
- Updated bootnode definitions, and more strict checking for their values. PR #718
1.5.0 - 2019-12-10
Support for the MuirGlacier
HF
(EIP-2387) scheduled for January 2020
delaying the difficulty bomb.
Changes:
- Implemented EIP-2384 Difficulty Bomb Delay, PR #75
- Consistent genesis account balance format, converted from decimal to hex where necessary, PR #73
1.4.0 - 2019-11-05
First release with full Istanbul
support regarding parameter introductions/updates
and HF block numbers set for supported chains.
Relevant PRs:
- Added
Istanbul
block numbers formainnet
,goerli
andrinkeby
, PR #68 - Added
Petersburg
andConstantinople
fork blocks torinkeby
, PR #71 - Added
EIP-2200
(rebalance net-metered SSTORE gas costs) parameters forIstanbul
, PR #65
Other noteworthy changes:
1.3.2 - 2019-09-04
Istanbul Updates:
- Added gas parameters for
EIP-2200
(rebalanced net-metered SSTORE gas costs), PR #65 - Renamed hardfork
blake2bRound
(->blake2Round
) parameter, PR #63
Other Changes:
- Fixed
Kovan
genesis state, PR #66
1.3.1 - 2019-08-08
Added missing Istanbul gas costs for:
- ChainID opcode (EIP-1344, as base param in
hardforks/chainstart.json
) - Blake2b precompile (EIP-2129/152)
- Calldata gas cost reduction (EIP-2028)
See PR #58.
1.3.0 - 2019-06-18
- Add a static factory method
Custom.forCustomChain
to make working with custom/private chains easier.
1.2.1 - 2019-06-03
- Added
Istanbul
HF candidate EIP-1108 (DRAFT
) updatedalt_bn128
precompile gas costs (seehardforks/istanbul.json
)
1.2.0 - 2019-05-27
DRAFT Istanbul Hardfork Support
Draft support for the upcoming Istanbul
hardfork planned for October 2019,
use istanbul
as constructor hardfork
parameter to activate. Parameters
relevant to new EIPs accepted for the HF will be added along subsequent 1.2.x
releases, the finalized HF version will be released along a subsequent 1.x.0
release (likely 1.3.0
).
See new hardforks/istanbul.json
file as well as PR
#51.
1.1.0 - 2019-02-04
Petersburg Hardfork Support
This release now supports the new Petersburg
(aka
constantinopleFix
) HF removing support for EIP 1283. Petersburg
is conceptualized
within the library as a separate delta-containing HF, only removing EIP 1283
support and containing nothing else. It should therefore always be applied
together with the Constantinople
HF, either by using the same block number to
update on both (mainnet
scenario) or applying subsequently on subsequent
block numbers (ropsten
scenario).
HF related changes (from PR #44):
- New
hardforks/petersburg.json
HF file constantinople
andpetersburg
block numbers forropsten
andmainnet
- Updated tests, new
petersburg
related tests
Launched/Final Goerli Configuration Support
The release now supports the final Goerli cross-client testnet configuration.
Goerli related changes (from PR #48):
- Updated
chains/goerli.json
configuration file (chainId
-> 5,networkId
-> 5, genesis parameters) - HF block numbers up to
petersburg
hardfork - Updated bootstrap nodes
- Updated
genesisStates/goerli.json
genesis state - Test updates
Other Changes
- Fixed a bug in
hardforkGteHardfork()
where non-active hardforks were considered equal tochainstart
whenonlyActive
is passed, see PR #44 - Use CLI scripts from ethereumjs-config in package.json, PR #43
1.0.0 - 2019-01-23
First TypeScript
based release of the library (for details see
PR #38),
so release coming with type declaration files and additional type safety! 😄
Library Import
TypeScript
handles ES6
transpilation
a bit differently (at the
end: cleaner) than babel
so require
syntax of the library slightly changes to:
const Common = require('ethereumjs-common').default
Genesis State Import/Usage
Import path and usage API of genesis state has changed, see also the docs on this, PR #39:
const mainnetGenesisState = require('ethereumjs-common/dist/genesisStates/mainnet')
Or by accessing dynamically:
const genesisStates = require('ethereumjs-common/dist/genesisStates')
const mainnetGenesisState = genesisStates.genesisStateByName('mainnet')
const mainnetGenesisState = genesisStates.genesisStateById(1) // alternative via network Id
Removed hybridCasper
(draft) hardfork
Not likely that anyone has used this, but just in case:
The once anticipated hybridCasper
(draft) hardfork has been removed from the
list of hardforks, see PR #37
0.6.1 - 2018-11-28
- Experimental support for the Goerli cross-client
PoA
testnet (chains/goerli.json
), see PR #31 - Unified hex-prefixing (so always prefixing with
0x
) of account addresses in genesis files (fixes an issue with state root computation on other libraries), see PR #32
0.6.0 - 2018-10-11
Parameter support for the Constantinople
hardfork (see hardforks/constantinople.json
):
0.5.0 - 2018-08-27
- Introduces support for private chains by allowing to pass a custom dictionary as the
chain
parameter in the constructor or thesetChain()
method as an alternative to just passing one of the predefinedchain
String
names (e.g.mainnet
,ropsten
), PR #24
0.4.1 - 2018-08-13
- Added
timestamp
field to genesis definitions in chain files, set forRinkeby
andnull
for other chains, PR #21 - Updated
Ropsten
bootstrap nodes, PR #20
0.4.0 - 2018-06-20
- Remove leftover ...Gas postfix for some gas prices (e.g.
ecAddGas
->ecAdd
) to be consistent with overall gas price naming
0.3.1 - 2018-05-28
- Added two alias functions
activeOnBlock()
andgteHardfork()
when hardfork is set for convenience, PR #15 - Added option to dynamically choose genesis state (see
README
), PR #15
0.3.0 - 2018-05-25
- Allow functions like
hardforkIsActiveOnBlock()
- where hardfork is provided as param - also to be run on hardfork set for greater flexibility/comfort, PR #13 - New
hardforkGteHardfork()
method for HF order comparisons, PR #13
0.2.0 - 2018-05-14
- New optional initialization parameter
allowedHardforks
, this allows for cleaner client library implementations by preventing undefined behaviour, PR #10 - Added
activeHardfork()
function to get latest active HF for chain or block, PR #11
0.1.1 - 2018-05-09
- Remove dynamic require to prevent browserify issue, PR #8
0.1.0 - 2018-05-09
- Initial version, this library succeeds the ethereum/common library, being more future-proof through a better structured design
Features:
- Easy chain-/HF-based parameter access
- No parameter changes on library updates (
c.param('gasPrices', 'ecAddGas', 'byzantium')
will always return the same value) - Ease experimentation/research by allowing to include future HF parameters (already included as draft:
constantinople
andhybridCasper
) without breaking current installations - Improved structure for parameter access (mainly through topics like
gasPrices
,pow
,sharding
) for better readability/developer overview - See README and API Docs for a more in-depth feature overview and usage instructions