<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.5 (Ruby 3.2.2) -->
<?rfc rfcedstyle="yes"?>
<?rfc tocindent="yes"?>
<?rfc strict="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<?rfc text-list-symbols="o-*+"?>
<?rfc compact="yes"?>
<?rfc subcompact="no"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-belchior-satp-gateway-recovery-01" category="info" consensus="true" submissionType="IETF" tocDepth="4" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.19.1 -->
  <front>
    <title abbrev="SATP Gateway Crash Recovery">Secure Asset Transfer Protocol (SATP) Gateway Crash Recovery Mechanism</title>
    <seriesInfo name="Internet-Draft" value="draft-belchior-satp-gateway-recovery-01"/>
    <author initials="R." surname="Belchior" fullname="Rafael Belchior">
      <organization>INESC-ID, Técnico Lisboa, Blockdaemon</organization>
      <address>
        <email>rafael.belchior@tecnico.ulisboa.pt</email>
      </address>
    </author>
    <author initials="M." surname="Correia" fullname="Miguel Correia">
      <organization>INESC-ID, Técnico Lisboa</organization>
      <address>
        <email>miguel.p.correia@tecnico.ulisboa.pt</email>
      </address>
    </author>
    <author initials="A." surname="Augusto" fullname="André Augusto">
      <organization>INESC-ID, Técnico Lisboa</organization>
      <address>
        <email>andre.augusto@tecnico.ulisboa.pt</email>
      </address>
    </author>
    <author initials="T." surname="Hardjono" fullname="Thomas Hardjono">
      <organization>MIT</organization>
      <address>
        <email>hardjono@mit.edu</email>
      </address>
    </author>
    <date year="2024" month="January" day="29"/>
    <area>Applications and Real-Time</area>
    <workgroup>Secure Asset Transfer Protocol</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 90?>

<t>This memo describes the crash recovery mechanism for the Secure Asset Transfer Protocol (SATP). The goal of this draft is to specify the message flow that implements a crash recovery mechanism. The mechanism assures that gateways running SATP are able to recover faults, enforcing ACID properties for asset transfers across ledgers (i.e., double spend does not occur).</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://ietf-satp.github.io/draft-belchior-satp-gateway-recovery/draft-belchior-satp-gateway-recovery.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-belchior-satp-gateway-recovery/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Secure Asset Transfer Protocol Working Group mailing list (<eref target="mailto:sat@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/sat/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/sat/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/ietf-satp/draft-belchior-satp-gateway-recovery"/>.</t>
    </note>
  </front>
  <middle>
    <?line 95?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Gateway systems that perform digital asset transfers among networks must possess a degree of resiliency and fault tolerance in the face of possible crashes. Accounting for the possibility of crashes is
particularly important to guarantee asset consistency across networks.</t>
      <t>The crash recovering mechanism is applied to a version of SATP <xref target="I-D.draft-ietf-satp-core"/> using either 2PC or 3PC, which are atomic commitment protocol (ACP).
2PC and 3PC considers two roles: a coordinator who manages the protocol's execution and participants who manage the resources that must be kept consistent. The origin gateway plays the ACP role of Coordinator, and the destination Gateway plays the Participant role in relay mode. Gateways exchange messages corresponding to the protocol execution, generating log entries for each one.
The crash recovery draft does not depend on the specific SATP messages, but defines procedures to recover from crashes and for rollbacks, independently of the specific protocol phase being executed.</t>
      <t>Log entries are organized into logs. Logs enable either the same or other backup gateways to resume any phase of SATP. This log can also serve as an accountability tool in case of disputes. Log entries are then the basis satisfying one of the key deployment requirements of gateways for asset transfers: a high degree of availability. In this document, we consider two common strategies to increase availability: (1) to support the recovery of the gateways (self-healing model) and (2) to employ backup gateways with the ability to resume a stalled transfer (primary-backup model).</t>
      <t>This memo proposes:</t>
      <t>(i) the logging model of the crash recovery mechanism; (ii) the log storage types; (iii) the log storage API; (iv)  the log entry format; (v) the recovery and rollback procedures.</t>
    </section>
    <section anchor="terminology">
      <name>Terminology</name>
      <t>There following are some terminology used in the current document:</t>
      <ul spacing="normal">
        <li>
          <t>Gateway: The collection of services which connects to a minimum of one network or system, and which implements the secure asset transfer protocol.</t>
        </li>
        <li>
          <t>Primary Gateway: The node of a network that has been selected or elected to act as a gateway in an asset transfer.</t>
        </li>
        <li>
          <t>Backup Gateway: The node of a network that has been selected or elected to act as a backup gateway to a primary gateway.</t>
        </li>
        <li>
          <t>Message Flow Parameters: The parameters and payload employed in a message flow between a sending gateway and receiving gateway.</t>
        </li>
        <li>
          <t>Origin Gateway: The gateway that initiates the transfer protocol. Acts as a coordinator of the ACP and mediates the message flow.</t>
        </li>
        <li>
          <t>Destination Gateway: The gateway that is the target of an asset transfer. It follows instructions from the origin Gateway.</t>
        </li>
        <li>
          <t>Log: Set of log entries such that those are ordered by the time of its creation.</t>
        </li>
        <li>
          <t>Public (or Shared) Log: log where several gateways can read and write from it.</t>
        </li>
        <li>
          <t>Private Log: log where only one gateway can read and write from it.</t>
        </li>
        <li>
          <t>Log data: The log information is retained by a gateway connected to an exchanged message within an asset transfer protocol.</t>
        </li>
        <li>
          <t>Log entry: The log information generated and persisted by a gateway regarding one specific message flow step.</t>
        </li>
        <li>
          <t>Log format: The format of log data generated by a gateway.</t>
        </li>
        <li>
          <t>Atomic commit protocol (ACP): A protocol that guarantees that assets taken from a network are persisted into the other network. Examples are two and three-phase commit protocols (2PC, 3PC, respectively) and non-blocking atomic commit protocols.</t>
        </li>
        <li>
          <t>Fault: A fault is an event that alters the expected behavior of a system.</t>
        </li>
        <li>
          <t>Crash-fault tolerant models: the models allowing a system to keep operating correctly despite having a set of faulty components.</t>
        </li>
      </ul>
    </section>
    <section anchor="log-model">
      <name>Logging Model</name>
      <t>We consider the log file to be a stack of log entries. Each time a log entry is added, it goes to the top of the stack (the highest index).
