From e10b199ae168d8ece33a669131376f5d8fd0ff00 Mon Sep 17 00:00:00 2001 From: Katarzyna Streich Date: Tue, 29 Nov 2016 11:53:54 +0000 Subject: [PATCH] Add clauses documentation. --- docs/source/clauses.rst | 278 ++++++++++++++++++ docs/source/index.rst | 1 + docs/source/resources/allCompositionChart.png | Bin 0 -> 22693 bytes docs/source/resources/anyCompositionChart.png | Bin 0 -> 14902 bytes docs/source/resources/commPaperClauses.png | Bin 0 -> 13269 bytes docs/source/resources/commPaperExecution.png | Bin 0 -> 27042 bytes .../resources/firstCompositionChart.png | Bin 0 -> 16122 bytes .../resources/groupClauseVerifyChart.png | Bin 0 -> 14096 bytes docs/source/tutorial-contract-clauses.rst | 230 ++++++++++----- docs/source/tutorial-contract.rst | 2 + 10 files changed, 431 insertions(+), 80 deletions(-) create mode 100644 docs/source/clauses.rst create mode 100644 docs/source/resources/allCompositionChart.png create mode 100644 docs/source/resources/anyCompositionChart.png create mode 100644 docs/source/resources/commPaperClauses.png create mode 100644 docs/source/resources/commPaperExecution.png create mode 100644 docs/source/resources/firstCompositionChart.png create mode 100644 docs/source/resources/groupClauseVerifyChart.png diff --git a/docs/source/clauses.rst b/docs/source/clauses.rst new file mode 100644 index 0000000000..9e55fc1e4c --- /dev/null +++ b/docs/source/clauses.rst @@ -0,0 +1,278 @@ +Clauses key concepts +==================== + +Basic clause structure +---------------------- + +A clause is a small building block for assembling contract verification logic, reusable and ready to test in separation. +To see clauses in action go to: :doc:`tutorial-contract-clauses`. +Let's take a look at a simplified structure of the ``Clause`` class: + +.. container:: codeset + + .. sourcecode:: kotlin + + abstract class Clause { + + /** Determine whether this clause runs or not */ + open val requiredCommands: Set> = emptySet() + + @Throws(IllegalStateException::class) + abstract fun verify(tx: TransactionForContract, + inputs: List, + outputs: List, + commands: List>, + groupingKey: K?): Set + ... + } + +Basic clause structure contains two important components: ``requiredCommands`` and ``verify`` function. +A clause is triggered when all ``requiredCommands`` are present in transaction's command set (opposite inclusion doesn't have to hold). +Then the ``verify`` function is run, which checks if transaction meets conditions specified by this clause. Verification +is no different than normal contract verification but using clauses it's split into smaller generic code blocks with single verify method. + +When writing a contract you need to override the contract's ``verify`` function which should call ``verifyClause``. See: :ref:`verify_ref`. + +.. note:: A clause ``verify`` function returns the set of processed commands, at the end of ``verifyClause`` execution + there is a check if all of transaction's commands were matched. If not then an exception is raised. This is done to + enforce that spurious commands cannot be included in a transaction, ensuring that the transaction is as clear as + possible. As an example imagine a transaction with two commands: ``Move`` and ``Issue`` included, with verification written + using ``FirstComposition`` on clauses that require single command set. Thus only one of transaction's commands will match + leaving the second unprocessed. It should raise an error - we want to ensure that commands set is minimal to simplify + analysis of intent of a transaction. + +An example ``verify`` from ``Obligation`` contract: + +.. container:: codeset + + .. sourcecode:: kotlin + + override fun verify(tx: TransactionForContract) = verifyClause(tx, FirstComposition( + Clauses.Net(), + Clauses.Group

() + ), tx.commands.select()) + +It takes transaction to be verified, and passes it along with a top-level clause and commands to the ``verifyClause`` +function. As you can see above we have used ``FirstComposition`` which is a special type of clause, which extends the +``CompositeClause`` abstract class (in that particular case, it ensures that either ``Net`` or ``Group`` will run - for explanation see `FirstComposition`_). +It's a type of clause that adds support for encapsulating multiple clauses and defines common behaviour for that composition. +There is also a ``GroupClauseVerifier`` special clause, which specifies how to group transaction input/output states +together and passes them to adequate clause for further processing. + +Composition clauses +------------------- + +One of the most important concepts of clauses - composition clauses which extend ``CompositeClause`` abstract class, +providing a range of ways of assembling clauses together. They define a logic of verification execution specifying which clauses +will be run. + +AllComposition +~~~~~~~~~~~~~~ + +**Description** + +Composes a number of clauses, such that all of the clauses must run for verification to pass. + +.. image:: resources/allCompositionChart.png + +Short description: + +- ``AllComposition`` holds clauses *Cl1,..,Cl5*. +- Check if all clauses that compose ``AllComposition`` have associated commands in a command set - if not, verification fails. +- After successful check runs verification logic specific for every clause *Cl1,..,Cl5* from that composition. + +**Usage** + +See code in `GroupClauseVerifier`_. + +AnyComposition +~~~~~~~~~~~~~~ + +**Description** + +Composes a number of clauses, such that 0 or more of the clauses can be run. + +.. image:: resources/anyCompositionChart.png + +Short description: + +- Checks if zero or more clauses that compose AnyComposition have associated commands in a command set. +- After success runs verification logic specific for every *matched* (in this case *Cl2, Cl4, Cl5*) clause from composition. + +**Usage** + +Example from ``CommercialPaper.kt``: + +.. container:: codeset + + .. sourcecode:: kotlin + + class Group : GroupClauseVerifier>( + AnyComposition( + Redeem(), + Move(), + Issue())) { + override fun groupStates(tx: TransactionForContract): List>> + = tx.groupStates> { it.token } + } + +FirstComposition +~~~~~~~~~~~~~~~~ + +**Description** + +Composes a number of clauses, such that the first match is run, and it errors if none is run. + +.. image:: resources/firstCompositionChart.png + +Short description: + +- Takes first clause that matches and if none found throws an exception. +- If successful runs verification on the clause that matched (in this case *Cl4*). + +**Usage** + +See code in `GroupClauseVerifier`_. + + +Other types of clauses +---------------------- + +There are certain types of clauses that are specialized in particular types of contracts (like ``AbstractIssue``) or generally +should be used as helpers in building parts of logic (the most important one is ``GroupClauseVerifier``). + +GroupClauseVerifier +~~~~~~~~~~~~~~~~~~~ + +**Description** + +Groups input and output states according to ``groupStates`` function. Runs the top-level clause verification on each +group in turn. + +.. image:: resources/groupClauseVerifyChart.png + +Short description: + +``GroupClauseVerifier`` wraps clause *Cl1*. After grouping relevant states together with ``groupStates`` into three groups +*Gr1, Gr2, Gr3* runs *Cl1.verify(Gr1), Cl1.verify(Gr2), Cl1.verify(Gr3)*. + +For more detailed example head to :ref:`state_ref`. + +**Usage** + +You need to extend ``GroupClauseVerifier`` clause and define ``groupStates`` function which takes transaction and returns +grouped input and output states with a grouping key used for each group. Example from ``Obligation.kt`` contract: + +.. container:: codeset + + .. sourcecode:: kotlin + + class Group

