From 201a4a13c1128dc926af042ab4d7f0459faac314 Mon Sep 17 00:00:00 2001 From: Joel Dudley Date: Wed, 7 Jun 2017 16:14:01 +0100 Subject: [PATCH] Further docsite changes, including reorganising the index. --- docs/source/api-contracts.rst | 2 +- docs/source/api-core-types.rst | 39 ++--- docs/source/api-flows.rst | 20 +-- .../{persistence.rst => api-persistence.rst} | 69 ++++---- docs/source/api-rpc.rst | 29 ++++ docs/source/api-service-hub.rst | 29 ++++ docs/source/api-states.rst | 8 +- docs/source/api.rst | 3 +- docs/source/building-a-cordapp-index.rst | 16 ++ docs/source/component-library-index.rst | 10 ++ docs/source/contract-irs.rst | 2 +- docs/source/corda-configuration-file.rst | 2 +- docs/source/corda-networks-index.rst | 9 + docs/source/corda-nodes-index.rst | 12 ++ docs/source/financial-model.rst | 4 +- docs/source/index.rst | 159 ++---------------- docs/source/key-concepts-consensus.rst | 11 ++ docs/source/key-concepts-contracts.rst | 15 ++ docs/source/key-concepts-ecosystem.rst | 5 +- docs/source/key-concepts-flows.rst | 87 +++++++--- docs/source/key-concepts-ledger.rst | 11 ++ docs/source/key-concepts-node.rst | 17 +- docs/source/key-concepts-notaries.rst | 15 +- docs/source/key-concepts-oracles.rst | 57 ++++++- docs/source/key-concepts-states.rst | 15 ++ docs/source/key-concepts-time-windows.rst | 11 +- docs/source/key-concepts-transactions.rst | 33 ++++ docs/source/key-concepts.rst | 111 ++---------- docs/source/merkle-trees.rst | 125 -------------- docs/source/network-simulator.rst | 2 +- docs/source/node-internals-index.rst | 11 ++ docs/source/other-index.rst | 12 ++ docs/source/quickstart-index.rst | 10 ++ docs/source/release-process-index.rst | 10 ++ .../{ => resources}/contract-cp-state.png | Bin docs/source/{ => resources}/contract-cp.png | Bin docs/source/{ => resources}/contract-irs.png | Bin docs/source/resources/flow-sequence.png | Bin 0 -> 201861 bytes .../{ => resources}/network-simulator.png | Bin docs/source/running-a-node.rst | 3 +- docs/source/running-the-demos.rst | 6 +- docs/source/tools-index.rst | 11 ++ docs/source/tutorial-contract.rst | 4 +- docs/source/tutorial-tear-offs.rst | 80 +++++++++ docs/source/tutorials-index.rst | 21 +++ 45 files changed, 611 insertions(+), 485 deletions(-) rename docs/source/{persistence.rst => api-persistence.rst} (53%) create mode 100644 docs/source/api-rpc.rst create mode 100644 docs/source/api-service-hub.rst create mode 100644 docs/source/building-a-cordapp-index.rst create mode 100644 docs/source/component-library-index.rst create mode 100644 docs/source/corda-networks-index.rst create mode 100644 docs/source/corda-nodes-index.rst delete mode 100644 docs/source/merkle-trees.rst create mode 100644 docs/source/node-internals-index.rst create mode 100644 docs/source/other-index.rst create mode 100644 docs/source/quickstart-index.rst create mode 100644 docs/source/release-process-index.rst rename docs/source/{ => resources}/contract-cp-state.png (100%) rename docs/source/{ => resources}/contract-cp.png (100%) rename docs/source/{ => resources}/contract-irs.png (100%) create mode 100644 docs/source/resources/flow-sequence.png rename docs/source/{ => resources}/network-simulator.png (100%) create mode 100644 docs/source/tools-index.rst create mode 100644 docs/source/tutorial-tear-offs.rst create mode 100644 docs/source/tutorials-index.rst diff --git a/docs/source/api-contracts.rst b/docs/source/api-contracts.rst index db1c4a0b08..c011a098bd 100644 --- a/docs/source/api-contracts.rst +++ b/docs/source/api-contracts.rst @@ -136,7 +136,7 @@ Commands ``TransactionForContract`` contains the commands as a list of ``AuthenticatedObject`` instances. ``AuthenticatedObject`` pairs an object with a list of signers. In this case, ``AuthenticatedObject`` pairs a command - with a list of the entities that are required to sign a transaction where this command is present: +with a list of the entities that are required to sign a transaction where this command is present: .. container:: codeset diff --git a/docs/source/api-core-types.rst b/docs/source/api-core-types.rst index f86011d2db..2505068675 100644 --- a/docs/source/api-core-types.rst +++ b/docs/source/api-core-types.rst @@ -4,21 +4,28 @@ API: Core types Corda provides a large standard library of data types used to represent the Corda data model. In addition, there are a series of helper libraries which provide date manipulation, maths and cryptography functions. +Cryptography and maths support +------------------------------ +The ``SecureHash`` class represents a secure hash of unknown algorithm. We currently define only a single subclass, +``SecureHash.SHA256``. There are utility methods to create them, parse them and so on. + +We also provide some mathematical utilities, in particular a set of interpolators and classes for working with +splines. These can be found in the `maths package `_. + NamedByHash and UniqueIdentifier -------------------------------- - Things which are identified by their hash, like transactions and attachments, should implement the ``NamedByHash`` interface which standardises how the ID is extracted. Note that a hash is *not* a globally unique identifier: it is always a derivative summary of the contents of the underlying data. Sometimes this isn't what you want: two deals that have exactly the same parameters and which are made simultaneously but which are logically different -can't be identified by hash because their contents would be identical. Instead you would use ``UniqueIdentifier``. -This is a combination of a (Java) ``UUID`` representing a globally unique 128 bit random number, and an arbitrary -string which can be paired with it. For instance the string may represent an existing "weak" (not guaranteed unique) -identifier for convenience purposes. +can't be identified by hash because their contents would be identical. + +Instead you would use ``UniqueIdentifier``. This is a combination of a (Java) ``UUID`` representing a globally +unique 128 bit random number, and an arbitrary string which can be paired with it. For instance the string may +represent an existing "weak" (not guaranteed unique) identifier for convenience purposes. Party and CompositeKey ---------------------- - Entities using the network are called *parties*. Parties can sign structures using keys, and a party may have many keys under their control. @@ -30,13 +37,15 @@ without any identifying information about who owns it. In contrast, for internal a party are required, the ``Party`` class should be used. The identity service provides functionality for resolving anonymous parties to full parties. -An ``AuthenticatedObject`` represents an object (like a command) that has been signed by a set of parties. +.. note:: These types are provisional and will change significantly in future as the identity framework becomes more +fleshed out. -.. note:: These types are provisional and will change significantly in future as the identity framework becomes more fleshed out. +AuthenticatedObject +------------------- +An ``AuthenticatedObject`` represents an object (like a command) and the list of associated signers. Multi-signature support ----------------------- - Corda supports scenarios where more than one key or party is required to authorise a state object transition, for example: "Either the CEO or 3 out of 5 of his assistants need to provide signatures". @@ -44,7 +53,6 @@ Corda supports scenarios where more than one key or party is required to authori Composite Keys ^^^^^^^^^^^^^^ - This is achieved by public key composition, using a tree data structure ``CompositeKey``. A ``CompositeKey`` is a tree that stores the cryptographic public key primitives in its leaves and the composition logic in the intermediary nodes. Every intermediary node specifies a *threshold* of how many child signatures it requires. @@ -64,7 +72,6 @@ then specifies the minimum total weight of all children required. Our previous e Verification ^^^^^^^^^^^^ - Signature verification is performed in two stages: 1. Given a list of signatures, each signature is verified against the expected content. @@ -74,7 +81,6 @@ Signature verification is performed in two stages: Date support ------------ - There are a number of supporting interfaces and classes for use by contracts which deal with dates (especially in the context of deadlines). As contract negotiation typically deals with deadlines in terms such as "overnight", "T+3", etc., it's desirable to allow conversion of these terms to their equivalent deadline. ``Tenor`` models the interval @@ -86,12 +92,3 @@ Calculating the rollover of a deadline based on working days requires informatio bank holidays). The ``BusinessCalendar`` class models these calendars of business holidays; currently it loads these from files on disk, but in future this is likely to involve reference data oracles in order to ensure consensus on the dates used. - -Cryptography and maths support ------------------------------- - -The ``SecureHash`` class represents a secure hash of unknown algorithm. We currently define only a single subclass, -``SecureHash.SHA256``. There are utility methods to create them, parse them and so on. - -We also provide some mathematical utilities, in particular a set of interpolators and classes for working with -splines. These can be found in the `maths package `_. diff --git a/docs/source/api-flows.rst b/docs/source/api-flows.rst index 4d3367bb1c..714370e48b 100644 --- a/docs/source/api-flows.rst +++ b/docs/source/api-flows.rst @@ -123,23 +123,9 @@ annotation. ServiceHub ---------- -Within ``FlowLogic.call()``, the flow developer has access to the node's ``ServiceHub`` that provides access to the -various services the node provides. - -The key ``ServiceHub`` services are: - -* ``ServiceHub.networkMapCache`` - * Provides info on other nodes on the network (e.g. notaries…) -* ``ServiceHub.vaultService`` - * Stores the node’s current and historic states -* ``ServiceHub.storageService`` - * Stores additional info such as transactions and attachments -* ``ServiceHub.keyManagementService`` - * Manages the node’s digital signing keys -* ``ServiceHub.myInfo`` - * Other information about the node -* ``ServiceHub.clock`` - * Provides access to the node’s internal time and date +Within ``FlowLogic.call``, the flow developer has access to the node's ``ServiceHub``, which provides access to the +various services the node provides. See :doc:`api-service-hub` for information about the services the ``ServiceHub`` +offers. Some common tasks performed using the ``ServiceHub`` are: diff --git a/docs/source/persistence.rst b/docs/source/api-persistence.rst similarity index 53% rename from docs/source/persistence.rst rename to docs/source/api-persistence.rst index 0abf7fcb31..5c2b786db2 100644 --- a/docs/source/persistence.rst +++ b/docs/source/api-persistence.rst @@ -1,23 +1,22 @@ Persistence =========== -Corda offers developers the option to expose all or some part of a contract state to an *Object Relational Mapping* (ORM) tool -to be persisted in a RDBMS. The purpose of this is to assist *vault* development by effectively indexing +Corda offers developers the option to expose all or some part of a contract state to an *Object Relational Mapping* +(ORM) tool to be persisted in a RDBMS. The purpose of this is to assist *vault* development by effectively indexing persisted contract states held in the vault for the purpose of running queries over them and to allow relational joins between Corda data and private data local to the organisation owning a node. -The ORM mapping is specified using the `Java Persistence API `_ (JPA) -as annotations and is converted to database table rows by the node automatically every time a state is recorded in the -node's local vault as part of a transaction. +The ORM mapping is specified using the `Java Persistence API `_ +(JPA) as annotations and is converted to database table rows by the node automatically every time a state is recorded +in the node's local vault as part of a transaction. -.. note:: Presently the node includes an instance of the H2 database but any database that supports JDBC is a candidate and - the node will in the future support a range of database implementations via their JDBC drivers. Much of the node - internal state is also persisted there. You can access the internal H2 database via JDBC, please see the info - in ":doc:`node-administration`" for details. +.. note:: Presently the node includes an instance of the H2 database but any database that supports JDBC is a +candidate and the node will in the future support a range of database implementations via their JDBC drivers. Much +of the node internal state is also persisted there. You can access the internal H2 database via JDBC, please see the +info in ":doc:`node-administration`" for details. Schemas ------- - Every ``ContractState`` can implement the ``QueryableState`` interface if it wishes to be inserted into the node's local database and accessible using SQL. @@ -26,10 +25,10 @@ database and accessible using SQL. :start-after: DOCSTART QueryableState :end-before: DOCEND QueryableState -The ``QueryableState`` interface requires the state to enumerate the different relational schemas it supports, for instance in -cases where the schema has evolved, with each one being represented by a ``MappedSchema`` object return by the -``supportedSchemas()`` method. Once a schema is selected it must generate that representation when requested via the -``generateMappedObject()`` method which is then passed to the ORM. +The ``QueryableState`` interface requires the state to enumerate the different relational schemas it supports, for +instance in cases where the schema has evolved, with each one being represented by a ``MappedSchema`` object return +by the ``supportedSchemas()`` method. Once a schema is selected it must generate that representation when requested +via the ``generateMappedObject()`` method which is then passed to the ORM. Nodes have an internal ``SchemaService`` which decides what to persist and what not by selecting the ``MappedSchema`` to use. @@ -46,44 +45,44 @@ to use. The ``SchemaService`` can be configured by a node administrator to select the schemas used by each app. In this way the relational view of ledger states can evolve in a controlled fashion in lock-step with internal systems or other -integration points and not necessarily with every upgrade to the contract code. -It can select from the ``MappedSchema`` offered by a ``QueryableState``, automatically upgrade to a -later version of a schema or even provide a ``MappedSchema`` not originally offered by the ``QueryableState``. +integration points and not necessarily with every upgrade to the contract code. It can select from the +``MappedSchema`` offered by a ``QueryableState``, automatically upgrade to a later version of a schema or even +provide a ``MappedSchema`` not originally offered by the ``QueryableState``. It is expected that multiple different contract state implementations might provide mappings to some common schema. For example an Interest Rate Swap contract and an Equity OTC Option contract might both provide a mapping to a common Derivative schema. The schemas should typically not be part of the contract itself and should exist independently of it to encourage re-use of a common set within a particular business area or Cordapp. -``MappedSchema`` offer a family name that is disambiguated using Java package style name-spacing derived from the class name -of a *schema family* class that is constant across versions, allowing the ``SchemaService`` to select a preferred version -of a schema. +``MappedSchema`` offer a family name that is disambiguated using Java package style name-spacing derived from the +class name of a *schema family* class that is constant across versions, allowing the ``SchemaService`` to select a +preferred version of a schema. -The ``SchemaService`` is also responsible for the ``SchemaOptions`` that can be configured for a particular ``MappedSchema`` -which allow the configuration of a database schema or table name prefixes to avoid any clash with other ``MappedSchema``. +The ``SchemaService`` is also responsible for the ``SchemaOptions`` that can be configured for a particular +``MappedSchema`` which allow the configuration of a database schema or table name prefixes to avoid any clash with +other ``MappedSchema``. -.. note:: It is intended that there should be plugin support for the ``SchemaService`` to offer the version upgrading and - additional schemas as part of Cordapps, and that the active schemas be configurable. However the present implementation - offers none of this and simply results in all versions of all schemas supported by a ``QueryableState`` being persisted. - This will change in due course. Similarly, it does not currently support configuring ``SchemaOptions`` but will do so in - the future. +.. note:: It is intended that there should be plugin support for the ``SchemaService`` to offer the version upgrading + and additional schemas as part of Cordapps, and that the active schemas be configurable. However the present + implementation offers none of this and simply results in all versions of all schemas supported by a + ``QueryableState`` being persisted. This will change in due course. Similarly, it does not currently support + configuring ``SchemaOptions`` but will do so in the future. Object relational mapping ------------------------- - -The persisted representation of a ``QueryableState`` should be an instance of a ``PersistentState`` subclass, constructed -either by the state itself or a plugin to the ``SchemaService``. This allows the ORM layer to always associate a -``StateRef`` with a persisted representation of a ``ContractState`` and allows joining with the set of unconsumed states -in the vault. +The persisted representation of a ``QueryableState`` should be an instance of a ``PersistentState`` subclass, +constructed either by the state itself or a plugin to the ``SchemaService``. This allows the ORM layer to always +associate a ``StateRef`` with a persisted representation of a ``ContractState`` and allows joining with the set of +unconsumed states in the vault. The ``PersistentState`` subclass should be marked up as a JPA 2.1 *Entity* with a defined table name and having properties (in Kotlin, getters/setters in Java) annotated to map to the appropriate columns and SQL types. Additional entities can be included to model these properties where they are more complex, for example collections, so the mapping -does not have to be *flat*. The ``MappedSchema`` must provide a list of all of the JPA entity classes for that schema in order -to initialise the ORM layer. +does not have to be *flat*. The ``MappedSchema`` must provide a list of all of the JPA entity classes for that schema +in order to initialise the ORM layer. Several examples of entities and mappings are provided in the codebase, including ``Cash.State`` and -``CommercialPaper.State``. For example, here's the first version of the cash schema. +``CommercialPaper.State``. For example, here's the first version of the cash schema. .. literalinclude:: ../../finance/src/main/kotlin/net/corda/schemas/CashSchemaV1.kt :language: kotlin diff --git a/docs/source/api-rpc.rst b/docs/source/api-rpc.rst new file mode 100644 index 0000000000..8f37fa9beb --- /dev/null +++ b/docs/source/api-rpc.rst @@ -0,0 +1,29 @@ +API: RPC operations +=================== +The node's owner interacts with the node solely via remote procedure calls (RPC). The node's owner does not have +access to the node's ``ServiceHub``. + +The key RPC operations exposed by the node are: + +* ``CordaRPCOps.vaultQueryBy`` + * Extract states from the node's vault based on a query criteria +* ``CordaRPCOps.vaultTrackBy`` + * As above, but also returns an observable of future states matching the query +* ``CordaRPCOps.verifiedTransactions`` + * Extract all transactions from the node's local storage, as well as an observable of all future transactions +* ``CordaRPCOps.networkMapUpdates`` + * A list of network nodes, and an observable of changes to the network map +* ``CordaRPCOps.registeredFlows`` + * See a list of registered flows on the node +* ``CordaRPCOps.startFlowDynamic`` + * Start one of the node's registered flows +* ``CordaRPCOps.startTrackedFlowDynamic`` + * As above, but also returns a progress handle for the flow +* ``CordaRPCOps.nodeIdentity`` + * Returns the node's identity +* ``CordaRPCOps.currentNodeTime`` + * Returns the node's current time +* ``CordaRPCOps.partyFromKey/CordaRPCOps.partyFromX500Name`` + * Retrieves a party on the network based on a public key or X500 name +* ``CordaRPCOps.uploadAttachment``/``CordaRPCOps.openAttachment``/``CordaRPCOps.attachmentExists`` + * Uploads, opens and checks for the existence of attachments \ No newline at end of file diff --git a/docs/source/api-service-hub.rst b/docs/source/api-service-hub.rst new file mode 100644 index 0000000000..739dee94bd --- /dev/null +++ b/docs/source/api-service-hub.rst @@ -0,0 +1,29 @@ +API: ServiceHub +=============== +Within ``FlowLogic.call``, the flow developer has access to the node's ``ServiceHub``, which provides access to the +various services the node provides. The services offered by the ``ServiceHub`` are split into the following categories: + +* ``ServiceHub.networkMapCache`` + * Provides information on other nodes on the network (e.g. notaries…) +* ``ServiceHub.identityService`` + * Allows you to resolve anonymous identities to well-known identities if you have the required certificates +* ``ServiceHub.vaultService`` + * Stores the node’s current and historic states +* ``ServiceHub.storageService`` + * Stores additional information such as transactions and attachments +* ``ServiceHub.keyManagementService`` + * Manages signing transactions and generating fresh public keys +* ``ServiceHub.myInfo`` + * Other information about the node +* ``ServiceHub.clock`` + * Provides access to the node’s internal time and date + +Additional, ``ServiceHub`` exposes the following properties: + +* ``ServiceHub.loadState`` and ``ServiceHub.toStateAndRef`` to resolve a ``StateRef`` into a ``TransactionState`` or + a ``StateAndRef`` +* ``ServiceHub.signInitialTransaction`` to sign a ``TransactionBuilder`` and convert it into a ``SignedTransaction`` +* ``ServiceHub.createSignature`` and ``ServiceHub.addSignature`` to create and add signatures to a ``SignedTransaction`` + +Finally, ``ServiceHub`` exposes the node's legal identity key (via ``ServiceHub.legalIdentityKey``) and its notary +identity key (via ``ServiceHub.notaryIdentityKey``). \ No newline at end of file diff --git a/docs/source/api-states.rst b/docs/source/api-states.rst index e25d8ebd75..fc88c54fdb 100644 --- a/docs/source/api-states.rst +++ b/docs/source/api-states.rst @@ -81,6 +81,12 @@ The vault tracks the head (i.e. the most recent version) of each ``LinearState`` states all sharing a ``linearId``). To create a transaction updating a ``LinearState``, we retrieve the state from the vault using its ``linearId``. +UniqueIdentifier +~~~~~~~~~~~~~~~~ +``UniqueIdentifier`` is a combination of a (Java) ``UUID`` representing a globally unique 128 bit random number, and +an arbitrary string which can be paired with it. For instance the string may represent an existing "weak" (not +guaranteed unique) identifier for convenience purposes. + OwnableState ^^^^^^^^^^^^ ``OwnableState`` models fungible assets. Fungible assets are assets for which it's the total amount held that is @@ -101,7 +107,7 @@ Where: * ``owner`` is the ``PublicKey`` of the asset's owner * ``OwnableState`` also override the default behavior of the vault's relevancy check. The default vault - implementation will track any ``OwnableState`` of which it is the owner. + implementation will track any ``OwnableState`` of which it is the owner. * ``withNewOwner(newOwner: PublicKey)`` creates an identical copy of the state, only with a new owner diff --git a/docs/source/api.rst b/docs/source/api.rst index de10eaf1a1..e456d7f86f 100644 --- a/docs/source/api.rst +++ b/docs/source/api.rst @@ -4,9 +4,10 @@ API overview This section describes the APIs that are available for the development of CorDapps: * :doc:`api-states` +* :doc:`api-persistence` * :doc:`api-contracts` * :doc:`api-transactions` * :doc:`api-flows` * :doc:`api-core-types` -Before reading this page, you should be familiar with the key concepts of Corda: :doc:`key-concepts`. +Before reading this page, you should be familiar with the key concepts of Corda: :doc:`key-concepts`. \ No newline at end of file diff --git a/docs/source/building-a-cordapp-index.rst b/docs/source/building-a-cordapp-index.rst new file mode 100644 index 0000000000..7df3372200 --- /dev/null +++ b/docs/source/building-a-cordapp-index.rst @@ -0,0 +1,16 @@ +Building a CorDapp +================== + +.. toctree:: + :maxdepth: 1 + + cordapp-overview + writing-cordapps + api + api-states + api-contracts + api-transactions + api-flows + api-service-hub + api-core-types + cheat-sheet \ No newline at end of file diff --git a/docs/source/component-library-index.rst b/docs/source/component-library-index.rst new file mode 100644 index 0000000000..415b81b71b --- /dev/null +++ b/docs/source/component-library-index.rst @@ -0,0 +1,10 @@ +Component library +================= + +.. toctree:: + :maxdepth: 1 + + flow-library + contract-catalogue + financial-model + contract-irs \ No newline at end of file diff --git a/docs/source/contract-irs.rst b/docs/source/contract-irs.rst index 195b9fafd0..f8e898c4b2 100644 --- a/docs/source/contract-irs.rst +++ b/docs/source/contract-irs.rst @@ -33,7 +33,7 @@ the view of the floating leg receiver / fixed leg payer. The enumerated document it progresses (note that, the first version exists before the value date), the dots on the "y=0" represent an interest rate value becoming available and then the curved arrow indicates to which period the fixing applies. -.. image:: contract-irs.png +.. image:: resources/contract-irs.png Two days (by convention, although this can be modified) before the value date (i.e. at the start of the swap) in the red period, the reference rate is observed from an oracle and fixed - in this instance, at 1.1%. At the end of the accrual period, diff --git a/docs/source/corda-configuration-file.rst b/docs/source/corda-configuration-file.rst index 69c0592b18..ed3cc0c986 100644 --- a/docs/source/corda-configuration-file.rst +++ b/docs/source/corda-configuration-file.rst @@ -100,7 +100,7 @@ path to the node's base directory. :notaryNodeAddress: The host and port to which to bind the embedded Raft server. Required only when running a distributed notary service. A group of Corda nodes can run a distributed notary service by each running an embedded Raft server and joining them to the same cluster to replicate the committed state log. Note that the Raft cluster uses a separate transport - layer for communication that does not integrate with ArtemisMQ messaging services. + layer for communication that does not integrate with ArtemisMQ messaging services. :notaryClusterAddresses: List of Raft cluster member addresses used to join the cluster. At least one of the specified members must be active and be able to communicate with the cluster leader for joining. If empty, a new cluster will be diff --git a/docs/source/corda-networks-index.rst b/docs/source/corda-networks-index.rst new file mode 100644 index 0000000000..abdcf7c0b5 --- /dev/null +++ b/docs/source/corda-networks-index.rst @@ -0,0 +1,9 @@ +Corda networks +============== + +.. toctree:: + :maxdepth: 1 + + setting-up-a-corda-network + permissioning + versioning \ No newline at end of file diff --git a/docs/source/corda-nodes-index.rst b/docs/source/corda-nodes-index.rst new file mode 100644 index 0000000000..0297f1c744 --- /dev/null +++ b/docs/source/corda-nodes-index.rst @@ -0,0 +1,12 @@ +Corda nodes +=========== + +.. toctree:: + :maxdepth: 1 + + running-a-node + clientrpc + shell + node-administration + corda-configuration-file + out-of-process-verification \ No newline at end of file diff --git a/docs/source/financial-model.rst b/docs/source/financial-model.rst index f43a5b282d..b5f4e9d77c 100644 --- a/docs/source/financial-model.rst +++ b/docs/source/financial-model.rst @@ -7,8 +7,8 @@ These provide a common language for states and contracts. Amount ------ -The `Amount `_ class is used to represent an amount of some -fungible asset. It is a generic class which wraps around a type used to define the underlying product, called +The `Amount `_ class is used to represent an amount of +some fungible asset. It is a generic class which wraps around a type used to define the underlying product, called the *token*. For instance it can be the standard JDK type ``Currency``, or an ``Issued`` instance, or this can be a more complex type such as an obligation contract issuance definition (which in turn contains a token definition for whatever the obligation is to be settled in). Custom token types should implement ``TokenizableAssetInfo`` to allow the diff --git a/docs/source/index.rst b/docs/source/index.rst index dbf7474938..9091a12902 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -38,148 +38,19 @@ Documentation Contents: ======================= .. toctree:: - :maxdepth: 1 - :caption: Quickstart + :maxdepth: 2 - getting-set-up - tutorial-cordapp - running-the-demos - CLI-vs-IDE - -.. toctree:: - :maxdepth: 1 - :caption: Key concepts - - key-concepts - key-concepts-ecosystem - key-concepts-ledger - key-concepts-states - key-concepts-contracts - key-concepts-transactions - key-concepts-flows - key-concepts-consensus - key-concepts-notaries - key-concepts-time-windows - key-concepts-oracles - key-concepts-node - key-concepts-tradeoffs - -.. toctree:: - :maxdepth: 1 - :caption: Building a CorDapp - - cordapp-overview - writing-cordapps - api - api-states - api-contracts - api-transactions - api-flows - api-core-types - cheat-sheet - -.. toctree:: - :maxdepth: 1 - :caption: Corda nodes - - running-a-node - clientrpc - shell - node-administration - corda-configuration-file - out-of-process-verification - -.. toctree:: - :maxdepth: 1 - :caption: Corda networks - - setting-up-a-corda-network - permissioning - versioning - -.. toctree:: - :maxdepth: 1 - :caption: Tutorials - - tutorial-contract - tutorial-contract-clauses - tutorial-test-dsl - contract-upgrade - tutorial-integration-testing - tutorial-clientrpc-api - tutorial-building-transactions - flow-state-machines - flow-testing - running-a-notary - using-a-notary - oracles - tutorial-attachments - event-scheduling - -.. toctree:: - :maxdepth: 1 - :caption: Tools - - network-simulator - demobench - node-explorer - azure-vm - loadtesting - -.. toctree:: - :maxdepth: 1 - :caption: Node internals - - node-services - vault - serialization - messaging - persistence - -.. toctree:: - :maxdepth: 1 - :caption: Component library - - flow-library - contract-catalogue - financial-model - contract-irs - -.. toctree:: - :maxdepth: 1 - :caption: Release process - - release-process - release-notes - changelog - publishing-corda - codestyle - -.. toctree:: - :maxdepth: 1 - :caption: FAQ - - faq - -.. toctree:: - :maxdepth: 1 - :caption: Troubleshooting - - troubleshooting - -.. toctree:: - :maxdepth: 1 - :caption: Other - - clauses - merkle-trees - json - secure-coding-guidelines - corda-repo-layout - building-the-docs - -.. toctree:: - :maxdepth: 1 - :caption: Glossary - - glossary + quickstart-index.rst + key-concepts.rst + building-a-cordapp-index.rst + corda-nodes-index.rst + corda-networks-index.rst + tutorials-index.rst + tools-index.rst + node-internals-index.rst + component-library-index.rst + release-process-index.rst + faq.rst + troubleshooting.rst + other-index.rst + glossary.rst \ No newline at end of file diff --git a/docs/source/key-concepts-consensus.rst b/docs/source/key-concepts-consensus.rst index dc665c247c..d679dc1f45 100644 --- a/docs/source/key-concepts-consensus.rst +++ b/docs/source/key-concepts-consensus.rst @@ -7,6 +7,13 @@ Consensus * *Validity consensus requires contractual validity of the transaction and all its dependencies* * *Uniqueness consensus prevents double-spends* +Video +----- +.. raw:: html + + +

