Hello Salvatore,

Really interesting idea. The walk-through of the challenge protocol helped.

In the final state:

[S14. state: h_{A;6}, h_{B;6}]
- Alice can take all the money if she can open h_{A;6} to a correct "n => n + 
n" computation step
- Bob can take all the money if he can open h_{B;6} to a correct "n => n + n" 
computation step

My understanding of your scheme for encoding execution traces is that each leaf 
is (previous-state, operation, post-state) So in this case when we get to the 
conflicting step of the execution traces, alice might reveal something like 
(x=64, x+x, x=127) and bob might reveal something like (x=64, x+x, x=128). So 
in order for the covenant to enforce which state-transition is valid (who can 
spend the money), that means that `x+x` needs to be evaluated in script to tell 
who has posted the incorrect state. Am I understanding this final step of the 
bisection protocol correctly?

-rijndael

On 11/12/22 10:04 AM, Salvatore Ingala via bitcoin-dev wrote:

> Hi Antoine,
> It appears that my explanation of the relationship between the covenant and 
> the bisection protocol is still unclear; I'll do my best to clarify.
>
> The bisection's Merkle tree never ends up on-chain, in any form. Therefore, a 
> bigger computation does not end up in a bigger witness size, which is key to 
> the scalability of the approach. Only in the case of a challenge, it will 
> result in a (logarithmically) longer chain of transactions to resolve it. 
> This chain of transactions could be mapped to a root-to-leaf path in the 
> Merkle tree of the computation trace.
>
> The actual computation trace (and the corresponding Merkle tree) is only 
> computed by the parties when they execute the computation.
> What's in the tapleaves is only the valid transitions at the current state of 
> the protocol; that is, the valid transitions in the Finite State Machine (and 
> possibly other valid exit conditions that remove the covenant encumbrance, if 
> any).
>
> The bisection protocol only makes sense as a step in a larger protocol that 
> makes use of it.
>
> Perhaps presenting the protocol in a less-than-general case might help to 
> understand it. So let's play a simpler game using a protocol that includes a 
> fraud proof.
>
> Alice claims that she knows how to multiply by 256, while Bob doesn't believe 
> her. So they make a bet: they each commit 1 coin; then Bob choses a number x; 
> then Alice computes y = 256*x by doubling x eight times (expensive 
> multiplications were disabled in a tragic DDoS accident), and publishes the 
> result y. Bob independently computes 256 * x (he has a friend who is a 
> mathematician, he'll know how to do it). If the result is not y, Bob will 
> start a challenge; otherwise, Alice wins and takes the money.
>
> (The example is of course artificial, as redoing the computation in Script is 
> cheaper than executing the fraud proof in this case!)
>
> What follows is an actual execution of the protocol. In the following, each 
> [Si] is a UTXO corresponding to some possible FSM node, starting with the S0, 
> the UTXO with 1+1 = 2 coins. Each line with "-" is a possible transition 
> (script in the taptree), specifying what is the next FSM node after the "==>" 
> symbol; the encumbrance in the scripts enforce that the state of the next 
> UTXO is updated correctly (details omitted below), and any other necessary 
> conditions to ensure the integrity of the protocol.
>
> =====
>
> [S0]: Initial UTXO
> - only Bob can spend, he must choose his number x ==> S1
>
> [S1; state: x]:
> - only Alice can spend, she publishes her answer y ==> S2
>
> [S2. state: x, y]:
> - after 1 day: Alice won, she can take the money // Happy case! Usually 
> that's the end
> - Bob disagrees with the answer, post z as his answer. ==> S3
>
> The challenge starts here! Let's put some actual numbers. x = 2; y = 508; z = 
> 512.
>
> This is what Alice computed:
>
> 2 => 4 => 8 => 16 => 32 => 64 => 127 => 254 => 508
>
> This is what Bob computed:
>
> 2 => 4 => 8 => 16 => 32 => 64 => 128 => 256 => 512
>
> At this time, we don't know who is right. They both built a tree that looks 
> like this (ASCII art only working in fixed-width font):
>
> ___H18___
> / \
> / \
> H14 H58
> / \ / \
> / \ / \
> / \ / \
> H12 H34 H56 H78
> / \ / \ / \ / \
> H1 H2 H3 H4 H5 H6 H7 H8
>
> Remember that each internal node commits to: the state of the computation 
> before the leftmost leaf in the subtree, the state after the rightmost leaf, 
> and the hash of sub-trace for the sub-tree. Each leaf just commits to that 
> intermediate computation step (and the operation, which here is always 
> "double the input"). For example, H4 commits to "16 => 32" according to both 
> Alice's and Bob's computation traces.
>
> (From our privileged point of view, we can foresee that the earliest 
> disagreement is on the 6th step of the computation: "64 => 127" according to 
> Alice, "64 => 128" according to Bob).
>
> Let's denote h_{A;18} (resp. h_{B;18}) all the information committed to in 
> the node H18, according to Alice (resp. Bob). Similarly for all the other 
> nodes.
>
> [S3. state: x, y, z]: Challenge starts!
> - Alice posts the root of her computation trace h_{A;18} ==> S4
>
> [S4. state: x, y, z, h_{A;18}]
> - Bob posts the root of her computation trace h_{B;18} ==> S5
>
> Since they disagree, it must be the case that h_{A;18} != h_{B;18}.
>
> [S5. state: x, y, z, h_{A;18}, h_{B;18}]
> - Alice opens the commitment h_{A;18}, by revealing H14 and H58 (according to 
> her) ==> S6
>
> Note that in this last transition (going to S6), the covenant enforces that 
> the child commitments are compatible: the transition is only valid if the 
> starting state of the computation according to h_{A;14} is compatible with 
> h_{A;18} (that is, it's equal to x); similarly the end state of the 
> computation in h_{A;58} must be y, and h_{A;18} can be recomputed from the 
> data provided (ensuring the integrity of the Merkle tree).
> This is true for all the commitment openings below.
>
> [S6. state: x, y, z, (h_{A;14}, h_{A;58}), h_{B;18}]
> - Bob opens the commitment h_{B;18}, by revealing H14 and H58 (according to 
> him) ==> S7
>
> [S7. state: x, y, z, (h_{A;18}, h_{A;14}, h_{A;58}), (h_{B;18}, h_{B;14}, 
> h_{B;58})]
> // We now need to choose a child where there is disagreement.
> // If both children don't match, iterate on the left child.
> - Anyone: if h_{A;14} == h_{B;14} ==> S8
> - Anyone: if h_{A;14} != h_{B;14} ==> Continue challenge on H14 // 
> Non-executed FSM cases omitted for brevity
>
> At this point, the disagreement over the root is settled: Alice and Bob agree 
> on the first half of the computation, but they disagree over the second half. 
> Therefore, in S8 the protocol continues over H58.
>
> [S8. state: h_{A;58}, h_{B;58}]
> // This is analogous to S5, just with half of the computation steps.
> - Alice opens the commitment h_{A;58}, by revealing H56 and H78 (according to 
> her) ==> S9
>
> [S9. state: (h_{A;56}, h_{A;78}), h_{B;58}]
> - Bob opens the commitment h_{B;58}, by revealing H56 and H78 (according to 
> him) ==> S10
>
> [S10. state: (h_{A;56}, h_{A;78}), (h_{B;56}, h_{B;78})]
> // Like S7, iterate on a disagreeing child
> - Anyone: if h_{A;56} == h_{B;56} ==> continue challenge on H78 // 
> Non-executed FSM cases omitted for brevity
> - Anyone: if h_{A;56} != h_{B;56} ==> S11
>
> Getting there! The subtree now commits to just two computation steps.
>
> [S11. state: h_{A;56}, h_{B;56}]
> // This is analogous to S5 and S8.
> - Alice opens the commitment h_{A;56}, by revealing H5 and H6 (according to 
> her) ==> S12
>
> [S12. state: (h_{A;5}, h_{A;6}), h_{B;56}]
> - Bob opens the commitment h_{B;56}, by revealing H5 and H6 (according to 
> him) ==> S13
>
> [S13. state: (h_{A;5}, h_{A;6}), (h_{B;5}, h_{B;6})]
> // Like S7 and S10, iterate on a disagreeing child
> - Anyone: if h_{A;5} == h_{B;5} ==> S14
> - Anyone: if h_{A;5} != h_{B;5} ==> continue challenge on H5 // Non-executed 
> FSM cases omitted for brevity
>
> We are now at the crucial stage: the commitment corresponds to a leaf of the 
> computation trace Merkle tree.
>
> [S14. state: h_{A;6}, h_{B;6}]
> - Alice can take all the money if she can open h_{A;6} to a correct "n => n + 
> n" computation step
> - Bob can take all the money if he can open h_{B;6} to a correct "n => n + n" 
> computation step
>
> The challenge now ends quickly: Bob's hash commits to the computation step 
> "64 => 128".
> Instead, Alice's step is the incorrect "64 => 127".
>
> It's not difficult to convince oneself that, as long as the hash function is 
> collision-free and the computation is deterministic, only the honest party 
> can provide correct data for this final step.
> (The bisection protocol can't do anything useful if both parties provide 
> incorrect data; arguably, that is not a very interesting scenario!)
>
> Crucially, the operation in the single step is so simple that Script can 
> verify it.
>
> =====
>
> If you read until here: thank you, this was the first execution of a 
> challenge in MATT covenants!
>
> Of course, there are a few things missing in the above protocol:
> - Bonds should be added in order to incentivize cooperation.
> - The omitted FSM steps (corresponding to branches of the challenge that were 
> never taken) need to be computed nonetheless when preparing the covenant.
> - Additional transitions should be added at every step (always allow 
> cooperative behavior; forfait after a timeout if it's the other party's turn).
> - Some of those consecutive "forced" steps can be contracted in a single 
> step; I felt this sequence is more logical to explain the protocol, but 
> implementations would want to optimize it.
>
> Yet, _all_ the code and scripts of the bisection protocol are independent of 
> the actual execution, and can be precomputed (bottom up, starting from the 
> leaves) before the initial covenant is created - therefore, before x, y and z 
> are chosen and committed to.
>
> While here each leaf is doing the same operation (doubling a number), it is 
> well-known that arbitrary computation can be decomposed in very simple 
> elementary functions (like NAND gates, if we want to be minimalistic).
>
> I hope this helps in clarifying the role of the bisection protocol in smart 
> contracts using MATT covenants.
>
> Best,
> Salvatore
_______________________________________________
bitcoin-dev mailing list
bitcoin-dev@lists.linuxfoundation.org
https://lists.linuxfoundation.org/mailman/listinfo/bitcoin-dev

Reply via email to