mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-10 22:18:54 +01:00
Merge bitcoin/bitcoin#26415: rpc,rest,zmq: faster getblock, NotifyBlock and rest_block by reading raw block
e710cefd57rest: read raw block in rest_block and deserialize for json (Andrew Toth)95ce0783a6rpc: read raw block in getblock and deserialize for verbosity > 0 (Andrew Toth)0865ab8712test: check more details on zmq raw block response (Andrew Toth)38265cc14ezmq: read raw block with ReadRawBlockFromDisk (Andrew Toth)da338aada7blockstorage: check nPos in ReadRawBlockFromDisk before seeking back (Andrew Toth) Pull request description: For the `getblock` endpoint with `verbosity=0`, the `rest_block` REST endpoint for `bin` and `hex`, and zmq `NotifyBlock` we don't have to deserialize the block since we're just sending the raw data. This PR uses `ReadRawBlockFromDisk` instead of `ReadBlockFromDisk` to serve these requests, and only deserializes for `verbosity > 0` and `json` REST requests. See benchmarks in https://github.com/bitcoin/bitcoin/pull/26684. Benchmarked using ApacheBench. Requesting block 750,000 in binary 10k times on a single core (set `-rest=1` in config): `ab -n 10000 -c 1 "http://127.0.0.1:8332/rest/block/0000000000000000000592a974b1b9f087cb77628bb4a097d5c2c11b3476a58e.bin"` On master, mean time 15ms. On this branch, mean time 1ms. For RPC ``` echo '{"jsonrpc": "1.0", "id": "curltest", "method": "getblock", "params": ["0000000000000000000592a974b1b9f087cb77628bb4a097d5c2c11b3476a58e", 0]}' > /tmp/data.json ab -p /tmp/data.json -n 1000 -c 1 -A user:password "http://127.0.0.1:8332/" ``` On master, mean time 32ms On this branch, mean time 13ms ACKs for top commit: achow101: re-ACKe710cefd57Tree-SHA512: 4cea13c7b563b2139d041b1fdcfdb793c8cc688654ae08db07e7ee6b875c5e582b8185db3ae603abbfb06d2164724f29205774620b48c493726b991999af289e
This commit is contained in:
@@ -5,6 +5,7 @@
|
||||
"""Test the ZMQ notification interface."""
|
||||
import struct
|
||||
from time import sleep
|
||||
from io import BytesIO
|
||||
|
||||
from test_framework.address import (
|
||||
ADDRESS_BCRT1_P2WSH_OP_TRUE,
|
||||
@@ -17,6 +18,7 @@ from test_framework.blocktools import (
|
||||
)
|
||||
from test_framework.test_framework import BitcoinTestFramework
|
||||
from test_framework.messages import (
|
||||
CBlock,
|
||||
hash256,
|
||||
tx_from_hex,
|
||||
)
|
||||
@@ -201,8 +203,13 @@ class ZMQTest (BitcoinTestFramework):
|
||||
assert_equal(tx.hash, txid.hex())
|
||||
|
||||
# Should receive the generated raw block.
|
||||
block = rawblock.receive()
|
||||
assert_equal(genhashes[x], hash256_reversed(block[:80]).hex())
|
||||
hex = rawblock.receive()
|
||||
block = CBlock()
|
||||
block.deserialize(BytesIO(hex))
|
||||
assert block.is_valid()
|
||||
assert_equal(block.vtx[0].hash, tx.hash)
|
||||
assert_equal(len(block.vtx), 1)
|
||||
assert_equal(genhashes[x], hash256_reversed(hex[:80]).hex())
|
||||
|
||||
# Should receive the generated block hash.
|
||||
hash = hashblock.receive().hex()
|
||||
|
||||
Reference in New Issue
Block a user