+ Two types of consensus ---------------------- Determining whether a proposed transaction is a valid ledger update involves reaching two types of consensus: @@ -34,6 +41,8 @@ transferring us a treasury bond. We can only be sure that the bond transfer is v The only way to be sure of both conditions is to walk the transaction's chain. We can visualize this process as follows: .. image:: resources/validation-consensus.png + :scale: 25% + :align: center When verifying a proposed transaction, a given party may not have every transaction in the transaction chain that they need to verify. In this case, they can request the missing transactions from the transaction proposer(s). The @@ -52,6 +61,8 @@ This is a problem because, although both transactions will achieve validity cons "double-spend" his USD to get double the amount of GBP and EUR. We can visualize this as follows: .. image:: resources/uniqueness-consensus.png + :scale: 25% + :align: center To prevent this, a valid transaction proposal must also achieve uniqueness consensus. Uniqueness consensus is the requirement that none of the inputs to a proposed transaction have already been consumed in another transaction. diff --git a/docs/source/key-concepts-contracts.rst b/docs/source/key-concepts-contracts.rst index 26558044f0..f4e768fad7 100644 --- a/docs/source/key-concepts-contracts.rst +++ b/docs/source/key-concepts-contracts.rst @@ -7,6 +7,13 @@ Contracts * *Contracts are written in a JVM programming language (e.g. Java or Kotlin)* * *Contract execution is deterministic and its acceptance of a transaction is based on the transaction's contents alone* +Video +----- +.. raw:: html + + +

