Repository navigation
Add an overview - #51
yuval-block wants to merge 1 commit into
Conversation
arminsabouri
left a comment
There was a problem hiding this comment.
This walks a thin line between describing the solutions and the techincal "how" (as well as what the problems). My comments are mostly regarding continuitity / flow of ideas.
|
|
||
| ### Communication models | ||
|
|
||
| There are three communication models traditionally described in distributed systems: asynchrony, partial synchrony and synchrony. Each model demands a different approach to fault tolerance. |
There was a problem hiding this comment.
nit: We either need a leading sentence that connects this section with the one before or just remove it or condense it into 2 sentences into the last section. e.g the interactive tx construction protocols may operate in these communication models blah blah it matters bc X.
There was a problem hiding this comment.
Edit: now that I see how the rest of the document builds these terms, I think its approriate to define them here. But a connector sentence would still cause less "whip lash" .
|
|
||
| ## Net settlement | ||
|
|
||
| Net settlement interactively combines several payments into one transaction. Individual payment amounts need not appear on chain, and payments may form cycles. |
There was a problem hiding this comment.
Same comment about a connector sentence for this as well.
2f2a706 to
327b453
Compare
8f2ce4c to
76631c2
Compare
arminsabouri
left a comment
There was a problem hiding this comment.
just noticed this. Have not read the rest of this
9508302 to
f9a0ded
Compare
arminsabouri
left a comment
There was a problem hiding this comment.
This reads well! I need to re-read the cordial miners / consitency section again. There is a lot of information packed in there that I am mainly not familiar with. But I think it gets the why across which is the important bit for this document.
|
about the links, we can:
i'm leaning towards the latter, and after we're done with the backlog we can add a nix flake check that ensures there are no broken links... wdyt @bc1cindy ? |
range-diff for force push f9a0ded9d9 → 36dbec85c3
|
range-diff for force push 36dbec85c3 → c3a0f8d3da
|
agreed, merge with broken links and #54 tracks adding the check once the backlog lands non-blocking, but since the chapters move into |
|
|
I disagree. We cannot share this document with broken links. removing the links might be better. |
| The simplest of these is Byzantine Eventual Consistency by Martin Kleppmann and Heidi Howard.[^bec] In this model, messages, or transaction fragments as in our case, are committed to a [Merklized](https://en.wikipedia.org/wiki/Merkle_tree) causal log. For example, if Alice is adding an output, the output itself would be the payload of her message, and the envelope would contain references to Alice's last message, as well as the messages of other peers, referenced by hash. | ||
|
|
||
| In the naive version of their protocol (they describe a more optimized version), whenever a message is received, if the receiving peer does not know what a hash in its references commits to, it will request the preimage from the peer which sent this message, and after a finite number of such recursive queries and round trips it will eventually reach a message it has already seen. Signatures on the messages authenticate their authorship, allowing messages to be relayed via intermediate peers, and for any equivocations to be detectable. If the payloads are subject to validity constraints and merging independently accepting updates preserves these constraints, as Kleppmann and Howard show, this is sufficient for *Byzantine* eventual consistency: loosely speaking, even in the presence of Byzantine nodes, honest peers will eventually converge on the same set of messages. | ||
|
|
There was a problem hiding this comment.
Might be worth adding a sentence or two about what Kleppman and Howard show (invariant confluence, iiuc?) so that the reader doesn't have to leave the doc to look it up
There was a problem hiding this comment.
i'm on the fence on this one, i had a short thing in there, but it seems a bit technical for the overview...
invariant confluence holds for the message domain since we are just dealing with sets closed under union (for which it is trivial), and the validity proofs ensure that no matter what set of messages is collected, maintaining the invariant that the set of messages can be flattened into a transaction that the honest users would not object to signing it so long as some bound on
this is actually a pretty subtle invariant that needs incentive compatibility and is rather insensitive to the state... so i have a detailed account of it in the DAG spec but for here i eventually gave up and just made "Byzantine" italic lol
There was a problem hiding this comment.
btw if the bound on f doesn't hold - that's the same as not having a counterparties in the coalition formation, so that's an additional reason why clients in practice may place a limit on how many recovery attempts they do and elect to wait longer for market conditions to be more favorable instead of insisting on following through at any cost, but the protocol shouldn't make assumptions about that hence the desire to show that it is at least possible to obtain valid transaction output liveness in O(f) time, even if at the next level of abstraction some attempted coallitions just dissolve.
as far as i know the problem of byzantine fault tolerant coalition formation in non-cooperative games is not generally solvable, i think that follows from similar impossibility results in hedonic games so no sense in even discussing byzantine fault tolerance without defining a class of games for which a stable coalition structure is possible can be ensured where the payoff is always positive, etc. i believe there is a class of hedonic games that treats all agents as at least weakly preferring each others' company but i forget what it's called. i don't know if this has been studied in the setting where a transferrable utility is possible.
also note that treating bitcoin as a transferrable utility is also quite an assumption, i am also not familiar with any work that attempts to kind of reduce coalition formation to bilateral bargaining, all of the work i found always assumes some kind of mechanism that seems to preclude privacy in the permissionless setting. i also found some impossibility results on the optimality of bilateral bargaining i need to find again, which made me give up on trying to show optimality, empirically joinmarket is already good enough for coordinating coinjoins and uses bilateral negotiation so if market efficiency can be improved, which aggregation should support, then that's good enough as far as i'm concerned. in fact your tip a few years ago to read up on combinatorial clock auctions was what kind of prompted that, and inspired confidence that the aggregator role for coalition formation proposals is sufficient, the main difference is that it's not exclusive, which led to the realization that the aggregator should be able to propose arbitrary redistributions of the surplus, so thanks for that.
all this goes to say, ultimately it's up to the market, and while i suspect this can be made much more rigorous through more in depth game theoretical analysis, unlike rigor in regards to privacy i'm much more willing to defer doing that work until after "try it and see" fails to work, because of the evidence that joinmarket works
|
|
||
| A trusted execution environment (TEE) can shift this trust assumption from the service operator to the hardware vendor and its attestation infrastructure. Attestation provides verifiable evidence that designated validation code executed in the claimed protected environment. Clients can therefore accept its validation of the protocol state without trusting the operator to execute that code faithfully, instead trusting the vendor’s hardware isolation and attestation guarantees. This additional trust assumption can improve liveness and consistency under weaker quorum assumptions, while reducing clients’ validation work. It does not relax the requirement for unanimous transaction signing; private allocations and spending authority remain with the participants. | ||
|
|
||
| This has two primary advantages. The first is that bandwidth or compute restricted devices can participate asymmetrically in dissemination, validation, etc. If the trust assumption fails, that is still only a liveness violation, and doesn't compromise on safety or privacy. Presumably such clients are too constrained for scalable Byzantine fault tolerance. On the other hand, if the TEE assumption holds, liveness can tolerate a dishonest majority allowing successful termination after $O(f)$ attempts even if $f = n - 2$ (note that $f = n - 1$ holds trivially, that's just falling back to a unilateral transaction). |
There was a problem hiding this comment.
I think I grok why privacy is independent of the TEE ("private allocations remain with participants"). But does that hold against an actively malicious validator? E.g. thinking of a "spy validator" that selectively disseminates/withholds fragments and attempts to correlate acknowledgments with contributions
There was a problem hiding this comment.
unless i misunderstand then already Kleppman & Howard's BEC, of which everything else is a special case, is byzantine fault tolerant against such behavior as far as preventing dissemination, so the main question is can the adversary force that to be a privacy leak
the answer is definitely yes, much like a network partition forces privacy leaks... there is a tension between liveness and this, otherwise BEC in the async communication model provides the best case for privacy from this privacy and everything on top of it can only try to improve liveness by improving the protocol participant's fidelity of information about who is doing what, which is why i believe this kind of leak is inherent
it can be mitigated to some extent by remembering what you acknowledged and noting that you can use your least compromising input to veto, or least damaging to be censored by if you are coerced into not publishing an output because acknowledgement would single you out as the owner of that input. in this scenario you sacrifice that one input's usability, but get an attempt to try something else instead of internalizing the harm of a privacy leak by insisting on liveness and not being punished.
the pragmatic solution, which i am also working on is to improve the resilience of the gossip layer and ensure honest peers can converge on the messages to include before producing blocks so that the probability of this happenning is pretty controllable if you are not too eager to produce blocks but are eager to gossip your messages anonymously until you are satisfied they have been disseminated. the details of this vary with the transport, for example in connection based channels we are limited to a more or less static local topology, whereas with a transport like nym you can send a message to any peer at any time, so it functions more like a low capacity clique graph or the traditional gossip topology (random telephone call model)
there is also recent work on censorship resistant byzantine broadcast, and related work on prefix consensus but afaict this doesn't actually buy much because the distinction between ackwnoledgement and inclusion that that work mainly pertains to total ordering, and we just need set union... still studying some of this work
There was a problem hiding this comment.
if you are coerced
sorry, i mean, you just give up on that output to resist that coercsion and suffer the liveness consequences, you aren't actually coerced into the privacy leak
There was a problem hiding this comment.
i've attempted to clarify this nuance in latest version
we can also consider create-missing the reason i would rather go with the broken links is that there's no phrasing changes required, whereas if the text just becomes "Coalition formation is the protocol blah blah blah. In game theory coalition formation means blah blah blah" then it's unclear the first used to be a specific notion, i.e. the coalition formation protocol in the repository, and not just a general statement about game theory which would be incorrect. Addressing that means rephrasing things in ways that i usually am very bad at fixing later, because of dyslexic autocorrect, i remember what it was supposed to say and that's how my brain reads at as. since that kind of mistake will stick around indefinitely whereas a broken link will be repaired once the target is merged it seems like the more sensible option if we do want to merge this (otherwise we can rebase it and not merge until the link targets are ready and still avoid the rephrasing stuff) Cindy - in the screenshot those look like links... are they just styled text? if so i think having a dashed underline kinda like wikis use for missing articles might be a decent compromise? but also i do expect the broken links to go away once stuff is merged and since mdbook doesn't have functionality for this, it sounds like this complicates the processing significantly more than what we should be doing long term which is #54 |
|
hmm, maybe the easiest compromise is to start implementing #54, but instead of having it error as a flake check, use it as part of a processing pipeline and just create every link, not just mdbook's create missing (which applies only to the summary) and put a little blurb in there that says that the mdbook is still a WIP and to look at the open PRs for the target page? |
|
did it in #57: links stay as they are, a chapter not merged yet gets a stub with a wip note and its pr, and once it lands in this pr needs frontmatter in please take a look when you can! |
xstoicunicornx
left a comment
There was a problem hiding this comment.
Only read up to validity proofs so far... planning to get through the rest later today
|
|
||
| Invalid transactions cannot spend any coins. Only valid transactions have consequences for the owners of the inputs. The sense in which the fragments themselves must be valid according to the proofs is that when combined they would result in a valid transaction if fully signed. Taken together with the incentive compatibility assumption, the lack of obstruction removes any reason for honest participants to withhold their signatures: by following the protocol the correct destination for all of their funds will be secured. And if we also assume consistency of the shared state, validity proofs ensure there is no way to poison the state so the transaction will be invalid, so maximally disruptive manipulation of the shared state amounts to withholding a signature, the only way the malicious participant can ensure a transaction does not have consequences. | ||
|
|
||
| A widely circulated misconception is that validity proofs with zero knowledge somehow provide privacy. This is false. All they can do is enforce validity, and if done correctly, they can enforce this without destroying privacy. They cannot contribute to privacy. |
There was a problem hiding this comment.
This last paragraph does seem a bit out of place. Its clear what the purpose of the validity proofs are i n the context of the protocol -- so i did not have this misconception. Maybe move this to a footer?
There was a problem hiding this comment.
it's such a repeated talking point that's just harmful and wrong "wasabi's inputs are unlinkable because it uses anonymous credentials", i think it has to be addressed so i think i need to clear up what is meant by this paragraph rather than move it
There was a problem hiding this comment.
I re-jiggered the validity proof section a bit here and I think the last fragment reads better, what do you think?
#51 (comment)
Introduce the protocol before privacy, coalition formation and the abstract cost function, so readers learn the mechanism before its optimization goals. Concurrent PSBT Construction belongs with the BIP drafts before Scrubber. --- - [x] Add an overview stub linking to PR #51. - [x] Order protocol chapters and classify Concurrent PSBT as a BIP draft. - [x] Verify rendering and navigation order.
The review stubs introduced by PR #59 need to appear in the book while full chapters remain under review. Set their stale-after date to October 31, 2026 and register them through the existing source symlink convention. Add an overview stub for PR #51. Present introduction, overview, privacy, coalition formation and the abstract cost function in that order, and put Concurrent PSBT Construction before Scrubber under BIP Drafts.
|
|
||
| Due to the unanimity condition even in the Byzantine setting, successful termination requires that all participants in a particular transaction construction session comply with the protocol, which includes being responsive. When this happens to be the case, the optimistic approach is to let everything proceed exactly as in the semi-honest setting: Participants anonymously add their fragment, and once everyone acknowledges the same balanced transaction they can simply sign. The Byzantine fault-tolerant variant of Fungi is therefore designed to recover liveness by identifying at least one input controlled by a faulty peer, and then attempting transaction construction again with the faulty inputs excluded. Once all faulty participants have been excluded the honest participants will be able to successfully carry out transaction construction. | ||
|
|
||
| ### Validity proofs |
There was a problem hiding this comment.
I think this section is a bit meandering and can read a bit better. I mostly just moved paragraphs around but rewrote a bit in the middle.
I removed the oversized fee contribution mention as it didn't seem to tie into validity proofs. If it will also leverage validity proofs we should add it back, otherwise we should add it to the relevant section that will mitigate oversized fee contribution.
Validity proofs
The purpose of the validity proofs is to enable the possibility of completion without sacrificing privacy, which is why they are zero-knowledge proofs. They mainly prevent the same funds from being claimed more than once. They do not replace each participant's final approval, nor can they compel any participant into providing the remaining proofs or signatures. They ensure that honest, responsive participants can successfully add all of their intended inputs and outputs to the shared state without obstruction.
Only valid transactions have consequences for the owners of the inputs. The sense in which the fragments themselves must be valid according to the proofs is that when combined they would result in a valid transaction if fully signed. Taken together with the incentive compatibility assumption, the lack of obstruction removes any reason for honest participants to withhold their signatures: by following the protocol the correct destination for all of their funds will be secured. If we also assume consistency of the shared state, validity proofs ensure there is no way to poison the state so the transaction will be invalid. This means the maximally disruptive manipulation that can be performed at zero cost by a malicious participant amounts to withholding a signature.
Using zero-knowledge proofs, each participant can establish to all other participants that their own contributed outputs are covered by input funds without needing to reveal any of their inputs or outputs. This includes payments between participants, and must not reveal the details of how each participant allocates its funds.
While validity proofs enable the possibility of completion without sacrificing privacy, they do not contribute to privacy themselves. All they do is enforce validity, and if done correctly, they can enforce validity without destroying privacy.
There was a problem hiding this comment.
I removed the oversized fee contribution mention as it didn't seem to tie into validity proofs.
it kinda does, on two levels:
- the proofs cover the fees
- it's the trigger for proving
we have to prove that every sat is accounted for, and the only way to avoid doing the kind of scam kruw is doing with wasabi is for every client to validate that every sat they intended to go to fees provably and accountably does that
and it's not about oversized fee contributions it's that if everyone can observe that they sats they claim to allocate are all there, and no overflow has occurred, there's no need to prove anything, every individual user is happy and everyone has evidence that nobody tried to cheat, so if they can have unanimous agreement about that exact state, signing can just proceed
if there is some kind of imbalance or disagreement, that's when the proofs need to be made and posted, in order to filter out the contentious outputs or fee contributions that are doing the double spending
|
|
||
| As a result, liveness is inherently brittle. Consistency is a liveness requirement, not a safety requirement, and all of the mechanisms described here are primarily concerned with enhancing liveness without breaking the privacy assurances made to honest participants. | ||
|
|
||
| ## Interactive transaction construction with honest participants |
There was a problem hiding this comment.
I think this should titled "The honest setting: Interactive transaction construction" and be placed right before "The semi-honest setting" section. I think all 3 overviews of the different "settings" should read one right after another as that adds a lot of clarity.
Or if "Interactivity under different communication models" is supposed to be about honest setting in particular it should be subsection of this one.
There was a problem hiding this comment.
yeah it's a bit inconsistent... fwiw the reasoning behind that is that the previous section described a state sharing based model, whereas everything from here on down is explicitly based on sending specific kinds of messages maybe it makes sense to discuss that a bit more explicitly in the first paragraph
There was a problem hiding this comment.
i tried to make the headings a bit more consistent but differently than the suggestion
xstoicunicornx
left a comment
There was a problem hiding this comment.
I think "problem statement/definition" broken links definitely need to be resolved by creating it if it doesn't already exist. Seems highly relevant to the overview and referenced in multiple places. Let me know if I should create and issue for tracking this.
Other than the "problem statement/definition" link I agree with @arminsabouri that all broken links should be removed.
|
@xstoicunicornx the broken links are being fixed in #50 , #57, #59 and #65 |
range-diff for force push c3a0f8d3da → c278fa2252
|
|
Since there were many unresolved comments i took the liberty of resolving the ones i felt were obvious but left the ones that i was less sure about unresolved, @arminsabouri @afsheenb @xstoicunicornx if you don't mind please take a look at your still unresolved comments and resolving if i've managed to address your feedback |
range-diff for force push c278fa2252 → e341018a9c
|
range-diff for force push e341018a9c → fd3cc4b9ad
|
This includes a high level description of the various components of the protocol suite, focusing on the transaction construction. Unlike the strawman ladder it replaced (previously described as an overview, and now somewhat out of date at any rate) it is scoped to only discuss actual things not strawman constructions which only benefit exposition, to avoid confusion about what is actually being implemented. Closes #21
range-diff for force push fd3cc4b9ad → dc99513d04
|
xstoicunicornx
left a comment
There was a problem hiding this comment.
Overall its ACK from me.
Highlighted the remaining feedback that I think was missed.
The one thing I feel strongly about is that the 3 settings have the same heading pattern (leading with the setting name) and should be grouped together to make it intuitive to the reader that these are the 3 different settings in which fungi operates under.
|
|
||
| Partial synchrony lies in between. Like the synchronous model, it assumes message delivery is timely, but unlike the synchronous model, the bound on the delay either isn't known or may not always apply, so simply waiting for a timeout duration will not suffice to obtain liveness. Typically this requires acknowledgement from some threshold fraction of participants in order for progress to be made. | ||
|
|
||
| ## Transaction construction in the semi-honest setting |
There was a problem hiding this comment.
I think old title of "The semi-honest setting: adding privacy-preserving communication" was better. Transaction construction is kinda a given for entire fungi protocol, and "adding privacy-preserving communication" does a good job highlighting the the main difference between honest and semi-honest setting.
If you'd rather not use the old title it should at least match format of "Byzantine fault tolerant transaction construction" (ie Semi-honest setting transaction construction).
|
|
||
| ### Validity proofs | ||
|
|
||
| The purpose of validity proofs is to restore the possibility of completion by preventing the same funds from being claimed more than once.The proofs establish that outputs and fee contributions are covered by input funds, including any funds that originate from payments between participants. They must accomplish this *without* sacrificing privacy, which is why they must be zero-knowledge proofs. They do not replace each participant's final approval, nor can they compel any participant into providing the remaining proofs or signatures. They ensure that honest, responsive participants can successfully add all of their intended inputs and outputs to the shared state without obstruction. |
There was a problem hiding this comment.
| The purpose of validity proofs is to restore the possibility of completion by preventing the same funds from being claimed more than once.The proofs establish that outputs and fee contributions are covered by input funds, including any funds that originate from payments between participants. They must accomplish this *without* sacrificing privacy, which is why they must be zero-knowledge proofs. They do not replace each participant's final approval, nor can they compel any participant into providing the remaining proofs or signatures. They ensure that honest, responsive participants can successfully add all of their intended inputs and outputs to the shared state without obstruction. | |
| The purpose of validity proofs is to restore the possibility of completion by preventing the same funds from being claimed more than once. The proofs establish that outputs and fee contributions are covered by input funds, including any funds that originate from payments between participants. They must accomplish this *without* sacrificing privacy, which is why they must be zero-knowledge proofs. They do not replace each participant's final approval, nor can they compel any participant into providing the remaining proofs or signatures. They ensure that honest, responsive participants can successfully add all of their intended inputs and outputs to the shared state without obstruction. |
|
|
||
| The purpose of validity proofs is to restore the possibility of completion by preventing the same funds from being claimed more than once.The proofs establish that outputs and fee contributions are covered by input funds, including any funds that originate from payments between participants. They must accomplish this *without* sacrificing privacy, which is why they must be zero-knowledge proofs. They do not replace each participant's final approval, nor can they compel any participant into providing the remaining proofs or signatures. They ensure that honest, responsive participants can successfully add all of their intended inputs and outputs to the shared state without obstruction. | ||
|
|
||
| On the optimistic path, no proofs are needed if every participant can verify that all of its funds are are accounted for in its outputs and fees contributions, and no overspending has occurred, and everyone acknowledges that exact state. Overspending triggers proving so that contentious outputs and fee contributions can be validated. An anonymous, oversized fee contribution permits any participant to abort the optimistic path and force validity proofs to be required. |
There was a problem hiding this comment.
Are you saying that the only path to forcing validity proofs to be required is overspending triggering validation, and then through validation an oversized fee contribution permits any participant to abort optimistic path? Or that either overspending or oversized fee contribution can abort optimistic path and force validity proofs?
From your response #51 (comment) it seems like the former. I think its worth being a bit more verbose here to incorporate some of the context you gave in this response.
|
|
||
| Only valid transactions have consequences for the owners of the inputs, because invalid transaction cannot actually spend any coins, even if fully signed. The sense in which the fragments themselves must be valid according to the proofs is that when combined they would result in a valid transaction if it were fully signed. Taken together with the incentive compatibility assumption, the lack of obstruction removes any reason for honest participants to withhold their signatures: by following the protocol their funds will be sent to the destination they intended, and since this applies to all participants, this removes any valid reason for honest participants to withhold their input signatures. | ||
|
|
||
| A widely circulated misconception is that validity proofs in such protocols, due to the use of zero knowledge somehow themselves are a source of privacy. This is false. All they can do is enforce validity, and if done correctly, they can enforce this without requiring privacy to be destroyed. |
There was a problem hiding this comment.
I still think my version reads better:
| A widely circulated misconception is that validity proofs in such protocols, due to the use of zero knowledge somehow themselves are a source of privacy. This is false. All they can do is enforce validity, and if done correctly, they can enforce this without requiring privacy to be destroyed. | |
| While validity proofs restore the possibility of completion without sacrificing privacy, they do not contribute to privacy themselves. All they do is enforce validity, and if done correctly, they can enforce validity without destroying privacy. |
|
|
||
| As a result, liveness is inherently brittle. Consistency is a liveness requirement, not a safety requirement, and all of the mechanisms described here are primarily concerned with enhancing liveness without breaking the privacy assurances made to honest participants. | ||
|
|
||
| ## Interactive transaction construction in the honest setting |
There was a problem hiding this comment.
"Honest setting transaction construction" is more consistent with BFT heading. I think putting the "transaction construction" in the front buries the lede (especially since thats the redundant-ish part that all settings relate too).
|
|
||
| In lieu of agreement about a transaction, agreement on the available evidence can still support liveness by allowing recovery from a fault. This boils down identifying inputs for which signatures have not yet been received. A missing signature may still eventually arrive, completing the transaction, but to avoid waiting indefinitely, participants can negotiate another transaction construction attempt while continuing to listen for progress in the original one. | ||
|
|
||
| Under synchrony or partial synchrony (specifically the eventual synchrony variant), if a sufficient threshold of peers can all agree it has been too long, then they can initiate such a recovery session. A threshold of peers agreeing implies a majority of honest peers agreeing. Note that agreement by a majority of honest participants requires a supermajority threshold. A quorum is a set of peers meeting the required agreement threshold. Given $n = 3f+1$ where at most $f$ are faulty, a quorum of $2f+1$ peers will include at least $f+1$ honest peers, a majority within any such quorum. |
There was a problem hiding this comment.
Where are these equations pulled from?
|
|
||
| ### Cordial miners inspired invariants | ||
|
|
||
| Cordial miners[^cordial-miners] is one of a family of so-called block DAG consensus protocols.[^dag-rider] In these protocols, a fixed set of participants, usually called validators, produce blocks that, similarly to BEC, refer to other validators' blocks, and the consensus protocol involves defining a deterministic function that produces a consistent priority order when blocks conflict, that all honest validators will agree on. The cordiality requirement is that for $n = 3f + 1$ validators, every block at height $h$ will have $t = n - f$ parent blocks with height $h - 1$. In addition to setting up the required thresholds for Byzantine fault-tolerant consistency, this also serves as a flood protection mechanism. |
There was a problem hiding this comment.
The cordiality requirement is that for
$n = 3f + 1$ validators, every block at height$h$ will have$t = n - f$ parent blocks with height$h - 1$ .
I guess I don't understand how height and parent blocks tie together? They seem to not have a relationship in the given equations?

This includes a high level description of the various components of the
protocol suite, focusing on the transaction construction.
Unlike the strawman ladder it replaced (previously described as an
overview, and now somewhat out of date at any rate) it is scoped to only
discuss actual things not strawman constructions which only benefit
exposition, to avoid confusion about what is actually being implemented.
Closes #21