From 2b93843d86532db3d6b530daf15c04fde0b73eba Mon Sep 17 00:00:00 2001
From: Taylor Gerring <taylor.gerring@gmail.com>
Date: Wed, 25 Mar 2015 12:09:55 +0100
Subject: [PATCH] Improve protocol version reporting

---
 eth/backend.go | 39 +++++++++++++++++++++------------------
 rpc/api.go     |  6 +++++-
 xeth/xeth.go   | 12 ++++++++++--
 3 files changed, 36 insertions(+), 21 deletions(-)

diff --git a/eth/backend.go b/eth/backend.go
index 3f7f7c2cb..cf5bd2c92 100644
--- a/eth/backend.go
+++ b/eth/backend.go
@@ -138,11 +138,12 @@ type Ethereum struct {
 
 	// logger logger.LogSystem
 
-	Mining          bool
-	DataDir         string
-	version         string
-	protocolVersion int
-	networkId       int
+	Mining        bool
+	DataDir       string
+	clientVersion string
+	ethVersionId  int
+	netVersionId  int
+	shhVersionId  int
 }
 
 func New(config *Config) (*Ethereum, error) {
@@ -177,16 +178,16 @@ func New(config *Config) (*Ethereum, error) {
 	servlogger.Infof("Protocol Version: %v, Network Id: %v", config.ProtocolVersion, config.NetworkId)
 
 	eth := &Ethereum{
-		shutdownChan:    make(chan bool),
-		blockDb:         blockDb,
-		stateDb:         stateDb,
-		extraDb:         extraDb,
-		eventMux:        &event.TypeMux{},
-		accountManager:  config.AccountManager,
-		DataDir:         config.DataDir,
-		version:         config.Name, // TODO should separate from Name
-		protocolVersion: config.ProtocolVersion,
-		networkId:       config.NetworkId,
+		shutdownChan:   make(chan bool),
+		blockDb:        blockDb,
+		stateDb:        stateDb,
+		extraDb:        extraDb,
+		eventMux:       &event.TypeMux{},
+		accountManager: config.AccountManager,
+		DataDir:        config.DataDir,
+		clientVersion:  config.Name, // TODO should separate from Name
+		ethVersionId:   config.ProtocolVersion,
+		netVersionId:   config.NetworkId,
 	}
 
 	eth.chainManager = core.NewChainManager(blockDb, stateDb, eth.EventMux())
@@ -195,6 +196,7 @@ func New(config *Config) (*Ethereum, error) {
 	eth.blockProcessor = core.NewBlockProcessor(stateDb, extraDb, eth.pow, eth.txPool, eth.chainManager, eth.EventMux())
 	eth.chainManager.SetProcessor(eth.blockProcessor)
 	eth.whisper = whisper.New()
+	eth.shhVersionId = int(eth.whisper.Version())
 	eth.miner = miner.New(eth, eth.pow, config.MinerThreads)
 
 	hasBlock := eth.chainManager.HasBlock
@@ -324,9 +326,10 @@ func (s *Ethereum) IsListening() bool                    { return true } // Alwa
 func (s *Ethereum) PeerCount() int                       { return s.net.PeerCount() }
 func (s *Ethereum) Peers() []*p2p.Peer                   { return s.net.Peers() }
 func (s *Ethereum) MaxPeers() int                        { return s.net.MaxPeers }
-func (s *Ethereum) Version() string                      { return s.version }
-func (s *Ethereum) ProtocolVersion() int                 { return s.protocolVersion }
-func (s *Ethereum) NetworkId() int                       { return s.networkId }
+func (s *Ethereum) ClientVersion() string                { return s.clientVersion }
+func (s *Ethereum) EthVersion() int                      { return s.ethVersionId }
+func (s *Ethereum) NetVersion() int                      { return s.netVersionId }
+func (s *Ethereum) ShhVersion() int                      { return s.shhVersionId }
 
 // Start the ethereum
 func (s *Ethereum) Start() error {
diff --git a/rpc/api.go b/rpc/api.go
index 37ab6e1d4..aa5b54199 100644
--- a/rpc/api.go
+++ b/rpc/api.go
@@ -49,7 +49,7 @@ func (api *EthereumApi) Close() {
 }
 
 func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error {
-	// Spec at https://github.com/ethereum/wiki/wiki/Generic-JSON-RPC
+	// Spec at https://github.com/ethereum/wiki/wiki/JSON-RPC
 	rpclogger.Debugf("%s %s", req.Method, req.Params)
 
 	switch req.Method {
@@ -68,6 +68,8 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
 	case "net_peerCount":
 		v := api.xeth().PeerCount()
 		*reply = common.ToHex(big.NewInt(int64(v)).Bytes())
+	case "eth_version":
+		*reply = api.xeth().EthVersion()
 	case "eth_coinbase":
 		// TODO handling of empty coinbase due to lack of accounts
 		res := api.xeth().Coinbase()
@@ -406,6 +408,8 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
 
 		res, _ := api.db.Get([]byte(args.Database + args.Key))
 		*reply = common.ToHex(res)
+	case "shh_version":
+		*reply = api.xeth().WhisperVersion()
 	case "shh_post":
 		args := new(WhisperMessageArgs)
 		if err := json.Unmarshal(req.Params, &args); err != nil {
diff --git a/xeth/xeth.go b/xeth/xeth.go
index 8296e61bb..36c9979f4 100644
--- a/xeth/xeth.go
+++ b/xeth/xeth.go
@@ -221,12 +221,20 @@ func (self *XEth) IsMining() bool {
 	return self.backend.IsMining()
 }
 
+func (self *XEth) EthVersion() string {
+	return string(self.backend.EthVersion())
+}
+
 func (self *XEth) NetworkVersion() string {
-	return string(self.backend.ProtocolVersion())
+	return string(self.backend.NetVersion())
+}
+
+func (self *XEth) WhisperVersion() string {
+	return string(self.backend.ShhVersion())
 }
 
 func (self *XEth) ClientVersion() string {
-	return self.backend.Version()
+	return self.backend.ClientVersion()
 }
 
 func (self *XEth) SetMining(shouldmine bool) bool {
-- 
GitLab