+ Transaction verification ------------------------ Recall that a transaction is only valid if it is digitally signed by all required signers. However, even if a @@ -23,6 +30,8 @@ transaction gathers all the required signatures, it is only valid if it is also We can picture this situation as follows: .. image:: resources/tx-validation.png + :scale: 25% + :align: center The contract code can be written in any JVM language, and has access to the full capabilities of the language, including: @@ -68,6 +77,12 @@ these cases, an oracle is required. See :doc:`key-concepts-oracles` for further Legal prose ----------- + +.. raw:: html + + +

+ Each contract also refers to a legal prose document that states the rules governing the evolution of the state over time in a way that is compatible with traditional legal systems. This document can be relied upon in the case of legal disputes. \ No newline at end of file diff --git a/docs/source/key-concepts-ecosystem.rst b/docs/source/key-concepts-ecosystem.rst index 740f532b9f..2e2e900f64 100644 --- a/docs/source/key-concepts-ecosystem.rst +++ b/docs/source/key-concepts-ecosystem.rst @@ -31,6 +31,8 @@ This certificate certifies the node's identity when communicating with other par We can visualize a network as follows: .. image:: resources/network.png + :scale: 25% + :align: center Network services ---------------- @@ -44,7 +46,8 @@ Nodes can provide several types of services: These components are illustrated in the following diagram: .. image:: resources/cordaNetwork.png - :align: center + :scale: 25% + :align: center In this diagram, Corda infrastructure services are those upon which all participants depend, such as the network map and notary services. Corda services may be deployed by participants, third parties or a central network operator diff --git a/docs/source/key-concepts-flows.rst b/docs/source/key-concepts-flows.rst index bfd55bffca..1452efe2e8 100644 --- a/docs/source/key-concepts-flows.rst +++ b/docs/source/key-concepts-flows.rst @@ -7,37 +7,68 @@ Flows * *Communication between nodes only occurs in the context of these flows, and is point-to-point* * *Built-in flows are provided to automate common tasks* +Video +----- +.. raw:: html + + +

