add Monero daemon version checking

This commit is contained in:
The MMGen Project 2023-03-24 20:31:11 +00:00
commit cbdd9db75e
Signed by: mmgen
GPG key ID: 3F8B1861E32B7DA2
7 changed files with 54 additions and 8 deletions

View file

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

View file

@ -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'

View file

@ -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(

View file

@ -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,

View file

@ -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,

View file

@ -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:

View file

@ -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')