For each protocol step a gateway performs, a log entry is created immediately before executing and immediately after executing a given operation.</t>
      <t>To manipulate the log, we define a set of log primitives that translate log entry requests from a process into log entries, realized by the log storage API (for the context of SATP, Section 3.5):</t>
      <ul spacing="normal">
        <li>
          <t>writeLogEntry(e,L) (WRITE) - appends a log entry e in the log L (held by the corresponding Log Storage Support).</t>
        </li>
        <li>
          <t>getLogEntry(i,L) (READ) - retrieves a log entry with index i from log L.</t>
        </li>
      </ul>
      <t>From these primitives, other functions can be built:</t>
      <ul spacing="normal">
        <li>
          <t>getLogLength (L) (READ) - obtains the number of log entries from log L.</t>
        </li>
        <li>
          <t>getLogDiff(l1,l2) (READ) - obtains the difference between two logs.</t>
        </li>
        <li>
          <t>getLastEntry(L): obtains the last log entry from log L.</t>
        </li>
        <li>
          <t>getLog(L): retrieves the whole log L.</t>
        </li>
        <li>
          <t>updateLog(l1,l2): updates l1 based on l2 (uses getLogDiff and writeLogEntry).</t>
        </li>
      </ul>
      <t>The following example shows a simplified version log referring to the transfer initiation flow SATP phase. Each log entry (simplified, see the definition in Section 3) is composed of metadata (phase, sequence number) and one attribute from the payload (operation). Operations map behavior to state (see Section 4).</t>
      <section anchor="example">
        <name>Example</name>
        <figure anchor="example-log-model">
          <artwork><![CDATA[
     ,--.                     ,--.                                 ,-------.
     |G1|                     |G2|                                 |Log API|
     `--'                     `--'                                 `-------'
      |             [1]: writeLogEntry <1,1,init-validate>             |
      | --------------------------------------------------------------->
      |                        |                                       |
      | initiate SATP's phase 1|                                       |
      | ----------------------->                                       |
      |                        |                                       |
      |                        | [2]: writeLogEntry <1,2,exec-validate>|
      |                        | -------------------------------------->
      |                        |                                       |
      |                        |----.                                  |
      |                        |    | execute validate from p1         |
      |                        |<---'                                  |
      |                        |                                       |
      |                        | [3]: writeLogEntry <1,3,done-validate>|
      |                        | -------------------------------------->
      |                        |                                       |
      |                        | [4]: writeLogEntry <1,4,ack-validate> |
      |                        | -------------------------------------->
      |                        |                                       |
      |   validation complete  |                                       |
      | <-----------------------                                       |
     ,--.                     ,--.                                 ,-------.
     |G1|                     |G2|                                 |Log API|
     `--'                     `--'                                 `-------'

]]></artwork>
        </figure>
        <t>This example shows the sequence of logging operations over part of the first phase of SATP (simplified):</t>
        <ol spacing="normal" type="1"><li>
            <t>At step 1, G1 writes an init-validate operation, meaning it will require G2 to initiate the validate function:
This step generates a log entry (p1, 1, init-validate).</t>
          </li>
          <li>
            <t>At step 2, G2 writes an exec-validate operation, meaning it will try to execute the validate function:
This step generates a log entry (p1, 2, exec-validate).</t>
          </li>
          <li>
            <t>At step 3, G2 writes a done-validate operation, meaning it successfully executed the validate function:
This step generates a log entry (p1, 3, done-validate).</t>
          </li>
          <li>
            <t>At step 4, G2 writes an ack-validate operation, meaning it will send an acknowledgment to G1 regarding the done-validate:
This step generates a log entry (p1, 4, ack-validate).</t>
          </li>
        </ol>
        <t>Without loss of generality, the above logging model applies to all phases of SATP.</t>
      </section>
      <section anchor="satp-example">
        <name>SATP Example</name>
        <t>This example showcases the logging procedure step 2.4 of SATP (lock-assertion) by both gateways.</t>
        <figure anchor="satp-example-lock-assertion">
          <artwork><![CDATA[
    ,----------.               ,----------.                                   ,-------.
     |Gateway G1|               |Gateway G2|                                   |Log API|
     `----------'               `----------'                                   `-------'
          |----.                     |                                             |
          |    | 1 using log api     |                                             |
          |<---'                     |                                             |
          |                          |                                             |
          |              2 writeLogEntry(2,2.2-1,init-lock-assertion)              |
          | ----------------------------------------------------------------------->
          |                          |                                             |
          |  3 Lock-Assertion (2.2)  |                                             |
          | ------------------------->                                             |
          |                          |                                             |
          |                          | 4 writeLogEntry(2,2.2-2,exec-lock-assertion)|
          |                          | -------------------------------------------->
          |                          |                                             |
          |                          |----.                                        |
          |                          |    | 5 execute lock assertion phase         |
          |                          |<---'                                        |
          |                          |                                             |
          |                          | 6 writeLogEntry(2,2.2-3,done-lock-assertion)|
          |                          | -------------------------------------------->
          |                          |                                             |
          |                          |----.                                        |
          |                          |    | 7 generate lock assertion receipt      |
          |                          |<---'                                        |
          |                          |                                             |
          |                          |  8 (optional) write lock assertion receipt  |
          |                          | -------------------------------------------->
          |                          |                                             |
          |                          | 9 writeLogEntry(2,2.2-4,ack-lock-assertion) |
          |                          | -------------------------------------------->
          |                          |                                             |
          | 10 lock assertion receipt|                                             |
          | <-------------------------                                             |
     ,----------.               ,----------.                                   ,-------.
     |Gateway G1|               |Gateway G2|                                   |Log API|
     `----------'               `----------'                                   `-------'

]]></artwork>
        </figure>
      </section>
      <section anchor="log-storage-modes">
        <name>Log Storage Modes</name>
        <t>Gateways store state that is captured by logs. Gateways have private logs recording enterprise-sensitive data that can be used, for instance, for analytics. Entries can include end-to-end cross-jurisdiction transaction latency and throughput.</t>
        <t>Apart from the enterprise log, a state log can be public or private, centralized or decentralized. This log is meant to be shared with everyone with an internet connection (public) or only within the gateway consortium (private). Logs can be stored locally or in a cloud service, per gateway (centralized), or in a decentralized infrastructure (i.e., decentralized ledger, decentralized database). We call the latter option decentralized log storage. The type of the state log depends on the trust assumptions among gateways and the log access mode.</t>
        <t>In greater detail:</t>
        <ol spacing="normal" type="1"><li>
            <t>Public decentralized log: log entries are stored on a decentralized public log (e.g., Ethereum blockchain, IPFS). Each gateway writes non-encrypted log entries to a decentralized log storage.
