From a1bfc274d55ce4a7c28027cde7f78663fd5a12ad Mon Sep 17 00:00:00 2001 From: mDuo13 Date: Wed, 28 Nov 2018 19:35:50 -0800 Subject: [PATCH] Serialization: Add PathSet diagram, fix typos --- .../_img-sources/serialization-pathset.uxf | 323 ++++++++++++++++++ .../api-conventions/serialization.md | 29 +- img/serialization-pathset.png | Bin 0 -> 16722 bytes 3 files changed, 342 insertions(+), 10 deletions(-) create mode 100644 content/_img-sources/serialization-pathset.uxf create mode 100644 img/serialization-pathset.png diff --git a/content/_img-sources/serialization-pathset.uxf b/content/_img-sources/serialization-pathset.uxf new file mode 100644 index 0000000000..84eb14431a --- /dev/null +++ b/content/_img-sources/serialization-pathset.uxf @@ -0,0 +1,323 @@ + + + 10 + + UMLPackage + + 40 + 40 + 650 + 70 + + PathSet + + + + UMLClass + + 50 + 210 + 40 + 30 + + 0x30 + + + + UMLClass + + 200 + 70 + 40 + 30 + + 0xff + + + + UMLClass + + 50 + 70 + 150 + 30 + + First path + + + + Relation + + 430 + 230 + 60 + 60 + + lt=<<- + 10.0;10.0;10.0;40.0;40.0;40.0 + + + Text + + 470 + 260 + 260 + 30 + + Path step's type byte + + + + UMLClass + + 250 + 70 + 150 + 30 + + Second path + + + + UMLClass + + 400 + 70 + 40 + 30 + + 0xff + + + + Text + + 450 + 70 + 40 + 30 + + ... + + + + UMLClass + + 490 + 70 + 150 + 30 + + Last path + + + + UMLClass + + 640 + 70 + 40 + 30 + + 0x00 + + + + UMLPackage + + 40 + 180 + 650 + 70 + + Path + + + + Relation + + 30 + 90 + 40 + 110 + + lt=.. + 10.0;90.0;20.0;10.0 + + + Relation + + 190 + 90 + 520 + 130 + + lt=.. + 500.0;110.0;10.0;10.0 + + + UMLClass + + 90 + 210 + 160 + 30 + + Currency (160 bits) + + + + UMLClass + + 250 + 210 + 160 + 30 + + Issuer (160 bits) + + + + UMLClass + + 420 + 210 + 40 + 30 + + 0x01 + + + + UMLClass + + 460 + 210 + 160 + 30 + + Account (160 bits) + + + + Text + + 640 + 210 + 40 + 30 + + ... + + + + Relation + + 40 + 250 + 390 + 50 + + lt=. + 10.0;10.0;10.0;30.0;370.0;30.0;370.0;10.0 + + + Text + + 80 + 290 + 260 + 30 + + Path step + + + + Relation + + 450 + 90 + 60 + 60 + + lt=<<- + 10.0;10.0;10.0;40.0;40.0;40.0 + + + Text + + 490 + 120 + 180 + 30 + + More paths + + + + Text + + 490 + 300 + 130 + 30 + + More path steps + + + + Relation + + 610 + 230 + 60 + 100 + + lt=<<- + 40.0;10.0;40.0;80.0;10.0;80.0 + + + Text + + 460 + 20 + 180 + 30 + + "Continue" byte + + + + Relation + + 410 + 20 + 60 + 70 + + lt=<<- + 10.0;50.0;10.0;10.0;40.0;10.0 + + + Text + + 640 + 20 + 100 + 30 + + "End" byte + + + + Relation + + 670 + 40 + 60 + 60 + + lt=<<- + 10.0;40.0;40.0;40.0;40.0;10.0 + + diff --git a/content/references/rippled-api/api-conventions/serialization.md b/content/references/rippled-api/api-conventions/serialization.md index 1c58b75068..9fe463a432 100644 --- a/content/references/rippled-api/api-conventions/serialization.md +++ b/content/references/rippled-api/api-conventions/serialization.md @@ -136,14 +136,14 @@ Transaction instructions may contain fields of any of the following types: In addition to all of the above field types, the following types may appear in other contexts, such as [ledger objects](ledger-object-types.html) and [transaction metadata](transaction-metadata.html): -| Type Name | Type Code | Variable-Length? | Description | -|:--------------|:----------|:-----------------|:------------------------------| -| Transaction | 10001 | No | A "high-level" type containing an entire [transaction](transaction-formats.html). | -| LedgerEntry | 10002 | No | A "high-level" type containing an entire [ledger object](ledger-object-types.html). | -| Validation | 10003 | No | A "high-level" type used in peer-to-peer communications to represent a validation vote in the [consensus process](consensus.html). | -| Metadata | 10004 | No | A "high-level" type containing [metadata for one transaction](transaction-metadata.html). | -| [UInt64][] | 3 | No | A 64-bit unsigned integer. This type does not appear in transaction instructions, but several use fields of this type. | -| [Vector256][] | 19 | Yes | This type does not appear in transaction instructions, but the [Amendments ledger object](amendments-object.html)'s `Amendments` field uses this to represent which [amendments](amendments.html) are currently enabled. | +| Type Name | Type Code | Variable-Length? | Description | +|:------------|:----------|:-----------------|:--------------------------------| +| Transaction | 10001 | No | A "high-level" type containing an entire [transaction](transaction-formats.html). | +| LedgerEntry | 10002 | No | A "high-level" type containing an entire [ledger object](ledger-object-types.html). | +| Validation | 10003 | No | A "high-level" type used in peer-to-peer communications to represent a validation vote in the [consensus process](consensus.html). | +| Metadata | 10004 | No | A "high-level" type containing [metadata for one transaction](transaction-metadata.html). | +| [UInt64][] | 3 | No | A 64-bit unsigned integer. This type does not appear in transaction instructions, but several ledger objects use fields of this type. | +| Vector256 | 19 | Yes | This type does not appear in transaction instructions, but the [Amendments ledger object](amendments-object.html)'s `Amendments` field uses this to represent which [amendments](amendments.html) are currently enabled. | ### AccountID Fields @@ -219,12 +219,12 @@ The following example shows the serialization format for an object (a single `Me The `Paths` field of a cross-currency [Payment transaction][] is a "PathSet", represented in JSON as an array of arrays. For more information on what paths are used for, see [Paths](paths.html). -A PathSet is serialized as each individual path in sequence. Each complete path is followed by a byte that indicates what comes next: +A PathSet is serialized as **one or more** individual paths in sequence. Each complete path is followed by a byte that indicates what comes next: - `0xff` indicates another path follows - `0x00` indicates the end of the PathSet -Each path consists of a set of path steps in order. Each step starts with a **type** byte, followed by one or more fields describing the path step. The type indicates which fields are present in that path step through bitwise flags. (For example, the value `0x11` indicates changing both currency and issuer.) If more than one field is present, the fields are always placed in a specific order. +Each path consists of **one or more** path steps in order. Each step starts with a **type** byte, followed by one or more fields describing the path step. The type indicates which fields are present in that path step through bitwise flags. (For example, the value `0x30` indicates changing both currency and issuer.) If more than one field is present, the fields are always placed in a specific order. The following table describes the possible fields and the bitwise flags to set in the type byte to indicate them: @@ -242,6 +242,10 @@ The AccountIDs in the `account` and `issuer` fields are presented _without_ a va Each step is followed directly by the next step of the path. As described above, last step of a path is followed by either `0xff` (if another path follows) or `0x00` (if this ends the last path). +The following example shows the serialization format for a PathSet: + +![PathSet is several paths each followed by a continue or end byte; each path is several path steps consisting of a type byte and one or more 160-bit fields based on the type byte](img/serialization-pathset.png) + ### UInt Fields [UInt8]: #uint-fields @@ -254,3 +258,8 @@ The XRP Ledger has several unsigned integer types: UInt8, UInt16, UInt32, and UI When representing these fields in JSON objects, most are represented as JSON numbers by default. One exception is UInt64, which is represented as a string because some JSON decoders may try to represent these integers as 64-bit "double precision" floating point numbers, which cannot represent all distinct UInt64 values with full precision. Another special case is the `TransactionType` field. In JSON, this field is conventionally represented as a string with the name of the transaction type, but in binary, this field is a UInt16. The `TRANSACTION_TYPES` object in the [definitions file](#definitions-file) maps these strings to specific numeric values. + + +{% include '_snippets/rippled-api-links.md' %} +{% include '_snippets/tx-type-links.md' %} +{% include '_snippets/rippled_versions.md' %} diff --git a/img/serialization-pathset.png b/img/serialization-pathset.png new file mode 100644 index 0000000000000000000000000000000000000000..2f1d528f0f4c2a8ed2c9b386444e37c0ef939b10 GIT binary patch literal 16722 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 Sn>fO4%1SEUD!gI*=>Gtg;~