Quarterly Progress Report #4
What I worked on: Feb, Mar & Apr (2025)
This quarter, I primarily worked on improving the Python specifications of BIP FROST Signing and ChillDKG.
When building test vectors for ChillDKG, I ran into two design issues.
Synthetic Randomness: ChillDKG relies on its internal
schnorr_signfunction that uses fresh “synthetic randomness” (as recommended by BIP340) to generate certificates and proofs of possession. Because this randomness is regenerated on each API call, test vectors aren’t reproducible. I opened an issue to discuss it, which led to a few modifications to the user-facing APIs.Error Handling Inconsistencies: Building test vectors forced me to test every API path and edge case thoroughly. This process uncovered a few inconsistencies in error handling, which I have flagged for review: https://github.com/BlockstreamResearch/bip-frost-dkg/issues/89.
I focused on two major pull requests for ChillDKG, which consumed most of my time. A key contribution was the implementation of JSON test vectors for the protocol. Automated entirely by a script, this significantly eases the process of updating the vectors when the protocol's internal structure is modified.
https://github.com/BlockstreamResearch/bip-frost-dkg/pull/90
I also opened a pull request implementing the serialization and deserialization for all messages exchanged between participants and the coordinator.
In the Signing BIP, I changed the way participant identifiers are represented: they’re now 4-byte integers in the range 0..n-1, where n is the total number of participants in keygen. This matches how ChillDKG treats participant IDs and should make things much simpler (and less confusing) for users integrating both the BIPs.
I had attempted this change earlier but didn’t follow through, since updating participant IDs also meant updating the test vectors. At the time, I didn’t have a script for that, so I tried doing it manually, and quickly ran into a mess. It was way too time-consuming, and I even lost some of the secret keys used in generating signatures. Honestly, it turned out to be more trouble than I expected. So, I decided to build an automated script for the vectors first. Implementing the identifier change after that was much smoother. Now, I can update the signing protocol (if needed) easily, without dreading the vector updates :)
There’s been growing interest in Rust bindings for my Schnorr adaptor pull request, so I decided not to wait and opened a PR in rust-secp256k1-zkp for the bindings: https://github.com/BlockstreamResearch/rust-secp256k1-zkp/pull/89.
Fabian Jahr, a Bitcoin Core developer, reached out about my batch verification PR for libsecp256k1. He highlighted the growing momentum around batch validation and the formation of a new Bitcoin Core working group focused on it. Following his invitation, I joined the group to stay in the loop and align my work in libsecp256k1 with their efforts.
Reflections
Note: I might’ve gone a bit overboard with the self-reflection. Feel free to skip this part if it’s too long.
I've finally figured out an efficient way to integrate generative AI into my coding workflow, and the impact is clear: easier overviews, better understanding, and significant time savings. I typically don't rely on it for code completion, since cryptography code is often straightforward (if-else blocks, and loops, with few complex data structures) – the math is the harder part. Instead, I use these AI tools to brainstorm architecture designs and understand open problems.
The GitHub MCP server paired with Gemini 2.5 Pro has been a game changer for me. It lets me quickly grasp specific parts of a codebase and the concepts behind their implementation. For example, here’s the summary it generated when I asked it to analyze the scratch_space data structure used in libsecp256k1: https://jumpshare.com/v/clcAEFdOra5cknRe8Die.
Throughout this year, several people have reached out, asking about the status of my projects, expressing interest in using them, or sharing feedback. Since this is my first full-time role straight out of college, it’s all new to me, and I’m genuinely glad to see that people find my work meaningful and valuable. I’m especially grateful to Spiral for giving me this opportunity.
One thing I haven’t managed to do this year is develop a deep understanding of security proofs. The ability to reason about how protocol changes affect security proofs feels like a superpower. I've seen senior cryptography devs do it, and it’s something I aspire to learn. Coincidentally, I've been invited to Crypto Camp 2025 in Portugal, which focuses on this very topic. I plan to make the most of the opportunity.
I also want to write more high-quality, easy-to-understand technical blogs that explain cryptography concepts. I'm quite proud of my last post on the birthday attack.
Next Steps
Sebastian Falbesoner (theStack) has opened a few pull requests to the BIP FROST Signing repo. My immediate next step is to review and merge them. So glad he’s helping! I’ve also received comments on my ChillDKG and Rust bindings PRs, which I’ll address next.
After that, I’ll look into rebasing my batch verification pull request. The libsecp256k1 codebase has changed quite a bit since I first opened it, so this one’s going to be fun T_T