+ +Motivation +---------- Corda networks use point-to-point messaging instead of a global broadcast. This means that coordinating a ledger update requires network participants to specify exactly what information needs to be sent, to which counterparties, and in what order. -Rather than having to specify these steps manually, Corda automates the process using *flows*. A flow is a sequence -of actions that tells a node how to achieve a specific ledger update, such as issuing an asset or settling a trade. - -Once a given business process has been encapsulated in a flow and installed on the node as part of a CorDapp, the node's -owner can instruct the node to kick off this business process at any time with a simple RPC call. All activity on the -node, and all inter-node communication, occurs in the context of these flows. - -A flow's steps may include: - -* Identifying counterparties on the network -* Extracting information from the vault or local storage -* Building a transaction -* Sending messages -* Notarising and recording a transaction -* Reporting progress to observers -* Requesting human interaction... - -A node can have millions of flows active at once and they may last days, across node restarts and even upgrades. - -An example flow ---------------- -Here is a visualisation of an example flow, showing Alice and Bob agreeing on a ledger update: +Here is a visualisation of the process of agreeing a simple ledger update between Alice and Bob: .. image:: resources/flow.gif + :scale: 25% + :align: center + +The flow framework +------------------ +Rather than having to specify these steps manually, Corda automates the process using *flows*. A flow is a sequence +of steps that tells a node how to achieve a specific ledger update, such as issuing an asset or settling a trade. + +Here is the sequence of flow steps involved in the simple ledger update above: + +.. image:: resources/flow-sequence.png + :scale: 25% + :align: center + +Running flows +------------- +Once a given business process has been encapsulated in a flow and installed on the node as part of a CorDapp, the node's +owner can instruct the node to kick off this business process at any time using an RPC call. The flow abstracts all +the networking, I/O and concurrency issues away from the node owner. + +All activity on the node occurs in the context of these flows. Unlike contracts, flows do not execute in a sandbox, +meaning that nodes can perform actions such as networking, I/O and use sources of randomness within the execution of a +flow. + +Inter-node communication +^^^^^^^^^^^^^^^^^^^^^^^^ +Nodes communicate by passing messages between flows. Each node has zero or more flow classes that are registered to +respond to messages from a single other flow. + +Suppose Alice is a node on the network and wishes to agree a ledger update with Bob, another network node. To +communicate with Bob, Alice must: + +* Start a flow that Bob is registered to respond to +* Send Bob a message within the context of that flow +* Bob will start its registered counterparty flow + +Now that a connection is established, Alice and Bob can communicate to agree a ledger update by passing a series of +messages back and forth, as prescribed by the flow steps. + +Subflows +^^^^^^^^ +Flows can be composed by starting a flow as a subprocess in the context of another flow. The flow that is started as +a subprocess is known as a *subflow*. The parent flow will wait until the subflow returns. The flow library ----------------- +~~~~~~~~~~~~~~~~ Corda provides a library of flows to handle common tasks, meaning that developers do not have to redefine the logic behind common processes such as: @@ -45,4 +76,12 @@ logic behind common processes such as: * Gathering signatures from counterparty nodes * Verifying a chain of transactions -Further information on the available built-in flows can be found in :doc:`flow-library`. \ No newline at end of file +Further information on the available built-in flows can be found in :doc:`flow-library`. + +Concurrency +----------- +The flow framework allows nodes to have many flows active at once. These flows may last days, across node restarts and even upgrades. + +This is achieved by serializing flows to disk whenever they enter a blocking state (e.g. when they're waiting on I/O +or a networking call). Instead of waiting for the flow to become unblocked, the node immediately starts work on any +other scheduled flows, only returning to the original flow at a later date. diff --git a/docs/source/key-concepts-ledger.rst b/docs/source/key-concepts-ledger.rst index a553e0053b..8741c8da82 100644 --- a/docs/source/key-concepts-ledger.rst +++ b/docs/source/key-concepts-ledger.rst @@ -6,6 +6,13 @@ The ledger * *The ledger is subjective from each peer's perspective* * *Two peers are always guaranteed to see the exact same version of any on-ledger facts they share* +Video +----- +.. raw:: html + + +

