
Security News
Attackers Are Hunting High-Impact Node.js Maintainers in a Coordinated Social Engineering Campaign
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.
python-monerorpc
Advanced tools
DISCLAIMER: The repository that should be worked on is located at the monero-ecosystem.
python-monerorpc is an improved version of python-jsonrpc for Monero (monerod rpc, monero-wallet-rpc).
python-monerorpc was originally forked from python-bitcoinrpc.
It includes the following generic improvements:
AuthServiceProxy object using requests.SessionIt also includes some more specific details:
python-monerorpc communicates with monero over RPC.
That includes:
monerod rpc as well asmonero-wallet-rpc.python-monerorpc takes over the actual HTTP request containing all the necessary headers.
monerod rpc, monero-wallet-rpc).A practical difference:
rpc_connection.getbalance() # -> rpc_connection.get_balance()
rpc_connection.new_method()
The JSONRPCException is thrown in the event of an error.
One exception to that rule is when receiving a JSONDecodeError when converting the response to JSON.
In this case a ValueError including the HTTP response is raised.
This error was not handled before and directly raised a JSONDecodeError. Since JSONDecodeError inherits from ValueError nothing really changes. You should handle ValueError in addition to just JSONRPCException when working with python-monerorpc.
TODO: An improved error handling.
To install python-monerorpc from PyPI using pip you just need to:
$ pip install python-monerorpc
$ python setup.py install --user
Note: This will only install monerorpc. If you also want to install jsonrpc to preserve
backwards compatibility, you have to replace monerorpc with jsonrpc in setup.py and run it again.
Example usage monerod (get info):
from monerorpc.authproxy import AuthServiceProxy, JSONRPCException
# initialisation, rpc_user and rpc_password are set as flags in the cli command
rpc_connection = AuthServiceProxy(service_url='http://{0}:{1}@127.0.0.1:18081/json_rpc'.format(rpc_user, rpc_password))
info = rpc_connection.get_info()
print(info)
# rpc_user and rpc_password can also be left out (testing, develop, not recommended)
rpc_connection = AuthServiceProxy(service_url='http://127.0.0.1:18081/json_rpc')
Example usage monerod (special characters in RPC password).
This is also the recommended way to use passwords containing special characters like some_password#-+.
When both ways are used (username/password in the URL and passed as arguments), the arguments' values will be predominant.
from monerorpc.authproxy import AuthServiceProxy, JSONRPCException
# When leaving rpc_user and rpc_password in the URL,
# you can still pass those values as separate paramaters.
rpc_connection = AuthServiceProxy(service_url='http://127.0.0.1:18081/json_rpc', username=rpc_user, password=rpc_password)
# Or use both ways.
rpc_connection = AuthServiceProxy(service_url='http://{0}@127.0.0.1:18081/json_rpc'.format(rpc_user), password=rpc_password)
Example usage monerod (get network type):
from monerorpc.authproxy import AuthServiceProxy, JSONRPCException
rpc_connection = AuthServiceProxy(service_url='http://{0}:{1}@127.0.0.1:18081/json_rpc'.format(rpc_user, rpc_password))
result = None
network_type = None
try:
result = rpc_connection.get_info()
except (requests.HTTPError,
requests.ConnectionError,
JSONRPCException) as e:
logger.error('RPC Error on getting address' + str(e))
logger.exception(e)
# Check network type
network_type = result.get('nettype')
if not network_type:
raise ValueError('Error with: {0}'.format(result))
print(network_type)
Example usage monerod (on get block hash):
from monerorpc.authproxy import AuthServiceProxy, JSONRPCException
rpc_connection = AuthServiceProxy(service_url='http://{0}:{1}@127.0.0.1:18081/json_rpc'.format(rpc_user, rpc_password))
params = [2]
hash = rpc.on_get_block_hash(params)
print(hash)
Example usage monero-wallet-rpc (get balance):
from monerorpc.authproxy import AuthServiceProxy, JSONRPCException
# initialisation, rpc_user and rpc_password are set as flags in the cli command
rpc_connection = AuthServiceProxy(service_url='http://{0}:{1}@127.0.0.1:18083/json_rpc'.format(rpc_user, rpc_password))
balance = rpc_connection.get_balance()
print(balance)
Example usage monero-wallet-rpc (make transfer):
from monerorpc.authproxy import AuthServiceProxy, JSONRPCException
# initialisation, rpc_user and rpc_password are set as flags in the cli command
rpc_connection = AuthServiceProxy(service_url='http://{0}:{1}@127.0.0.1:18083/json_rpc'.format(rpc_user, rpc_password))
destinations = {"destinations": [{"address": "some_address", "amount": 1}], "mixin": 10}
result = rpc_connection.transfer(destinations)
print(result)
Example usage monero-wallet-rpc (batch):
from monerorpc.authproxy import AuthServiceProxy, JSONRPCException
import pprint
# initialisation, rpc_user and rpc_password are set as flags in the cli command
rpc_connection = AuthServiceProxy(service_url='http://{0}:{1}@127.0.0.1:18083/json_rpc'.format(rpc_user, rpc_password))
# some example batch
params={"account_index":0,"address_indices":[0,1]}
result = rpc.batch_([ ["get_balance"], ["get_balance", params] ])
pprint.pprint(result)
# make transfer and get balance in a batch
destinations = {"destinations": [{"address": "some_address", "amount": 1}], "mixin": 10}
result = rpc.batch_([ ["transfer", destinations], ["get_balance"] ])
pprint.pprint(result)
Logging all RPC calls to stderr:
from monerorpc.authproxy import AuthServiceProxy, JSONRPCException
import logging
logging.basicConfig()
logging.getLogger("MoneroRPC").setLevel(logging.DEBUG)
rpc_connection = AuthServiceProxy(service_url='http://{0}:{1}@127.0.0.1:18081/json_rpc'.format(rpc_user, rpc_password))
print(rpc_connection.get_info())
Produces output on stderr like:
DEBUG:MoneroRPC:-1-> get_info []
DEBUG:MoneroRPC:<-1- {u'result': {u'incoming_connections_count': 0, ...etc }
Possible errors and error codes:
no code
error contained in the RPC response.-341
could not establish a connection, original error: {}-342
missing HTTP response from server-343
missing JSON-RPC result-344
received HTTP status code {}200requirements.txtYou won't ever need this probably - This is helpful when developing.
pip-tools is used to create requirements.txt.
requirements.in where dependencies are set and pinned.requirements.txt, run update_requirements.sh which basically just calls pip-compile.Note:
build_requirements.txt which only contains pip-tools. I found, when working with virtual environments, it is necessary to install pip-tools inside the virtual environment as well. Otherwise pip-sync would install outside the virtual environment.A test and development environment can be created like this:
# Create a virtual environment 'venv'.
python -m venv venv
# Activate the virtual environment 'venv'.
. /venv/bin/activate
# Install 'pip-tools'.
pip install --upgrade -r build_requirements.txt
# Install dependencies.
pip-sync requirements.txt
...
# Deactivate the virtual environment 'venv'.
deactivate
Run unit tests using pytest:
# virtualenv activated (see above)
pytest -s -v --cov monerorpc/ tests.py
Run unit tests on all supported python versions:
tox -q
Run unit tests on a subset of the supported python versions:
tox -q -e py36,py37
Note: The chosen python versions have to be installed on your system.
See also the list of contributors who participated in this project.
FAQs
Enhanced version of python-jsonrpc for Monero (monerod, monero-wallet-rpc).
We found that python-monerorpc demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.