| 
									
										
										
										
											2016-03-01 23:32:43 +01:00
										 |  |  | // Copyright 2016 The go-ethereum Authors | 
					
						
							|  |  |  | // This file is part of the go-ethereum library. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // The go-ethereum library is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  | // it under the terms of the GNU Lesser General Public License as published by | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  | // (at your option) any later version. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // The go-ethereum library is distributed in the hope that it will be useful, | 
					
						
							|  |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
					
						
							|  |  |  | // GNU Lesser General Public License for more details. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // You should have received a copy of the GNU Lesser General Public License | 
					
						
							|  |  |  | // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-20 13:36:29 +02:00
										 |  |  | package params | 
					
						
							| 
									
										
										
										
											2016-03-01 23:32:43 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2016-11-23 13:32:25 +01:00
										 |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2016-03-01 23:32:43 +01:00
										 |  |  | 	"math/big" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-24 11:40:58 +03:00
										 |  |  | 	"github.com/ethereum/go-ethereum/common" | 
					
						
							| 
									
										
										
										
											2016-03-01 23:32:43 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-14 13:03:29 +02:00
										 |  |  | // MainnetChainConfig is the chain parameters to run a node on the main network. | 
					
						
							|  |  |  | var MainnetChainConfig = &ChainConfig{ | 
					
						
							| 
									
										
										
										
											2016-11-16 01:46:40 +02:00
										 |  |  | 	ChainId:        MainNetChainID, | 
					
						
							| 
									
										
										
										
											2016-11-14 13:03:29 +02:00
										 |  |  | 	HomesteadBlock: MainNetHomesteadBlock, | 
					
						
							|  |  |  | 	DAOForkBlock:   MainNetDAOForkBlock, | 
					
						
							|  |  |  | 	DAOForkSupport: true, | 
					
						
							|  |  |  | 	EIP150Block:    MainNetHomesteadGasRepriceBlock, | 
					
						
							|  |  |  | 	EIP150Hash:     MainNetHomesteadGasRepriceHash, | 
					
						
							|  |  |  | 	EIP155Block:    MainNetSpuriousDragon, | 
					
						
							|  |  |  | 	EIP158Block:    MainNetSpuriousDragon, | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // TestnetChainConfig is the chain parameters to run a node on the test network. | 
					
						
							|  |  |  | var TestnetChainConfig = &ChainConfig{ | 
					
						
							| 
									
										
										
										
											2016-11-20 22:32:31 +01:00
										 |  |  | 	ChainId:        big.NewInt(3), | 
					
						
							|  |  |  | 	HomesteadBlock: big.NewInt(0), | 
					
						
							|  |  |  | 	DAOForkBlock:   nil, | 
					
						
							|  |  |  | 	DAOForkSupport: true, | 
					
						
							|  |  |  | 	EIP150Block:    big.NewInt(0), | 
					
						
							|  |  |  | 	EIP150Hash:     common.HexToHash("0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d"), | 
					
						
							|  |  |  | 	EIP155Block:    big.NewInt(10), | 
					
						
							|  |  |  | 	EIP158Block:    big.NewInt(10), | 
					
						
							| 
									
										
										
										
											2016-11-14 13:03:29 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-01 23:32:43 +01:00
										 |  |  | // ChainConfig is the core config which determines the blockchain settings. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // ChainConfig is stored in the database on a per block basis. This means | 
					
						
							|  |  |  | // that any network, identified by its genesis block, can have its own | 
					
						
							|  |  |  | // set of configuration options. | 
					
						
							|  |  |  | type ChainConfig struct { | 
					
						
							| 
									
										
										
										
											2016-11-02 13:44:13 +01:00
										 |  |  | 	ChainId *big.Int `json:"chainId"` // Chain id identifies the current chain and is used for replay protection | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-08 18:48:17 +03:00
										 |  |  | 	HomesteadBlock *big.Int `json:"homesteadBlock"` // Homestead switch block (nil = no fork, 0 = already homestead) | 
					
						
							|  |  |  | 	DAOForkBlock   *big.Int `json:"daoForkBlock"`   // TheDAO hard-fork switch block (nil = no fork) | 
					
						
							|  |  |  | 	DAOForkSupport bool     `json:"daoForkSupport"` // Whether the nodes supports or opposes the DAO hard-fork | 
					
						
							| 
									
										
										
										
											2016-03-01 23:32:43 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-20 13:36:29 +02:00
										 |  |  | 	// EIP150 implements the Gas price changes (https://github.com/ethereum/EIPs/issues/150) | 
					
						
							| 
									
										
										
										
											2016-11-02 13:44:13 +01:00
										 |  |  | 	EIP150Block *big.Int    `json:"eip150Block"` // EIP150 HF block (nil = no fork) | 
					
						
							|  |  |  | 	EIP150Hash  common.Hash `json:"eip150Hash"`  // EIP150 HF hash (fast sync aid) | 
					
						
							| 
									
										
										
										
											2016-10-08 00:23:45 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-02 13:44:13 +01:00
										 |  |  | 	EIP155Block *big.Int `json:"eip155Block"` // EIP155 HF block | 
					
						
							|  |  |  | 	EIP158Block *big.Int `json:"eip158Block"` // EIP158 HF block | 
					
						
							| 
									
										
										
										
											2016-03-01 23:32:43 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-23 13:32:25 +01:00
										 |  |  | // String implements the Stringer interface. | 
					
						
							|  |  |  | func (c *ChainConfig) String() string { | 
					
						
							|  |  |  | 	return fmt.Sprintf("{ChainID: %v Homestead: %v DAO: %v DAOSupport: %v EIP150: %v EIP155: %v EIP158: %v}", | 
					
						
							|  |  |  | 		c.ChainId, | 
					
						
							|  |  |  | 		c.HomesteadBlock, | 
					
						
							|  |  |  | 		c.DAOForkBlock, | 
					
						
							|  |  |  | 		c.DAOForkSupport, | 
					
						
							|  |  |  | 		c.EIP150Block, | 
					
						
							|  |  |  | 		c.EIP155Block, | 
					
						
							|  |  |  | 		c.EIP158Block, | 
					
						
							|  |  |  | 	) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-02 13:44:13 +01:00
										 |  |  | var ( | 
					
						
							|  |  |  | 	TestChainConfig = &ChainConfig{big.NewInt(1), new(big.Int), new(big.Int), true, new(big.Int), common.Hash{}, new(big.Int), new(big.Int)} | 
					
						
							|  |  |  | 	TestRules       = TestChainConfig.Rules(new(big.Int)) | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2016-10-20 13:36:29 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-01 23:32:43 +01:00
										 |  |  | // IsHomestead returns whether num is either equal to the homestead block or greater. | 
					
						
							|  |  |  | func (c *ChainConfig) IsHomestead(num *big.Int) bool { | 
					
						
							| 
									
										
										
										
											2016-07-08 11:43:36 +03:00
										 |  |  | 	if c.HomesteadBlock == nil || num == nil { | 
					
						
							| 
									
										
										
										
											2016-03-01 23:32:43 +01:00
										 |  |  | 		return false | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return num.Cmp(c.HomesteadBlock) >= 0 | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-10-08 00:23:45 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | // GasTable returns the gas table corresponding to the current phase (homestead or homestead reprice). | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // The returned GasTable's fields shouldn't, under any circumstances, be changed. | 
					
						
							| 
									
										
										
										
											2016-10-20 13:36:29 +02:00
										 |  |  | func (c *ChainConfig) GasTable(num *big.Int) GasTable { | 
					
						
							|  |  |  | 	if num == nil { | 
					
						
							|  |  |  | 		return GasTableHomestead | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	switch { | 
					
						
							|  |  |  | 	case c.EIP158Block != nil && num.Cmp(c.EIP158Block) >= 0: | 
					
						
							|  |  |  | 		return GasTableEIP158 | 
					
						
							|  |  |  | 	case c.EIP150Block != nil && num.Cmp(c.EIP150Block) >= 0: | 
					
						
							|  |  |  | 		return GasTableHomesteadGasRepriceFork | 
					
						
							|  |  |  | 	default: | 
					
						
							|  |  |  | 		return GasTableHomestead | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (c *ChainConfig) IsEIP150(num *big.Int) bool { | 
					
						
							|  |  |  | 	if c.EIP150Block == nil || num == nil { | 
					
						
							|  |  |  | 		return false | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return num.Cmp(c.EIP150Block) >= 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-02 13:44:13 +01:00
										 |  |  | func (c *ChainConfig) IsEIP155(num *big.Int) bool { | 
					
						
							|  |  |  | 	if c.EIP155Block == nil || num == nil { | 
					
						
							|  |  |  | 		return false | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return num.Cmp(c.EIP155Block) >= 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-20 13:36:29 +02:00
										 |  |  | func (c *ChainConfig) IsEIP158(num *big.Int) bool { | 
					
						
							|  |  |  | 	if c.EIP158Block == nil || num == nil { | 
					
						
							|  |  |  | 		return false | 
					
						
							| 
									
										
										
										
											2016-10-08 00:23:45 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-10-20 13:36:29 +02:00
										 |  |  | 	return num.Cmp(c.EIP158Block) >= 0 | 
					
						
							| 
									
										
										
										
											2016-10-08 00:23:45 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-11-02 13:44:13 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Rules wraps ChainConfig and is merely syntatic sugar or can be used for functions | 
					
						
							|  |  |  | // that do not have or require information about the block. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // Rules is a one time interface meaning that it shouldn't be used in between transition | 
					
						
							|  |  |  | // phases. | 
					
						
							|  |  |  | type Rules struct { | 
					
						
							|  |  |  | 	ChainId                                   *big.Int | 
					
						
							|  |  |  | 	IsHomestead, IsEIP150, IsEIP155, IsEIP158 bool | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (c *ChainConfig) Rules(num *big.Int) Rules { | 
					
						
							|  |  |  | 	return Rules{ChainId: new(big.Int).Set(c.ChainId), IsHomestead: c.IsHomestead(num), IsEIP150: c.IsEIP150(num), IsEIP155: c.IsEIP155(num), IsEIP158: c.IsEIP158(num)} | 
					
						
							|  |  |  | } |