+ Overview -------- In Corda, there is **no single central store of data**. Instead, each node maintains a separate database of known @@ -15,6 +22,8 @@ entirety. For example, imagine a network with five nodes, where each coloured circle represents a shared fact: .. image:: resources/ledger-venn.png + :scale: 25% + :align: center We can see that although Carl, Demi and Ed are aware of shared fact 3, **Alice and Bob are not**. @@ -22,5 +31,7 @@ Equally importantly, Corda guarantees that whenever one of these facts is shared in lockstep in the database of every node that is aware of it: .. image:: resources/ledger-table.png + :scale: 25% + :align: center For example, Alice and Bob will both see the **exact same version** of shared facts 1 and 7. \ No newline at end of file diff --git a/docs/source/key-concepts-node.rst b/docs/source/key-concepts-node.rst index a849cf4ac3..aa6517249a 100644 --- a/docs/source/key-concepts-node.rst +++ b/docs/source/key-concepts-node.rst @@ -11,6 +11,14 @@ Nodes * *The node's functionality is extended by installing CorDapps in the plugin registry* +Video +----- +.. raw:: html + +

Corda Node, CorDapps and Network

+ +

+ Node architecture ----------------- A Corda node is a JVM run-time environment with a unique identity on the network that hosts Corda services and @@ -19,6 +27,8 @@ CorDapps. We can visualize the node's internal architecture as follows: .. image:: resources/node-architecture.png + :scale: 25% + :align: center The core elements of the architecture are: @@ -44,11 +54,8 @@ node's owner does not interact with other network nodes directly. RPC interface ------------- -The node's owner interacts with the node via remote procedure calls (RPC). RPC operations exposed by the node include: - -* Starting a flow -* Reading the contents of the vault or the transaction storage -* Uploading and downloading attachments +The node's owner interacts with the node via remote procedure calls (RPC). The key RPC operations the node exposes +are documented in :doc:``api-rpc``. The service hub --------------- diff --git a/docs/source/key-concepts-notaries.rst b/docs/source/key-concepts-notaries.rst index 673bf330fe..5408fae4b6 100644 --- a/docs/source/key-concepts-notaries.rst +++ b/docs/source/key-concepts-notaries.rst @@ -7,8 +7,15 @@ Notaries * *Notaries may optionally also validate transactions* * *A network can have several notaries, each running a different consensus algorithm* -Notarisation ------------- +Video +----- +.. raw:: html + + +

+ +Overview +-------- A *notary* is a network service that provides **uniqueness consensus** by attesting that, for a given transaction, it has not already signed other transactions that consumes any of the proposed transaction's input states. @@ -28,7 +35,7 @@ Every state has an appointed notary, and a notary will only notarise a transacti of all the transaction's input states. Consensus algorithms -^^^^^^^^^^^^^^^^^^^^ +-------------------- Corda has "pluggable" consensus, allowing notaries to choose a consensus algorithm based on their requirements in terms of privacy, scalability, legal-system compatibility and algorithmic agility. @@ -60,7 +67,7 @@ In the case of the validating model, the use of anonymous, freshly-generated pub identify parties in a transaction limit the information the notary sees. Multiple notaries -^^^^^^^^^^^^^^^^^ +----------------- Each Corda network can have multiple notaries, each potentially running a different consensus algorithm. This provides several benefits: diff --git a/docs/source/key-concepts-oracles.rst b/docs/source/key-concepts-oracles.rst index 82859d9817..9dca75a82f 100644 --- a/docs/source/key-concepts-oracles.rst +++ b/docs/source/key-concepts-oracles.rst @@ -6,6 +6,15 @@ Oracles * *A fact can be included in a transaction as part of a command* * *An oracle is a service that will only sign the transaction if the included fact is true* +Video +----- +.. raw:: html + + +

+ +Overview +-------- In many cases, a transaction's contractual validity depends on some external piece of data, such as the current exchange rate. However, if we were to let each participant evaluate the transaction's validity based on their own view of the current exchange rate, the contract's execution would be non-deterministic: some signers would consider the @@ -22,5 +31,49 @@ their transaction, and the oracle will sign the transaction to assert that the f If they wish to monetize their services, oracles can choose to only sign a transaction and attest to the validity of the fact it contains for a fee. -Transaction tear-offs are used to prevent the oracle from seeing information about the transaction that is not -relevant to them. See :doc:`merkle-trees` for further details. \ No newline at end of file +Transaction tear-offs +--------------------- +To sign a transaction, the only information the oracle needs to see is their embedded command. Providing any +additional transaction data to the oracle would constitute a privacy leak. Similarly, a non-validating notary only +needs to see a transaction's input states. + +To combat this, the transaction proposer(s) uses a Merkle tree to "tear off" any parts of the transaction that the +oracle/notary doesn't need to see before presenting it to them for signing. A Merkle tree is a well-known cryptographic +scheme that is commonly used to provide proofs of inclusion and data integrity. Merkle trees are widely used in +peer-to-peer networks, blockchain systems and git. + +The advantage of a Merkle tree is that the parts of the transaction that were torn off when presenting the transaction +to the oracle cannot later be changed without also invalidating the oracle's digital signature. + +Transaction Merkle trees +^^^^^^^^^^^^^^^^^^^^^^^^ +A Merkle tree is constructed from a transaction by splitting the transaction into leaves, where each leaf contains +either an input, an output, a command, or an attachment. The Merkle tree also contains the other fields of the +``WireTransaction``, such as the timestamp, the notary, the type and the signers. + +Next, the Merkle tree is built in the normal way by hashing the concatenation of nodes’ hashes below the current one +together. It’s visible on the example image below, where ``H`` denotes sha256 function, "+" - concatenation. + +.. image:: resources/merkleTree.png + +The transaction has two input states, one output state, one attachment, one command and a timestamp. For brevity +we didn't include all leaves on the diagram (type, notary and signers are presented as one leaf labelled Rest - in +reality they are separate leaves). Notice that if a tree is not a full binary tree, leaves are padded to the nearest +power of 2 with zero hash (since finding a pre-image of sha256(x) == 0 is hard computational task) - marked light +green above. Finally, the hash of the root is the identifier of the transaction, it's also used for signing and +verification of data integrity. Every change in transaction on a leaf level will change its identifier. + +Hiding data +^^^^^^^^^^^ +Hiding data and providing the proof that it formed a part of a transaction is done by constructing Partial Merkle Trees +(or Merkle branches). A Merkle branch is a set of hashes, that given the leaves’ data, is used to calculate the +root’s hash. Then that hash is compared with the hash of a whole transaction and if they match it means that data we +obtained belongs to that particular transaction. + +.. image:: resources/partialMerkle.png + +In the example above, the node ``H(f)`` is the one holding command data for signing by Oracle service. Blue leaf +``H(g)`` is also included since it's holding timestamp information. Nodes labelled ``Provided`` form the Partial +Merkle Tree, black ones are omitted. Having timestamp with the command that should be in a violet node place and +branch we are able to calculate root of this tree and compare it with original transaction identifier - we have a +proof that this command and timestamp belong to this transaction. \ No newline at end of file diff --git a/docs/source/key-concepts-states.rst b/docs/source/key-concepts-states.rst index da12907a72..f4bf72be94 100644 --- a/docs/source/key-concepts-states.rst +++ b/docs/source/key-concepts-states.rst @@ -7,6 +7,15 @@ States * *States are evolved by marking the current state as historic and creating an updated state* * *Each node has a vault where it stores any relevant states to itself* +Video +----- +.. raw:: html + + +

