A transaction chain is used for creating a multi-stage protocol whose code does not contain loops or
A transaction chain is created as follows:
1: Represent as N#
Represent an Ethereum contract’s execution using n sequential steps, where each step represents a transaction that modifies its state. The states before and after a transaction are a directed graph's start and end nodes, with the transaction as the edge joining them. As an example, a 3-stage contract, such as the ICO example of Section 4.3, is represented as:
The states contain data and the code that was executed in the transaction.
n’s code and data inside state
n − 1’s code. Then require the code of state
n − 1 to output a box containing state n’s code and data. An example is given in the following pseudocode:
out.propositionBytes == state_n_code && out.R4[Int].get == SELF.R4[Int].get // ensure data is propagated
The above code uses the field
propositionBytes of a box, which contains the binary representation of its guard script as a collection of bytes.
Repeat Step 2 by replacing
(n, n − 1) by
(n − 1, n − 2) while
n > 2
To avoid code size increase at each iteration, we ideally work with hashes, as in hash(out.propositionBytes) == state n code hash. However, for clarity of presentation, we will skip this optimization.
Next, we will look at Transaction Trees