Allow to add manual connections to the node (#77 and #78): Now you can use the addnode RPC to manually connect with a given peer.
Socks5 Support (#76): Now we can connect with peers over multiple transports, including socks5. This allows running florestad behind a socks proxy like Tor.
Update a few RPCs to show more useful data (#82): Some RPCs like getblockchaininfo and getrawtransaction got updated to return more useful data. They are now close to what Core returns in their respective RPC, but you shouldn't expect a 1-1 equivalence. getblockchaininfo now returns Utreexo-related data.
Add a ZMQ block notification (#93): Now you can subscribe over ZMQ to receive new blocks as they are accepted by our chainstate.
Build and store BIP-158 Compact Block Filters (#89): We now create and store Compact Block Filters for easy wallet rescan and finding UTXOs inside the chain. Currently, we only build the filters and expose them over a new rpc getfilter.
This implementation doesn't download the filters from p2p, we build them locally and let users pick what is stored, reducing disk usage. A multiphase approach where we use the p2p-provided ones to sync-up user's wallet during IBD and only store the locally computed ones should bring the best of both worlds.
Don't die if we lose all Utreexo peers (#79): losing all utreexo peers may put our node in an undefined state, since we need those peers to get proofs. This PR hardens our node against it, and improves our recovery logic.
Don't invalidate block if proof is invalid (#81): Since proofs aren't committed by PoW, a misbehaving peer might send an invalid proof without changing the block hash. Therefore, if we get an invalid proof, just ban this peer and try to get the proof from someone else.
Refactor the node struct and rework trait bounds (#83): UtreexoNode is the biggest struct inside this codebase, and it's generic over many attributes. This PR is an attempt to simplify those bounds. Furthermore, making internal methods private.
improve Error enum names so we can remove clippy::enum_variant_name (#85): Some enum members ended with the enum's name (e.g. SomethingError), this would trigger a clippy warning. This pr reworks invariant naming, so now we satisfy that linting.
Rework block notification (#92): Once chainstate validates a new block, it sends that block to some subscribers.
Before this PR, a subscriber would pass the Sender end of a channel, and we would use this channel to send new blocks. The problem here is that some modules aren't services (i.e. they don't have an always running loop) and can't work with this channel model.
Now, anything implementing the BlockConsumer trait may subscribe by passing an Arc-ed instance of self to chainstate.
For modules using the old model, this pr implements a simple Single Producer, Single Consumer channel that implements BlockConsumer.
Make database more robust (#95): Our default chainstore database had many issues with unclean shutdowns, leading to a broken state. This pr is another attempt to make our DB more robust against unexpected scenarios.
Make dockerfile build florestad (#96): After #58 our Dockerfile wasn't working. Now we keep official docker images on docker hub.