As part of Milestone 4 in Crosslink’s development, Shielded Labs will host a series of workshops (4a, 4b, 4c…) to gather more frequent feedback as the design continues to evolve.
The next workshop will take place on Wednesday, October 22 at 10AM PST / 1PM EST / 5PM UTC and will be held on Zoom. Meeting details will be shared prior to the session. Participants will be able to:
Join the BFT network without manual intervention from the team
Add, remove, and move stake between roster members
Observe their stake accumulate as PoW blocks are finalized
There is no need to share your IP address for this session. As before, you can join using just a laptop; however, running a publicly accessible server will improve network resiliency, since traffic currently routes through visible nodes.
Builds for Linux (Ubuntu 24.04) and macOS will be made available ahead of the workshop.
This kind of issue has always been a tension in Zcash development. There’s a variety of participants, and some prefer “easy to use mainstream stuff” while some prefer “hardened, FLOSS, privacy-centric”.
Over time we’ve tried a lot of different configurations. I’m personally always willing to try (or retry) different platforms that work better for the cautious-opsec crowd, but it’s likely too late for this workshop.
The way I think that needs to work is we do a “try out” or “dress rehearsal” with a representative sample of participants (including a variety of platforms and configurations, e.g. Tor access) and see how well it works for everyone. In fact, if we have a viable suggestion by the time of the workshop, then near the end I’d be interested to ask a sample of participants to try it out.
The main suggestion I recall for freer / FLOSSier is Jitsi and we’ve tried it maybe 2 or three times over the years. It definitely improved over time, but it was never glitch-free enough for a basic large group of less-opsec-experty participants to feel fully comfortable.
Any other setups we should investigate?
Edit: As to how a “privacy centric project could use such platforms”… we can only fight the good fight on so many fronts at once.
Some more pre-workshop good news is that zebra-crosslink works with Tailscale! You can connect a machine running zebra-crosslink to an exit node within your Tailnet and everything will work without additional configuration.
For anyone running this during the workshop, let me know if your mileage varies!
Here are the current instructions for participating with a node observing the evolution:
I’m working on adding instructions on how you can add your node into the BFT roster to begin contributing to finality votes, and we’ll also cover that in the zoom.
I wanted to check whether the top section (with the two forks) satisfies the Last Final Snapshot BFT rule. It does, but it’s very difficult to see how the forks go, partly because their bc-chains cross. Can there be some repulsion in the layout between bc-blocks and vertically between their labels, so that forks are more obvious?
Also: have you implemented the requirements that each bft-block points to a \sigma-confirmed bc-block (via a bc-header chain) and that each bc-block points to a bft-block that is final in a given context, or are those details left out for now?
Answering my own question, the visualization seems to reflect the trivial case \sigma = 1. In particular there are bc-blocks H for which \mathsf{snapshot}(\mathsf{LF}(H)) is only two blocks prior to H, which suggests by the argument quoted below from Questions about Crosslink that \sigma is probably 1, i.e. bft-blocks point to bc-blocks directly. It cannot be 0 because then \mathsf{headers\_bc} would be empty.
None of the block hashes in \mathsf{LF}(H)\mathsf{.headers\_bc} can point to H because that would be a hash cycle. In a typical case where no block withholding and no other rollback (not caused by the adversary) occurs on the honestly mined chain, the proposer of the last final block before a context bft‑block that H can point to will have, at the latest, H ⌈ {}_{\mathrm{bc}}^1 as \mathsf{tip}(B). Under these conditions, \mathsf{snapshot}(\mathsf{LF}(H)) will point, at the latest, to \sigma blocks before H ⌈ {}_{\mathrm{bc}}^1, i.e. \sigma+1 blocks before H.