Improve wallet sync performance

This commit is contained in:
Mariano Sorgente 2020-09-15 20:06:43 +09:00 committed by Gene Hoffman
parent 966b5bb989
commit 6f183f7eee
6 changed files with 51 additions and 18 deletions

View File

@ -5262,7 +5262,7 @@
}
},
"electron-osx-sign": {
"version": "github:electron/electron-osx-sign#877226b5198f2ed9661129ea56a1ea048c4c55ae",
"version": "github:electron/electron-osx-sign#6ba45b2deec3f4f3629010645f92e6506df133ee",
"from": "github:electron/electron-osx-sign#master",
"dev": true,
"requires": {

View File

@ -613,6 +613,7 @@ const Farmer = props => {
const classes = props.classes;
const checkRewards = useCallback(async () => {
console.log("Checking rewards");
let totalChia = BigInt(0);
let biggestHeight = 0;
for (let wallet of wallets) {
@ -624,6 +625,7 @@ const Farmer = props => {
if (tx.additions.length < 1) {
continue;
}
console.log("Checking tx", tx);
// Height here is filled into the whole 256 bits (32 bytes) of the parent
let hexHeight = arr_to_hex(
big_int_to_array(BigInt(tx.confirmed_at_index), 32)

View File

@ -55,7 +55,7 @@ from src.util.hash import std_hash
from src.util.ints import uint32, uint64, uint128
from src.util.merkle_set import MerkleSet
from src.util.path import mkdir, path_from_root
from src.types.peer_info import PeerInfo, TimestampedPeerInfo
from src.types.peer_info import PeerInfo
OutboundMessageGenerator = AsyncGenerator[OutboundMessage, None]
@ -1725,11 +1725,7 @@ class FullNode:
) -> OutboundMessageGenerator:
if self.global_connections is None:
return
tmp_connected_peers = self.global_connections.get_full_node_peerinfos()
connected_peers = [
TimestampedPeerInfo(peer.host, peer.port, uint64(0))
for peer in tmp_connected_peers
]
connected_peers = self.global_connections.get_full_node_peerinfos()
unconnected_peers = self.global_connections.peers.get_peers(
recent_threshold=24 * 60 * 60
)

View File

@ -177,6 +177,24 @@ class WalletPuzzleStore:
return row is not None
async def one_of_puzzle_hashes_exists(self, puzzle_hashes: List[bytes32]) -> bool:
"""
Checks if one of the passed puzzle_hashes is present in the db.
"""
if len(puzzle_hashes) < 1:
return False
puzzle_hashes_db = tuple([ph.hex() for ph in puzzle_hashes])
formatted_str = (
f"SELECT * from derivation_paths WHERE puzzle_hash in "
f'({"?," * (len(puzzle_hashes_db) - 1)}?) LIMIT 1'
)
cursor = await self.db_connection.execute(formatted_str, puzzle_hashes_db)
row = await cursor.fetchone()
await cursor.close()
return row is not None
async def index_for_pubkey(self, pubkey: G1Element) -> Optional[uint32]:
"""
Returns derivation paths for the given pubkey.

View File

@ -790,6 +790,12 @@ class WalletStateManager:
self.block_records[block.header_hash] = block
await self.wallet_store.add_block_record(block, False)
# If one of these new additions is ours, generate more puzzle hashes
phs: List[bytes32] = [addition.puzzle_hash for addition in block.additions]
block_includes_our_tx: bool = await self.puzzle_store.one_of_puzzle_hashes_exists(
phs
)
if block_includes_our_tx:
async with self.puzzle_store.lock:
for addition in block.additions:
record = await self.puzzle_store.get_derivation_record_for_puzzle_hash(
@ -799,7 +805,6 @@ class WalletStateManager:
continue
index = record.index
await self.puzzle_store.set_used_up_to(index)
await self.create_more_puzzle_hashes()
# Genesis case

View File

@ -67,6 +67,18 @@ class TestPuzzleStore:
await db.add_derivation_paths(derivation_recs)
assert await db.puzzle_hash_exists(derivation_recs[0].puzzle_hash) is True
phs_1 = [derivation_recs[0].puzzle_hash]
phs_2 = [32 * bytes([1]), derivation_recs[0].puzzle_hash]
phs_3 = [derivation_recs[0].puzzle_hash, 32 * bytes([1])]
phs_4 = [32 * bytes([1]), 32 * bytes([2])]
phs_5 = []
assert await db.one_of_puzzle_hashes_exists(phs_1) is True
assert await db.one_of_puzzle_hashes_exists(phs_2) is True
assert await db.one_of_puzzle_hashes_exists(phs_3) is True
assert await db.one_of_puzzle_hashes_exists(phs_4) is False
assert await db.one_of_puzzle_hashes_exists(phs_5) is False
assert await db.index_for_pubkey(derivation_recs[4].pubkey) == 2
assert await db.index_for_puzzle_hash(derivation_recs[2].puzzle_hash) == 1
assert await db.wallet_info_for_puzzle_hash(