The results of Summer of Bitcoin were declared the previous week and I am really excited to announce that my proposal was accepted by LDK. I will be continuing the project which I started last year titled Integrating LDK into the Lnprototest test suite
About the Project
This project aims at Integrating LDK into the Lnprototest test suite and ensuring that this lightning implementation follows all the BOLT protocols.
Progress made during Summer of Bitcoin 2022
- Implementing
features.rsin LDK-Sample. This file simply displays the features of LDK-Sample node. These features are then used by theldk.pyscript inside Lnprototest. - Adding an exit function in LDK-Sample. Having an exit function ensures that the port used by LDK-Sample is unoccupied after the node is exited and can be used for other purposes.
- Implementing
myKeysManagerstruct in LDK-Sample. This struct manages the node secrets and uses akey_seedto generate different keys. The advantage of using this instead of the defaultKeysManageris that it allows me to use my own set of channel secrets(funding_key, revocation_base_key, payment_key, delayed_payment_base_key, htlc_base_key) instead of the randomly generated ones. This was useful for setting up the configuration required by Lnprototest. - Implementing
KeysInterfacetrait for themyKeysManagerstruct. This was essential formyKeysManageras it has a lot of useful methods. - Implementing
openchannel_testmethod in LDK-Sample. This method allows opening a fundchannel without providing the host or port. - Adding the
ldk.pyscript inside Lnprototest. This script does all the heavy lifting in the integration process. - Implementing the
LDKConnclass inside the script. This class is used to connect to the node usingpyln.proto.wiremodule and intercept all the messages that the node initiates and receives. - Implementing the
LDK Runnerclass. This class contains all the functions used to start/stop bitcoind, start/stop LDK-Sample node, adding a connection, connecting to a peer, carrying out transactions, receiving output messages etc. The tests are run against this class and it basically tells the node to do a particular task(like connecting to a peer) and theLDKConnclass intercepts the messages sent by the node.
Week 1 and 2
I started working on the project and discovered that both LDK-Sample and Lnprototest repos were updated. On updating my forks, I found out that LDK-Sample now uses Lightning crate version 0.0.115 instead of 0.0.108. This meant that I had to make a lot of changes to make it work. This involved:
- Removing
features.rsas theFeatures::known()method was deprecated. After discussion with the devs, I am now usinglightning_msg_handler.chan_handler.provided_init_features()method to display the features. - Reimplementing
myKeysManageras a lot of traits and methods changed. - Implementing various methods and structs as a lot of methods used in
KeysManagerwere private.
After all the bugs from my LDK-Sample were removed and my custom channel secrets were added, LDK-Sample was built and it ran successfully.
I then started the testing phase. The bug I had opened last year in Lnprototest was fixed by Vincenzo. After encountering some minor errors and tweaking some things in my LDK script, I was able to pass all the BOLT #1 tests. These included:
- test_namespace_override
- test_echo_init
- test_init_check_received_msg
- test_init_invalid_globalfeatures
- test_init_is_first_msg
- test_init_check_free_featurebits
- test_init_fail_connection_if_receive_an_even_unknown_featurebits
- test_init_fail_connection_if_receive_an_even_unknown_globalfeaturebits
- test_init_fail_ask_for_option_data_loss_protect
- test_init_advertize_option_data_loss_protect
- test_init_required_option_data_loss_protect
- test_init_reject_option_data_loss_protect_if_not_supported
- test_init_advertize_option_anchor_outputs
- test_init_required_option_anchor_outputs
- test_init_advertize_option_static_remotekey
- test_unknowns
Now I will start working on the BOLT2 tests.