+ +Overview +-------- A *state* is an immutable object representing a fact known by one or more Corda nodes at a specific point in time. States can contain arbitrary data, allowing them to represent facts of any kind (e.g. stocks, bonds, loans, KYC data, identity information...). @@ -14,6 +23,8 @@ identity information...). For example, the following state represents an IOU - an agreement that Alice owes Bob an amount X: .. image:: resources/state.png + :scale: 25% + :align: center Specifically, this state represents an IOU of £10 from Alice to Bob. @@ -32,6 +43,8 @@ This sequence of state replacements gives us a full view of the evolution of the picture this situation as follows: .. image:: resources/state-sequence.png + :scale: 25% + :align: center The vault --------- @@ -39,6 +52,8 @@ Each node on the network maintains a *vault* - a database where it tracks all th is aware of, and which it considers to be relevant to itself: .. image:: resources/vault-simple.png + :scale: 25% + :align: center We can think of the ledger from each node's point of view as the set of all the current (i.e. non-historic) states that it is aware of. \ No newline at end of file diff --git a/docs/source/key-concepts-time-windows.rst b/docs/source/key-concepts-time-windows.rst index 60fb608a11..08d8df5fbb 100644 --- a/docs/source/key-concepts-time-windows.rst +++ b/docs/source/key-concepts-time-windows.rst @@ -7,6 +7,13 @@ Time-windows * *The notary is the timestamping authority, refusing to commit transactions outside of that window* * *Time-windows can have a start and end time, or be open at either end* +Video +----- +.. raw:: html + + +

