diff --git a/cmd/ethereum/main.go b/cmd/ethereum/main.go index 3b952dd79..94c62b97a 100644 --- a/cmd/ethereum/main.go +++ b/cmd/ethereum/main.go @@ -136,8 +136,8 @@ The Ethereum JavaScript VM exposes a node admin interface as well as the DAPP Ja utils.RPCPortFlag, utils.UnencryptedKeysFlag, utils.VMDebugFlag, - - //utils.VMTypeFlag, + utils.ProtocolVersionFlag, + utils.NetworkIdFlag, } // missing: @@ -327,7 +327,7 @@ GO: %s OS: %s GOPATH=%s GOROOT=%s -`, ClientIdentifier, Version, eth.ProtocolVersion, eth.NetworkId, runtime.Version(), runtime.GOOS, os.Getenv("GOPATH"), runtime.GOROOT()) +`, ClientIdentifier, Version, c.GlobalInt(utils.ProtocolVersionFlag.Name), c.GlobalInt(utils.NetworkIdFlag.Name), runtime.Version(), runtime.GOOS, os.Getenv("GOPATH"), runtime.GOROOT()) } // hashish returns true for strings that look like hashes. diff --git a/cmd/mist/main.go b/cmd/mist/main.go index 1c51233e3..fab651b22 100644 --- a/cmd/mist/main.go +++ b/cmd/mist/main.go @@ -28,8 +28,8 @@ import ( "github.com/codegangsta/cli" "github.com/ethereum/go-ethereum/cmd/utils" - "github.com/ethereum/go-ethereum/eth" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/eth" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/ui/qt/webengine" "github.com/obscuren/qml" @@ -66,6 +66,8 @@ func init() { utils.RPCListenAddrFlag, utils.RPCPortFlag, utils.JSpathFlag, + utils.ProtocolVersionFlag, + utils.NetworkIdFlag, } } diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index 42256903e..1d8f6382b 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -11,11 +11,11 @@ import ( "github.com/codegangsta/cli" "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/eth" "github.com/ethereum/go-ethereum/ethdb" - "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/p2p/nat" @@ -70,25 +70,23 @@ func NewApp(version, usage string) *cli.App { var ( // General settings - /* - VMTypeFlag = cli.IntFlag{ - Name: "vm", - Usage: "Virtual Machine type: 0 is standard VM, 1 is debug VM", - } - */ - UnlockedAccountFlag = cli.StringFlag{ - Name: "unlock", - Usage: "Unlock a given account untill this programs exits (address:password)", - } - VMDebugFlag = cli.BoolFlag{ - Name: "vmdebug", - Usage: "Virtual Machine debug output", - } DataDirFlag = cli.StringFlag{ Name: "datadir", Usage: "Data directory to be used", Value: common.DefaultDataDir(), } + ProtocolVersionFlag = cli.IntFlag{ + Name: "protocolversion", + Usage: "ETH protocol version", + Value: eth.ProtocolVersion, + } + NetworkIdFlag = cli.IntFlag{ + Name: "networkid", + Usage: "Network Id", + Value: eth.NetworkId, + } + + // miner settings MinerThreadsFlag = cli.IntFlag{ Name: "minerthreads", Usage: "Number of miner threads", @@ -98,11 +96,18 @@ var ( Name: "mine", Usage: "Enable mining", } + + // key settings UnencryptedKeysFlag = cli.BoolFlag{ Name: "unencrypted-keys", Usage: "disable private key disk encryption (for testing)", } + UnlockedAccountFlag = cli.StringFlag{ + Name: "unlock", + Usage: "Unlock a given account untill this programs exits (address:password)", + } + // logging and debug settings LogFileFlag = cli.StringFlag{ Name: "logfile", Usage: "Send log output to a file", @@ -117,6 +122,10 @@ var ( Usage: `"std" or "raw"`, Value: "std", } + VMDebugFlag = cli.BoolFlag{ + Name: "vmdebug", + Usage: "Virtual Machine debug output", + } // RPC settings RPCEnabledFlag = cli.BoolFlag{ @@ -198,21 +207,23 @@ func GetNodeKey(ctx *cli.Context) (key *ecdsa.PrivateKey) { func MakeEthConfig(clientID, version string, ctx *cli.Context) *eth.Config { return ð.Config{ - Name: common.MakeName(clientID, version), - DataDir: ctx.GlobalString(DataDirFlag.Name), - LogFile: ctx.GlobalString(LogFileFlag.Name), - LogLevel: ctx.GlobalInt(LogLevelFlag.Name), - LogFormat: ctx.GlobalString(LogFormatFlag.Name), - MinerThreads: ctx.GlobalInt(MinerThreadsFlag.Name), - AccountManager: GetAccountManager(ctx), - VmDebug: ctx.GlobalBool(VMDebugFlag.Name), - MaxPeers: ctx.GlobalInt(MaxPeersFlag.Name), - Port: ctx.GlobalString(ListenPortFlag.Name), - NAT: GetNAT(ctx), - NodeKey: GetNodeKey(ctx), - Shh: true, - Dial: true, - BootNodes: ctx.GlobalString(BootnodesFlag.Name), + Name: common.MakeName(clientID, version), + DataDir: ctx.GlobalString(DataDirFlag.Name), + ProtocolVersion: ctx.GlobalInt(ProtocolVersionFlag.Name), + NetworkId: ctx.GlobalInt(NetworkIdFlag.Name), + LogFile: ctx.GlobalString(LogFileFlag.Name), + LogLevel: ctx.GlobalInt(LogLevelFlag.Name), + LogFormat: ctx.GlobalString(LogFormatFlag.Name), + MinerThreads: ctx.GlobalInt(MinerThreadsFlag.Name), + AccountManager: GetAccountManager(ctx), + VmDebug: ctx.GlobalBool(VMDebugFlag.Name), + MaxPeers: ctx.GlobalInt(MaxPeersFlag.Name), + Port: ctx.GlobalString(ListenPortFlag.Name), + NAT: GetNAT(ctx), + NodeKey: GetNodeKey(ctx), + Shh: true, + Dial: true, + BootNodes: ctx.GlobalString(BootnodesFlag.Name), } } diff --git a/eth/backend.go b/eth/backend.go index 16be8793a..c1aa28f3c 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -38,7 +38,10 @@ var ( ) type Config struct { - Name string + Name string + ProtocolVersion int + NetworkId int + DataDir string LogFile string LogLevel int @@ -135,14 +138,16 @@ type Ethereum struct { logger logger.LogSystem - Mining bool - DataDir string - version string + Mining bool + DataDir string + version string + ProtocolVersion int + NetworkId int } func New(config *Config) (*Ethereum, error) { // Boostrap database - servlogger := logger.New(config.DataDir, config.LogFile, config.LogLevel, config.LogFormat) + servlogsystem := logger.New(config.DataDir, config.LogFile, config.LogLevel, config.LogFormat) newdb := config.NewDB if newdb == nil { @@ -159,13 +164,14 @@ func New(config *Config) (*Ethereum, error) { extraDb, err := ethdb.NewLDBDatabase(path.Join(config.DataDir, "extra")) // Perform database sanity checks - d, _ := blockDb.Get([]byte("ProtocolVersion")) - protov := common.NewValue(d).Uint() - if protov != ProtocolVersion && protov != 0 { + d, _ := extraDb.Get([]byte("ProtocolVersion")) + protov := int(common.NewValue(d).Uint()) + if protov != config.ProtocolVersion && protov != 0 { path := path.Join(config.DataDir, "blockchain") - return nil, fmt.Errorf("Database version mismatch. Protocol(%d / %d). `rm -rf %s`", protov, ProtocolVersion, path) + return nil, fmt.Errorf("Database version mismatch. Protocol(%d / %d). `rm -rf %s`", protov, config.ProtocolVersion, path) } - saveProtocolVersion(extraDb) + saveProtocolVersion(extraDb, config.ProtocolVersion) + servlogger.Infof("Protocol Version: %v, Network Id: %v", config.ProtocolVersion, config.NetworkId) eth := &Ethereum{ shutdownChan: make(chan bool), @@ -173,7 +179,7 @@ func New(config *Config) (*Ethereum, error) { stateDb: stateDb, extraDb: extraDb, eventMux: &event.TypeMux{}, - logger: servlogger, + logger: servlogsystem, accountManager: config.AccountManager, DataDir: config.DataDir, version: config.Name, // TODO should separate from Name @@ -195,7 +201,8 @@ func New(config *Config) (*Ethereum, error) { if err != nil { return nil, err } - ethProto := EthProtocol(eth.txPool, eth.chainManager, eth.blockPool) + + ethProto := EthProtocol(config.ProtocolVersion, config.NetworkId, eth.txPool, eth.chainManager, eth.blockPool) protocols := []p2p.Protocol{ethProto} if config.Shh { protocols = append(protocols, eth.whisper.Protocol()) @@ -412,11 +419,11 @@ func (self *Ethereum) blockBroadcastLoop() { } } -func saveProtocolVersion(db common.Database) { +func saveProtocolVersion(db common.Database, protov int) { d, _ := db.Get([]byte("ProtocolVersion")) protocolVersion := common.NewValue(d).Uint() if protocolVersion == 0 { - db.Put([]byte("ProtocolVersion"), common.NewValue(ProtocolVersion).Bytes()) + db.Put([]byte("ProtocolVersion"), common.NewValue(protov).Bytes()) } } diff --git a/eth/protocol.go b/eth/protocol.go index e368bbec5..1d4322886 100644 --- a/eth/protocol.go +++ b/eth/protocol.go @@ -5,9 +5,9 @@ import ( "fmt" "math/big" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/errs" - "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/rlp" @@ -59,13 +59,15 @@ var errorToString = map[int]string{ // ethProtocol represents the ethereum wire protocol // instance is running on each peer type ethProtocol struct { - txPool txPool - chainManager chainManager - blockPool blockPool - peer *p2p.Peer - id string - rw p2p.MsgReadWriter - errors *errs.Errors + txPool txPool + chainManager chainManager + blockPool blockPool + peer *p2p.Peer + id string + rw p2p.MsgReadWriter + errors *errs.Errors + protocolVersion int + networkId int } // backend is the interface the ethereum protocol backend should implement @@ -102,27 +104,29 @@ type getBlockHashesMsgData struct { // main entrypoint, wrappers starting a server running the eth protocol // use this constructor to attach the protocol ("class") to server caps // the Dev p2p layer then runs the protocol instance on each peer -func EthProtocol(txPool txPool, chainManager chainManager, blockPool blockPool) p2p.Protocol { +func EthProtocol(protocolVersion, networkId int, txPool txPool, chainManager chainManager, blockPool blockPool) p2p.Protocol { return p2p.Protocol{ Name: "eth", - Version: ProtocolVersion, + Version: uint(protocolVersion), Length: ProtocolLength, Run: func(peer *p2p.Peer, rw p2p.MsgReadWriter) error { - return runEthProtocol(txPool, chainManager, blockPool, peer, rw) + return runEthProtocol(protocolVersion, networkId, txPool, chainManager, blockPool, peer, rw) }, } } // the main loop that handles incoming messages // note RemovePeer in the post-disconnect hook -func runEthProtocol(txPool txPool, chainManager chainManager, blockPool blockPool, peer *p2p.Peer, rw p2p.MsgReadWriter) (err error) { +func runEthProtocol(protocolVersion, networkId int, txPool txPool, chainManager chainManager, blockPool blockPool, peer *p2p.Peer, rw p2p.MsgReadWriter) (err error) { id := peer.ID() self := ðProtocol{ - txPool: txPool, - chainManager: chainManager, - blockPool: blockPool, - rw: rw, - peer: peer, + txPool: txPool, + chainManager: chainManager, + blockPool: blockPool, + rw: rw, + peer: peer, + protocolVersion: protocolVersion, + networkId: networkId, errors: &errs.Errors{ Package: "ETH", Errors: errorToString, @@ -290,8 +294,8 @@ func (self *ethProtocol) statusMsg() p2p.Msg { td, currentBlock, genesisBlock := self.chainManager.Status() return p2p.NewMsg(StatusMsg, - uint32(ProtocolVersion), - uint32(NetworkId), + uint32(self.protocolVersion), + uint32(self.networkId), td, currentBlock, genesisBlock, @@ -329,12 +333,12 @@ func (self *ethProtocol) handleStatus() error { return self.protoError(ErrGenesisBlockMismatch, "%x (!= %x)", status.GenesisBlock, genesisBlock) } - if status.NetworkId != NetworkId { - return self.protoError(ErrNetworkIdMismatch, "%d (!= %d)", status.NetworkId, NetworkId) + if int(status.NetworkId) != self.networkId { + return self.protoError(ErrNetworkIdMismatch, "%d (!= %d)", status.NetworkId, self.networkId) } - if ProtocolVersion != status.ProtocolVersion { - return self.protoError(ErrProtocolVersionMismatch, "%d (!= %d)", status.ProtocolVersion, ProtocolVersion) + if int(status.ProtocolVersion) != self.protocolVersion { + return self.protoError(ErrProtocolVersionMismatch, "%d (!= %d)", status.ProtocolVersion, self.protocolVersion) } self.peer.Infof("Peer is [eth] capable (%d/%d). TD=%v H=%x\n", status.ProtocolVersion, status.NetworkId, status.TD, status.CurrentBlock[:4]) diff --git a/eth/protocol_test.go b/eth/protocol_test.go index a2b59f117..4bed71663 100644 --- a/eth/protocol_test.go +++ b/eth/protocol_test.go @@ -9,10 +9,10 @@ import ( "testing" "time" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/errs" - "github.com/ethereum/go-ethereum/common" ethlogger "github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/p2p/discover" @@ -235,8 +235,8 @@ func TestStatusMsgErrors(t *testing.T) { var status statusMsgData eth.checkMsg(0, StatusMsg, &status) // first outgoing msg should be StatusMsg if status.TD.Cmp(td) != 0 || - status.ProtocolVersion != ProtocolVersion || - status.NetworkId != NetworkId || + status.ProtocolVersion != eth.ProtocolVersion || + status.NetworkId != eth.NetworkId || status.TD.Cmp(td) != 0 || bytes.Compare(status.CurrentBlock, currentBlock) != 0 || bytes.Compare(status.GenesisBlock, genesis) != 0 {