Merge pull request #1581 from obscuren/olympic
cmd, core, eth: support for the olympic network
This commit is contained in:
		@@ -280,6 +280,7 @@ JavaScript API. See https://github.com/ethereum/go-ethereum/wiki/Javascipt-Conso
 | 
				
			|||||||
		utils.BootnodesFlag,
 | 
							utils.BootnodesFlag,
 | 
				
			||||||
		utils.DataDirFlag,
 | 
							utils.DataDirFlag,
 | 
				
			||||||
		utils.BlockchainVersionFlag,
 | 
							utils.BlockchainVersionFlag,
 | 
				
			||||||
 | 
							utils.OlympicFlag,
 | 
				
			||||||
		utils.CacheFlag,
 | 
							utils.CacheFlag,
 | 
				
			||||||
		utils.JSpathFlag,
 | 
							utils.JSpathFlag,
 | 
				
			||||||
		utils.ListenPortFlag,
 | 
							utils.ListenPortFlag,
 | 
				
			||||||
@@ -346,6 +347,9 @@ func main() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func run(ctx *cli.Context) {
 | 
					func run(ctx *cli.Context) {
 | 
				
			||||||
	utils.CheckLegalese(ctx.GlobalString(utils.DataDirFlag.Name))
 | 
						utils.CheckLegalese(ctx.GlobalString(utils.DataDirFlag.Name))
 | 
				
			||||||
 | 
						if ctx.GlobalBool(utils.OlympicFlag.Name) {
 | 
				
			||||||
 | 
							utils.InitOlympic()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cfg := utils.MakeEthConfig(ClientIdentifier, nodeNameVersion, ctx)
 | 
						cfg := utils.MakeEthConfig(ClientIdentifier, nodeNameVersion, ctx)
 | 
				
			||||||
	ethereum, err := eth.New(cfg)
 | 
						ethereum, err := eth.New(cfg)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,6 +21,7 @@ import (
 | 
				
			|||||||
	"bufio"
 | 
						"bufio"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"io"
 | 
						"io"
 | 
				
			||||||
 | 
						"math/big"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
	"os/signal"
 | 
						"os/signal"
 | 
				
			||||||
	"regexp"
 | 
						"regexp"
 | 
				
			||||||
@@ -32,6 +33,7 @@ import (
 | 
				
			|||||||
	"github.com/ethereum/go-ethereum/eth"
 | 
						"github.com/ethereum/go-ethereum/eth"
 | 
				
			||||||
	"github.com/ethereum/go-ethereum/logger"
 | 
						"github.com/ethereum/go-ethereum/logger"
 | 
				
			||||||
	"github.com/ethereum/go-ethereum/logger/glog"
 | 
						"github.com/ethereum/go-ethereum/logger/glog"
 | 
				
			||||||
 | 
						"github.com/ethereum/go-ethereum/params"
 | 
				
			||||||
	"github.com/ethereum/go-ethereum/rlp"
 | 
						"github.com/ethereum/go-ethereum/rlp"
 | 
				
			||||||
	"github.com/peterh/liner"
 | 
						"github.com/peterh/liner"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@@ -143,6 +145,15 @@ func StartEthereum(ethereum *eth.Ethereum) {
 | 
				
			|||||||
	}()
 | 
						}()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func InitOlympic() {
 | 
				
			||||||
 | 
						params.DurationLimit = big.NewInt(8)
 | 
				
			||||||
 | 
						params.GenesisGasLimit = big.NewInt(3141592)
 | 
				
			||||||
 | 
						params.MinGasLimit = big.NewInt(125000)
 | 
				
			||||||
 | 
						params.MaximumExtraDataSize = big.NewInt(1024)
 | 
				
			||||||
 | 
						NetworkIdFlag.Value = 0
 | 
				
			||||||
 | 
						core.BlockReward = big.NewInt(1.5e+18)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func FormatTransactionData(data string) []byte {
 | 
					func FormatTransactionData(data string) []byte {
 | 
				
			||||||
	d := common.StringToByteFunc(data, func(s string) (ret []byte) {
 | 
						d := common.StringToByteFunc(data, func(s string) (ret []byte) {
 | 
				
			||||||
		slice := regexp.MustCompile("\\n|\\s").Split(s, 1000000000)
 | 
							slice := regexp.MustCompile("\\n|\\s").Split(s, 1000000000)
 | 
				
			||||||
@@ -203,6 +214,11 @@ func ImportChain(chain *core.ChainManager, fn string) error {
 | 
				
			|||||||
			} else if err != nil {
 | 
								} else if err != nil {
 | 
				
			||||||
				return fmt.Errorf("at block %d: %v", n, err)
 | 
									return fmt.Errorf("at block %d: %v", n, err)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
								// don't import first block
 | 
				
			||||||
 | 
								if b.NumberU64() == 0 {
 | 
				
			||||||
 | 
									i--
 | 
				
			||||||
 | 
									continue
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			blocks[i] = &b
 | 
								blocks[i] = &b
 | 
				
			||||||
			n++
 | 
								n++
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -218,6 +234,7 @@ func ImportChain(chain *core.ChainManager, fn string) error {
 | 
				
			|||||||
				batch, blocks[0].Hash().Bytes()[:4], blocks[i-1].Hash().Bytes()[:4])
 | 
									batch, blocks[0].Hash().Bytes()[:4], blocks[i-1].Hash().Bytes()[:4])
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if _, err := chain.InsertChain(blocks[:i]); err != nil {
 | 
							if _, err := chain.InsertChain(blocks[:i]); err != nil {
 | 
				
			||||||
			return fmt.Errorf("invalid block %d: %v", n, err)
 | 
								return fmt.Errorf("invalid block %d: %v", n, err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -131,6 +131,10 @@ var (
 | 
				
			|||||||
		Usage: "Megabytes of memory allocated to internal caching",
 | 
							Usage: "Megabytes of memory allocated to internal caching",
 | 
				
			||||||
		Value: 0,
 | 
							Value: 0,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						OlympicFlag = cli.BoolFlag{
 | 
				
			||||||
 | 
							Name:  "olympic",
 | 
				
			||||||
 | 
							Usage: "Use olympic style protocol",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// miner settings
 | 
						// miner settings
 | 
				
			||||||
	MinerThreadsFlag = cli.IntFlag{
 | 
						MinerThreadsFlag = cli.IntFlag{
 | 
				
			||||||
@@ -402,6 +406,7 @@ func MakeEthConfig(clientID, version string, ctx *cli.Context) *eth.Config {
 | 
				
			|||||||
		MaxPeers:                ctx.GlobalInt(MaxPeersFlag.Name),
 | 
							MaxPeers:                ctx.GlobalInt(MaxPeersFlag.Name),
 | 
				
			||||||
		MaxPendingPeers:         ctx.GlobalInt(MaxPendingPeersFlag.Name),
 | 
							MaxPendingPeers:         ctx.GlobalInt(MaxPendingPeersFlag.Name),
 | 
				
			||||||
		Port:                    ctx.GlobalString(ListenPortFlag.Name),
 | 
							Port:                    ctx.GlobalString(ListenPortFlag.Name),
 | 
				
			||||||
 | 
							Olympic:                 ctx.GlobalBool(OlympicFlag.Name),
 | 
				
			||||||
		NAT:                     MakeNAT(ctx),
 | 
							NAT:                     MakeNAT(ctx),
 | 
				
			||||||
		NatSpec:                 ctx.GlobalBool(NatspecEnabledFlag.Name),
 | 
							NatSpec:                 ctx.GlobalBool(NatspecEnabledFlag.Name),
 | 
				
			||||||
		Discovery:               !ctx.GlobalBool(NoDiscoverFlag.Name),
 | 
							Discovery:               !ctx.GlobalBool(NoDiscoverFlag.Name),
 | 
				
			||||||
@@ -444,6 +449,13 @@ func MakeChain(ctx *cli.Context) (chain *core.ChainManager, blockDB, stateDB, ex
 | 
				
			|||||||
	if extraDB, err = ethdb.NewLDBDatabase(filepath.Join(datadir, "extra"), cache); err != nil {
 | 
						if extraDB, err = ethdb.NewLDBDatabase(filepath.Join(datadir, "extra"), cache); err != nil {
 | 
				
			||||||
		Fatalf("Could not open database: %v", err)
 | 
							Fatalf("Could not open database: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if ctx.GlobalBool(OlympicFlag.Name) {
 | 
				
			||||||
 | 
							InitOlympic()
 | 
				
			||||||
 | 
							_, err := core.WriteTestNetGenesisBlock(stateDB, blockDB, 42)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								glog.Fatalln(err)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	eventMux := new(event.TypeMux)
 | 
						eventMux := new(event.TypeMux)
 | 
				
			||||||
	pow := ethash.New()
 | 
						pow := ethash.New()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -78,6 +78,7 @@ type Config struct {
 | 
				
			|||||||
	GenesisNonce int
 | 
						GenesisNonce int
 | 
				
			||||||
	GenesisFile  string
 | 
						GenesisFile  string
 | 
				
			||||||
	GenesisBlock *types.Block // used by block tests
 | 
						GenesisBlock *types.Block // used by block tests
 | 
				
			||||||
 | 
						Olympic      bool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	BlockChainVersion  int
 | 
						BlockChainVersion  int
 | 
				
			||||||
	SkipBcVersionCheck bool // e.g. blockchain export
 | 
						SkipBcVersionCheck bool // e.g. blockchain export
 | 
				
			||||||
@@ -302,6 +303,14 @@ func New(config *Config) (*Ethereum, error) {
 | 
				
			|||||||
		glog.V(logger.Info).Infof("Successfully wrote genesis block. New genesis hash = %x\n", block.Hash())
 | 
							glog.V(logger.Info).Infof("Successfully wrote genesis block. New genesis hash = %x\n", block.Hash())
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if config.Olympic {
 | 
				
			||||||
 | 
							_, err := core.WriteTestNetGenesisBlock(stateDb, blockDb, 42)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							glog.V(logger.Error).Infoln("Starting Olympic network")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// This is for testing only.
 | 
						// This is for testing only.
 | 
				
			||||||
	if config.GenesisBlock != nil {
 | 
						if config.GenesisBlock != nil {
 | 
				
			||||||
		core.WriteBlock(blockDb, config.GenesisBlock)
 | 
							core.WriteBlock(blockDb, config.GenesisBlock)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user