Releases: btclib-org/bitcoin-core-rpc
Release list
v2026.8.8
The body of a failure is bounded by timeout now, not only by
MAX_ERROR_BODY_SIZE and the socket's own per-recv timeout. A peer
answering with an error page that keeps sending, one octet inside that
per-packet limit at a time, no longer holds the call for as long as the
page takes to trickle in; it fails at the deadline instead, the way an
answer already did.
http_request's own timeout is refused now where it used to reach the
socket layer unexamined: a 0, a negative number, True or a NaN
raises BtcRpcTypeError or BtcRpcValueError here, the same refusal
BitcoinCoreRpcClient already gave its own timeout and
request_timeout. Only a caller passing a transport of their own
straight to http_request reaches this — BitcoinCoreRpcClient never
forwarded a bad one to begin with.
v2026.8.7
The timeout now bounds the whole exchange rather than each socket
operation, so a call cannot outlive it by waiting on a peer that keeps
sending. If you fetch replies large enough to take longer than the timeout
to arrive — a big getblock over a slow link — raise request_timeout
for those calls; they would previously have succeeded under a timeout that
did not cover them.
Requests carry User-Agent: bitcoin-core-rpc, where they carried urllib's
Python-urllib/3.x. Anything filtering or logging by user agent in front
of a node — a reverse proxy, a WAF rule — sees the new string.
Three arguments are refused now where they used to fail later or not at
all: a transport that is not callable, a cookie_path that is no path,
and a wallet_name that is not a string. Each raises BtcRpcTypeError at
the call that supplied it. The one to check for is
for_wallet(b"hot") — bytes built an endpoint before, from a name that
was never spelled that way, and is refused now.
Code matching on the text of a size refusal has three to update: they name
max_body_size now, as more than the max_body_size of 8001024 rather
than more than the 8001024 allowed.
Two exported functions are renamed, with no alias left behind:
core_chain_from_network is chain_from_network and
network_from_core_chain is network_from_chain. They take and return
what they always did.
Code matching on the text of an error has one more to check: an unknown
chain is now refused as unknown Core chain: ... everywhere, including
BitcoinCoreRpcClient.from_chain, which said unknown chain: ....
v2026.8.6
The first release. There is nothing to act on and nothing to migrate.
pip install bitcoin-core-rpc, or copy bitcoin_core_rpc/__init__.py — one
source file with nothing but the standard library behind it, which is what
makes the second option a supported one rather than a fallback.
If you are coming from python-bitcoinrpc's AuthServiceProxy, or from the
copy of it Bitcoin Core's test framework maintains, this is not a drop-in
replacement and does not try to be. Four things change, and the module
docstring spells each of them out with the reason:
- a method is an argument, not an attribute
- credentials leave the url
JSONRPCExceptionbecomes three exceptionsbatch_has no equivalent; a loop overcallis the replacement