: GroupClauseVerifier, Commands, Issued>>( + AllComposition( + NoZeroSizedOutputs, Commands, Terms

>(), + FirstComposition( + SetLifecycle

(), + AllComposition( + VerifyLifecycle, Commands, Issued>, P>(), + FirstComposition( + Settle

(), + Issue(), + ConserveAmount() + ) + ) + ) + ) + ) { + override fun groupStates(tx: TransactionForContract): List, Issued>>> + = tx.groupStates, Issued>> { it.amount.token } + } + +Usually it's convenient to use ``groupStates`` function defined on ``TransactionForContract`` class. Which given a type and a +selector function, that returns a grouping key, associates inputs and outputs together so that they can be processed as one. +The grouping key is any arbitrary object that can act as a map key (so must implement equals and hashCode). + +AbstractConserveAmount +~~~~~~~~~~~~~~~~~~~~~~ + +**Description** + +Standardised clause for checking input/output balances of fungible assets. Requires that a +Move command is provided, and errors if absent. Conserve amount clause can only be used on grouped states. + +**Usage** + +.. container:: codeset + + .. sourcecode:: kotlin + + /** + * Generic move/exit clause for fungible assets + */ + class ConserveAmount

: AbstractConserveAmount, Commands, Terms

>() + +See code in `GroupClauseVerifier`_. + +AbstractIssue +~~~~~~~~~~~~~ + +**Description** + +Standard issue clause for contracts that issue fungible assets. + +**Usage** + +Example from ``CommercialPaper.kt``: + +.. container:: codeset + + .. sourcecode:: kotlin + + class Issue : AbstractIssue( + { map { Amount(it.faceValue.quantity, it.token) }.sumOrThrow() }, + { token -> map { Amount(it.faceValue.quantity, it.token) }.sumOrZero(token) }) { + override val requiredCommands: Set> = setOf(Commands.Issue::class.java) + + override fun verify(tx: TransactionForContract, + inputs: List, + outputs: List, + commands: List>, + groupingKey: Issued?): Set { + val consumedCommands = super.verify(tx, inputs, outputs, commands, groupingKey) + ... + +First function in constructor converts a list of states into an amount of the token. Must error if there are no states in the list. +Second function converts a list of states into an amount of the token, and returns zero if there are no states in the list. +Takes in an instance of the token definition for constructing the zero amount if needed. + +NoZeroSizedOutputs +~~~~~~~~~~~~~~~~~~ + +**Description** + +Clause for fungible asset contracts, which enforces that no output state should have a balance of zero. + +**Usage** + +See code in `GroupClauseVerifier`_. + +FilterOn +~~~~~~~~ + +**Description** + +Filter the states that are passed through to the wrapped clause, to restrict them to a specific type. + +``FilterOn`` narrows the scope of the states being verified. +Let's take a transaction with multiple cash states of different currencies, we want to run a clause that focuses +on only GBP cash states rather than all cash states. + +**Usage** + +.. container:: codeset + + .. sourcecode:: kotlin + + FilterOn(clause, { states -> states.filter { it.amount.token == GBP} }) + + +Takes ``filterStates`` function that limits states passed to ``clause`` verification. diff --git a/docs/source/index.rst b/docs/source/index.rst index 2f4d193289..587db18908 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -91,6 +91,7 @@ Read on to learn: contract-catalogue contract-irs + clauses .. toctree:: :maxdepth: 2 diff --git a/docs/source/resources/allCompositionChart.png b/docs/source/resources/allCompositionChart.png new file mode 100644 index 0000000000000000000000000000000000000000..e33304d8db84591dae06a8eb22b8c50de865adc4 GIT binary patch literal 22693 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 F@?Y(DR22XK literal 0 HcmV?d00001 diff --git a/docs/source/resources/anyCompositionChart.png b/docs/source/resources/anyCompositionChart.png new file mode 100644 index 0000000000000000000000000000000000000000..7ee61cf0011b2fa11ab06856c2e5bc81fd289d17 GIT binary patch literal 14902 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 W>dW9^$1YL#dPDb?PT@7XkpByL199^J literal 0 HcmV?d00001 diff --git a/docs/source/resources/commPaperClauses.png b/docs/source/resources/commPaperClauses.png new file mode 100644 index 0000000000000000000000000000000000000000..19f22cbdfecd4d2796565d55fd9687eb3a909c71 GIT binary patch literal 13269 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 T!^?pGsj9B5qg1Z&HuQf0v|^{! literal 0 HcmV?d00001 diff --git a/docs/source/resources/commPaperExecution.png b/docs/source/resources/commPaperExecution.png new file mode 100644 index 0000000000000000000000000000000000000000..1921e59e916308de5eb41483838198cd386d82b9 GIT binary patch literal 27042 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[Sm;%loZ3x-mU7k{%T-9K`pKGvjL1slL7K5-)e88 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 literal 0 HcmV?d00001 diff --git a/docs/source/tutorial-contract-clauses.rst b/docs/source/tutorial-contract-clauses.rst index 9b4b24438a..01d1f68a5e 100644 --- a/docs/source/tutorial-contract-clauses.rst +++ b/docs/source/tutorial-contract-clauses.rst @@ -9,43 +9,63 @@ Writing a contract using clauses This tutorial will take you through restructuring the commercial paper contract to use clauses. You should have already completed ":doc:`tutorial-contract`". +As before, the example is focused on basic implementation of commercial paper, which is essentially a simpler version of a corporate +bond. A company issues CP with a particular face value, say $100, but sells it for less, say $90. The paper can be redeemed +for cash at a given date in the future. Thus this example would have a 10% interest rate with a single repayment. +Whole Kotlin code can be found in ``CommercialPaper.kt``. + +What are clauses and why to use them? +------------------------------------- Clauses are essentially micro-contracts which contain independent verification logic, and can be logically composed -together to form a contract. Clauses are designed to enable re-use of common logic, for example issuing state objects +together to form a contract. Clauses are designed to enable re-use of common verification parts, for example issuing state objects is generally the same for all fungible contracts, so a common issuance clause can be inherited for each contract's issue clause. This cuts down on scope for error, and improves consistency of behaviour. By splitting verification logic into smaller chunks, they can also be readily tested in isolation. -Clauses can be composed of subclauses, for example the ``AllClause`` or ``AnyClause`` clauses take list of clauses -that they delegate to. Clauses can also change the scope of states and commands being verified, for example grouping -together fungible state objects and running a clause against each distinct group. +How clauses work? +----------------- -The commercial paper contract has a ``Group`` outermost clause, which contains the ``Issue``, ``Move`` and ``Redeem`` -clauses. The result is a contract that looks something like this: +We have different types of clauses, the most basic are the ones that define verification logic for particular command set. +We will see them later as elementary building blocks that commercial paper consist of - ``Move``, ``Issue`` and ``Redeem``. +As a developer you need to identify reusable parts of your contract and decide how they should be combined. It is where +composite clauses become useful. They gather many clause subcomponents and resolve how and which of them should be checked. - 1. Group input and output states together, and then apply the following clauses on each group: - a. If an ``Issue`` command is present, run appropriate tests and end processing this group. - b. If a ``Move`` command is present, run appropriate tests and end processing this group. - c. If a ``Redeem`` command is present, run appropriate tests and end processing this group. +For example, assume that we want to verify a transaction using all constraints defined in separate clauses. We need to +wrap classes that define them into ``AllComposition`` composite clause. It assures that all clauses from that combination +match with commands in a transaction - only then verification logic can be executed. +It may be a little confusing, but composite clause is also a clause and you can even wrap it in the special grouping clause. +In ``CommercialPaper`` it looks like that: + +.. image:: resources/commPaperClauses.png + +The most basic types of composite clauses are ``AllComposition``, ``AnyComposition`` and ``FirstComposition``. +In this tutorial we will use ``GroupClauseVerifier`` and ``AnyComposition``. It's important to understand how they work. +Charts showing execution and more detailed information can be found in :doc:`clauses`. + +.. _verify_ref: Commercial paper class ---------------------- -To use the clause verification logic, the contract needs to call the ``verifyClause`` function, passing in the -transaction, a clause to verify, and a collection of commands the clauses are expected to handle all of. This list of -commands is important because ``verifyClause`` checks that none of the commands are left unprocessed at the end, and -raises an error if they are. The top level clause would normally be a composite clause (such as ``AnyComposition``, -``AllComposition``, etc.) which contains further clauses. The following examples are trimmed to the modified class -definition and added elements, for brevity: +We start from defining ``CommercialPaper`` class. As in previous tutorial we need some elementary parts: ``Commands`` interface, +``generateMove``, ``generateIssue``, ``generateRedeem`` - so far so good that stays the same. The new part is verification and +``Clauses`` interface (you will see them later in code). Let's start from the basic structure: .. container:: codeset .. sourcecode:: kotlin - class CommercialPaper : Contract { - override val legalContractReference: SecureHash = SecureHash.sha256("https://en.wikipedia.org/wiki/Commercial_paper") + class CommercialPaper : Contract { + override val legalContractReference: SecureHash = SecureHash.sha256("https://en.wikipedia.org/wiki/Commercial_paper") - override fun verify(tx: TransactionForContract) = verifyClause(tx, Clauses.Group(), tx.commands.select()) + override fun verify(tx: TransactionForContract) = verifyClause(tx, Clauses.Group(), tx.commands.select()) + + interface Commands : CommandData { + data class Move(override val contractHash: SecureHash? = null) : FungibleAsset.Commands.Move, Commands + class Redeem : TypeOnlyCommandData(), Commands + data class Issue(override val nonce: Long = random63BitValue()) : IssueCommand, Commands + } .. sourcecode:: java @@ -60,88 +80,135 @@ definition and added elements, for brevity: ClauseVerifier.verifyClause(tx, new Clauses.Group(), extractCommands(tx)); } -Clauses -------- + public interface Commands extends CommandData { + class Move implements Commands { + @Override + public boolean equals(Object obj) { return obj instanceof Move; } + } -We'll tackle the inner clauses that contain the bulk of the verification logic, first, and the clause which handles -grouping of input/output states later. The clauses must extend the ``Clause`` abstract class, which defines -the ``verify`` function, and the ``requiredCommands`` property used to determine the conditions under which a clause -is triggered. Composite clauses should extend the ``CompositeClause`` abstract class, which extends ``Clause`` to -add support for wrapping around multiple clauses. + class Redeem implements Commands { + @Override + public boolean equals(Object obj) { return obj instanceof Redeem; } + } -The ``verify`` function defined in the ``Clause`` interface is similar to the conventional ``Contract`` verification -function, although it adds new parameters and returns the set of commands which it has processed. Normally this returned -set is identical to the ``requiredCommands`` used to trigger the clause, however in some cases the clause may process -further optional commands which it needs to report that it has handled. + class Issue implements Commands { + @Override + public boolean equals(Object obj) { return obj instanceof Issue; } + } + } -The ``Move`` clause for the commercial paper contract is relatively simple, so we will start there: +As you can see we used ``verifyClause`` function with ``Clauses.Group()`` in place of previous verification. +It's an entry point to running clause logic. ``verifyClause`` takes the transaction, a clause (usually a composite one) +to verify, and a collection of commands the clause is expected to handle all of. This list of commands is important because +``verifyClause`` checks that none of the commands are left unprocessed at the end, and raises an error if they are. + +Simple Clauses +-------------- + +Let's move to constructing contract logic in terms of clauses language. Commercial paper contract has three commands and +three corresponding behaviours: ``Issue``, ``Move`` and ``Redeem``. Each of them has a specific set of requirements that must be satisfied - +perfect material for defining clauses. For brevity we will show only ``Move`` clause, rest is constructed in similar manner +and included in the ``CommercialPaper.kt`` code. .. container:: codeset .. sourcecode:: kotlin - class Move: Clause>() { - override val requiredCommands: Set> - get() = setOf(Commands.Move::class.java) + interface Clauses { + class Move: Clause>() { + override val requiredCommands: Set> + get() = setOf(Commands.Move::class.java) - override fun verify(tx: TransactionForContract, + override fun verify(tx: TransactionForContract, inputs: List, outputs: List, commands: List>, groupingKey: Issued?): Set { - val command = commands.requireSingleCommand() - val input = inputs.single() - requireThat { - "the transaction is signed by the owner of the CP" by (input.owner in command.signers) - "the state is propagated" by (outputs.size == 1) - // Don't need to check anything else, as if outputs.size == 1 then the output is equal to - // the input ignoring the owner field due to the grouping. + val command = commands.requireSingleCommand() + val input = inputs.single() + requireThat { + "the transaction is signed by the owner of the CP" by (input.owner in command.signers) + "the state is propagated" by (outputs.size == 1) + // Don't need to check anything else, as if outputs.size == 1 then the output is equal to + // the input ignoring the owner field due to the grouping. + } + return setOf(command.value) } - return setOf(command.value) } - } + ... .. sourcecode:: java - class Move extends Clause { - @NotNull - @Override - public Set> getRequiredCommands() { - return Collections.singleton(Commands.Move.class); - } - - @NotNull - @Override - public Set verify(@NotNull TransactionForContract tx, - @NotNull List inputs, - @NotNull List outputs, - @NotNull List> commands, - @NotNull State groupingKey) { - AuthenticatedObject cmd = requireSingleCommand(tx.getCommands(), Commands.Move.class); - // There should be only a single input due to aggregation above - State input = single(inputs); - - if (!cmd.getSigners().contains(input.getOwner())) - throw new IllegalStateException("Failed requirement: the transaction is signed by the owner of the CP"); - - // Check the output CP state is the same as the input state, ignoring the owner field. - if (outputs.size() != 1) { - throw new IllegalStateException("the state is propagated"); + public interface Clauses { + class Move extends Clause { + @NotNull + @Override + public Set> getRequiredCommands() { + return Collections.singleton(Commands.Move.class); + } + + @NotNull + @Override + public Set verify(@NotNull TransactionForContract tx, + @NotNull List inputs, + @NotNull List outputs, + @NotNull List> commands, + @NotNull State groupingKey) { + AuthenticatedObject cmd = requireSingleCommand(tx.getCommands(), Commands.Move.class); + // There should be only a single input due to aggregation above + State input = single(inputs); + + if (!cmd.getSigners().contains(input.getOwner())) + throw new IllegalStateException("Failed requirement: the transaction is signed by the owner of the CP"); + + // Check the output CP state is the same as the input state, ignoring the owner field. + if (outputs.size() != 1) { + throw new IllegalStateException("the state is propagated"); + } + // Don't need to check anything else, as if outputs.size == 1 then the output is equal to + // the input ignoring the owner field due to the grouping. + return Collections.singleton(cmd.getValue()); } - // Don't need to check anything else, as if outputs.size == 1 then the output is equal to - // the input ignoring the owner field due to the grouping. - return Collections.singleton(cmd.getValue()); } - } + ... + +We took part of code for ``Command.Move`` verification from previous tutorial and put it into the verify function +of ``Move`` class. Notice that this class must extend the ``Clause`` abstract class, which defines +the ``verify`` function, and the ``requiredCommands`` property used to determine the conditions under which a clause +is triggered. In the above example it means that the clause will run verification when the ``Commands.Move`` is present in a transaction. + +.. note:: Notice that commands refer to all input and output states in a transaction. For clause to be executed, transaction has + to include all commands from ``requiredCommands`` set. + +Few important changes: + +- ``verify`` function returns the set of commands which it has processed. Normally this returned set is identical to the + ``requiredCommands`` used to trigger the clause, however in some cases the clause may process further optional commands + which it needs to report that it has handled. + +- Verification takes new parameters. Usually inputs and outputs are some subset of the original transaction entries + passed to the clause by outer composite or grouping clause. ``groupingKey`` is a key used to group original states. + +As a simple example imagine input states: + +1. 1000 GBP issued by Bank of England +2. 500 GBP issued by Bank of England +3. 1000 GBP issued by Bank of Scotland + +We will group states by Issuer so in the first group we have inputs 1 and 2, in second group input number 3. Grouping keys are: +'GBP issued by Bank of England' and 'GBP issued by Bank of Scotland'. + +How the states can be grouped and passed in that form to the ``Move`` clause? That leads us to the concept of ``GroupClauseVerifier``. Group clause ------------ -We need to wrap the move clause (as well as the issue and redeem clauses - see the relevant contract code for their -full specifications) in an outer clause that understands how to group contract states and objects. For this we extend -the standard ``GroupClauseVerifier`` and specify how to group input/output states, as well as the top-level to run on -each group. As with the top level clause on a contract, this is normally a composite clause that delegates to subclauses. - +We may have a transaction with similar but unrelated state evolutions which need to be validated independently. It +makes sense to check ``Move`` command on groups of related inputs and outputs (see example above). Thus, we need to collect +relevant states together. +For this we extend the standard ``GroupClauseVerifier`` and specify how to group input/output states, as well as the top-level +clause to run on each group. In our example a top-level is a composite clause - ``AnyCompostion`` that delegates verification to +it's subclasses (wrapped move, issue, redeem). Any in this case means that it will take 0 or more clauses that match transaction commands. .. container:: codeset @@ -174,17 +241,20 @@ each group. As with the top level clause on a contract, this is normally a compo } } -For the ``CommercialPaper`` contract, this is the top level clause for the contract, and is passed directly into -``verifyClause`` (see the example code at the top of this tutorial). +For the ``CommercialPaper`` contract, ``Group`` is the main clause for the contract, and is passed directly into +``verifyClause`` (see the example code at the top of this tutorial). We used ``groupStates`` function here, it's worth reminding +how it works: :ref:`state_ref`. Summary ------- In summary the top level contract ``CommercialPaper`` specifies a single grouping clause of type ``CommercialPaper.Clauses.Group`` which in turn specifies ``GroupClause`` implementations for each type of command -(``Redeem``, ``Move`` and ``Issue``). This reflects the flow of verification: In order to verify a ``CommercialPaper`` +(``Redeem``, ``Move`` and ``Issue``). This reflects the flow of verification: in order to verify a ``CommercialPaper`` we first group states, check which commands are specified, and run command-specific verification logic accordingly. +.. image:: resources/commPaperExecution.png + Debugging --------- diff --git a/docs/source/tutorial-contract.rst b/docs/source/tutorial-contract.rst index 2db18bdf4f..87f5e17c97 100644 --- a/docs/source/tutorial-contract.rst +++ b/docs/source/tutorial-contract.rst @@ -321,6 +321,8 @@ The second line does what the code suggests: it searches for a command object th ``CommercialPaper.Commands`` supertype, and either returns it, or throws an exception if there's zero or more than one such command. +.. _state_ref: + Using state groups ------------------