Merge pull request #536 from mDuo13/reliable_tx_diagram

Reliable transaction submission diagram
This commit is contained in:
Rome Reginelli
2019-03-22 15:11:42 -07:00
committed by GitHub
3 changed files with 1328 additions and 6 deletions

View File

@@ -0,0 +1,689 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<diagram program="umlet" version="14.2">
<zoom_level>10</zoom_level>
<element>
<id>UMLClass</id>
<coordinates>
<x>160</x>
<y>60</y>
<w>180</w>
<h>90</h>
</coordinates>
<panel_attributes>Find the latest validated ledger index. Call this value A.
style=wordwrap</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>50</x>
<y>50</y>
<w>130</w>
<h>70</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>110.0;50.0;10.0;50.0;10.0;10.0</additional_attributes>
</element>
<element>
<id>UMLSpecialState</id>
<coordinates>
<x>50</x>
<y>40</y>
<w>20</w>
<h>20</h>
</coordinates>
<panel_attributes>type=initial</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>390</x>
<y>50</y>
<w>180</w>
<h>110</h>
</coordinates>
<panel_attributes>Construct transaction JSON including Sequence and LastLedgerSequence.
(LastLedgerSequence is &gt; A)
style=wordwrap</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>330</x>
<y>90</y>
<w>80</w>
<h>30</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>60.0;10.0;10.0;10.0</additional_attributes>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>560</x>
<y>90</y>
<w>70</w>
<h>30</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>50.0;10.0;10.0;10.0</additional_attributes>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>610</x>
<y>80</y>
<w>180</w>
<h>50</h>
</coordinates>
<panel_attributes>Sign transaction.
style=wordwrap</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>840</x>
<y>50</y>
<w>180</w>
<h>130</h>
</coordinates>
<panel_attributes>Save transaction to persistent storage. Be sure to include the hash, Sequence, LastLedgerSequence, and the validated ledger index.
style=wordwrap</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>780</x>
<y>90</y>
<w>80</w>
<h>30</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>60.0;10.0;10.0;10.0</additional_attributes>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>1010</x>
<y>90</y>
<w>80</w>
<h>30</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>60.0;10.0;10.0;10.0</additional_attributes>
</element>
<element>
<id>Text</id>
<coordinates>
<x>10</x>
<y>10</y>
<w>160</w>
<h>30</h>
</coordinates>
<panel_attributes>New transaction
style=wordwrap</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>1070</x>
<y>80</y>
<w>180</w>
<h>50</h>
</coordinates>
<panel_attributes>Submit transaction.
style=wordwrap</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLTimer</id>
<coordinates>
<x>1080</x>
<y>230</y>
<w>140</w>
<h>90</h>
</coordinates>
<panel_attributes>Wait ~4s for next
validated ledger</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>90</x>
<y>530</y>
<w>180</w>
<h>50</h>
</coordinates>
<panel_attributes>Check status of transaction by hash.
style=wordwrap</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLSpecialState</id>
<coordinates>
<x>370</x>
<y>530</y>
<w>40</w>
<h>40</h>
</coordinates>
<panel_attributes>type=decision</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>260</x>
<y>540</y>
<w>130</w>
<h>30</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>110.0;10.0;10.0;10.0</additional_attributes>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>400</x>
<y>530</y>
<w>240</w>
<h>60</h>
</coordinates>
<panel_attributes>lt=&lt;-
[transaction not found,
or is found in a
non-validated ledger]</panel_attributes>
<additional_attributes>220.0;20.0;10.0;20.0</additional_attributes>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>160</x>
<y>560</y>
<w>250</w>
<h>120</h>
</coordinates>
<panel_attributes>lt=&lt;-
[transaction is
in a validated ledger]</panel_attributes>
<additional_attributes>10.0;100.0;10.0;60.0;230.0;60.0;230.0;10.0</additional_attributes>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>90</x>
<y>660</y>
<w>180</w>
<h>50</h>
</coordinates>
<panel_attributes>Save final outcome to persistent storage.
style=wordwrap</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLSpecialState</id>
<coordinates>
<x>160</x>
<y>740</y>
<w>20</w>
<h>20</h>
</coordinates>
<panel_attributes>type=final</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>160</x>
<y>700</y>
<w>30</w>
<h>60</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>10.0;40.0;10.0;10.0</additional_attributes>
</element>
<element>
<id>Text</id>
<coordinates>
<x>150</x>
<y>760</y>
<w>60</w>
<h>30</h>
</coordinates>
<panel_attributes>Done
style=wordwrap</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLSpecialState</id>
<coordinates>
<x>620</x>
<y>530</y>
<w>40</w>
<h>40</h>
</coordinates>
<panel_attributes>type=decision</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>630</x>
<y>240</y>
<w>640</w>
<h>310</h>
</coordinates>
<panel_attributes>lt=&lt;-
r2=[latest validated ledger \nis &lt; LastLedgerSequence]
r2pos=20,5</panel_attributes>
<additional_attributes>550.0;10.0;620.0;10.0;620.0;270.0;10.0;270.0;10.0;290.0</additional_attributes>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>650</x>
<y>540</y>
<w>240</w>
<h>50</h>
</coordinates>
<panel_attributes>lt=&lt;-
r1=[latest validated ledger \nis ≥ LastLedgerSequence]
r1pos=-10,30</panel_attributes>
<additional_attributes>220.0;10.0;10.0;10.0</additional_attributes>
</element>
<element>
<id>UMLSpecialState</id>
<coordinates>
<x>870</x>
<y>530</y>
<w>40</w>
<h>40</h>
</coordinates>
<panel_attributes>type=decision</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>420</x>
<y>560</y>
<w>490</w>
<h>160</h>
</coordinates>
<panel_attributes>lt=&lt;-
[server has continuous ledger history
from A to LastLedgerSequence, inclusive]
</panel_attributes>
<additional_attributes>10.0;140.0;10.0;90.0;470.0;90.0;470.0;10.0</additional_attributes>
</element>
<element>
<id>UMLSpecialState</id>
<coordinates>
<x>630</x>
<y>710</y>
<w>40</w>
<h>40</h>
</coordinates>
<panel_attributes>type=decision</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>520</x>
<y>720</y>
<w>130</w>
<h>30</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>110.0;10.0;10.0;10.0</additional_attributes>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>900</x>
<y>530</y>
<w>230</w>
<h>130</h>
</coordinates>
<panel_attributes>lt=&lt;-
[server does not
have continuous
ledger history
from A to
LastLedgerSequence
(inclusive)]
</panel_attributes>
<additional_attributes>210.0;20.0;10.0;20.0</additional_attributes>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>1110</x>
<y>530</y>
<w>180</w>
<h>60</h>
</coordinates>
<panel_attributes>Wait for gaps to fill in or ask a different server.
style=wordwrap</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>1240</x>
<y>240</y>
<w>90</w>
<h>330</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>10.0;10.0;70.0;10.0;70.0;310.0;50.0;310.0</additional_attributes>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>350</x>
<y>700</y>
<w>180</w>
<h>70</h>
</coordinates>
<panel_attributes>Look up account Sequence number in latest validated ledger.
style=wordwrap</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>240</x>
<y>740</y>
<w>430</w>
<h>140</h>
</coordinates>
<panel_attributes>lt=&lt;-
[Account Sequence is
less than or equal to
transaction Sequence]</panel_attributes>
<additional_attributes>10.0;120.0;10.0;70.0;410.0;70.0;410.0;10.0</additional_attributes>
</element>
<element>
<id>UMLSpecialState</id>
<coordinates>
<x>690</x>
<y>880</y>
<w>20</w>
<h>20</h>
</coordinates>
<panel_attributes>type=flow_final</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>200</x>
<y>860</y>
<w>180</w>
<h>80</h>
</coordinates>
<panel_attributes>Transaction has not been included in any validated ledger and never will be.
style=wordwrap</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>450</x>
<y>870</y>
<w>180</w>
<h>50</h>
</coordinates>
<panel_attributes>Save final outcome to persistent storage.
style=wordwrap</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>370</x>
<y>880</y>
<w>100</w>
<h>30</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>80.0;10.0;10.0;10.0</additional_attributes>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>620</x>
<y>880</y>
<w>90</w>
<h>30</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>70.0;10.0;10.0;10.0</additional_attributes>
</element>
<element>
<id>Text</id>
<coordinates>
<x>680</x>
<y>900</y>
<w>60</w>
<h>30</h>
</coordinates>
<panel_attributes>Done
style=wordwrap</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLSpecialState</id>
<coordinates>
<x>50</x>
<y>220</y>
<w>20</w>
<h>20</h>
</coordinates>
<panel_attributes>type=initial</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Text</id>
<coordinates>
<x>10</x>
<y>190</y>
<w>190</w>
<h>30</h>
</coordinates>
<panel_attributes>Recover from outage
style=wordwrap</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>660</x>
<y>710</y>
<w>240</w>
<h>60</h>
</coordinates>
<panel_attributes>lt=&lt;-
[Account Sequence is
greater than transaction
Sequence]</panel_attributes>
<additional_attributes>220.0;20.0;10.0;20.0</additional_attributes>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>880</x>
<y>700</y>
<w>180</w>
<h>80</h>
</coordinates>
<panel_attributes>Unknown transaction has been validated. Manual intervention recommended.
style=wordwrap</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>160</x>
<y>240</y>
<w>180</w>
<h>80</h>
</coordinates>
<panel_attributes>Check persistent storage for transactions without a final outcome saved.
style=wordwrap</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>50</x>
<y>230</y>
<w>130</w>
<h>60</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>110.0;40.0;10.0;40.0;10.0;10.0</additional_attributes>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>330</x>
<y>260</y>
<w>100</w>
<h>30</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>80.0;10.0;10.0;10.0</additional_attributes>
</element>
<element>
<id>UMLSpecialState</id>
<coordinates>
<x>410</x>
<y>250</y>
<w>40</w>
<h>40</h>
</coordinates>
<panel_attributes>type=decision</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>420</x>
<y>280</y>
<w>150</w>
<h>130</h>
</coordinates>
<panel_attributes>lt=&lt;-
[final outcomes of
all transactions
are recorded]</panel_attributes>
<additional_attributes>10.0;110.0;10.0;10.0</additional_attributes>
</element>
<element>
<id>Text</id>
<coordinates>
<x>410</x>
<y>410</y>
<w>60</w>
<h>30</h>
</coordinates>
<panel_attributes>Done
style=wordwrap</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>UMLSpecialState</id>
<coordinates>
<x>420</x>
<y>390</y>
<w>20</w>
<h>20</h>
</coordinates>
<panel_attributes>type=final</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>440</x>
<y>250</y>
<w>230</w>
<h>60</h>
</coordinates>
<panel_attributes>lt=&lt;-
[final outcomes of
some transactions
are not recorded]</panel_attributes>
<additional_attributes>210.0;20.0;10.0;20.0</additional_attributes>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>1140</x>
<y>120</y>
<w>30</w>
<h>130</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>10.0;110.0;10.0;10.0</additional_attributes>
</element>
<element>
<id>UMLClass</id>
<coordinates>
<x>650</x>
<y>220</y>
<w>180</w>
<h>100</h>
</coordinates>
<panel_attributes>Repeat the following steps for each transaction without a final outcome recorded.
style=wordwrap</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>850</x>
<y>310</y>
<w>320</w>
<h>160</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>10.0;140.0;300.0;140.0;300.0;10.0</additional_attributes>
</element>
<element>
<id>UMLNote</id>
<coordinates>
<x>1080</x>
<y>700</y>
<w>230</w>
<h>230</h>
</coordinates>
<panel_attributes>bg=#fed74c
transparency=0
style=wordwrap
Some reasons an unknown transaction may have been validated:
- The transaction was malleable and succeeded with a different hash.
- A different program or person with your secret key is also sending transactions from the same account.
- You previously sent a transaction, but lost your record of it.</panel_attributes>
<additional_attributes/>
</element>
<element>
<id>Relation</id>
<coordinates>
<x>50</x>
<y>260</y>
<w>830</w>
<h>310</h>
</coordinates>
<panel_attributes>lt=&lt;-</panel_attributes>
<additional_attributes>40.0;290.0;10.0;290.0;10.0;190.0;810.0;190.0;810.0;10.0;780.0;10.0</additional_attributes>
</element>
</diagram>