Although this is the best option for providing accountability of gateways, availability, and integrity of the logs, leading to shorter dispute resolution, this can lead to leak of information which can lead to privacy issues.
The integrity of the log can be asserted by hashing the entries and comparing it to each stored hash on the decentralized log storage.
A solution to the privacy problems could be given by gateways publishing a hash of the log entry plus metadata to the decentralized log storage instead of the log entries. Although this is a first step towards resolving privacy issues, a tradeoff with data availability exists.
In particular, this choice leads to lower availability guarantees since a gateway needs to wait for the counterparty gateway to deliver the logs in case logs need to be shared. In this case, the decentralized log storage acts as a notarizing service.
This mode is recommended when gateways operate in the  Relay Mode: Client-initiated Gateway to Gateway. This mode can also be used by the Direct Mode: Client to Multiple Gateway access mode because gateways may need to share state between themselves.
Note: the difference between the mentioned modes is that in Direct Mode: Client to Multiple Gateway, a single client/organization controls all the gateways, whereas, in the Relay Mode, gateways are controlled by different organizations.</t>
          </li>
          <li>
            <t>Public centralized log: log entries are published in a bulletin that more organizations control. That bulletin can be updated or removed at any time. Accountability is only guaranteed provided that there are multiple copies of such bulletin by conflicting parties.
Availability and integrity can be obtained via redundancy.</t>
          </li>
          <li>
            <t>Private centralized log. Each gateway stores logs locally or in a cloud in the private log storage mode but does not share them by default with other gateways. If needed, logs are requested from the counterparty gateway.
Saving logs locally is faster than saving them on the respective ledger since issuing a transaction is several orders of magnitude slower than writing on a disk or accessing a cloud service.
Nonetheless, this model delivers weaker integrity and availability guarantees.</t>
          </li>
          <li>
            <t>Private decentralized log. Each gateway stores logs in a private blockchain, and are shared with other gateways by default.</t>
          </li>
        </ol>
        <t>Each log storage mode provides a different process to recover the state from crashes. In the private log, a gateway requires the most recent log from the counterparty gateway. This mode is the one where the most trust is needed.
The gateway publishes hashes of log entries and metadata on a decentralized log storage in the centralized public log. Gateways who need the logs request them from other gateways and perform integrity checks of the received logs.
In the public decentralized mode, the gateways publish the plain log entries on decentralized log storage. This is the most trustless and decentralized mode of operation.</t>
        <t>By default, if there are gateways from different institutions involved in an asset transfer, the storage mode should be a decentralized log storage. The decentralized log storage can provide a common source of truth to solve disputes and maintain a shared state, alleviating trust assumptions between gateways.</t>
      </section>
      <section anchor="log-storage-api">
        <name>Log Storage API</name>
        <t>The log storage API allows developers to be abstracted from the log storage support, providing a standardized way
to interact with logs (e.g., relational vs. non-relational, local vs. on-chain). It also handles access control if needed.</t>
        <figure anchor="api-table">
          <artwork><![CDATA[
+---------------------------------------+----------------------------------+------------------------------------------------------------------------+
| Function                              | Parameters                       | Endpoint                                                               |
+---------------------------------------+----------------------------------+------------------------------------------------------------------------+
| Append log entry                      | logId - log entry to be appended | POST / writeLogEntry/:logId Host: example.org Accept: application/json |
+---------------------------------------+----------------------------------+------------------------------------------------------------------------+
| Obtains a log entry                   | id - log entry id                | GET getLogEntry/:id Host: example.org                                  |
+---------------------------------------+----------------------------------+------------------------------------------------------------------------+
| Obtains the length of the log         | None                             | GET getLogLength Host: example.org                                     |
+---------------------------------------+----------------------------------+------------------------------------------------------------------------+
| Obtains the difference                | log - log to be compared         |  POST /getLogDiff/:log Host: example.org                                     |
| between a given log and a current log |                                  |                                                                        |
+---------------------------------------+----------------------------------+------------------------------------------------------------------------+
| Obtains the last log entry            | None                             | GET getLastEntry Host: example.org                                     |
+---------------------------------------+----------------------------------+------------------------------------------------------------------------+
| Obtains the whole log                 | None                             | GET getLog Host: example.org                                           |
+---------------------------------------+----------------------------------+------------------------------------------------------------------------+

]]></artwork>
        </figure>
        <t>The following table maps the respective return values and response examples:</t>
        <figure anchor="return-values-api-table">
          <artwork><![CDATA[
+---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------+
| Returns                         | Response Example                                                                                                                                      |
+=================================+=======================================================================================================================================================+
| The entry index of the last log | HTTP/1.1 200 OK Cache-Control: private Date: Mon, 02 Mar 2020 05:07:35 GMT Content-Type: application/json { "success": true, "response_data":"2" }    |
| (string)                        |                                                                                                                                                       |
+---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------+
| A log entry                     | HTTP/1.1 200 OK Cache-Control: private Date: Mon, 02 Mar 2020 05:07:35 GMT Content-Type: application/json { "success": true, "response_data": {...} } |
+---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------+
| The length of the log           | HTTP/1.1 200 OK Cache-Control: private Date: Mon, 02 Mar 2020 05:07:35 GMT Content-Type: application/json { "success": true, "response_data":"2" }    |
| (string)                        |                                                                                                                                                       |
+---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------+
| The difference between two logs | HTTP/1.1 200 OK Cache-Control: private Date: Mon, 02 Mar 2020 05:07:35 GMT Content-Type: application/json { "success": true, "response_data": {...} } |
+---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------+
| A log entry                     | HTTP/1.1 200 OK Cache-Control: private Date: Mon, 02 Mar 2020 05:07:35 GMT Content-Type: application/json { "success": true, "response_data": {...} } |
+---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------+
| The log                         | HTTP/1.1 200 OK Cache-Control: private Date: Mon, 02 Mar 2020 05:07:35 GMT Content-Type: application/json { "success": true, "response_data": {...} } |
+---------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------+

]]></artwork>
        </figure>
        <section anchor="response-codes">
          <name>Response Codes</name>
          <t>The log storage API  MUST respond with return codes indicating the failure (error 5XX) or success of the operation (200). The application may carry out a further operation in the future to determine the ultimate status of the operation.</t>
          <t>The log storage API response is in JSON format and contains two fields: 1) success: true if the operation was successful, and 2) response_data: contains the payload of the response generated by the log storage API.</t>
        </section>
      </section>
    </section>
    <section anchor="format">
      <name>Format of Log Entries</name>
      <t>A gateway stores the log entries in its log, and they capture gateways operations. Entries account for the current status of one of the three SATP flows: Transfer Initiation flow, Lock-Evidence flow, and Commitment Establishment flow.</t>
      <t>The recommended format for log entries is JSON, with protocol-specific mandatory fields supporting a free format field for plaintext or encrypted payloads directed at the SATP gateway or an underlying network. Although the recommended format is JSON, other formats can be used (e.g., XML).</t>
      <t>The mandatory fields of a log entry, that SATP generates, are:</t>
      <ul spacing="normal">
        <li>
          <t>Version: SATP protocol Version (major, minor).</t>
        </li>
        <li>
          <t>Session ID: a unique identifier (UUIDv2) representing a session.</t>
        </li>
        <li>
          <t>Sequence Number: monotonically increasing counter that uniquely represents a message from a session.</t>
        </li>
        <li>
          <t>SATP Phase: current SATP phase.</t>
        </li>
        <li>
          <t>Resource URL: Location of Resource to be accessed.</t>
        </li>
        <li>
          <t>Developer URN: Assertion of developer/application identity.</t>
        </li>
        <li>
          <t>Action/Response: GET/POST and arguments (or Response Code).</t>
        </li>
        <li>
          <t>Credential Profile: Specify the type of auth (e.g., SAML, OAuth, X.509)</t>
        </li>
        <li>
          <t>Credential Block: Credential token, certificate, string.</t>
        </li>
        <li>
          <t>Payload Profile: Asset Profile provenance and capabilities.</t>
        </li>
        <li>
          <t>Application Profile: Vendor or Application-specific profile.</t>
        </li>
        <li>
          <t>Payload: Payload for POST, responses, and native network transactions. The payload is specific to the current SATP phase.</t>
        </li>
        <li>
          <t>Payload Hash: hash of the current message payload.</t>
        </li>
      </ul>
      <t>In addition to the attributes that belong to SATP s schema, each log entry REQUIRES the following attributes:</t>
      <ul spacing="normal">
        <li>
          <t>timestamp REQUIRED: timestamp referring to when the log entry was generated (UNIX format).</t>
        </li>
        <li>
          <t>origin_gateway_pubkey REQUIRED: the public key of the gateway initiating a transfer.</t>
        </li>
        <li>
          <t>origin_gateway_system REQUIRED: the ID  of the source network.</t>
        </li>
        <li>
          <t>destination_gateway_pubkey REQUIRED: the public key of the gateway involved in a transfer.</t>
        </li>
        <li>
          <t>destination_gateway_system REQUIRED: the ID of the destination Gateway involved in a transfer.</t>
        </li>
        <li>
          <t>logging_profile REQUIRED: contains the profile regarding the logging procedure. Default is a local store.</t>
        </li>
        <li>
          <t>Message_signature REQUIRED: Gateway EDCSA signature over the log entry.</t>
        </li>
        <li>
          <t>Last_entry_hash REQUIRED: Hash of previous log entry.</t>
        </li>
        <li>
          <t>Access_control_profile REQUIRED: the profile regarding the confidentiality of the log entries being stored. Default is only the gateway that created the logs that can access them.</t>
        </li>
        <li>
          <t>Operation: the high-level operation being executed by the gateway on that step.