+ Time in a distributed system ---------------------------- A notary also act as the *timestamping authority*, verifying that a transaction occurred during a specific time-window @@ -32,6 +39,8 @@ there can never be "true time", only an approximation of it. Time windows can be "before" and "after") or they can be fully bounded. .. image:: resources/time-window.gif + :scale: 25% + :align: center In this way, we express the idea that the *true value* of the fact "the current time" is actually unknowable. Even when both a before and an after time are included, the transaction could have occurred at any point within that time-window. @@ -47,4 +56,4 @@ If a time window needs to be converted to an absolute time (e.g. for display pur calculate the mid point. .. note:: It is assumed that the time feed for a notary is GPS/NaviStar time as defined by the atomic -clocks at the US Naval Observatory. This time feed is extremely accurate and available globally for free. \ No newline at end of file +clocks at the US Naval Observatory. This time feed is extremely accurate and available globally for free. diff --git a/docs/source/key-concepts-transactions.rst b/docs/source/key-concepts-transactions.rst index 3c445874ea..1e2c1ff836 100644 --- a/docs/source/key-concepts-transactions.rst +++ b/docs/source/key-concepts-transactions.rst @@ -10,6 +10,15 @@ Transactions * *It is contractually valid* * *It is signed by the required parties* +Video +----- +.. raw:: html + + +

+ +Overview +-------- Corda uses a *UTXO* (unspent transaction output) model where every state on the ledger is immutable. The ledger evolves over time by applying *transactions*, which update the ledger by marking zero or more existing ledger states as historic (the *inputs*) and producing zero or more new ledger states (the *outputs*). Transactions represent a @@ -18,6 +27,8 @@ single link in the state sequences seen in :doc:`key-concepts-states`. Here is an example of an update transaction, with two inputs and two outputs: .. image:: resources/basic-tx.png + :scale: 25% + :align: center A transaction can contain any number of inputs and outputs of any type: @@ -46,6 +57,8 @@ These input states references are a combination of: This situation can be illustrated as follows: .. image:: resources/tx-chain.png + :scale: 25% + :align: center These input state references link together transactions over time, forming what is known as a *transaction chain*. @@ -55,15 +68,21 @@ Initially, a transaction is just a **proposal** to update the ledger. It represe that is desired by the transaction builder(s): .. image:: resources/uncommitted_tx.png + :scale: 25% + :align: center To become reality, the transaction must receive signatures from all of the *required signers* (see **Commands**, below). Each required signer appends their signature to the transaction to indicate that they approve the proposal: .. image:: resources/tx_with_sigs.png + :scale: 25% + :align: center If all of the required signatures are gathered, the transaction becomes committed: .. image:: resources/committed_tx.png + :scale: 25% + :align: center This means that: @@ -96,11 +115,18 @@ For example, a transaction where Alice pays off £5 of an IOU with Bob using a attachments and a timestamp, may look as follows: .. image:: resources/full-tx.png + :scale: 25% + :align: center We explore the role played by the remaining transaction components below. Commands ^^^^^^^^ +.. raw:: html + + +

+ Suppose we have a transaction with a cash state and a bond state as inputs, and a cash state and a bond state as outputs. This transaction could represent two different scenarios: @@ -124,9 +150,16 @@ listed in the commands, we get the list of the transaction's required signers. I We can visualize this situation as follows: .. image:: resources/commands.png + :scale: 25% + :align: center Attachments ^^^^^^^^^^^ +.. raw:: html + + +

+ Sometimes, we have a large piece of data that can be reused across many different transactions. Some examples: * A calendar of public holidays diff --git a/docs/source/key-concepts.rst b/docs/source/key-concepts.rst index faff68663c..41044a1ba0 100644 --- a/docs/source/key-concepts.rst +++ b/docs/source/key-concepts.rst @@ -1,108 +1,33 @@ -Overview -======== +Key concepts +============ This section describes the key concepts and features of the Corda platform. It is intended for readers who are new to Corda, and want to understand its architecture. It does not contain any code, and is suitable for non-developers. This section should be read in order: - * :doc:`key-concepts-ecosystem` - * :doc:`key-concepts-ledger` - * :doc:`key-concepts-states` - * :doc:`key-concepts-contracts` - * :doc:`key-concepts-transactions` - * :doc:`key-concepts-flows` - * :doc:`key-concepts-consensus` - * :doc:`key-concepts-notaries` - * :doc:`key-concepts-time-windows` - * :doc:`key-concepts-oracles` - * :doc:`key-concepts-node` - * :doc:`key-concepts-tradeoffs` +.. toctree:: + :maxdepth: 1 + + key-concepts-ecosystem + key-concepts-ledger + key-concepts-states + key-concepts-contracts + key-concepts-transactions + key-concepts-flows + key-concepts-consensus + key-concepts-notaries + key-concepts-time-windows + key-concepts-oracles + key-concepts-node + key-concepts-tradeoffs The detailed thinking and rationale behind these concepts are presented in two white papers: * `Corda: An Introduction`_ * `Corda: A Distributed Ledger`_ (A.K.A. the Technical White Paper) -Explanations of the key concepts are also available as `videos `_: - -.. raw:: html - -

The Corda Ledger

- -

- -.. raw:: html - -

States

- -

- -.. raw:: html - -

Transactions

- -

- -.. raw:: html - -

Contracts

- -

- -.. raw:: html - -

Legal Prose

- -

- -.. raw:: html - -

Commands

- -

- -.. raw:: html - -

Timestamps

- -

- -.. raw:: html - -

Attachments

- -

- -.. raw:: html - -

Flows

- -

- -.. raw:: html - -

Consensus

- -

- -.. raw:: html - -

Notaries

- -

- -.. raw:: html - -

Oracles

- -

- -.. raw:: html - -

Corda Node, CorDapps and Network

- -

+Explanations of the key concepts are also available as `videos `_. .. _`Corda: An Introduction`: _static/corda-introductory-whitepaper.pdf .. _`Corda: A Distributed Ledger`: _static/corda-technical-whitepaper.pdf diff --git a/docs/source/merkle-trees.rst b/docs/source/merkle-trees.rst deleted file mode 100644 index 6c8378fa1f..0000000000 --- a/docs/source/merkle-trees.rst +++ /dev/null @@ -1,125 +0,0 @@ -Transaction tear-offs -===================== - -One of the basic data structures in our platform is a transaction. It can be passed around to be signed and verified, -also by third parties. The construction of transactions assumes that they form a whole entity with input and output states, -commands and attachments inside. However all sensitive data shouldn’t be revealed to other nodes that take part in -the creation of transaction on validation level (a good example of this situation is the Oracle which validates only -embedded commands). How to achieve it in a way that convinces the other party the data they got for signing really did form -a part of the transaction? - -We decided to use well known and described cryptographic scheme to provide proofs of inclusion and data integrity. -Merkle trees are widely used in peer-to-peer networks, blockchain systems and git. -You can read more on the concept `here `_. - -Merkle trees in Corda ---------------------- - -Transactions are split into leaves, each of them contains either input, output, command or attachment. Additionally, in -transaction id calculation we use other fields of ``WireTransaction`` like timestamp, notary, type and signers. -Next, the Merkle tree is built in the normal way by hashing the concatenation of nodes’ hashes below the current one together. -It’s visible on the example image below, where ``H`` denotes sha256 function, "+" - concatenation. - -.. image:: resources/merkleTree.png - -The transaction has two input states, one of output, attachment and command each and timestamp. For brevity we didn't -include all leaves on the diagram (type, notary and signers are presented as one leaf labelled Rest - in reality -they are separate leaves). Notice that if a tree is not a full binary tree, leaves are padded to the nearest power -of 2 with zero hash (since finding a pre-image of sha256(x) == 0 is hard computational task) - marked light green above. -Finally, the hash of the root is the identifier of the transaction, it's also used for signing and verification of data integrity. -Every change in transaction on a leaf level will change its identifier. - -Hiding data ------------ - -Hiding data and providing the proof that it formed a part of a transaction is done by constructing Partial Merkle Trees -(or Merkle branches). A Merkle branch is a set of hashes, that given the leaves’ data, is used to calculate the root’s hash. -Then that hash is compared with the hash of a whole transaction and if they match it means that data we obtained belongs -to that particular transaction. - -.. image:: resources/partialMerkle.png - -In the example above, the node ``H(f)`` is the one holding command data for signing by Oracle service. Blue leaf ``H(g)`` is also -included since it's holding timestamp information. Nodes labelled ``Provided`` form the Partial Merkle Tree, black ones -are omitted. Having timestamp with the command that should be in a violet node place and branch we are able to calculate -root of this tree and compare it with original transaction identifier - we have a proof that this command and timestamp -belong to this transaction. - -Example of usage ----------------- - -Let’s focus on a code example. We want to construct a transaction with commands containing interest rate fix data as in: -:doc:`oracles`. -After construction of a partial transaction, with included ``Fix`` commands in it, we want to send it to the Oracle for checking -and signing. To do so we need to specify which parts of the transaction are going to be revealed. That can be done by constructing -filtering function over fields of ``WireTransaction`` of type ``(Any) -> Boolean``. - -.. container:: codeset - - .. sourcecode:: kotlin - - val partialTx = ... - val oracle: Party = ... - fun filtering(elem: Any): Boolean { - return when (elem) { - is Command -> oracleParty.owningKey in elem.signers && elem.value is Fix - else -> false - } - } - -Assuming that we already assembled partialTx with some commands and know the identity of Oracle service, -we construct filtering function over commands - ``filtering``. It performs type checking and filters only ``Fix`` commands -as in IRSDemo example. Then we can construct ``FilteredTransaction``: - -.. container:: codeset - - .. sourcecode:: kotlin - - val wtx: WireTransaction = partialTx.toWireTransaction() - val ftx: FilteredTransaction = wtx.buildFilteredTransaction(filtering) - -In the Oracle example this step takes place in ``RatesFixFlow`` by overriding ``filtering`` function, see: :ref:`filtering_ref` - - -``FilteredTransaction`` holds ``filteredLeaves`` (data that we wanted to reveal) and Merkle branch for them. - -.. container:: codeset - - .. sourcecode:: kotlin - - // Direct accsess to included commands, inputs, outputs, attachments etc. - val cmds: List = ftx.filteredLeaves.commands - val ins: List = ftx.filteredLeaves.inputs - val timestamp: Timestamp? = ftx.filteredLeaves.timestamp - ... - -.. literalinclude:: ../../samples/irs-demo/src/main/kotlin/net/corda/irs/api/NodeInterestRates.kt - :language: kotlin - :start-after: DOCSTART 1 - :end-before: DOCEND 1 - -Above code snippet is taken from ``NodeInterestRates.kt`` file and implements a signing part of an Oracle. -You can check only leaves using ``leaves.checkWithFun { check(it) }`` and then verify obtained ``FilteredTransaction`` -to see if data from ``PartialMerkleTree`` belongs to ``WireTransaction`` with provided ``id``. All you need is the root hash -of the full transaction: - -.. container:: codeset - - .. sourcecode:: kotlin - - if (!ftx.verify(merkleRoot)){ - throw MerkleTreeException("Rate Fix Oracle: Couldn't verify partial Merkle tree.") - } - -Or combine the two steps together: - -.. container:: codeset - - .. sourcecode:: kotlin - - ftx.verifyWithFunction(merkleRoot, ::check) - -.. note:: The way the ``FilteredTransaction`` is constructed ensures that after signing of the root hash it's impossible to add or remove - leaves. However, it can happen that having transaction with multiple commands one party reveals only subset of them to the Oracle. - As signing is done now over the Merkle root hash, the service signs all commands of given type, even though it didn't see - all of them. This issue will be handled after implementing partial signatures. diff --git a/docs/source/network-simulator.rst b/docs/source/network-simulator.rst index 0385572713..0d0916d68e 100644 --- a/docs/source/network-simulator.rst +++ b/docs/source/network-simulator.rst @@ -40,7 +40,7 @@ to single JVM simulations. Interface --------- -.. image:: network-simulator.png +.. image:: resources/network-simulator.png The network simulator can be run automatically, or stepped manually through each step of the interest rate swap. The options on the simulator window are: diff --git a/docs/source/node-internals-index.rst b/docs/source/node-internals-index.rst new file mode 100644 index 0000000000..8fe4795988 --- /dev/null +++ b/docs/source/node-internals-index.rst @@ -0,0 +1,11 @@ +Node internals +============== + +.. toctree:: + :maxdepth: 1 + + node-services + vault + serialization + messaging + persistence \ No newline at end of file diff --git a/docs/source/other-index.rst b/docs/source/other-index.rst new file mode 100644 index 0000000000..5fd4d78554 --- /dev/null +++ b/docs/source/other-index.rst @@ -0,0 +1,12 @@ +Other +===== + +.. toctree:: + :maxdepth: 1 + + clauses + merkle-trees + json + secure-coding-guidelines + corda-repo-layout + building-the-docs \ No newline at end of file diff --git a/docs/source/quickstart-index.rst b/docs/source/quickstart-index.rst new file mode 100644 index 0000000000..12404a0d8f --- /dev/null +++ b/docs/source/quickstart-index.rst @@ -0,0 +1,10 @@ +Quickstart +========== + +.. toctree:: + :maxdepth: 1 + + getting-set-up + tutorial-cordapp + running-the-demos + CLI-vs-IDE \ No newline at end of file diff --git a/docs/source/release-process-index.rst b/docs/source/release-process-index.rst new file mode 100644 index 0000000000..ff8d39ea52 --- /dev/null +++ b/docs/source/release-process-index.rst @@ -0,0 +1,10 @@ +Release process +=============== + +.. toctree:: + :maxdepth: 1 + + release-notes + changelog + publishing-corda + codestyle \ No newline at end of file diff --git a/docs/source/contract-cp-state.png b/docs/source/resources/contract-cp-state.png similarity index 100% rename from docs/source/contract-cp-state.png rename to docs/source/resources/contract-cp-state.png diff --git a/docs/source/contract-cp.png b/docs/source/resources/contract-cp.png similarity index 100% rename from docs/source/contract-cp.png rename to docs/source/resources/contract-cp.png diff --git a/docs/source/contract-irs.png b/docs/source/resources/contract-irs.png similarity index 100% rename from docs/source/contract-irs.png rename to docs/source/resources/contract-irs.png diff --git a/docs/source/resources/flow-sequence.png b/docs/source/resources/flow-sequence.png new file mode 100644 index 0000000000000000000000000000000000000000..c2898a6c50c919419631cdb082b21ac4e0736b1c GIT binary patch literal 201861 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%0D=Ay}JLY{aCWYLKkn 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 w2!U8ivnbV~hlsUuofN0eZu;QRs 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/source/network-simulator.png b/docs/source/resources/network-simulator.png similarity index 100% rename from docs/source/network-simulator.png rename to docs/source/resources/network-simulator.png diff --git a/docs/source/running-a-node.rst b/docs/source/running-a-node.rst index 4c83dc3207..12606c7491 100644 --- a/docs/source/running-a-node.rst +++ b/docs/source/running-a-node.rst @@ -151,7 +151,8 @@ deployment. To use this gradle plugin you must add a new task that is of the type ``net.corda.plugins.Cordform`` to your build.gradle and then configure the nodes you wish to deploy with the Node and nodes configuration DSL. -This DSL is specified in the `JavaDoc `_. An example of this is in the CorDapp template and below +This DSL is specified in the `JavaDoc `_. An example of this is in the CorDapp template and +below is a three node example; .. code-block:: text diff --git a/docs/source/running-the-demos.rst b/docs/source/running-the-demos.rst index 752e02ea32..53cb7529b1 100644 --- a/docs/source/running-the-demos.rst +++ b/docs/source/running-the-demos.rst @@ -123,7 +123,8 @@ You will notice that successive transactions get signed by different members of To run the Raft version of the demo from the command line in Unix: 1. Run ``./gradlew samples:notary-demo:deployNodes``, which will create all three types of notaries' node directories - with configs under ``samples/notary-demo/build/nodes/nodesRaft`` (``nodesBFT`` and ``nodesSingle`` for BFT and Single notaries). + with configs under ``samples/notary-demo/build/nodes/nodesRaft`` (``nodesBFT`` and ``nodesSingle`` for BFT and + Single notaries). 2. Run ``./samples/notary-demo/build/nodes/nodesRaft/runnodes``, which will start the nodes in separate terminal windows/tabs. Wait until a "Node started up and registered in ..." message appears on each of the terminals 3. Run ``./gradlew samples:notary-demo:notarise`` to make a call to the "Party" node to initiate notarisation requests @@ -132,7 +133,8 @@ To run the Raft version of the demo from the command line in Unix: To run from the command line in Windows: 1. Run ``gradlew samples:notary-demo:deployNodes``, which will create all three types of notaries' node directories - with configs under ``samples/notary-demo/build/nodes/nodesRaft`` (``nodesBFT`` and ``nodesSingle`` for BFT and Single notaries). + with configs under ``samples/notary-demo/build/nodes/nodesRaft`` (``nodesBFT`` and ``nodesSingle`` for BFT and + Single notaries). 2. Run ``samples\notary-demo\build\nodes\nodesRaft\runnodes``, which will start the nodes in separate terminal windows/tabs. Wait until a "Node started up and registered in ..." message appears on each of the terminals 3. Run ``gradlew samples:notary-demo:notarise`` to make a call to the "Party" node to initiate notarisation requests diff --git a/docs/source/tools-index.rst b/docs/source/tools-index.rst new file mode 100644 index 0000000000..36d24534a0 --- /dev/null +++ b/docs/source/tools-index.rst @@ -0,0 +1,11 @@ +Tools +===== + +.. toctree:: + :maxdepth: 1 + + network-simulator + demobench + node-explorer + azure-vm + loadtesting \ No newline at end of file diff --git a/docs/source/tutorial-contract.rst b/docs/source/tutorial-contract.rst index c843a65ed8..8f3e16fba9 100644 --- a/docs/source/tutorial-contract.rst +++ b/docs/source/tutorial-contract.rst @@ -30,7 +30,7 @@ value of the commercial paper. This lifecycle for commercial paper is illustrated in the diagram below: -.. image:: contract-cp.png +.. image:: resources/contract-cp.png Where to put your code ---------------------- @@ -97,7 +97,7 @@ States A state is a class that stores data that is checked by the contract. A commercial paper state is structured as below: -.. image:: contract-cp-state.png +.. image:: resources/contract-cp-state.png .. container:: codeset diff --git a/docs/source/tutorial-tear-offs.rst b/docs/source/tutorial-tear-offs.rst new file mode 100644 index 0000000000..4e247f733d --- /dev/null +++ b/docs/source/tutorial-tear-offs.rst @@ -0,0 +1,80 @@ +Transaction tear-offs +===================== + +Example of usage +---------------- +Let’s focus on a code example. We want to construct a transaction with commands containing interest rate fix data as in: +:doc:`oracles`. After construction of a partial transaction, with included ``Fix`` commands in it, we want to send it +to the Oracle for checking and signing. To do so we need to specify which parts of the transaction are going to be +revealed. That can be done by constructing filtering function over fields of ``WireTransaction`` of type ``(Any) -> +Boolean``. + +.. container:: codeset + + .. sourcecode:: kotlin + + val partialTx = ... + val oracle: Party = ... + fun filtering(elem: Any): Boolean { + return when (elem) { + is Command -> oracleParty.owningKey in elem.signers && elem.value is Fix + else -> false + } + } + +Assuming that we already assembled partialTx with some commands and know the identity of Oracle service, we construct +filtering function over commands - ``filtering``. It performs type checking and filters only ``Fix`` commands as in +IRSDemo example. Then we can construct ``FilteredTransaction``: + +.. container:: codeset + + .. sourcecode:: kotlin + + val wtx: WireTransaction = partialTx.toWireTransaction() + val ftx: FilteredTransaction = wtx.buildFilteredTransaction(filtering) + +In the Oracle example this step takes place in ``RatesFixFlow`` by overriding ``filtering`` function, see: +:ref:`filtering_ref`. + +``FilteredTransaction`` holds ``filteredLeaves`` (data that we wanted to reveal) and Merkle branch for them. + +.. container:: codeset + + .. sourcecode:: kotlin + + // Direct accsess to included commands, inputs, outputs, attachments etc. + val cmds: List = ftx.filteredLeaves.commands + val ins: List = ftx.filteredLeaves.inputs + val timestamp: Timestamp? = ftx.filteredLeaves.timestamp + ... + +.. literalinclude:: ../../samples/irs-demo/src/main/kotlin/net/corda/irs/api/NodeInterestRates.kt + :language: kotlin + :start-after: DOCSTART 1 + :end-before: DOCEND 1 + +Above code snippet is taken from ``NodeInterestRates.kt`` file and implements a signing part of an Oracle. You can +check only leaves using ``leaves.checkWithFun { check(it) }`` and then verify obtained ``FilteredTransaction`` to see +if data from ``PartialMerkleTree`` belongs to ``WireTransaction`` with provided ``id``. All you need is the root hash +of the full transaction: + +.. container:: codeset + + .. sourcecode:: kotlin + + if (!ftx.verify(merkleRoot)){ + throw MerkleTreeException("Rate Fix Oracle: Couldn't verify partial Merkle tree.") + } + +Or combine the two steps together: + +.. container:: codeset + + .. sourcecode:: kotlin + + ftx.verifyWithFunction(merkleRoot, ::check) + +.. note:: The way the ``FilteredTransaction`` is constructed ensures that after signing of the root hash it's impossible to add or remove + leaves. However, it can happen that having transaction with multiple commands one party reveals only subset of them to the Oracle. + As signing is done now over the Merkle root hash, the service signs all commands of given type, even though it didn't see + all of them. This issue will be handled after implementing partial signatures. diff --git a/docs/source/tutorials-index.rst b/docs/source/tutorials-index.rst new file mode 100644 index 0000000000..c360e5e729 --- /dev/null +++ b/docs/source/tutorials-index.rst @@ -0,0 +1,21 @@ +Tutorials +========= + +.. toctree:: + :maxdepth: 1 + + tutorial-contract + tutorial-contract-clauses + tutorial-test-dsl + contract-upgrade + tutorial-integration-testing + tutorial-clientrpc-api + tutorial-building-transactions + flow-state-machines + flow-testing + running-a-notary + using-a-notary + oracles + tutorial-tear-offs + tutorial-attachments + event-scheduling \ No newline at end of file