View File

@@ -66,6 +66,10 @@ RippleAPI uses the `maxLedgerVersion` field of [Transaction Instructions](ripple
## Best Practices
The following diagram summarizes the recommended flow for submitting a transaction and determining its outcome:
[![Reliable transaction submission flowchart](img/reliable-tx-submission.svg)](img/reliable-tx-submission.svg)
### Reliable Transactions Submission
@@ -104,7 +108,7 @@ On restart, or the determination of a new last validated ledger (pseudocode):
```
For each persisted transaction without validated result:
Query transaction by hash
If (result appears in validated ledger)
If (result appears in any validated ledger)
# Outcome is final
Persist the final result
If (result code is tesSUCCESS)
@@ -122,9 +126,13 @@ For each persisted transaction without validated result:
If (server has continuous ledger history from the ledger when the
transaction was submitted up to and including the ledger
identified by LastLedgerSequence)
The transaction failed (2)
If appropriate for the application, submit with
new LastLedgerSequence and Fee
# Sanity check
If (sender account sequence > transaction sequence)
A different transaction with this sequence has a final outcome.
Manual intervention suggested (3)
Else
The transaction failed (2)
Else
# Outcome is final, but not known due to a ledger gap
@@ -137,15 +145,30 @@ The difference between the two transaction failure cases (labeled (1) and (2) in
- In failure case (1), the transaction was included in a ledger and destroyed the [XRP transaction cost](transaction-cost.html), but did nothing else. This could be caused by a lack of liquidity, improperly specified [paths](paths.html), or other circumstances. For many such failures, immediately retrying with a similar transaction is likely to have the same result. You may get different results if you wait for circumstances to change.
- In failure case (2), the transaction was not included in a validated ledger, so it did nothing at all, not even destroy the transaction cost. This could be the result of the transaction cost being too low for the current load on the XRP Ledger, the `LastLedgerSequence` being too soon, or it could be due to other conditions such as an unstable network connection. In contrast to failure case (1), it is more likely that a new transaction is likely to succeed if you change only the `LastLedgerSequence` and possibly the `Fee` and submit again.
- In failure case (2), the transaction was not included in a validated ledger, so it did nothing at all, not even destroy the transaction cost. This could be the result of the transaction cost being too low for the current load on the XRP Ledger, the `LastLedgerSequence` being too soon, or it could be due to other conditions such as an unstable network connection.
- In contrast to failure case (1), it is more likely that a new transaction is likely to succeed if you change only the `LastLedgerSequence` and possibly the `Fee` and submit again. Use the same `Sequence` number as the original transaction.
- It is also possible that the transaction could not succeed due to the state of the ledger, for example because the sending address disabled the key pair used to sign the transaction. If the transaction's provisional result was a [`tef`-class code](tef-codes.html), the transaction is less likely to succeed without further modification.
- Failure case (3) represents an unexpected state. When a transaction is not processed, you should check the `Sequence` number of the sending account in the most recent validated ledger. (You can use the [account_info method][] to do so.) If the account's `Sequence` value in the latest validated ledger is higher than the transaction's `Sequence` value, then a different transaction with the same `Sequence` value has been included in a validated ledger. If your system is not aware of the other transaction, you are in an unexpected state and should stop processing until you have determined why that has happened; otherwise, your system might send multiple transactions to accomplish the same goal. The steps you should take depend on specifically what caused it. Some possibilities include:
- The previously-sent transaction was [malleable](transaction-malleability.html) and it actually was included in a validated ledger, but with a different hash than you expected. This can happen if you specify a set of flags that do not include the `tfFullyCanonicalSig` flag or if the transaction is multi-signed by more signers than necessary. If this is the case, save the different hash and the final outcome of the transaction, then resume normal activities.
- You [canceled](cancel-or-skip-a-transaction.html) and replaced the transaction, and the replacement transaction was processed instead. If you are recovering from an outage, it's possible you may have lost record of the replacement transaction. If this is the case, the transaction you were originally looking up has failed permanently, and the final outcome of the replacement transaction is recorded in a validated ledger version. Save both final outcomes, check for any other missing or replaced transactions, then resume normal activities.
- If you have two or more transaction-sending systems in an active/passive failover configuration, it's possible that the passive system mistakenly believes the active system has failed, and has become active while the original active system is still also sending transactions. Check the connectivity between the systems and ensure that at most one of them is active. Check your account's transaction history (for example, with the [account_tx method][]) and record the final outcome of all transactions that were included in validated ledgers. Any different transactions with the same `Sequence` numbers have failed permanently; save those final outcomes as well. When you have finished reconciling the differences from all the systems and have resolved the issues that made the systems activate simultaneously, resume normal activities.
**Tip:** The [`AccountTxnID` field](transaction-common-fields.html#accounttxnid) can help prevent redundant transactions from succeeding in this situation.
- A malicious actor may have used your secret key to send a transaction. If this is the case, [rotate your key pair](change-or-remove-a-regular-key-pair.html) if you can, and check for other transactions sent. You should also audit your network to determine if the secret key was part of a larger intrusion or security leak. When you successfully rotate your key pair and are certain that the malicious actor no longer has access to your accounts and systems, you can resume normal activities.
#### Ledger Gaps
If your server does not have continuous ledger history from when the transaction was originally submitted up to and including the ledger identified by `LastLedgerSequence`, you may not know the final outcome of the transaction. (If it was included in one of the ledger versions your server is missing, you do not know whether it succeeded or failed.)
Your `rippled` server should automatically acquire the missing ledger versions when it has spare resources (CPU/RAM/disk IO) to do so, unless the ledgers are older than its [configured amount of history to store](https://github.com/ripple/rippled/blob/develop/cfg/rippled-example.cfg#L581). Depending on the size of the gap and the resource usage of your server, acquiring missing ledgers should take a few minutes. You can also manually request your server to acquire historical ledger versions using the [ledger_request method][].
Your `rippled` server should automatically acquire the missing ledger versions when it has spare resources (CPU/RAM/disk IO) to do so, unless the ledgers are older than its [configured amount of history to store](ledger-history.html). Depending on the size of the gap and the resource usage of your server, acquiring missing ledgers should take a few minutes. You can request your server to acquire historical ledger versions using the [ledger_request method][], but even so you may not be able to look up transaction outcomes from ledger versions that are outside of your server's configured history range.
Alternatively, you can look up the status of the transaction using a different `rippled` server that already has the needed ledger history, such as Ripple's full-history servers at `s2.ripple.com`. Only use a server you trust for this purpose. A malicious server could be programmed to provide false information about the status and outcome of a transaction.
@@ -512,6 +535,7 @@ Finally the server may show one or more gaps in the transaction history. The `co
- [Transaction Formats](transaction-formats.html)
- [Transaction Cost](transaction-cost.html)
- [Transaction Malleability](transaction-malleability.html)
- [Overview of XRP Ledger Consensus Process](consensus.html)
- [Consensus Principles and Rules](consensus-principles-and-rules.html)

View File

@@ -0,0 +1,609 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.0//EN'
'http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd'>
<svg fill-opacity="1" xmlns:xlink="http://www.w3.org/1999/xlink" color-rendering="auto" color-interpolation="auto" text-rendering="auto" stroke="black" stroke-linecap="square" width="1360" stroke-miterlimit="10" shape-rendering="auto" stroke-opacity="1" fill="black" stroke-dasharray="none" font-weight="normal" stroke-width="1" viewBox="-10 -10 1360 970" height="970" xmlns="http://www.w3.org/2000/svg" font-family="'Dialog'" font-style="normal" stroke-linejoin="miter" font-size="12px" stroke-dashoffset="0" image-rendering="auto"
><!--Generated by the Batik Graphics2D SVG Generator--><defs id="genericDefs"
/><g
><defs id="defs1"
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath1"
><path d="M0 0 L2147483647 0 L2147483647 2147483647 L0 2147483647 L0 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath2"
><path d="M0 0 L0 230 L230 230 L230 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath3"
><path d="M0 0 L0 100 L180 100 L180 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath4"
><path d="M0 0 L0 20 L20 20 L20 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath5"
><path d="M0 0 L0 30 L60 30 L60 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath6"
><path d="M0 0 L0 40 L40 40 L40 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath7"
><path d="M0 0 L0 80 L180 80 L180 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath8"
><path d="M0 0 L0 30 L190 30 L190 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath9"
><path d="M0 0 L0 50 L180 50 L180 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath10"
><path d="M0 0 L0 70 L180 70 L180 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath11"
><path d="M0 0 L0 60 L180 60 L180 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath12"
><path d="M0 0 L0 90 L140 90 L140 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath13"
><path d="M0 0 L0 30 L160 30 L160 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath14"
><path d="M0 0 L0 130 L180 130 L180 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath15"
><path d="M0 0 L0 110 L180 110 L180 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath16"
><path d="M0 0 L0 90 L180 90 L180 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath17"
><path d="M0 0 L0 310 L830 310 L830 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath18"
><path d="M0 0 L0 160 L320 160 L320 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath19"
><path d="M0 0 L0 130 L30 130 L30 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath20"
><path d="M0 0 L0 60 L230 60 L230 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath21"
><path d="M0 0 L0 130 L150 130 L150 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath22"
><path d="M0 0 L0 30 L100 30 L100 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath23"
><path d="M0 0 L0 60 L130 60 L130 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath24"
><path d="M0 0 L0 60 L240 60 L240 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath25"
><path d="M0 0 L0 30 L90 30 L90 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath26"
><path d="M0 0 L0 140 L430 140 L430 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath27"
><path d="M0 0 L0 330 L90 330 L90 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath28"
><path d="M0 0 L0 130 L230 130 L230 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath29"
><path d="M0 0 L0 30 L130 30 L130 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath30"
><path d="M0 0 L0 160 L490 160 L490 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath31"
><path d="M0 0 L0 50 L240 50 L240 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath32"
><path d="M0 0 L0 310 L640 310 L640 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath33"
><path d="M0 0 L0 60 L30 60 L30 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath34"
><path d="M0 0 L0 120 L250 120 L250 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath35"
><path d="M0 0 L0 30 L80 30 L80 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath36"
><path d="M0 0 L0 30 L70 30 L70 0 Z"
/></clipPath
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath37"
><path d="M0 0 L0 70 L130 70 L130 0 Z"
/></clipPath
></defs
><g fill="rgb(254,215,76)" transform="translate(1080,700)" stroke="rgb(254,215,76)"
><path d="M0.5 0.5 L218.5 0.5 L229 12.5 L229 229 L0.5 229 Z" stroke="none" clip-path="url(#clipPath2)"
/><path fill="none" d="M0.5 0.5 L218.5 0.5 L229 12.5 L229 229 L0.5 229 Z" clip-path="url(#clipPath2)" stroke="black"
/><path fill="none" d="M218.5 0.5 L218.5 12.5 L229 12.5" clip-path="url(#clipPath2)" stroke="black"
/></g
><g font-family="sans-serif" font-size="14px" transform="translate(1080,700)"
><text x="5" xml:space="preserve" y="18.1094" clip-path="url(#clipPath2)" stroke="none"
>Some reasons an unknown</text
><text x="5" xml:space="preserve" y="34.2188" clip-path="url(#clipPath2)" stroke="none"
>transaction may have been</text
><text x="5" xml:space="preserve" y="50.3281" clip-path="url(#clipPath2)" stroke="none"
>validated:</text
><text x="5" xml:space="preserve" y="66.4375" clip-path="url(#clipPath2)" stroke="none"
>- The transaction was</text
><text x="5" xml:space="preserve" y="82.5469" clip-path="url(#clipPath2)" stroke="none"
>malleable and succeeded with</text
><text x="5" xml:space="preserve" y="98.6562" clip-path="url(#clipPath2)" stroke="none"
>a different hash.</text
><text x="5" xml:space="preserve" y="114.7656" clip-path="url(#clipPath2)" stroke="none"
>- A different program or</text
><text x="5" xml:space="preserve" y="130.875" clip-path="url(#clipPath2)" stroke="none"
>person with your secret key is</text
><text x="5" xml:space="preserve" y="146.9844" clip-path="url(#clipPath2)" stroke="none"
>also sending transactions</text
><text x="5" xml:space="preserve" y="163.0938" clip-path="url(#clipPath2)" stroke="none"
>from the same account.</text
><text x="5" xml:space="preserve" y="179.2031" clip-path="url(#clipPath2)" stroke="none"
>- You previously sent a</text
><text x="5" xml:space="preserve" y="195.3125" clip-path="url(#clipPath2)" stroke="none"
>transaction, but lost your</text
><text x="5" xml:space="preserve" y="211.4219" clip-path="url(#clipPath2)" stroke="none"
>record of it.</text
></g
><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(650,220)" stroke-opacity="0" stroke="rgb(255,255,255)"
><rect x="0.5" width="178.5" height="98.5" y="0.5" clip-path="url(#clipPath3)" stroke="none"
/></g
><g transform="translate(650,220)"
><rect fill="none" x="0.5" width="178.5" height="98.5" y="0.5" clip-path="url(#clipPath3)"
/><text x="17" font-size="14px" y="18.1094" clip-path="url(#clipPath3)" font-family="sans-serif" stroke="none" xml:space="preserve"
>Repeat the following</text
><text x="40" font-size="14px" y="34.2188" clip-path="url(#clipPath3)" font-family="sans-serif" stroke="none" xml:space="preserve"
>steps for each</text
><text x="15" font-size="14px" y="50.3281" clip-path="url(#clipPath3)" font-family="sans-serif" stroke="none" xml:space="preserve"
>transaction without a</text
><text x="41" font-size="14px" y="66.4375" clip-path="url(#clipPath3)" font-family="sans-serif" stroke="none" xml:space="preserve"
>final outcome</text
><text x="56" font-size="14px" y="82.5469" clip-path="url(#clipPath3)" font-family="sans-serif" stroke="none" xml:space="preserve"
>recorded.</text
></g
><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(420,390)" stroke-opacity="0" stroke="rgb(255,255,255)"
><circle r="9.25" clip-path="url(#clipPath4)" cx="9.75" cy="9.75" stroke="none"
/></g
><g transform="translate(420,390)"
><circle fill="none" r="9.25" clip-path="url(#clipPath4)" cx="9.75" cy="9.75"
/><circle r="6.2273" clip-path="url(#clipPath4)" cx="10" cy="10" stroke="none"
/></g
><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(420,390)" stroke-opacity="0" stroke="rgb(255,255,255)"
><circle fill="none" r="6.2273" clip-path="url(#clipPath4)" cx="10" cy="10"
/></g
><g font-family="sans-serif" font-size="14px" transform="translate(410,410)"
><text x="5" xml:space="preserve" y="18.1094" clip-path="url(#clipPath5)" stroke="none"
>Done</text
></g
><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(410,250)" stroke-opacity="0" stroke="rgb(255,255,255)"
><path d="M20.5 1.5 L39 20.5 L20.5 39 L1.5 20.5 Z" stroke="none" clip-path="url(#clipPath6)"
/></g
><g transform="translate(410,250)"
><path fill="none" d="M20.5 1.5 L39 20.5 L20.5 39 L1.5 20.5 Z" clip-path="url(#clipPath6)"
/></g
><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(160,240)" stroke-opacity="0" stroke="rgb(255,255,255)"
><rect x="0.5" width="178.5" height="78.5" y="0.5" clip-path="url(#clipPath7)" stroke="none"
/></g
><g transform="translate(160,240)"
><rect fill="none" x="0.5" width="178.5" height="78.5" y="0.5" clip-path="url(#clipPath7)"
/><text x="31" font-size="14px" y="18.1094" clip-path="url(#clipPath7)" font-family="sans-serif" stroke="none" xml:space="preserve"
>Check persistent</text
><text x="51" font-size="14px" y="34.2188" clip-path="url(#clipPath7)" font-family="sans-serif" stroke="none" xml:space="preserve"
>storage for</text
><text x="11" font-size="14px" y="50.3281" clip-path="url(#clipPath7)" font-family="sans-serif" stroke="none" xml:space="preserve"
>transactions without a</text
><text x="16" font-size="14px" y="66.4375" clip-path="url(#clipPath7)" font-family="sans-serif" stroke="none" xml:space="preserve"
>final outcome saved.</text
></g
><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(880,700)" stroke-opacity="0" stroke="rgb(255,255,255)"
><rect x="0.5" width="178.5" height="78.5" y="0.5" clip-path="url(#clipPath7)" stroke="none"
/></g
><g transform="translate(880,700)"
><rect fill="none" x="0.5" width="178.5" height="78.5" y="0.5" clip-path="url(#clipPath7)"
/><text x="15" font-size="14px" y="18.1094" clip-path="url(#clipPath7)" font-family="sans-serif" stroke="none" xml:space="preserve"
>Unknown transaction</text
><text x="20" font-size="14px" y="34.2188" clip-path="url(#clipPath7)" font-family="sans-serif" stroke="none" xml:space="preserve"
>has been validated.</text
><text x="19" font-size="14px" y="50.3281" clip-path="url(#clipPath7)" font-family="sans-serif" stroke="none" xml:space="preserve"
>Manual intervention</text
><text x="36" font-size="14px" y="66.4375" clip-path="url(#clipPath7)" font-family="sans-serif" stroke="none" xml:space="preserve"
>recommended.</text
></g
><g font-family="sans-serif" font-size="14px" transform="translate(10,190)"
><text x="5" xml:space="preserve" y="18.1094" clip-path="url(#clipPath8)" stroke="none"
>Recover from outage</text
></g
><g transform="translate(50,220)"
><circle r="8.75" clip-path="url(#clipPath4)" cx="10.25" cy="10.25" stroke="none"
/><circle fill="none" r="8.75" clip-path="url(#clipPath4)" cx="10.25" cy="10.25"
/></g
><g font-family="sans-serif" font-size="14px" transform="translate(680,900)"
><text x="5" xml:space="preserve" y="18.1094" clip-path="url(#clipPath5)" stroke="none"
>Done</text
></g
><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(450,870)" stroke-opacity="0" stroke="rgb(255,255,255)"
><rect x="0.5" width="178.5" height="48.5" y="0.5" clip-path="url(#clipPath9)" stroke="none"
/></g
><g transform="translate(450,870)"
><rect fill="none" x="0.5" width="178.5" height="48.5" y="0.5" clip-path="url(#clipPath9)"
/><text x="13" font-size="14px" y="18.1094" clip-path="url(#clipPath9)" font-family="sans-serif" stroke="none" xml:space="preserve"
>Save final outcome to</text
><text x="23" font-size="14px" y="34.2188" clip-path="url(#clipPath9)" font-family="sans-serif" stroke="none" xml:space="preserve"
>persistent storage.</text
></g
><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(200,860)" stroke-opacity="0" stroke="rgb(255,255,255)"
><rect x="0.5" width="178.5" height="78.5" y="0.5" clip-path="url(#clipPath7)" stroke="none"
/></g
><g transform="translate(200,860)"
><rect fill="none" x="0.5" width="178.5" height="78.5" y="0.5" clip-path="url(#clipPath7)"
/><text x="20" font-size="14px" y="18.1094" clip-path="url(#clipPath7)" font-family="sans-serif" stroke="none" xml:space="preserve"
>Transaction has not</text
><text x="16" font-size="14px" y="34.2188" clip-path="url(#clipPath7)" font-family="sans-serif" stroke="none" xml:space="preserve"
>been included in any</text
><text x="17" font-size="14px" y="50.3281" clip-path="url(#clipPath7)" font-family="sans-serif" stroke="none" xml:space="preserve"
>validated ledger and</text
><text x="42" font-size="14px" y="66.4375" clip-path="url(#clipPath7)" font-family="sans-serif" stroke="none" xml:space="preserve"
>never will be.</text
></g
><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(690,880)" stroke-opacity="0" stroke="rgb(255,255,255)"
><circle r="9.25" clip-path="url(#clipPath4)" cx="9.75" cy="9.75" stroke="none"
/></g
><g transform="translate(690,880)"
><circle fill="none" r="9.25" clip-path="url(#clipPath4)" cx="9.75" cy="9.75"
/><path fill="none" d="M2.9191 3.6667 L17.0809 16.3333" clip-path="url(#clipPath4)"
/><path fill="none" d="M2.9191 16.3333 L17.0809 3.6667" clip-path="url(#clipPath4)"
/></g
><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(350,700)" stroke-opacity="0" stroke="rgb(255,255,255)"
><rect x="0.5" width="178.5" height="68.5" y="0.5" clip-path="url(#clipPath10)" stroke="none"
/></g
><g transform="translate(350,700)"
><rect fill="none" x="0.5" width="178.5" height="68.5" y="0.5" clip-path="url(#clipPath10)"
/><text x="32" font-size="14px" y="18.1094" clip-path="url(#clipPath10)" font-family="sans-serif" stroke="none" xml:space="preserve"
>Look up account</text
><text x="17" font-size="14px" y="34.2188" clip-path="url(#clipPath10)" font-family="sans-serif" stroke="none" xml:space="preserve"
>Sequence number in</text
><text x="8" font-size="14px" y="50.3281" clip-path="url(#clipPath10)" font-family="sans-serif" stroke="none" xml:space="preserve"
>latest validated ledger.</text
></g
><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(1110,530)" stroke-opacity="0" stroke="rgb(255,255,255)"
><rect x="0.5" width="178.5" height="58.5" y="0.5" clip-path="url(#clipPath11)" stroke="none"
/></g
><g transform="translate(1110,530)"
><rect fill="none" x="0.5" width="178.5" height="58.5" y="0.5" clip-path="url(#clipPath11)"
/><text x="14" font-size="14px" y="18.1094" clip-path="url(#clipPath11)" font-family="sans-serif" stroke="none" xml:space="preserve"
>Wait for gaps to fill in</text
><text x="29" font-size="14px" y="34.2188" clip-path="url(#clipPath11)" font-family="sans-serif" stroke="none" xml:space="preserve"
>or ask a different</text
><text x="65" font-size="14px" y="50.3281" clip-path="url(#clipPath11)" font-family="sans-serif" stroke="none" xml:space="preserve"
>server.</text
></g
><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(630,710)" stroke-opacity="0" stroke="rgb(255,255,255)"
><path d="M20.5 1.5 L39 20.5 L20.5 39 L1.5 20.5 Z" stroke="none" clip-path="url(#clipPath6)"
/></g
><g transform="translate(630,710)"
><path fill="none" d="M20.5 1.5 L39 20.5 L20.5 39 L1.5 20.5 Z" clip-path="url(#clipPath6)"
/></g
><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(870,530)" stroke-opacity="0" stroke="rgb(255,255,255)"
><path d="M20.5 1.5 L39 20.5 L20.5 39 L1.5 20.5 Z" stroke="none" clip-path="url(#clipPath6)"
/></g
><g transform="translate(870,530)"
><path fill="none" d="M20.5 1.5 L39 20.5 L20.5 39 L1.5 20.5 Z" clip-path="url(#clipPath6)"
/></g
><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(620,530)" stroke-opacity="0" stroke="rgb(255,255,255)"
><path d="M20.5 1.5 L39 20.5 L20.5 39 L1.5 20.5 Z" stroke="none" clip-path="url(#clipPath6)"
/></g
><g transform="translate(620,530)"
><path fill="none" d="M20.5 1.5 L39 20.5 L20.5 39 L1.5 20.5 Z" clip-path="url(#clipPath6)"
/></g
><g font-family="sans-serif" font-size="14px" transform="translate(150,760)"
><text x="5" xml:space="preserve" y="18.1094" clip-path="url(#clipPath5)" stroke="none"
>Done</text
></g
><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(160,740)" stroke-opacity="0" stroke="rgb(255,255,255)"
><circle r="9.25" clip-path="url(#clipPath4)" cx="9.75" cy="9.75" stroke="none"
/></g
><g transform="translate(160,740)"
><circle fill="none" r="9.25" clip-path="url(#clipPath4)" cx="9.75" cy="9.75"
/><circle r="6.2273" clip-path="url(#clipPath4)" cx="10" cy="10" stroke="none"
/></g
><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(160,740)" stroke-opacity="0" stroke="rgb(255,255,255)"
><circle fill="none" r="6.2273" clip-path="url(#clipPath4)" cx="10" cy="10"
/></g
><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(90,660)" stroke-opacity="0" stroke="rgb(255,255,255)"
><rect x="0.5" width="178.5" height="48.5" y="0.5" clip-path="url(#clipPath9)" stroke="none"
/></g
><g transform="translate(90,660)"
><rect fill="none" x="0.5" width="178.5" height="48.5" y="0.5" clip-path="url(#clipPath9)"
/><text x="13" font-size="14px" y="18.1094" clip-path="url(#clipPath9)" font-family="sans-serif" stroke="none" xml:space="preserve"
>Save final outcome to</text
><text x="23" font-size="14px" y="34.2188" clip-path="url(#clipPath9)" font-family="sans-serif" stroke="none" xml:space="preserve"
>persistent storage.</text
></g
><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(370,530)" stroke-opacity="0" stroke="rgb(255,255,255)"
><path d="M20.5 1.5 L39 20.5 L20.5 39 L1.5 20.5 Z" stroke="none" clip-path="url(#clipPath6)"
/></g
><g transform="translate(370,530)"
><path fill="none" d="M20.5 1.5 L39 20.5 L20.5 39 L1.5 20.5 Z" clip-path="url(#clipPath6)"
/></g
><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(90,530)" stroke-opacity="0" stroke="rgb(255,255,255)"
><rect x="0.5" width="178.5" height="48.5" y="0.5" clip-path="url(#clipPath9)" stroke="none"
/></g
><g transform="translate(90,530)"
><rect fill="none" x="0.5" width="178.5" height="48.5" y="0.5" clip-path="url(#clipPath9)"
/><text x="35" font-size="14px" y="18.1094" clip-path="url(#clipPath9)" font-family="sans-serif" stroke="none" xml:space="preserve"
>Check status of</text
><text x="18" font-size="14px" y="34.2188" clip-path="url(#clipPath9)" font-family="sans-serif" stroke="none" xml:space="preserve"
>transaction by hash.</text
></g
><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(1080,230)" stroke-opacity="0" stroke="rgb(255,255,255)"
><path d="M50.5 0.5 L90.5 40.5 L50.5 40.5 L90.5 0.5 Z" stroke="none" clip-path="url(#clipPath12)"
/></g
><g transform="translate(1080,230)"
><path fill="none" d="M50.5 0.5 L90.5 40.5 L50.5 40.5 L90.5 0.5 Z" clip-path="url(#clipPath12)"
/><text x="8" font-size="14px" y="63.1094" clip-path="url(#clipPath12)" font-family="sans-serif" stroke="none" xml:space="preserve"
>Wait ~4s for next</text
><text x="12" font-size="14px" y="79.2188" clip-path="url(#clipPath12)" font-family="sans-serif" stroke="none" xml:space="preserve"
>validated ledger</text
></g
><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(1070,80)" stroke-opacity="0" stroke="rgb(255,255,255)"
><rect x="0.5" width="178.5" height="48.5" y="0.5" clip-path="url(#clipPath9)" stroke="none"
/></g
><g transform="translate(1070,80)"
><rect fill="none" x="0.5" width="178.5" height="48.5" y="0.5" clip-path="url(#clipPath9)"
/><text x="21" font-size="14px" y="18.1094" clip-path="url(#clipPath9)" font-family="sans-serif" stroke="none" xml:space="preserve"
>Submit transaction.</text
></g
><g font-family="sans-serif" font-size="14px" transform="translate(10,10)"
><text x="5" xml:space="preserve" y="18.1094" clip-path="url(#clipPath13)" stroke="none"
>New transaction</text
></g
><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(840,50)" stroke-opacity="0" stroke="rgb(255,255,255)"
><rect x="0.5" width="178.5" height="128.5" y="0.5" clip-path="url(#clipPath14)" stroke="none"
/></g
><g transform="translate(840,50)"
><rect fill="none" x="0.5" width="178.5" height="128.5" y="0.5" clip-path="url(#clipPath14)"
/><text x="21" font-size="14px" y="18.1094" clip-path="url(#clipPath14)" font-family="sans-serif" stroke="none" xml:space="preserve"
>Save transaction to</text
><text x="12" font-size="14px" y="34.2188" clip-path="url(#clipPath14)" font-family="sans-serif" stroke="none" xml:space="preserve"
>persistent storage. Be</text
><text x="24" font-size="14px" y="50.3281" clip-path="url(#clipPath14)" font-family="sans-serif" stroke="none" xml:space="preserve"
>sure to include the</text
><text x="31" font-size="14px" y="66.4375" clip-path="url(#clipPath14)" font-family="sans-serif" stroke="none" xml:space="preserve"
>hash, Sequence,</text
><text x="14" font-size="14px" y="82.5469" clip-path="url(#clipPath14)" font-family="sans-serif" stroke="none" xml:space="preserve"
>LastLedgerSequence,</text
><text x="28" font-size="14px" y="98.6562" clip-path="url(#clipPath14)" font-family="sans-serif" stroke="none" xml:space="preserve"
>and the validated</text
><text x="43" font-size="14px" y="114.7656" clip-path="url(#clipPath14)" font-family="sans-serif" stroke="none" xml:space="preserve"
>ledger index.</text
></g
><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(610,80)" stroke-opacity="0" stroke="rgb(255,255,255)"
><rect x="0.5" width="178.5" height="48.5" y="0.5" clip-path="url(#clipPath9)" stroke="none"
/></g
><g transform="translate(610,80)"
><rect fill="none" x="0.5" width="178.5" height="48.5" y="0.5" clip-path="url(#clipPath9)"
/><text x="30" font-size="14px" y="18.1094" clip-path="url(#clipPath9)" font-family="sans-serif" stroke="none" xml:space="preserve"
>Sign transaction.</text
></g
><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(390,50)" stroke-opacity="0" stroke="rgb(255,255,255)"
><rect x="0.5" width="178.5" height="108.5" y="0.5" clip-path="url(#clipPath15)" stroke="none"
/></g
><g transform="translate(390,50)"
><rect fill="none" x="0.5" width="178.5" height="108.5" y="0.5" clip-path="url(#clipPath15)"
/><text x="14" font-size="14px" y="18.1094" clip-path="url(#clipPath15)" font-family="sans-serif" stroke="none" xml:space="preserve"
>Construct transaction</text
><text x="38" font-size="14px" y="34.2188" clip-path="url(#clipPath15)" font-family="sans-serif" stroke="none" xml:space="preserve"
>JSON including</text
><text x="40" font-size="14px" y="50.3281" clip-path="url(#clipPath15)" font-family="sans-serif" stroke="none" xml:space="preserve"
>Sequence and</text
><text x="14" font-size="14px" y="66.4375" clip-path="url(#clipPath15)" font-family="sans-serif" stroke="none" xml:space="preserve"
>LastLedgerSequence.</text
><text x="13" font-size="14px" y="82.5469" clip-path="url(#clipPath15)" font-family="sans-serif" stroke="none" xml:space="preserve"
>(LastLedgerSequence</text
><text x="66" font-size="14px" y="98.6562" clip-path="url(#clipPath15)" font-family="sans-serif" stroke="none" xml:space="preserve"
>is &gt; A)</text
></g
><g transform="translate(50,40)"
><circle r="8.75" clip-path="url(#clipPath4)" cx="10.25" cy="10.25" stroke="none"
/><circle fill="none" r="8.75" clip-path="url(#clipPath4)" cx="10.25" cy="10.25"
/></g
><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(160,60)" stroke-opacity="0" stroke="rgb(255,255,255)"
><rect x="0.5" width="178.5" height="88.5" y="0.5" clip-path="url(#clipPath16)" stroke="none"
/></g
><g transform="translate(160,60)"
><rect fill="none" x="0.5" width="178.5" height="88.5" y="0.5" clip-path="url(#clipPath16)"
/><text x="39" font-size="14px" y="18.1094" clip-path="url(#clipPath16)" font-family="sans-serif" stroke="none" xml:space="preserve"
>Find the latest</text
><text x="9" font-size="14px" y="34.2188" clip-path="url(#clipPath16)" font-family="sans-serif" stroke="none" xml:space="preserve"
>validated ledger index.</text
><text x="31" font-size="14px" y="50.3281" clip-path="url(#clipPath16)" font-family="sans-serif" stroke="none" xml:space="preserve"
>Call this value A.</text
></g
><g transform="translate(50,260)"
><path fill="none" d="M39.5 290.5 L10.5 290.5" clip-path="url(#clipPath17)"
/><path fill="none" d="M10.5 290.5 L10.5 190.5" clip-path="url(#clipPath17)"
/><path fill="none" d="M10.5 190.5 L810.5 190.5" clip-path="url(#clipPath17)"
/><path fill="none" d="M810.5 190.5 L810.5 10.5" clip-path="url(#clipPath17)"
/><path fill="none" d="M810.5 10.5 L780.5 10.5" clip-path="url(#clipPath17)"
/><path fill="none" d="M28.7417 284 L40 290.5 L28.7417 297" clip-path="url(#clipPath17)"
/></g
><g transform="translate(850,310)"
><path fill="none" d="M11.5 140.5 L300.5 140.5" clip-path="url(#clipPath18)"
/><path fill="none" d="M300.5 140.5 L300.5 10.5" clip-path="url(#clipPath18)"
/><path fill="none" d="M22.2583 147 L11 140.5 L22.2583 134" clip-path="url(#clipPath18)"
/></g
><g transform="translate(1140,120)"
><path fill="none" d="M10.5 109.5 L10.5 10.5" clip-path="url(#clipPath19)"
/><path fill="none" d="M17 98.7417 L10.5 110 L4 98.7417" clip-path="url(#clipPath19)"
/></g
><g transform="translate(440,250)"
><path fill="none" d="M209.5 20.5 L10.5 20.5" clip-path="url(#clipPath20)"
/><path fill="none" d="M198.7417 14 L210 20.5 L198.7417 27" clip-path="url(#clipPath20)"
/><text x="47.0884" font-size="14px" y="16" clip-path="url(#clipPath20)" font-family="sans-serif" stroke="none" xml:space="preserve"
>[final outcomes of</text
><text x="46.2554" font-size="14px" y="32.1094" clip-path="url(#clipPath20)" font-family="sans-serif" stroke="none" xml:space="preserve"
>some transactions</text
><text x="49.5137" font-size="14px" y="48.2188" clip-path="url(#clipPath20)" font-family="sans-serif" stroke="none" xml:space="preserve"
>are not recorded]</text
></g
><g transform="translate(420,280)"
><path fill="none" d="M10.5 109.5 L10.5 10.5" clip-path="url(#clipPath21)"
/><path fill="none" d="M17 98.7417 L10.5 110 L4 98.7417" clip-path="url(#clipPath21)"
/><text x="14" font-size="14px" y="51.9453" clip-path="url(#clipPath21)" font-family="sans-serif" stroke="none" xml:space="preserve"
>[final outcomes of</text
><text x="14" font-size="14px" y="68.0547" clip-path="url(#clipPath21)" font-family="sans-serif" stroke="none" xml:space="preserve"
>all transactions</text
><text x="14" font-size="14px" y="84.1641" clip-path="url(#clipPath21)" font-family="sans-serif" stroke="none" xml:space="preserve"
>are recorded]</text
></g
><g transform="translate(330,260)"
><path fill="none" d="M79.5 10.5 L10.5 10.5" clip-path="url(#clipPath22)"
/><path fill="none" d="M68.7417 4 L80 10.5 L68.7417 17" clip-path="url(#clipPath22)"
/></g
><g transform="translate(50,230)"
><path fill="none" d="M109.5 40.5 L10.5 40.5" clip-path="url(#clipPath23)"
/><path fill="none" d="M10.5 40.5 L10.5 10.5" clip-path="url(#clipPath23)"
/><path fill="none" d="M98.7417 34 L110 40.5 L98.7417 47" clip-path="url(#clipPath23)"
/></g
><g transform="translate(660,710)"
><path fill="none" d="M219.5 20.5 L10.5 20.5" clip-path="url(#clipPath24)"
/><path fill="none" d="M208.7417 14 L220 20.5 L208.7417 27" clip-path="url(#clipPath24)"
/><text x="40.2563" font-size="14px" y="16" clip-path="url(#clipPath24)" font-family="sans-serif" stroke="none" xml:space="preserve"
>[Account Sequence is</text
><text x="30.229" font-size="14px" y="32.1094" clip-path="url(#clipPath24)" font-family="sans-serif" stroke="none" xml:space="preserve"
>greater than transaction </text
><text x="78.7998" font-size="14px" y="48.2188" clip-path="url(#clipPath24)" font-family="sans-serif" stroke="none" xml:space="preserve"
>Sequence]</text
></g
><g transform="translate(620,880)"
><path fill="none" d="M69.5 10.5 L10.5 10.5" clip-path="url(#clipPath25)"
/><path fill="none" d="M58.7417 4 L70 10.5 L58.7417 17" clip-path="url(#clipPath25)"
/></g
><g transform="translate(370,880)"
><path fill="none" d="M79.5 10.5 L10.5 10.5" clip-path="url(#clipPath22)"
/><path fill="none" d="M68.7417 4 L80 10.5 L68.7417 17" clip-path="url(#clipPath22)"
/></g
><g transform="translate(240,740)"
><path fill="none" d="M10.5 119.5 L10.5 70.5" clip-path="url(#clipPath26)"
/><path fill="none" d="M10.5 70.5 L410.5 70.5" clip-path="url(#clipPath26)"
/><path fill="none" d="M410.5 70.5 L410.5 10.5" clip-path="url(#clipPath26)"
/><path fill="none" d="M17 108.7417 L10.5 120 L4 108.7417" clip-path="url(#clipPath26)"
/><text x="135.2563" font-size="14px" y="66" clip-path="url(#clipPath26)" font-family="sans-serif" stroke="none" xml:space="preserve"
>[Account Sequence is </text
><text x="139.0786" font-size="14px" y="82.1094" clip-path="url(#clipPath26)" font-family="sans-serif" stroke="none" xml:space="preserve"
>less than or equal to</text
><text x="131.7588" font-size="14px" y="98.2188" clip-path="url(#clipPath26)" font-family="sans-serif" stroke="none" xml:space="preserve"
>transaction Sequence]</text
></g
><g transform="translate(1240,240)"
><path fill="none" d="M11.5 10.5 L70.5 10.5" clip-path="url(#clipPath27)"
/><path fill="none" d="M70.5 10.5 L70.5 310.5" clip-path="url(#clipPath27)"
/><path fill="none" d="M70.5 310.5 L50.5 310.5" clip-path="url(#clipPath27)"
/><path fill="none" d="M22.2583 17 L11 10.5 L22.2583 4" clip-path="url(#clipPath27)"
/></g
><g transform="translate(900,530)"
><path fill="none" d="M209.5 20.5 L10.5 20.5" clip-path="url(#clipPath28)"
/><path fill="none" d="M198.7417 14 L210 20.5 L198.7417 27" clip-path="url(#clipPath28)"
/><text x="53.2847" font-size="14px" y="16" clip-path="url(#clipPath28)" font-family="sans-serif" stroke="none" xml:space="preserve"
>[server does not </text
><text x="53.0781" font-size="14px" y="32.1094" clip-path="url(#clipPath28)" font-family="sans-serif" stroke="none" xml:space="preserve"
>have continuous </text
><text x="62.2373" font-size="14px" y="48.2188" clip-path="url(#clipPath28)" font-family="sans-serif" stroke="none" xml:space="preserve"
>ledger history </text
><text x="77.8384" font-size="14px" y="64.3281" clip-path="url(#clipPath28)" font-family="sans-serif" stroke="none" xml:space="preserve"
>from A to </text
><text x="37.6694" font-size="14px" y="80.4375" clip-path="url(#clipPath28)" font-family="sans-serif" stroke="none" xml:space="preserve"
>LastLedgerSequence </text
><text x="72.3545" font-size="14px" y="96.5469" clip-path="url(#clipPath28)" font-family="sans-serif" stroke="none" xml:space="preserve"
>(inclusive)]</text
></g
><g transform="translate(520,720)"
><path fill="none" d="M109.5 10.5 L10.5 10.5" clip-path="url(#clipPath29)"
/><path fill="none" d="M98.7417 4 L110 10.5 L98.7417 17" clip-path="url(#clipPath29)"
/></g
><g transform="translate(420,560)"
><path fill="none" d="M10.5 139.5 L10.5 90.5" clip-path="url(#clipPath30)"
/><path fill="none" d="M10.5 90.5 L470.5 90.5" clip-path="url(#clipPath30)"
/><path fill="none" d="M470.5 90.5 L470.5 10.5" clip-path="url(#clipPath30)"
/><path fill="none" d="M17 128.7417 L10.5 140 L4 128.7417" clip-path="url(#clipPath30)"
/><text x="109.748" font-size="14px" y="86" clip-path="url(#clipPath30)" font-family="sans-serif" stroke="none" xml:space="preserve"
>[server has continuous ledger history </text
><text x="94.6064" font-size="14px" y="102.1094" clip-path="url(#clipPath30)" font-family="sans-serif" stroke="none" xml:space="preserve"
>from A to LastLedgerSequence, inclusive]</text
></g
><g transform="translate(650,540)"
><path fill="none" d="M219.5 10.5 L10.5 10.5" clip-path="url(#clipPath31)"
/><path fill="none" d="M208.7417 4 L220 10.5 L208.7417 17" clip-path="url(#clipPath31)"
/><text x="27.748" font-size="14px" y="22.8906" clip-path="url(#clipPath31)" font-family="sans-serif" stroke="none" xml:space="preserve"
>[latest validated ledger </text
><text x="8.458" font-size="14px" y="36" clip-path="url(#clipPath31)" font-family="sans-serif" stroke="none" xml:space="preserve"
>is ≥ LastLedgerSequence]</text
></g
><g transform="translate(630,240)"
><path fill="none" d="M551.5 10.5 L620.5 10.5" clip-path="url(#clipPath32)"
/><path fill="none" d="M620.5 10.5 L620.5 270.5" clip-path="url(#clipPath32)"
/><path fill="none" d="M620.5 270.5 L10.5 270.5" clip-path="url(#clipPath32)"
/><path fill="none" d="M10.5 270.5 L10.5 290.5" clip-path="url(#clipPath32)"
/><path fill="none" d="M562.2583 17 L551 10.5 L562.2583 4" clip-path="url(#clipPath32)"
/><text x="34" font-size="14px" y="249.7812" clip-path="url(#clipPath32)" font-family="sans-serif" stroke="none" xml:space="preserve"
>[latest validated ledger </text
><text x="34" font-size="14px" y="262.8906" clip-path="url(#clipPath32)" font-family="sans-serif" stroke="none" xml:space="preserve"
>is &lt; LastLedgerSequence]</text
></g
><g transform="translate(160,700)"
><path fill="none" d="M10.5 39.5 L10.5 10.5" clip-path="url(#clipPath33)"
/><path fill="none" d="M17 28.7417 L10.5 40 L4 28.7417" clip-path="url(#clipPath33)"
/></g
><g transform="translate(160,560)"
><path fill="none" d="M10.5 99.5 L10.5 60.5" clip-path="url(#clipPath34)"
/><path fill="none" d="M10.5 60.5 L230.5 60.5" clip-path="url(#clipPath34)"
/><path fill="none" d="M230.5 60.5 L230.5 10.5" clip-path="url(#clipPath34)"
/><path fill="none" d="M17 88.7417 L10.5 100 L4 88.7417" clip-path="url(#clipPath34)"
/><text x="70.8535" font-size="14px" y="56" clip-path="url(#clipPath34)" font-family="sans-serif" stroke="none" xml:space="preserve"
>[transaction is </text
><text x="46.3052" font-size="14px" y="72.1094" clip-path="url(#clipPath34)" font-family="sans-serif" stroke="none" xml:space="preserve"
>in a validated ledger]</text
></g
><g transform="translate(400,530)"
><path fill="none" d="M219.5 20.5 L10.5 20.5" clip-path="url(#clipPath24)"
/><path fill="none" d="M208.7417 14 L220 20.5 L208.7417 27" clip-path="url(#clipPath24)"
/><text x="35.8115" font-size="14px" y="16" clip-path="url(#clipPath24)" font-family="sans-serif" stroke="none" xml:space="preserve"
>[transaction not found,</text
><text x="63.6289" font-size="14px" y="32.1094" clip-path="url(#clipPath24)" font-family="sans-serif" stroke="none" xml:space="preserve"
>or is found in a</text
><text x="40.7212" font-size="14px" y="48.2188" clip-path="url(#clipPath24)" font-family="sans-serif" stroke="none" xml:space="preserve"
>non-validated ledger]</text
></g
><g transform="translate(260,540)"
><path fill="none" d="M109.5 10.5 L10.5 10.5" clip-path="url(#clipPath29)"
/><path fill="none" d="M98.7417 4 L110 10.5 L98.7417 17" clip-path="url(#clipPath29)"
/></g
><g transform="translate(1010,90)"
><path fill="none" d="M59.5 10.5 L10.5 10.5" clip-path="url(#clipPath35)"
/><path fill="none" d="M48.7417 4 L60 10.5 L48.7417 17" clip-path="url(#clipPath35)"
/></g
><g transform="translate(780,90)"
><path fill="none" d="M59.5 10.5 L10.5 10.5" clip-path="url(#clipPath35)"
/><path fill="none" d="M48.7417 4 L60 10.5 L48.7417 17" clip-path="url(#clipPath35)"
/></g
><g transform="translate(560,90)"
><path fill="none" d="M49.5 10.5 L10.5 10.5" clip-path="url(#clipPath36)"
/><path fill="none" d="M38.7417 4 L50 10.5 L38.7417 17" clip-path="url(#clipPath36)"
/></g
><g transform="translate(330,90)"
><path fill="none" d="M59.5 10.5 L10.5 10.5" clip-path="url(#clipPath35)"
/><path fill="none" d="M48.7417 4 L60 10.5 L48.7417 17" clip-path="url(#clipPath35)"
/></g
><g transform="translate(50,50)"
><path fill="none" d="M109.5 50.5 L10.5 50.5" clip-path="url(#clipPath37)"
/><path fill="none" d="M10.5 50.5 L10.5 10.5" clip-path="url(#clipPath37)"
/><path fill="none" d="M98.7417 44 L110 50.5 L98.7417 57" clip-path="url(#clipPath37)"
/></g
></g
></svg
>

After

Width:  |  Height:  |  Size: 38 KiB