There are five types of operations: Operation init- states the intention of a node to execute a particular operation; Operation exec- expresses that the node is executing the operation; Operation done- states when a node successfully executes a step of the protocol;
Operation ack- refers to when a node acknowledges a message received from another (e.g., the command executed); Operation fail- occurs when an agent fails to execute a specific step.</t>
        </li>
      </ul>
      <t>Optional field entries are:</t>
      <ul spacing="normal">
        <li>
          <t>recovery message: the type of recovery message, if the gateway is involved in a recovery procedure.</t>
        </li>
        <li>
          <t>recovery payload: the payload associated with the recovery message.</t>
        </li>
      </ul>
      <t>Example of a log entry created by G1, corresponding to locking an asset (phase 2.3 of the SATP protocol):</t>
      <figure anchor="example-log-entry">
        <artwork><![CDATA[
{
  "Version": "1.0",
  "Session ID": "123e4567-e89b-12d3-a456-426655440000",
  "Sequence Number": 1,
  "SATP Phase": "Initialization",
  "Resource URL": "http://myresource.com",
  "Developer URN": "urn:myapp:developerid",
  "Action/Response": "POST /myresource",
  "Credential Profile": "OAuth",
  "Credential Block": "ABC123TOKEN",
  "Payload Profile": "ProvenanceProfile1",
  "Application Profile": "AppProfile1",
  "Payload": "{ 'key1': 'value1', 'key2': 'value2' }",
  "Payload Hash": "abc123def456",
  "timestamp": 1646176142,
  "origin_gateway_pubkey": "abc123",
  "origin_gateway_system": "system1",
  "destination_gateway_pubkey": "def456",
  "destination_gateway_system": "system2",
  "logging_profile": "Local Store",
  "Message_signature": "edcsa_signature_here",
  "Last_entry_hash": "hash_of_last_entry",
  "Access_control_profile": "GatewayOnly",
  "Operation": "init",
  "recovery message": "recovery_message_here",
  "recovery payload": "recovery_payload_here"
}
]]></artwork>
      </figure>
      <t>Example of a log entry created by G2, acknowledging G1 locking an asset (phase 2.4 of the SATP protocol) :</t>
      <figure anchor="example-log-entry-two">
        <artwork><![CDATA[
{
    "sessionId": "4eb424c8-aead-4e9e-a321-a160ac3909ac",
    "seqNumber": 7,
    "phaseId": "lock",
    "originGatewayId": "5.47.165.186",
    "originNetworkId": "Hyperledger-Fabric-JusticeChain",
    "destinationGatewayId": "192.47.113.116",
    "destinationNetworkId": "Ethereum",
    "timestamp": "1606157333",
    "payload": {
    "messageType": "2pc-log",
    "message": "LOCK_ASSET_ACK",
    "votes": "none"
}
]]></artwork>
      </figure>
    </section>
    <section anchor="procedure">
      <name>Crash Recovery Procedure</name>
      <t>This section defines general considerations about crash recovery for the self-healing mode. Note that the procedure for the primary-backup mode is the same, but first has a session resumption process.</t>
      <section anchor="crm">
        <name>Crash Recovery Model</name>
        <t>Gateways can fail by crashing (i.e., becoming silent). In order to be able to recover from these crashes, gateways store log entries in a persistent data storage. Thus, gateways can recover by obtaining the latest successful operation and continuing from there. We consider two recovery models:</t>
        <ol spacing="normal" type="1"><li>
            <t>Self-healing mode: assumes that after a crash, a gateway eventually recovers. The gateway does not lose its long-term keys (public-private key pair) and can reestablish all TLS connections.</t>
          </li>
          <li>
            <t>Primary-backup mode assumes that a gateway may never recover after a crash but that this failure can be detected by timeout <xref target="AD76"/>. If the timeout is exceeded, a backup gateway detects that failure unequivocally and takes the role of the primary gateway. The failure is detected using heartbeat messages and a conservative period.</t>
          </li>
        </ol>
        <t>In both modes, after a gateway recovers, the gateways follow a general recovery procedure (in Section 6.2 explained in detail for each phase):</t>
        <ol spacing="normal" type="1"><li>
            <t>Crash communication: using the self-healing or primary-backup modes, a node recovers. After that, it sends a message RECOVER to the counterparty gateways.</t>
          </li>
          <li>
            <t>State update: The gateway syncs its state with the latest state, either by requesting it from the decentralized log storage or other gateways (depending on the log storage mode).
If a decentralized log storage is available, the crashed gateway attempts to update its local log, using getLogDiff from the shared log.
If there is no shared log, the crashed gateway needs to synchronize itself with the counterparty gateway by querying the counterparty gateway with a recovery message RECOVER containing the latest log before the crash.
The counterparty gateway sends back a RECOVER-UPDATE message with its log. The recovered gateway can now reconstruct the updated log via getLogDiff, and derive the current state of the asset transfer.
The gateways now share the same state and can proceed with its operation.</t>
          </li>
          <li>
            <t>Recovery communication: The gateway and informs other gateways of the recovery with a recovery confirmation message is sent (RECOVERY-UPDATE-ACK), and the respective acknowledgment is sent by the counterparty gateway (RECOVERY-SUCCESS).</t>
          </li>
        </ol>
        <t>Finally, the gateway resumes the normal execution of SATP (session resumption).</t>
      </section>
      <section anchor="rp">
        <name>Recovery Procedure</name>
        <t>The previous section explained the general procedure that gateways follow upon crashing. In more detail, for each SATP phase, we define the recovery procedure:</t>
        <section anchor="transfer-initiation-flow">
          <name>Transfer Initiation Flow</name>
          <t>This phase of SATP follows the Crash Recovery Model from Section 6.1.</t>
        </section>
        <section anchor="lock-evidence-flow">
          <name>Lock-Evidence Flow</name>
          <t>This phase of SATP follows the Crash Recovery Model from Section 6.1.
Note that, in this phase, distributed ledgers were changed by gateways. The crash gateways' recovery should take place in less than the timeout specified for the asset transfer. Otherwise, the rollback protocol present in the next section is applied.</t>
        </section>
        <section anchor="commitment-establishment-flow">
          <name>Commitment Establishment  Flow</name>
          <t>As transactions cannot be undone on blockchains, reverting a transaction includes issuing new transactions (with the contrary effect of the ones to be reverted). We use a rollback list to keep track of which transaction may be rolled back.
The crash recovery protocol for the Stage 2 (lock) and Stage 3 (mint) is as follows:</t>
          <ol spacing="normal" type="1"><li>
              <t>Rollback lists for all the gateways involved are initialized.</t>
            </li>
            <li>
              <t>On step 2.1A, add a pre-lock transaction to the origin gateway rollback list.</t>
            </li>
            <li>
              <t>On step 2.1B, if the request is denied, abort the transaction and apply rollbacks on the origin gateway.</t>
            </li>
            <li>
              <t>On step 3.4A, add a lock transaction to the origin gateway rollback list.</t>
            </li>
            <li>
              <t>On step 3.4B, if the commit fails, abort the transaction and apply rollbacks on the origin gateway.</t>
            </li>
            <li>
              <t>On step 3.6A,  add a create asset transaction to the rollback list of the destination gateway.</t>
            </li>
            <li>
              <t>On step 3.8, if the commit is successful (confirmed by the ack final receipt), SATP terminates (3.9).</t>
            </li>
          </ol>
          <t>8: Otherwise, if the last commit is unsuccessful, then abort the transaction and apply rollbacks to both gateways.</t>
        </section>
      </section>
      <section anchor="recovery-messages">
        <name>Recovery Messages</name>
        <t>SATP-2PC messages are used to recover from crashes at the several SATP phases.
These messages inform gateways of the current state of a recovery procedure.
SATP-2PC messages follow the log format from Section 4.</t>
        <section anchor="recover">
          <name>RECOVER</name>
          <t>A recover message is sent from the crashed gateway to the counterparty gateway, sending its most recent state.
This message type is encoded on the recovery message field of an SATP log.</t>
          <t>The parameters of the recovery message payload consist of the following:</t>
          <ul spacing="normal">
            <li>
              <t>Session ID: a unique identifier (UUIDv2) representing a session.</t>
            </li>
            <li>
              <t>Message Type REQUIRED: urn:ietf:SATP-2pc:msgtype:recover-msg.</t>
            </li>
            <li>
              <t>SATP phase: latest SATP phase registered.</t>
            </li>
            <li>
              <t>Sequence number: latest sequence number registered.</t>
            </li>
            <li>
              <t>Is_Backup REQUIRED: indicates whether the sender is a backup gateway or not.</t>
            </li>
            <li>
              <t>New Identity Public Key: The public key of the sender if it is a backup gateway.</t>
            </li>
            <li>
              <t>Last_entry_timestamp REQUIRED: Timestamp of last known log entry.</t>
            </li>
            <li>
              <t>Sender Signature REQUIRED. The digital signature of the sender.</t>
            </li>
          </ul>
        </section>
        <section anchor="recover-udpdate">
          <name>RECOVER-UDPDATE</name>
          <t>The counterparty gateway sends the recover update message after receiving a RECOVER message from a recovered gateway. The recovered gateway informs of its current state (via the current state of the log).
The counterparty gateway now calculates the difference between the log entry corresponding to the received sequence number from the recovered gateway and
the latest sequence number (corresponding to the latest log entry).
This state is sent to the recovered gateway.</t>
          <t>The parameters of the recover update payload consist of the following:</t>
          <ul spacing="normal">
            <li>
              <t>Session ID: a unique identifier (UUIDv2) representing a session.</t>
            </li>
            <li>
              <t>Message Type REQUIRED: urn:ietf:SATP-2pc:msgtype:recover-update-msg.</t>
            </li>
            <li>
              <t>Hash Recover Message REQUIRED. The hash of previous message.</t>
            </li>
            <li>
              <t>Recovered logs: the list of log messages that the recovered gateway needs to update.</t>
            </li>
            <li>
              <t>Sender Signature REQUIRED. The digital signature of the sender.</t>
            </li>
          </ul>
        </section>
        <section anchor="recover-success">
          <name>RECOVER-SUCCESS</name>
          <t>The recover-success message (response to RECOVER-UPDATE) states if the recovered gateway's logs have been successfully updated. If inconsistencies are detected, the recovered gateway answers with initiates a dispute (RECOVER-DISPUTE message).</t>
          <t>The counterparty gateway sends this message to sinalize the recovered gateway acknowledging that the state is synchronized.</t>
          <t>The parameters of this message consist of the following:</t>
          <ul spacing="normal">
            <li>
              <t>Session ID: a unique identifier (UUIDv2) representing a session.</t>
            </li>
            <li>
              <t>Message Type REQUIRED: urn:ietf:SATP-2pc:msgtype:recover-update-ack-msg.</t>
            </li>
            <li>
              <t>Hash Recover Update Message REQUIRED. The hash of previous message.</t>
            </li>
            <li>
              <t>success: true/false.</t>
            </li>
            <li>
              <t>entries changed: list of hashes of log entries that were appended to the recovered gateway log.</t>
            </li>
            <li>
              <t>Sender Signature REQUIRED. The digital signature of the sender.</t>
            </li>
          </ul>
        </section>
        <section anchor="rollback">
          <name>ROLLBACK</name>
          <t>A rollback message is sent by a gateway that initiates a rollback. The parameters of this message consist of the following:</t>
          <ul spacing="normal">
            <li>
              <t>Session ID: a unique identifier (UUIDv2) representing a session.</t>
            </li>
            <li>
              <t>Message Type REQUIRED: urn:ietf:SATP-2pc:msgtype:rollback-msg.</t>
            </li>
            <li>
              <t>success: true/false.</t>
            </li>
            <li>
              <t>actions performed: actions performed to rollback a state (e.g., UNLOCK; BURN).</t>
            </li>
            <li>
              <t>proofs: a list of proofs specific to the network</t>
            </li>
            <li>
              <t>Sender Signature REQUIRED. The digital signature of the sender.</t>
            </li>
          </ul>
        </section>
        <section anchor="rollback-ack">
          <name>ROLLBACK-ACK</name>
          <t>The counterparty gateway sends the rollback-ack message to the recovered gateway acknowledging that the rollback has been performed successfully.</t>
          <t>The parameters of this message consist of the following:</t>
          <ul spacing="normal">
            <li>
              <t>Session ID: a unique identifier (UUIDv2) representing a session.</t>
            </li>
            <li>
              <t>Message Type REQUIRED: urn:ietf:SATP-2pc:msgtype:rollback-ack-msg.</t>
            </li>
            <li>
              <t>success: true/false.</t>
            </li>
            <li>
              <t>actions performed: actions performed to rollback a state (e.g., UNLOCK; BURN).</t>
            </li>
            <li>
              <t>proofs: a list of proofs specific to the network</t>
            </li>
            <li>
              <t>Sender Signature REQUIRED. The digital signature of the sender.</t>
            </li>
          </ul>
        </section>
      </section>
      <section anchor="examples">
        <name>Examples</name>
        <t>There are several situations when a crash may occur.</t>
        <section anchor="crashing-before-issuing-a-command-to-the-counterparty-gateway">
          <name>Crashing before issuing a command to the counterparty gateway</name>
          <t>The following figure represents the origin gateway (G1) crashing before it issued an init command to the destination gateway (G2).</t>
          <artwork><![CDATA[
   ,--.                           ,--.              ,-------.
     |G1|                           |G2|              |Log API|
     `--'                           `--'              `-------'
       |     [1]: writeLogEntry <1, 1, init-validate>     |
       |------------------------------------------------->|
       |                              |                   |
       |----.                         |                   |
       |    | [2]  Crash              |                   |
       |<---'  ...                    |                   |
       |      [3]recover              |                   |
       |                              |                   |
       |                              |                   |
       |      [4] <1, 2, RECOVER>     |                   |
       |----------------------------->|                   |
       |                              |                   |
       |                              | [5] getLogEntry(i)|
       |                              |------------------>|
       |                              |                   |
       |                              |   [6] logEntries  |
       |                              |< - - - - - - - - -|
       |                              |                   |
       |   [7] <1,3,RECOVER-UPDATE>   |                   |
       |<-----------------------------|                   |
       |                              |                   |
       |----.                         |                   |
       |    | [8] process log         |                   |
       |<---'                         |                   |
       |                              |                   |
       |              [9] <1,4,writeLogEntry>             |
       |------------------------------------------------->|
       |                              |                   |
       | [10] <1,5,RECOVER-UPDATE-ACK>|                   |
       |----------------------------->|                   |
       |                              |                   |
       |   [11] <1,6,RECOVER-SUCESS>  |                   |
       |<-----------------------------|                   |
       |                              |                   |
       |           [12]: <1,7,init-validateNext>          |
       |------------------------------------------------->|
     ,--.                           ,--.             ,-------.
     |G1|                           |G2|             |Log API|
     `--'                           `--'             `-------'

]]></artwork>
        </section>
        <section anchor="crashing-after-issuing-a-command-to-the-counterparty-gateway">
          <name>Crashing after issuing a command to the counterparty gateway</name>
          <t>The second scenario requires further synchronization (figure below). At the retrieval of the latest log entry, G1 notices its log is outdated. It updates it upon necessary validation and then communicates its recovery to G2. The process then continues as defined.</t>
          <artwork><![CDATA[
     ,--.                          ,--.                             ,-------.
     |G1|                          |G2|                             |Log API|
     `--'                          `--'                             `-------'
       |            [1]: writeLogEntry <1,1,init-validate>              |
       |--------------------------------------------------------------->|
       |                             |                                  |
       |   [2]: <1,1,init-validate>  |                                  |
       |---------------------------->|                                  |
       |                             |                                  |
       |----.                        |                                  |
       |    | [3] Crash              |                                  |
       |<---'                        |                                  |
       |                             |                                  |
       |                             |[4]: writeLogEntry <exec-validate>|
       |                             |--------------------------------->|
       |                             |                                  |
       |                             |----.                             |
       |                             |    | [5]: execute validate       |
       |                             |<---'                             |
       |                             |                                  |
       |                             |[6]: writeLogEntry <done-validate>|
       |                             |--------------------------------->|
       |                             |                                  |
       |                             |[7]: writeLogEntry <ack-validate> |
       |                             |--------------------------------->|
       |                             |                                  |
       | [8] <1,2,init-validate-ack> |                                  |
       |  discovers that G1 crashed  |                                  |
       |  via timeout                |                                  |
       |<----------------------------|                                  |
       |                             |                                  |
       |----.                        |                                  |
       |    | [9] Recover            |                                  |
       |<---'                        |                                  |
       |                             |                                  |
       |     [10] <1, 2, RECOVER>    |                                  |
       |----------------------------->                                  |
       |                             |                                  |
       |                             |        [11] getLogEntry(i)       |
       |                             |--------------------------------->|
       |                             |                                  |
       |                             |          [12] logEntries         |
       |                             |<- - - - - - - - - - - - - - - - -|
       |                             |                                  |
       |   [13] <1,3,RECOVER-UPDATE> |                                  |
       |<----------------------------|                                  |
       |                             |                                  |
       |----.                        |                                  |
       |    | [14] process log       |                                  |
       |<---'                        |                                  |
       |                             |                                  |
       |                     [15] <1,4,writeLogEntry>                    |
       |--------------------------------------------------------------->|
       |                             |                                  |
       |[16] <1,5,RECOVER-UPDATE-ACK>|                                  |
       |---------------------------->|                                  |
       |                             |                                  |
       |  [17] <1,6,RECOVER-SUCESS>  |                                  |
       |<----------------------------|                                  |
       |                             |                                  |
       |                  [18]: <1,7,init-validateNext>                 |
       |--------------------------------------------------------------->|
     ,--.                           ,--.                             ,-------.
     |G1|                           |G2|                             |Log API|
     `--'                           `--'                             `-------'

]]></artwork>
        </section>
        <section anchor="rollback-after-counterparty-gateway-crash">
          <name>Rollback after counterparty gateway crash</name>
          <t>At the retrieval of the latest log entry, G1 notices its log is outdated. It updates it upon necessary validation and then communicates its recovery to G2. The process then continues as defined.</t>
          <artwork><![CDATA[
    ,--.                            ,--.                            ,-------.
     |G1|                            |G2|                            |Log API|
     `--'                            `--'                            `-------'
       |              ...              |                                  |
       |                               |                                  |
       |  [1] <3, 1, COMMIT-PREPARE>   |                                  |
       |------------------------------>|                                  |
       |                               |                ...               |
       |----.                          |                                  |
       |    | [2]  Crash               |                                  |
       |<---'                          |                                  |
       |                               |                                  |
       |[3] <3, 2, COMMIT-PREPARE-ACK> |                                  |
       |  discovers that G1 crashed    |                                  |
       |  via timeout                  |                                  |
       |<------------------------------|                                  |
       |                          .----|                                  |
       |             [4]  Timeout |    |                                  |
       |                          '--->|                                  |
       |                               |                                  |
       |                               |[5]: writeLogEntry <exec-rollback>|
       |                               |--------------------------------->|
       |                               |                                  |
       |                               |----.                             |
       |                               |    | [6]: execute rollback       |
       |                               |<---'                             |
       |                               |                                  |
       |                               |[7]: writeLogEntry <done-rollback>|
       |                               |--------------------------------->|
       |                               |                                  |
       |                               |[8]: writeLogEntry <ack-rollback> |
       |                               |--------------------------------->|
       |                               |                                  |
       |                               |                                  |
       |----.                          |                                  |
       |    | [9] Recover              |                                  |
       |<---'                          |                                  |
       |      [10] <3, 3, RECOVER>     |                                  |
       |------------------------------>|                                  |
       |                               |                                  |
       |                               | [11] getLogEntry(i)              |
       |                               |--------------------------------->|
       |                               |                                  |
       |                               |   [12] logEntries                |
       |                               |<- - - - - - - - - - - - - - - - -|
       |                               |                                  |
       |   [13] <3, 4, RECOVER-UPDATE> |                                  |
       |<------------------------------|                                  |
       |                               |                                  |
       |----.                          |                                  |
       |    | [14] process log         |                                  |
       |<---'                          |                                  |
       |                               |                                  |
       |                  [15] <3, 5, writeLogEntry>                      |
       |----------------------------------------------------------------->|
       |                               |                                  |
       |[16] <3, 6, RECOVER-UPDATE-ACK>|                                  |
       |------------------------------>|                                  |
       |                               |                                  |
       |   [17] <3, 7, RECOVER-SUCESS> |                                  |
       |<------------------------------|                                  |
       |                               |                                  |
       |   [18] G1 discovers G2 made   |                                  |
       |        the rollback           |                                  |
       |                               |                                  |
       |----.                          |                                  |
       |    | [19]  Rollback           |                                  |
       |<---'                          |                                  |
       |                               |                                  |
       |  [20] <3, 8, ROLLBACK-ACK>    |                                  |
       |------------------------------>|                                  |
       |                               |                                  |
     ,--.                             ,--.                             ,-------.
     |G1|                             |G2|                             |Log API|
     `--'                             `--'                             `-------'

]]></artwork>
        </section>
      </section>
    </section>
    <section anchor="session-resumption">
      <name>Session Resumption</name>
      <t>This section explains how the primary-backup mode works for crash recovery. First, there is a session resumption phase. After that, the gateways perform the protocol specified in Section 5.</t>
      <section anchor="gateway-replacement">
        <name>Gateway Replacement</name>
        <t>The gateway replacemenet protocol introduces an assumption. We assume every gateway has a valid X.509 certificate that was issued by its owner, which is the entity legally responsible for the gateway.
Moreover, in the extensions field of the certificate, there is a list containing the hash of the authorized backup gateways.
When the primary gateway crashes, a replacement is bootstrapped with the latest version of the local state, and it engages in a protocol with the counterparty gateway.
This protocol aims to establish trust between gateways and the creation of a new TLS session:</t>
        <ol spacing="normal" type="1"><li>
            <t>Validate the backup gateway certificate by running a certification path algorithm, which includes validating all the intermediate certificates up to a trusted root (can be the VASPs CA).</t>
          </li>
          <li>
            <t>The counterparty gateway verifies if the parent certificate of the crashed gateway and the backup gateway is the same (proving they belong to the same authority).</t>
          </li>
          <li>
            <t>Verify if the backup gateway certificate hash belongs to the list specified in the crashed gateway certificate extensions.</t>
          </li>
        </ol>
        <t>The backup gateway, on its turn, defines gateways to replace it in case of a crash (X.509 certificate extensions).</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>We assume a trusted, authenticated, secure, reliable communication channel between gateways (i.e., messages cannot be spoofed and/or altered by an adversary) using TLS/HTTPS <xref target="TLS"/>. Clients support acceptable credential schemes such as OAuth2.0.
We assume the storage service used provides the means necessary to assure the logs' confidentiality and integrity, stored and in transit. The service must provide an authentication and authorization scheme, e.g., based on OAuth and OIDC <xref target="OIDC"/>, and use secure channels based on TLS/HTTPS.
The present protocol is crash fault-tolerant, meaning that it handles gateways that crash for several reasons (e.g., power outage). The present protocol does not support Byzantine faults, where gateways can behave arbitrarily (including being malicious). This implies that both gateways are considered trusted. We assume logs are not tampered with or lost.</t>
      <t>Log entries need integrity, availability, and confidentiality guarantees, as they are an attractive point of attack. Every log entry contains a hash of its payload for guaranteeing integrity.  If extra guarantees are needed (e.g., non-repudiation),  a log entry might be signed by its creator. Availability is guaranteed by the usage of the log storage API that connects a gateway to a dependable storage (local, external, or decentralized). Each underlying storage provides different guarantees. Access control can be enforced via the access control profile that each log can have associated with, i.e., the profile can be resolved, indicating who can access the log entry in which condition. Access control profiles can be implemented with access control lists for simple authorization. The authentication of the entities accessing the logs is done at the Log Storage API level (e.g., username+password authentication in local storage vs. decentralized access control).</t>
      <t>For extra guarantees, the nodes running the log storage API (or the gateway nodes themselves) can be protected by hardening technologies such as Intel SGX.</t>
    </section>
    <section anchor="performance-considerations">
      <name>Performance Considerations</name>
      <t>After the session setup using asymmetric-cryptography, the authenticated messages in the TLS Record Protocol utilize symmetric-key operations (using the session key). Since symmetric-key
operations are much faster than public-key operations, a persistent TLS connection delivers performance suitable for quickly exchange of log entries across gateways. Upon a crash, gateways might employ their best effort for resuming the crashed session.</t>
    </section>
    <section anchor="assumptions">
      <name>Assumptions</name>
      <t>For the protocol to work correctly, a few assumptions are taken: i) the crashed gateways eventually recover, at most for a fixed time (or are replaced); ii) Calls to the log API do not fail.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="TLS">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="HTTP2">
          <front>
            <title>HTTP/2</title>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <author fullname="C. Benfield" initials="C." role="editor" surname="Benfield"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>This specification describes an optimized expression of the semantics of the Hypertext Transfer Protocol (HTTP), referred to as HTTP version 2 (HTTP/2). HTTP/2 enables a more efficient use of network resources and a reduced latency by introducing field compression and allowing multiple concurrent exchanges on the same connection.</t>
              <t>This document obsoletes RFCs 7540 and 8740.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9113"/>
          <seriesInfo name="DOI" value="10.17487/RFC9113"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="OIDC" target="http://openid.net/specs/openid-connect-core-1_0.html">
          <front>
            <title>OpenID Connect Core 1.0</title>
            <author initials="N." surname="Sakimura">
              <organization/>
            </author>
            <author initials="J." surname="Bradley">
              <organization/>
            </author>
            <author initials="M." surname="Jones">
              <organization/>
            </author>
            <author initials="B." surname="de Medeiros">
              <organization/>
            </author>
            <author initials="C." surname="Mortimore">
              <organization/>
            </author>
            <date year="2014" month="November"/>
          </front>
        </reference>
        <reference anchor="AD76" target="http://openid.net/specs/openid-connect-core-1_0.html">
          <front>
            <title>A principle for resilient sharing of distributed resources</title>
            <author initials="P." surname="Alsberg">
              <organization/>
            </author>
            <author initials="D." surname="Day">
              <organization/>
            </author>
            <date year="1976"/>
          </front>
        </reference>
        <reference anchor="I-D.draft-ietf-satp-core">
          <front>
            <title>Secure Asset Transfer Protocol (SATP)</title>
            <author fullname="Martin Hargreaves" initials="M." surname="Hargreaves">
              <organization>Quant Network</organization>
            </author>
            <author fullname="Thomas Hardjono" initials="T." surname="Hardjono">
              <organization>MIT</organization>
            </author>
            <author fullname="Rafael Belchior" initials="R." surname="Belchior">
              <organization>Technico Lisboa</organization>
            </author>
            <date day="8" month="July" year="2023"/>
            <abstract>
              <t>   This memo This memo describes the Secure Asset Transfer (SAT)
   Protocol for digital assets.  SAT is a protocol operating between two
   gateways that conducts the transfer of a digital asset from one
   gateway to another.  The protocol establishes a secure channel
   between the endpoints and implements a 2-phase commit to ensure the
   properties of transfer atomicity, consistency, isolation and
   durability.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-satp-core-02"/>
        </reference>
      </references>
    </references>
  </back>
  <!-- ##markdown-source:
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
ZuO6k7bSc+QyStoTfvv49PzlK2+wsY6o1wqkcLvNMLEWKerrQCld+LlF9Vzk
bWCjNUwTjPfVswl6t9Syyivm94/gmJJn+71xlIjbor2okTN537FRfaIqQj0d
4l3Sk3XCS5Sh22KqF0+ffn949CMphvZwUNUMS5WgKwXK/enWenj+nuhDQHdU
sW45rSVAsnjhgq48ohOCRaFNwiyOUK+e463sX9X3r86es1MnKPbZ2OBcLWXw
kxW/WPG3vPUVb9Oqb6LgWCSFpLGWOteIFIcYvIQlmerxFkrX36WUCRD0/w8l
uTrpuGDiS2kPwSYuFnLfLy6EbLlCuxY5+wktHtlrc7nc8BkgrdfgNWfPaqaK
cTxZUPJKF7JQY7BpPunu+Nt6O2zBeYBHtnpddfgaCwn01Nvx1bhuKC+4+nrT
UoMSG7iSxH/T6oJqzeuVClrcf3213JWaelyoyJVMeL91YN5378vjrp953bPS
uOvxfv23/M/r3i9KbPJbfCsVUDqd2sFvHldhUVN72tj623U/n/vb1/u/EDX0
Wlal/m6Db2+gg88M8/pvX9//pVwrfmfjbz8bPd/87euDX1ADtMGEm3/7rWpX
/+/WYH794BcuyVs+aX1347fry6zgz+ejjVuQGw9/cUl0y2nnrvv2+spJvxUv
vH70C5cZLgn6+hroX062w160S3Der5AVaq43yI0vKHNed7sE9UErMFicnJ9/
97XyQvDwdRcrrQPwD1ql7f65/rX4ru7bj6aNbfWlT1SXPlFbqtQwKuuubOnd
TnW9IF16iCkDzFCnUR5nPpO2Deb31hfJBSAaLsYuXu1QEV4+g+FWcIn50e3V
Wdk4SuWZ0wz9mo3196GorEVhLVmFWLXwPftkpBpFG151B/W9xYMlDZxqpEt3
C4N1HHpiCrA5xvkL8iPVdP/M7hs21+8mFHFj+e6tCOTG+t1b0cuNBbzX6Nry
U69yd1s1CreH7+M5sJ4fb5Ihm2ThLElBESSr09iqp+tB3xKma5ptC9NaWtwa
pvd4Etj0ALK2p2v1ii+Ep+ubwVlihepLBdE3pswvRuM3wHS9vNoGJjqr9F0g
pCuwvl1PN1ft/AJUcLBKBaWC779rKoBj0crswqL0321FT19gdnjIASHeKwtx
tHN+ty2eRrFh53i2CYNGYt1Mtu2JbrrFK/FTZnetvv1H2VvgpHe2amb6Y+wt
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
GQKYlnZIzMeLZNput0k/bvw/5x8p97jaAAA=

-->

</rfc>
