Prune witnesses for notes spent more than X blocks ago
#161
Open
opened 2 years ago by duke
·
4 comments
No Branch/Tag Specified
arm
asyncnotedecryption
danger
dev
dev-aarch64
dev-mac
dev-old-randomx
divzaddrs
dragonx
duke
freebsd
getfilterednotes
hip39
hushutils
insync
jahway603
master
mvstuff
onryo
p2p_privacy
ramhash
relaytx
rx-largepages
setbestchain
warmup
witness_cache
wolfssl
wolfssl_win
z_createrawtransaction
z_importwallet
z_signmessage
v0.11.2.z0
v0.11.2.z1
v0.11.2.z2
v0.11.2.z3
v0.11.2.z4
v0.11.2.z5
v0.11.2.z6
v0.11.2.z7
v0.11.2.z8
v0.11.2.z9
v1.0.0
v1.0.0-beta1
v1.0.0-beta2
v1.0.0-rc1
v1.0.0-rc2
v1.0.0-rc3
v1.0.0-rc4
v1.0.1
v1.0.10
v1.0.10-1
v1.0.11
v1.0.11-rc1
v1.0.12
v1.0.12-rc1
v1.0.13
v1.0.13-rc1
v1.0.13-rc2
v1.0.14
v1.0.14-rc1
v1.0.15
v1.0.15-rc1
v1.0.2
v1.0.3
v1.0.4
v1.0.5
v1.0.6
v1.0.7-1
v1.0.8
v1.0.8-1
v1.0.9
v1.1.0
v1.1.0-rc1
v1.1.1
v1.1.1-rc1
v1.1.1-rc2
v1.1.2
v1.1.2-rc1
v2.0.0
v2.0.0-rc1
v2.0.1
v3.0.0
v3.1.0
v3.1.1
v3.10.0
v3.10.1
v3.10.2
v3.2.0
v3.2.1
v3.2.1-alpha
v3.2.1-beta
v3.2.2
v3.2.3
v3.3.0
v3.3.1
v3.3.2
v3.4.0
v3.4.1
v3.5.0
v3.5.1
v3.5.2
v3.6.0
v3.6.1
v3.6.2
v3.6.3
v3.7.0
v3.7.1
v3.8.0
v3.9.0
v3.9.1
v3.9.2
v3.9.3
v3.9.4
Labels
bounty up to 500 HUSH 2001-5000 bounty
bounty between 2001 and 5000 HUSH 501-2000 bounty
bounty between 501 and 2000 HUSH arm
something doesn't work on arm beginners
for new developers bug
may or may not be a bug build
problems building documentation
not enough information feature
new feature high priority
high priority i2p
related to i2p low priority
low priority medium priority
medium priority question
something is not clear release
release label or issue related to it testing
related to testing tor
related to tor wontfix
this won't be fixed
Apply labels
Clear labels
0-500 bounty
bounty up to 500 HUSH 2001-5000 bounty
bounty between 2001 and 5000 HUSH 501-2000 bounty
bounty between 501 and 2000 HUSH arm
something doesn't work on arm beginners
for new developers bug
may or may not be a bug build
problems building documentation
not enough information feature
new feature high priority
high priority i2p
related to i2p low priority
low priority medium priority
medium priority question
something is not clear release
release label or issue related to it testing
related to testing tor
related to tor wontfix
this won't be fixed
No Label
0-500 bounty
2001-5000 bounty
501-2000 bounty
arm
beginners
bug
build
documentation
feature
high priority
i2p
low priority
medium priority
question
release
testing
tor
wontfix
Milestone
Set milestone
Clear milestone
No items
No Milestone
Projects
Clear projects
No project
Assignees
Assign users
Clear assignees
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.
No due date set.
Dependencies
This issue currently doesn't have any dependencies.
Reference in new issue
There is no content yet.
Delete Branch '%!s(MISSING)'
Deleting a branch is permanent. It CANNOT be undone. Continue?
No
Yes
This is something we may want, which will improve the speed of syncing and rescanning:
82361aebc3
Upon reviewing this code, it seems reasonable and not too dangerous, except for it adding a new
assert()
which will crash the node with no error message if that case every happens (maybe due to a corrupt wallet/etc). At the very least an error should be printed to debug.log in that case, and instead of an assert, that iteration of the loop should be skipped.Additionally, Hush source code no longer has CopyPreviousWitnesses since Sapling consolidation was added, which will make porting this code a bit more challenging. It was remove/refactored into different functions in commit
6c48397cf3
in Feb 2020.Started working on this on the
witness_cache
branchNot only have some functions been renamed/refactored but the entire algorithm for updating/maintaining the witness cache has completely diverged.
Currently our code does not keep track of "spentness" of a note/zutxo, which is kept track of in the
spentHeight
variable that I added in thewitness_cache
branch. We need something likeUpdateSpentHeightAndMaybePruneWitnesses
but it's not clear how to implement it without completely changing our witness cache algorithm.Once we know a
spentHeight
for a note/zutxo we can prune witnesses for notes spent more than WITNESS_CACHE_SIZE blocks ago. This means less witnesses to keep track of by a large amount, which means theBuildWitnessCache
phase of rescanning will be much faster.Currently our code keeps track of witnesses for all time while the latest Zcash code only keeps track of the last WITNESS_CACHE_SIZE blocks, which is 110 blocks. So we keep track of an ever-growing list of witnesses in all blocks while this other code only keeps track of a small amount of recent witnesses. This is partially why "Building Witnesses" after a rescan is so damn slow and why it gets slower and slower for each block as the witness cache size increases. This also leads to large wallet.dat sizes since the witness cache is stored inside wallet.dat .
One possible way forward is to write a new function which does nothing but prune witnesses from notes/zutxos spent more than 110 blocks ago. It could be periodically run automatically by the full node and/or have an RPC interface to be run manually.
witness_cache
branch now has some code which attempts to portUpdateSpentHeightAndMaybePruneWitnesses
. No idea if it works, needs a lot of testing. Currently thinking of the best ways to test it.