Browse Source

add Monero daemon version checking

The MMGen Project 2 years ago
parent
commit
cbdd9db75e

+ 1 - 1
mmgen/data/version

@@ -1 +1 @@
-13.3.dev37
+13.3.dev38

+ 1 - 1
mmgen/proto/xmr/daemon.py

@@ -20,7 +20,7 @@ from ...util import list_gen,die
 from ...daemon import CoinDaemon,RPCDaemon,_nw,_dd
 
 class monero_daemon(CoinDaemon):
-	daemon_data = _dd('Monero', 'N/A', 'N/A')
+	daemon_data = _dd('Monero', 18002000, '0.18.2.0-release')
 	networks = ('mainnet','testnet')
 	exec_fn = 'monerod'
 	testnet_dir = 'stagenet'

+ 16 - 1
mmgen/proto/xmr/rpc.py

@@ -12,6 +12,8 @@
 proto.xmr.rpc: Monero base protocol RPC client class
 """
 
+import re
+from ...globalvars import g
 from ...rpc import RPCClient,IPPort,auth_data
 
 class MoneroRPCClient(RPCClient):
@@ -29,7 +31,8 @@ class MoneroRPCClient(RPCClient):
 			passwd,
 			test_connection       = True,
 			proxy                 = None,
-			daemon                = None ):
+			daemon                = None,
+			ignore_daemon_version = False ):
 
 		self.proto = proto
 
@@ -54,6 +57,18 @@ class MoneroRPCClient(RPCClient):
 
 		self.daemon = daemon
 
+		if test_connection:
+			# https://github.com/monero-project/monero src/rpc/rpc_version_str.cpp
+			self.daemon_version_str = self.call_raw('getinfo')['version']
+			self.daemon_version = sum(
+				int(m) * (1000 ** n) for n,m in
+					enumerate(reversed(re.match(r'(\d+)\.(\d+)\.(\d+)\.(\d+)',self.daemon_version_str).groups()))
+			)
+			if self.daemon and self.daemon_version > self.daemon.coind_version:
+				self.handle_unsupported_daemon_version(
+					proto.name,
+					ignore_daemon_version or g.ignore_daemon_version )
+
 	def call(self,method,*params,**kwargs):
 		assert params == (), f'{type(self).__name__}.call() accepts keyword arguments only'
 		return self.process_http_resp(self.backend.run_noasync(

+ 17 - 3
mmgen/tool/rpc.py

@@ -32,9 +32,23 @@ class tool_cmd(tool_cmd_base):
 
 	async def daemon_version(self):
 		"print coin daemon version"
-		from ..rpc import rpc_init
-		r = await rpc_init( self.proto, ignore_daemon_version=True )
-		return f'{r.daemon.coind_name} version {r.daemon_version} ({r.daemon_version_str})'
+		from ..daemon import CoinDaemon
+		from ..globalvars import g
+		d = CoinDaemon( proto=self.proto, test_suite=g.test_suite )
+		if self.proto.base_proto == 'Monero':
+			from ..proto.xmr.rpc import MoneroRPCClient
+			r = MoneroRPCClient(
+				proto  = self.proto,
+				daemon = d,
+				host   = d.host,
+				port   = d.rpc_port,
+				user   = None,
+				passwd = None,
+				ignore_daemon_version = True )
+		else:
+			from ..rpc import rpc_init
+			r = await rpc_init( self.proto, ignore_daemon_version=True )
+		return f'{d.coind_name} version {r.daemon_version} ({r.daemon_version_str})'
 
 	async def getbalance(self,
 			minconf: 'minimum number of confirmations' = 1,

+ 5 - 0
mmgen/xmrwallet.py

@@ -628,8 +628,11 @@ class MoneroWalletOps:
 			super().__init__(uarg_tuple,uopt_tuple)
 
 			host,port = uopt.daemon.split(':') if uopt.daemon else ('localhost',self.wd.daemon_port)
+
+			from .daemon import CoinDaemon
 			self.dc = MoneroRPCClient(
 				proto  = self.proto,
+				daemon = CoinDaemon('xmr'),
 				host   = host,
 				port   = int(port),
 				user   = None,
@@ -930,6 +933,7 @@ class MoneroWalletOps:
 				m = re.fullmatch(uarg_info['tx_relay_daemon'].pat,uopt.tx_relay_daemon,re.ASCII)
 				host,port = m[1].split(':')
 				proxy = m[2]
+				md = None
 			else:
 				from .daemon import CoinDaemon
 				md = CoinDaemon('xmr',test_suite=g.test_suite)
@@ -938,6 +942,7 @@ class MoneroWalletOps:
 
 			self.dc = MoneroRPCClient(
 				proto  = self.proto,
+				daemon = md,
 				host   = host,
 				port   = int(port),
 				user   = None,

+ 5 - 0
test/test_py_d/ts_xmrwallet.py

@@ -46,6 +46,7 @@ class TestSuiteXMRWallet(TestSuiteBase):
 	socks_port = 49237
 
 	cmd_group = (
+		('daemon_version',            'checking daemon version'),
 		('gen_kafiles',               'generating key-address files'),
 		('create_wallets_miner',      'creating Monero wallets (Miner)'),
 		('mine_initial_coins',        'mining initial coins'),
@@ -266,6 +267,10 @@ class TestSuiteXMRWallet(TestSuiteBase):
 
 	# cmd_group methods
 
+	def daemon_version(self):
+		rpc_port = self.users['miner'].md.rpc_port
+		return self.spawn( 'mmgen-tool', ['--coin=xmr', f'--rpc-port={rpc_port}', 'daemon_version'] )
+
 	def gen_kafiles(self):
 		for user,data in self.users.items():
 			if not data.kal_range:

+ 9 - 2
test/unit_tests_d/ut_rpc.py

@@ -44,14 +44,20 @@ def cfg_file_auth_test(proto,d,bad_auth=False):
 
 def print_daemon_info(rpc):
 
-	msg(f"""
+	if rpc.proto.base_proto == 'Monero':
+		msg(f"""
+    DAEMON VERSION: {rpc.daemon_version} [{rpc.daemon_version_str}]
+    NETWORK:        {rpc.proto.coin} {rpc.proto.network.upper()}
+		""".rstrip())
+	else:
+		msg(f"""
     DAEMON VERSION: {rpc.daemon_version} [{rpc.daemon_version_str}]
     CAPS:           {rpc.caps}
     NETWORK:        {rpc.proto.coin} {rpc.proto.network.upper()}
     CHAIN:          {rpc.chain}
     BLOCKCOUNT:     {rpc.blockcount}
     CUR_DATE:       {rpc.cur_date} [{make_timestr(rpc.cur_date)}]
-	""".rstrip())
+		""".rstrip())
 
 	if rpc.proto.base_proto == 'Bitcoin':
 		def fmt_dict(d):
@@ -168,6 +174,7 @@ class unit_tests:
 				passwd = None,
 				daemon = md,
 			)
+			print_daemon_info(rpc)
 			rpc.call_raw('get_height')
 			rpc.call('get_last_block_header')