base64 headers
This commit is contained in:
parent
24ed0521c7
commit
9965801258
3 changed files with 14 additions and 11 deletions
|
@ -1,3 +1,4 @@
|
||||||
|
import base64
|
||||||
import os
|
import os
|
||||||
import asyncio
|
import asyncio
|
||||||
import logging
|
import logging
|
||||||
|
@ -308,12 +309,12 @@ class BaseLedger(metaclass=LedgerRegistry):
|
||||||
async def initial_headers_sync(self):
|
async def initial_headers_sync(self):
|
||||||
target = self.network.remote_height
|
target = self.network.remote_height
|
||||||
current = len(self.headers)
|
current = len(self.headers)
|
||||||
get_chunk = partial(self.network.retriable_call, self.network.get_headers, count=2000)
|
get_chunk = partial(self.network.retriable_call, self.network.get_headers, count=2016, b64=True)
|
||||||
chunks = [asyncio.ensure_future(get_chunk(height)) for height in range(current, target, 2000)]
|
chunks = [asyncio.ensure_future(get_chunk(height)) for height in range(current, target, 2016)]
|
||||||
async with self.headers.checkpointed_connector() as connector:
|
async with self.headers.checkpointed_connector() as connector:
|
||||||
for chunk in chunks:
|
for chunk in chunks:
|
||||||
headers = await chunk
|
headers = await chunk
|
||||||
connector.connect(len(self.headers), unhexlify(headers['hex']))
|
connector.connect(len(self.headers), base64.b64decode(headers['base64']))
|
||||||
log.info("Headers sync: %s / %s", connector.tell() // self.headers.header_size, target)
|
log.info("Headers sync: %s / %s", connector.tell() // self.headers.header_size, target)
|
||||||
|
|
||||||
async def update_headers(self, height=None, headers=None, subscription_update=False):
|
async def update_headers(self, height=None, headers=None, subscription_update=False):
|
||||||
|
|
|
@ -239,9 +239,9 @@ class BaseNetwork:
|
||||||
restricted = 0 > height > self.remote_height - 10
|
restricted = 0 > height > self.remote_height - 10
|
||||||
return self.rpc('blockchain.transaction.get_merkle', [tx_hash, height], restricted)
|
return self.rpc('blockchain.transaction.get_merkle', [tx_hash, height], restricted)
|
||||||
|
|
||||||
def get_headers(self, height, count=10000):
|
def get_headers(self, height, count=10000, b64=False):
|
||||||
restricted = height >= self.remote_height - 100
|
restricted = height >= self.remote_height - 100
|
||||||
return self.rpc('blockchain.block.headers', [height, count], restricted)
|
return self.rpc('blockchain.block.headers', [height, count, 0, b64], restricted)
|
||||||
|
|
||||||
# --- Subscribes, history and broadcasts are always aimed towards the master client directly
|
# --- Subscribes, history and broadcasts are always aimed towards the master client directly
|
||||||
def get_history(self, address):
|
def get_history(self, address):
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
# and warranty status of this software.
|
# and warranty status of this software.
|
||||||
|
|
||||||
"""Classes for local RPC server and remote client TCP/SSL servers."""
|
"""Classes for local RPC server and remote client TCP/SSL servers."""
|
||||||
|
import base64
|
||||||
import collections
|
import collections
|
||||||
import asyncio
|
import asyncio
|
||||||
import codecs
|
import codecs
|
||||||
|
@ -1007,7 +1008,7 @@ class ElectrumX(SessionBase):
|
||||||
height: the header's height"""
|
height: the header's height"""
|
||||||
return await self.block_header(height)
|
return await self.block_header(height)
|
||||||
|
|
||||||
async def block_headers(self, start_height, count, cp_height=0):
|
async def block_headers(self, start_height, count, cp_height=0, b64=False):
|
||||||
"""Return count concatenated block headers as hex for the main chain;
|
"""Return count concatenated block headers as hex for the main chain;
|
||||||
starting at start_height.
|
starting at start_height.
|
||||||
|
|
||||||
|
@ -1021,15 +1022,16 @@ class ElectrumX(SessionBase):
|
||||||
max_size = self.MAX_CHUNK_SIZE
|
max_size = self.MAX_CHUNK_SIZE
|
||||||
count = min(count, max_size)
|
count = min(count, max_size)
|
||||||
headers, count = await self.db.read_headers(start_height, count)
|
headers, count = await self.db.read_headers(start_height, count)
|
||||||
result = {'hex': headers.hex(), 'count': count, 'max': max_size}
|
result = {
|
||||||
|
'base64' if b64 else 'hex': base64.b64encode(headers).decode() if b64 else headers.hex(),
|
||||||
|
'count': count,
|
||||||
|
'max': max_size
|
||||||
|
}
|
||||||
if count and cp_height:
|
if count and cp_height:
|
||||||
last_height = start_height + count - 1
|
last_height = start_height + count - 1
|
||||||
result.update(await self._merkle_proof(cp_height, last_height))
|
result.update(await self._merkle_proof(cp_height, last_height))
|
||||||
return result
|
return result
|
||||||
|
|
||||||
async def block_headers_12(self, start_height, count):
|
|
||||||
return await self.block_headers(start_height, count)
|
|
||||||
|
|
||||||
async def block_get_chunk(self, index):
|
async def block_get_chunk(self, index):
|
||||||
"""Return a chunk of block headers as a hexadecimal string.
|
"""Return a chunk of block headers as a hexadecimal string.
|
||||||
|
|
||||||
|
@ -1270,7 +1272,7 @@ class ElectrumX(SessionBase):
|
||||||
handlers.update({
|
handlers.update({
|
||||||
'mempool.get_fee_histogram':
|
'mempool.get_fee_histogram':
|
||||||
self.mempool.compact_fee_histogram,
|
self.mempool.compact_fee_histogram,
|
||||||
'blockchain.block.headers': self.block_headers_12,
|
'blockchain.block.headers': self.block_headers,
|
||||||
'server.ping': self.ping,
|
'server.ping': self.ping,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue