config.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. // Copyright 2016 The go-ethereum Authors
  2. // This file is part of the go-ethereum library.
  3. //
  4. // The go-ethereum library is free software: you can redistribute it and/or modify
  5. // it under the terms of the GNU Lesser General Public License as published by
  6. // the Free Software Foundation, either version 3 of the License, or
  7. // (at your option) any later version.
  8. //
  9. // The go-ethereum library is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. // GNU Lesser General Public License for more details.
  13. //
  14. // You should have received a copy of the GNU Lesser General Public License
  15. // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
  16. package params
  17. import (
  18. "fmt"
  19. "math/big"
  20. "github.com/ethereum/go-ethereum/common"
  21. )
  22. var (
  23. MainnetGenesisHash = common.HexToHash("0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3") // Mainnet genesis hash to enforce below configs on
  24. TestnetGenesisHash = common.HexToHash("0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d") // Testnet genesis hash to enforce below configs on
  25. )
  26. var (
  27. // MainnetChainConfig is the chain parameters to run a node on the main network.
  28. MainnetChainConfig = &ChainConfig{
  29. ChainId: big.NewInt(1),
  30. HomesteadBlock: big.NewInt(1150000),
  31. DAOForkBlock: big.NewInt(1920000),
  32. DAOForkSupport: true,
  33. EIP150Block: big.NewInt(2463000),
  34. EIP150Hash: common.HexToHash("0x2086799aeebeae135c246c65021c82b4e15a2c451340993aacfd2751886514f0"),
  35. EIP155Block: big.NewInt(2675000),
  36. EIP158Block: big.NewInt(2675000),
  37. ByzantiumBlock: big.NewInt(4370000),
  38. Ethash: new(EthashConfig),
  39. }
  40. // TestnetChainConfig contains the chain parameters to run a node on the Ropsten test network.
  41. TestnetChainConfig = &ChainConfig{
  42. ChainId: big.NewInt(3),
  43. HomesteadBlock: big.NewInt(0),
  44. DAOForkBlock: nil,
  45. DAOForkSupport: true,
  46. EIP150Block: big.NewInt(0),
  47. EIP150Hash: common.HexToHash("0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d"),
  48. EIP155Block: big.NewInt(10),
  49. EIP158Block: big.NewInt(10),
  50. ByzantiumBlock: big.NewInt(1700000),
  51. Ethash: new(EthashConfig),
  52. }
  53. // RinkebyChainConfig contains the chain parameters to run a node on the Rinkeby test network.
  54. RinkebyChainConfig = &ChainConfig{
  55. ChainId: big.NewInt(4),
  56. HomesteadBlock: big.NewInt(1),
  57. DAOForkBlock: nil,
  58. DAOForkSupport: true,
  59. EIP150Block: big.NewInt(2),
  60. EIP150Hash: common.HexToHash("0x9b095b36c15eaf13044373aef8ee0bd3a382a5abb92e402afa44b8249c3a90e9"),
  61. EIP155Block: big.NewInt(3),
  62. EIP158Block: big.NewInt(3),
  63. ByzantiumBlock: big.NewInt(1035301),
  64. Clique: &CliqueConfig{
  65. Period: 15,
  66. Epoch: 30000,
  67. },
  68. }
  69. // AllEthashProtocolChanges contains every protocol change (EIPs) introduced
  70. // and accepted by the Ethereum core developers into the Ethash consensus.
  71. //
  72. // This configuration is intentionally not using keyed fields to force anyone
  73. // adding flags to the config to also have to set these fields.
  74. AllEthashProtocolChanges = &ChainConfig{big.NewInt(1337), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(0), new(EthashConfig), nil}
  75. // AllCliqueProtocolChanges contains every protocol change (EIPs) introduced
  76. // and accepted by the Ethereum core developers into the Clique consensus.
  77. //
  78. // This configuration is intentionally not using keyed fields to force anyone
  79. // adding flags to the config to also have to set these fields.
  80. AllCliqueProtocolChanges = &ChainConfig{big.NewInt(1337), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(0), nil, &CliqueConfig{Period: 0, Epoch: 30000}}
  81. TestChainConfig = &ChainConfig{big.NewInt(1), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(0), new(EthashConfig), nil}
  82. TestRules = TestChainConfig.Rules(new(big.Int))
  83. )
  84. // ChainConfig is the core config which determines the blockchain settings.
  85. //
  86. // ChainConfig is stored in the database on a per block basis. This means
  87. // that any network, identified by its genesis block, can have its own
  88. // set of configuration options.
  89. type ChainConfig struct {
  90. ChainId *big.Int `json:"chainId"` // Chain id identifies the current chain and is used for replay protection
  91. HomesteadBlock *big.Int `json:"homesteadBlock,omitempty"` // Homestead switch block (nil = no fork, 0 = already homestead)
  92. DAOForkBlock *big.Int `json:"daoForkBlock,omitempty"` // TheDAO hard-fork switch block (nil = no fork)
  93. DAOForkSupport bool `json:"daoForkSupport,omitempty"` // Whether the nodes supports or opposes the DAO hard-fork
  94. // EIP150 implements the Gas price changes (https://github.com/ethereum/EIPs/issues/150)
  95. EIP150Block *big.Int `json:"eip150Block,omitempty"` // EIP150 HF block (nil = no fork)
  96. EIP150Hash common.Hash `json:"eip150Hash,omitempty"` // EIP150 HF hash (needed for header only clients as only gas pricing changed)
  97. EIP155Block *big.Int `json:"eip155Block,omitempty"` // EIP155 HF block
  98. EIP158Block *big.Int `json:"eip158Block,omitempty"` // EIP158 HF block
  99. ByzantiumBlock *big.Int `json:"byzantiumBlock,omitempty"` // Byzantium switch block (nil = no fork, 0 = already on byzantium)
  100. // Various consensus engines
  101. Ethash *EthashConfig `json:"ethash,omitempty"`
  102. Clique *CliqueConfig `json:"clique,omitempty"`
  103. }
  104. // EthashConfig is the consensus engine configs for proof-of-work based sealing.
  105. type EthashConfig struct{}
  106. // String implements the stringer interface, returning the consensus engine details.
  107. func (c *EthashConfig) String() string {
  108. return "ethash"
  109. }
  110. // CliqueConfig is the consensus engine configs for proof-of-authority based sealing.
  111. type CliqueConfig struct {
  112. Period uint64 `json:"period"` // Number of seconds between blocks to enforce
  113. Epoch uint64 `json:"epoch"` // Epoch length to reset votes and checkpoint
  114. }
  115. // String implements the stringer interface, returning the consensus engine details.
  116. func (c *CliqueConfig) String() string {
  117. return "clique"
  118. }
  119. // String implements the fmt.Stringer interface.
  120. func (c *ChainConfig) String() string {
  121. var engine interface{}
  122. switch {
  123. case c.Ethash != nil:
  124. engine = c.Ethash
  125. case c.Clique != nil:
  126. engine = c.Clique
  127. default:
  128. engine = "unknown"
  129. }
  130. return fmt.Sprintf("{ChainID: %v Homestead: %v DAO: %v DAOSupport: %v EIP150: %v EIP155: %v EIP158: %v Byzantium: %v Engine: %v}",
  131. c.ChainId,
  132. c.HomesteadBlock,
  133. c.DAOForkBlock,
  134. c.DAOForkSupport,
  135. c.EIP150Block,
  136. c.EIP155Block,
  137. c.EIP158Block,
  138. c.ByzantiumBlock,
  139. engine,
  140. )
  141. }
  142. // IsHomestead returns whether num is either equal to the homestead block or greater.
  143. func (c *ChainConfig) IsHomestead(num *big.Int) bool {
  144. return isForked(c.HomesteadBlock, num)
  145. }
  146. // IsDAO returns whether num is either equal to the DAO fork block or greater.
  147. func (c *ChainConfig) IsDAOFork(num *big.Int) bool {
  148. return isForked(c.DAOForkBlock, num)
  149. }
  150. func (c *ChainConfig) IsEIP150(num *big.Int) bool {
  151. return isForked(c.EIP150Block, num)
  152. }
  153. func (c *ChainConfig) IsEIP155(num *big.Int) bool {
  154. return isForked(c.EIP155Block, num)
  155. }
  156. func (c *ChainConfig) IsEIP158(num *big.Int) bool {
  157. return isForked(c.EIP158Block, num)
  158. }
  159. func (c *ChainConfig) IsByzantium(num *big.Int) bool {
  160. return isForked(c.ByzantiumBlock, num)
  161. }
  162. // GasTable returns the gas table corresponding to the current phase (homestead or homestead reprice).
  163. //
  164. // The returned GasTable's fields shouldn't, under any circumstances, be changed.
  165. func (c *ChainConfig) GasTable(num *big.Int) GasTable {
  166. if num == nil {
  167. return GasTableHomestead
  168. }
  169. switch {
  170. case c.IsEIP158(num):
  171. return GasTableEIP158
  172. case c.IsEIP150(num):
  173. return GasTableEIP150
  174. default:
  175. return GasTableHomestead
  176. }
  177. }
  178. // CheckCompatible checks whether scheduled fork transitions have been imported
  179. // with a mismatching chain configuration.
  180. func (c *ChainConfig) CheckCompatible(newcfg *ChainConfig, height uint64) *ConfigCompatError {
  181. bhead := new(big.Int).SetUint64(height)
  182. // Iterate checkCompatible to find the lowest conflict.
  183. var lasterr *ConfigCompatError
  184. for {
  185. err := c.checkCompatible(newcfg, bhead)
  186. if err == nil || (lasterr != nil && err.RewindTo == lasterr.RewindTo) {
  187. break
  188. }
  189. lasterr = err
  190. bhead.SetUint64(err.RewindTo)
  191. }
  192. return lasterr
  193. }
  194. func (c *ChainConfig) checkCompatible(newcfg *ChainConfig, head *big.Int) *ConfigCompatError {
  195. if isForkIncompatible(c.HomesteadBlock, newcfg.HomesteadBlock, head) {
  196. return newCompatError("Homestead fork block", c.HomesteadBlock, newcfg.HomesteadBlock)
  197. }
  198. if isForkIncompatible(c.DAOForkBlock, newcfg.DAOForkBlock, head) {
  199. return newCompatError("DAO fork block", c.DAOForkBlock, newcfg.DAOForkBlock)
  200. }
  201. if c.IsDAOFork(head) && c.DAOForkSupport != newcfg.DAOForkSupport {
  202. return newCompatError("DAO fork support flag", c.DAOForkBlock, newcfg.DAOForkBlock)
  203. }
  204. if isForkIncompatible(c.EIP150Block, newcfg.EIP150Block, head) {
  205. return newCompatError("EIP150 fork block", c.EIP150Block, newcfg.EIP150Block)
  206. }
  207. if isForkIncompatible(c.EIP155Block, newcfg.EIP155Block, head) {
  208. return newCompatError("EIP155 fork block", c.EIP155Block, newcfg.EIP155Block)
  209. }
  210. if isForkIncompatible(c.EIP158Block, newcfg.EIP158Block, head) {
  211. return newCompatError("EIP158 fork block", c.EIP158Block, newcfg.EIP158Block)
  212. }
  213. if c.IsEIP158(head) && !configNumEqual(c.ChainId, newcfg.ChainId) {
  214. return newCompatError("EIP158 chain ID", c.EIP158Block, newcfg.EIP158Block)
  215. }
  216. if isForkIncompatible(c.ByzantiumBlock, newcfg.ByzantiumBlock, head) {
  217. return newCompatError("Byzantium fork block", c.ByzantiumBlock, newcfg.ByzantiumBlock)
  218. }
  219. return nil
  220. }
  221. // isForkIncompatible returns true if a fork scheduled at s1 cannot be rescheduled to
  222. // block s2 because head is already past the fork.
  223. func isForkIncompatible(s1, s2, head *big.Int) bool {
  224. return (isForked(s1, head) || isForked(s2, head)) && !configNumEqual(s1, s2)
  225. }
  226. // isForked returns whether a fork scheduled at block s is active at the given head block.
  227. func isForked(s, head *big.Int) bool {
  228. if s == nil || head == nil {
  229. return false
  230. }
  231. return s.Cmp(head) <= 0
  232. }
  233. func configNumEqual(x, y *big.Int) bool {
  234. if x == nil {
  235. return y == nil
  236. }
  237. if y == nil {
  238. return x == nil
  239. }
  240. return x.Cmp(y) == 0
  241. }
  242. // ConfigCompatError is raised if the locally-stored blockchain is initialised with a
  243. // ChainConfig that would alter the past.
  244. type ConfigCompatError struct {
  245. What string
  246. // block numbers of the stored and new configurations
  247. StoredConfig, NewConfig *big.Int
  248. // the block number to which the local chain must be rewound to correct the error
  249. RewindTo uint64
  250. }
  251. func newCompatError(what string, storedblock, newblock *big.Int) *ConfigCompatError {
  252. var rew *big.Int
  253. switch {
  254. case storedblock == nil:
  255. rew = newblock
  256. case newblock == nil || storedblock.Cmp(newblock) < 0:
  257. rew = storedblock
  258. default:
  259. rew = newblock
  260. }
  261. err := &ConfigCompatError{what, storedblock, newblock, 0}
  262. if rew != nil && rew.Sign() > 0 {
  263. err.RewindTo = rew.Uint64() - 1
  264. }
  265. return err
  266. }
  267. func (err *ConfigCompatError) Error() string {
  268. return fmt.Sprintf("mismatching %s in database (have %d, want %d, rewindto %d)", err.What, err.StoredConfig, err.NewConfig, err.RewindTo)
  269. }
  270. // Rules wraps ChainConfig and is merely syntatic sugar or can be used for functions
  271. // that do not have or require information about the block.
  272. //
  273. // Rules is a one time interface meaning that it shouldn't be used in between transition
  274. // phases.
  275. type Rules struct {
  276. ChainId *big.Int
  277. IsHomestead, IsEIP150, IsEIP155, IsEIP158 bool
  278. IsByzantium bool
  279. }
  280. func (c *ChainConfig) Rules(num *big.Int) Rules {
  281. chainId := c.ChainId
  282. if chainId == nil {
  283. chainId = new(big.Int)
  284. }
  285. return Rules{ChainId: new(big.Int).Set(chainId), IsHomestead: c.IsHomestead(num), IsEIP150: c.IsEIP150(num), IsEIP155: c.IsEIP155(num), IsEIP158: c.IsEIP158(num), IsByzantium: c.IsByzantium(num)}
  286. }