+
+

Introduction to Multi-Signing

+

Multi-signing in Ripple is the act of authorizing transactions for the Ripple +Consensus Ledger by using a combination of multiple secret keys. After setting +up multi-signing for an account, you can put the master secret in cold storage, +or even disable the master key entirely. With multiple secret keys required to +authorize a multi-signature, you can improve security in several ways.

+
    +
  • If you keep an account's keys on different devices, a malicious user must compromise multiple machines in order to send transactions on your behalf.
  • +
  • If the keys to an account are in the custody of entirely different people, those people must collaborate in order to send transaction from that account.
  • +
  • You can use the SignerList as a backup, to delegate a group of others who can send transactions for you if you are unavailable or unable to sign using your regular key.
  • +
  • Even more uses than can be described here.
  • +
+

Availability of Multi-Signing

+

Multi-signing is due to be enabled by an Amendment to the Ripple Consensus +Protocol. This Amendment must be approved by a consensus of validators showing +consistent support for the feature over a period of time. For more information, +see Amendments (TODO: link).

+

You can test multi-signing by running rippled in stand-alone mode with the +feature enabled. In stand-alone mode, rippled does not communicate with the +rest of the Ripple peer-to-peer network, but you can perform most of the same +actions on your local server only. This way, you can be sure that you are ready +for multi-signing when it goes live.

+

How to Multi-Sign

+

The basic process of Multi-Signing a transaction is necessarily more +complex than the process of signing a transaction with a single master key or +regular key.

+

1. Download and build rippled with multi-sign

+

Until a binary for rippled with multi-signing is available, the best you can do is build it from source.

+
$ git clone git@github.com:scottschurr/rippled.git (TODO: switch to a Ripple Labs repo when available)
+$ git checkout fix-sign_for
+$ scons
+
+

See rippled build instructions for help building from source.

+

2. Configure rippled to enable MultiSign

+

Add the following to the bottom of the config file:

+
[features]
+MultiSign
+
+

Note that this stanza is case-sensitive.

+

3. Start rippled in stand-alone mode

+

If you have previously synced to the network, you can have the server load the +latest ledger as a starting place for stand-alone mode using the --load +commandline option:

+
$ sudo ./build/rippled --conf=/home/mduo13/.config/ripple/rippled.cfg -a --load
+
+

If you'd rather start from scratch, you can use the --start commandline +option to create a fresh ledger. In this case, the root account holds all +100 billion XRP:

+

Address: rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh

+

Secret: snoPBrXtMeMyMHUVTgbuqAfg1SUTb ("masterpassphrase")

+

4. Generate keys for a new wallet

+

This step is not strictly necessary. For this process, we generate the keys to +a new Ripple account and then set up multi-signing for that account. To set up +multi-signing on an existing Ripple account, just use the keys to that account.

+
$ build/rippled wallet_propose
+Loading: "/home/mduo13/.config/ripple/rippled.cfg"
+Connecting to 127.0.0.1:5005
+{
+   "result" : {
+      "account_id" : "rnBFvgZphmN39GWzUJeUitaP22Fr9be75H",
+      "key_type" : "secp256k1",
+      "master_key" : "NED MANA SPA BLUR HERS HEAT RED NIBS MAIN MELT NOB RARE",
+      "master_seed" : "shqZZy2Rzs9ZqWTCQAdqc3bKgxnYq",
+      "master_seed_hex" : "99C7F2DCD88218372B7509ADF7DC562B",
+      "public_key" : "aBPvx491i2ZPVzmxoAmAVq5qXAxAZgmjfxoMTxFCg9Xxf2xwVVLc",
+      "public_key_hex" : "0303E20EC6B4A39A629815AE02C0A1393B9225E3B890CAE45B59F42FA29BE9668D",
+      "status" : "success"
+   }
+}
+
+

As always, be sure that an account's secret key never gets transmitted to +anyone you don't trust with full control of that account, and certainly not +unencrypted over the network.

+

5. Fund the new account with an existing wallet

+

Again, this step is only necessary if you are setting up a new account to use +multi-signing for this example.

+
$ build/rippled submit <your existing account secret> '{
+>   "TransactionType" : "Payment",
+>   "Account" : "<your existing account address>",
+>   "Destination" : "rnBFvgZphmN39GWzUJeUitaP22Fr9be75H",
+>   "Amount" : "100000000",
+>   "Flags": 2147483648
+> }'
+Loading: "/home/mduo13/.config/ripple/rippled.cfg"
+Connecting to 127.0.0.1:5005
+{
+   "result" : {
+      "engine_result" : "tesSUCCESS",
+      "engine_result_code" : 0,
+      "engine_result_message" : "The transaction was applied. Only final in a validated ledger.",
+      "status" : "success",
+      "tx_blob" : "1200002280000000240000001E614000000005F5E10068400000000000000A7321023693F15967AE357D0327974AD46FE3C127113B1110D6044FD41E723689F81CC67446304402207AB5D16F58E9E6ADBBDD24837CAB80D871860E47EB0840FE57403FB979755A6D022015FE7A8838BEE6C18962C246D6D27791B7EE34B93415AE3824D12564E7A886C6811493B89AFCAD4C8EAC2B131C1331FEF12AE1522BBE83142DECAB42CA805119A9BA2FF305C9AFA12F0B86A1",
+      "tx_json" : {
+         "Account" : "rN7n7otQDd6FczFgLdSqtcsAUxDkw6fzRH",
+         "Amount" : "100000000",
+         "Destination" : "rnBFvgZphmN39GWzUJeUitaP22Fr9be75H",
+         "Fee" : "10",
+         "Flags" : 2147483648,
+         "Sequence" : 30,
+         "SigningPubKey" : "023693F15967AE357D0327974AD46FE3C127113B1110D6044FD41E723689F81CC6",
+         "TransactionType" : "Payment",
+         "TxnSignature" : "304402207AB5D16F58E9E6ADBBDD24837CAB80D871860E47EB0840FE57403FB979755A6D022015FE7A8838BEE6C18962C246D6D27791B7EE34B93415AE3824D12564E7A886C6",
+         "hash" : "8C7A4D35D71CE80DA4EDAC91D620B6A348B7691B78AA2896284135378E10E0C2"
+      }
+   }
+}
+
+

6. Manually close the ledger

+

In the live network, you would simply wait for the ledger to close +automatically as the result of consensus. However, a rippled node running in +stand-alone mode does not engage in consensus, so you must manually close the +ledger with the ledger_accept command.

+
$ build/rippled ledger_accept
+Loading: "/home/mduo13/.config/ripple/rippled.cfg"
+Connecting to 127.0.0.1:5005
+{
+   "result" : {
+      "ledger_current_index" : 16061437,
+      "status" : "success"
+   }
+}
+
+

7. Create a SignerList on the new account with a SignerListSet transaction

+

Before you can multi-sign transactions, you must associate a SignerList with +your account, so that RCL knows which keys can be used to sign for you. You do +this with a SignerListSet transaction.

+

In this example, the SignerList has 3 members, with the weights and quorum set +up such that multi-signed transactions need a signature from +rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW plus at least one signature from the other +two members of the list. The Account values you use in your list can be +funded accounts that exist in the ledger or just unused addresses.

+
$ build/rippled submit shqZZy2Rzs9ZqWTCQAdqc3bKgxnYq '{
+>     "Flags": 0,
+>     "TransactionType": "SignerListSet",
+>     "Account": "rnBFvgZphmN39GWzUJeUitaP22Fr9be75H",
+>     "Fee": "10000",
+>     "SignerQuorum": 3,
+>     "SignerEntries": [
+>         {
+>             "SignerEntry": {
+>                 "Account": "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW",
+>                 "SignerWeight": 2
+>             }
+>         },
+>         {
+>             "SignerEntry": {
+>                 "Account": "rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v",
+>                 "SignerWeight": 1
+>             }
+>         },
+>         {
+>             "SignerEntry": {
+>                 "Account": "raKEEVSGnKSD9Zyvxu4z6Pqpm4ABH8FS6n",
+>                 "SignerWeight": 1
+>             }
+>         }
+>     ]
+> }'
+Loading: "/home/mduo13/.config/ripple/rippled.cfg"
+Connecting to 127.0.0.1:5005
+{
+   "result" : {
+      "engine_result" : "tesSUCCESS",
+      "engine_result_code" : 0,
+      "engine_result_message" : "The transaction was applied. Only final in a validated ledger.",
+      "status" : "success",
+      "tx_blob" : "12000C2200000000240000000120230000000368400000000000271073210303E20EC6B4A39A629815AE02C0A1393B9225E3B890CAE45B59F42FA29BE9668D74473045022100BEDFA12502C66DDCB64521972E5356F4DB965F553853D53D4C69B4897F11B4780220595202D1E080345B65BAF8EBD6CA161C227F1B62C7E72EA5CA282B9434A6F04281142DECAB42CA805119A9BA2FF305C9AFA12F0B86A1F4EB1300028114204288D2E47F8EF6C99BCC457966320D12409711E1EB13000181147908A7F0EDD48EA896C3580A399F0EE78611C8E3E1EB13000181143A4C02EA95AD6AC3BED92FA036E0BBFB712C030CE1F1",
+      "tx_json" : {
+         "Account" : "rnBFvgZphmN39GWzUJeUitaP22Fr9be75H",
+         "Fee" : "10000",
+         "Flags" : 0,
+         "Sequence" : 1,
+         "SignerEntries" : [
+            {
+               "SignerEntry" : {
+                  "Account" : "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW",
+                  "SignerWeight" : 2
+               }
+            },
+            {
+               "SignerEntry" : {
+                  "Account" : "rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v",
+                  "SignerWeight" : 1
+               }
+            },
+            {
+               "SignerEntry" : {
+                  "Account" : "raKEEVSGnKSD9Zyvxu4z6Pqpm4ABH8FS6n",
+                  "SignerWeight" : 1
+               }
+            }
+         ],
+         "SignerQuorum" : 3,
+         "SigningPubKey" : "0303E20EC6B4A39A629815AE02C0A1393B9225E3B890CAE45B59F42FA29BE9668D",
+         "TransactionType" : "SignerListSet",
+         "TxnSignature" : "3045022100BEDFA12502C66DDCB64521972E5356F4DB965F553853D53D4C69B4897F11B4780220595202D1E080345B65BAF8EBD6CA161C227F1B62C7E72EA5CA282B9434A6F042",
+         "hash" : "3950D98AD20DA52EBB1F3937EF32F382D74092A4C8DF9A0B1A06ED25200B5756"
+      }
+   }
+}
+
+

8. Manually close the ledger again

+

As before, you would wait for the ledger to close on a live network. We use +the ledger_accept command to manually +close the ledger when running rippled in stand-alone mode.

+
$ build/rippled ledger_accept
+Loading: "/home/mduo13/.config/ripple/rippled.cfg"
+Connecting to 127.0.0.1:5005
+{
+   "result" : {
+      "ledger_current_index" : 16061438,
+      "status" : "success"
+   }
+}
+
+

9. Confirm the presence of the new signer list using account_objects

+

Normally an account has lots of different types of objects, but for this new +account, the only thing we've done is add a SignerList, so it should be easy to +find in the results of the +account_objects command.

+
$ build/rippled account_objects rnBFvgZphmN39GWzUJeUitaP22Fr9be75H
+Loading: "/home/mduo13/.config/ripple/rippled.cfg"
+Connecting to 127.0.0.1:5005
+{
+   "result" : {
+      "account" : "rnBFvgZphmN39GWzUJeUitaP22Fr9be75H",
+      "account_objects" : [
+         {
+            "Flags" : 0,
+            "LedgerEntryType" : "SignerList",
+            "OwnerNode" : "0000000000000000",
+            "PreviousTxnID" : "3950D98AD20DA52EBB1F3937EF32F382D74092A4C8DF9A0B1A06ED25200B5756",
+            "PreviousTxnLgrSeq" : 16061437,
+            "SignerEntries" : [
+               {
+                  "SignerEntry" : {
+                     "Account" : "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW",
+                     "SignerWeight" : 2
+                  }
+               },
+               {
+                  "SignerEntry" : {
+                     "Account" : "raKEEVSGnKSD9Zyvxu4z6Pqpm4ABH8FS6n",
+                     "SignerWeight" : 1
+                  }
+               },
+               {
+                  "SignerEntry" : {
+                     "Account" : "rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v",
+                     "SignerWeight" : 1
+                  }
+               }
+            ],
+            "SignerListID" : 0,
+            "SignerQuorum" : 3,
+            "index" : "92373B9F1683001079764527F0BD553ED8656A9934FE641A7F0A0BF4DB230E0E"
+         }
+      ],
+      "ledger_current_index" : 16061438,
+      "status" : "success",
+      "validated" : false
+   }
+}
+
+

10. Create a new transaction that you plan to multi-sign

+

You have to specify everything about this transaction, including Fee and +Sequence. Also include the field SigningPubKey as an empty string -- this +indicates that the transaction is multi-signed.

+

Here's an example transaction we can send from our test account:

+
{
+    "TransactionType": "TrustSet",
+    "Account": "rnBFvgZphmN39GWzUJeUitaP22Fr9be75H",
+    "Flags": 262144,
+    "LimitAmount": {
+      "currency": "USD",
+      "issuer": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
+      "value": "100"
+    },
+    "Sequence": 2,
+    "SigningPubKey":"",
+    "Fee": "12000"
+}
+
+

(If you started from a fresh ledger, you first need to fund the account +specified by the issuer in this example, and then manually close the ledger.)

+

Keep in mind that the Fee for multi-signed transactions is significantly +higher than for regularly-signed transactions. It should be (N+1) times the +normal fee, where N is the number of signatures you plan to provide. Given that +it sometimes takes a while to collect signatures from multiple sources, you may +want to include additional buffer in case the load fee increases in that time.

+

11. Get a signature using the sign_for command

+
$ build/rippled sign_for rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW <rsA2's secret> '{
+>     "TransactionType": "TrustSet",
+>     "Account": "rnBFvgZphmN39GWzUJeUitaP22Fr9be75H",
+>     "Flags": 262144,
+>     "LimitAmount": {
+>       "currency": "USD",
+>       "issuer": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
+>       "value": "100"
+>     },
+>     "Sequence": 2,
+>     "SigningPubKey":"",
+>     "Fee": "12000"
+> }'
+Loading: "/home/mduo13/.config/ripple/rippled.cfg"
+Connecting to 127.0.0.1:5005
+{
+   "result" : {
+      "Signers" : [
+         {
+            "Signer" : {
+               "Account" : "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW",
+               "SigningPubKey" : "02B3EC4E5DD96029A647CFA20DA07FE1F85296505552CCAC114087E66B46BD77DF",
+               "TxnSignature" : "304502210093EED0F75190385282C6369EE3C5C0FCC65227917F545EC8848B94E17105BC3D022073B3FB14452056FF8E966736150E2D75F3B7460AD7DEF6E2932ECD6690B6C3FE"
+            }
+         }
+      ],
+      "status" : "success",
+      "tx_blob" : "1200142200040000240000000263D5038D7EA4C6800000000000000000000000000055534400000000004B4E9C06F24296074F7BC48F92A97916C6DC5EA9684000000000002EE0730081142DECAB42CA805119A9BA2FF305C9AFA12F0B86A1",
+      "tx_json" : {
+         "Account" : "rnBFvgZphmN39GWzUJeUitaP22Fr9be75H",
+         "Fee" : "12000",
+         "Flags" : 262144,
+         "LimitAmount" : {
+            "currency" : "USD",
+            "issuer" : "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
+            "value" : "100"
+         },
+         "Sequence" : 2,
+         "SigningPubKey" : "",
+         "TransactionType" : "TrustSet",
+         "hash" : "4622B2893AF3A70B4DB1FF86B25C10E92B71973895143E66029567A8541A8060"
+      }
+   }
+}
+
+

The valuable part in the response is the Signers field. This is the part that +you're going to need later in order to construct the full, multi-signed +transaction.

+

The other parts, such as the tx_blob, are not very useful at this point, +unless you're "multi-signing" a transaction with only one signature.

+

12. Get additional signatures the same way

+

If the accounts in your SignerList are funded accounts, the secret key you use +to sign for those accounts can come from the regular key (if they have one), or +the master key (unless it's disabled). For accounts that don't exist in the +ledger, you can only use the master secret associated with the address.

+
$ build/rippled sign_for rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v <rUpy's secret> '{
+    "TransactionType": "TrustSet",
+    "Account": "rnBFvgZphmN39GWzUJeUitaP22Fr9be75H",
+    "Flags": 262144,
+    "LimitAmount": {
+      "currency": "USD",
+      "issuer": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
+      "value": "100"
+    },            
+    "Sequence": 2,
+    "SigningPubKey":"",
+    "Fee": "12000"
+}'
+Loading: "/home/mduo13/.config/ripple/rippled.cfg"
+Connecting to 127.0.0.1:5005
+{
+   "result" : {
+      "Signers" : [
+         {
+            "Signer" : {
+               "Account" : "rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v",
+               "SigningPubKey" : "028FFB276505F9AC3F57E8D5242B386A597EF6C40A7999F37F1948636FD484E25B",
+               "TxnSignature" : "304402204C1A4FFE1628A4BBEA4E8BEDE7C7080B94299704207479D1334096721629DB9802206BB07EBAB23EA288D5714CF7D3231D041BBB2AFD973D24ED693197C4881DC2E1"
+            }
+         }
+      ],
+      "status" : "success",
+      "tx_blob" : "1200142200040000240000000263D5038D7EA4C6800000000000000000000000000055534400000000004B4E9C06F24296074F7BC48F92A97916C6DC5EA9684000000000002EE0730081142DECAB42CA805119A9BA2FF305C9AFA12F0B86A1",
+      "tx_json" : {
+         "Account" : "rnBFvgZphmN39GWzUJeUitaP22Fr9be75H",
+         "Fee" : "12000",
+         "Flags" : 262144,
+         "LimitAmount" : {
+            "currency" : "USD",
+            "issuer" : "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
+            "value" : "100"
+         },
+         "Sequence" : 2,
+         "SigningPubKey" : "",
+         "TransactionType" : "TrustSet",
+         "hash" : "4622B2893AF3A70B4DB1FF86B25C10E92B71973895143E66029567A8541A8060"
+      }
+   }
+}
+
+

Depending on the SignerList you configured, you may need to repeat this step +several times in order to get signatures from all the necessary parties.

+

13. Combine the signatures and submit

+

Take the contents of all the Signers arrays from all the responses, and +concatenate them in to a single Signers array field. The commandline syntax +for the submit_multisigned command +takes a single JSON object with two elements: this combined Signers array; +and tx_json, which is the transaction JSON that they signed.

+

This command actually submits the transaction for inclusion in the ledger. In +online mode, this relays it to other members of the network.

+
$ build/rippled submit_multisigned '    {
+>         "Signers": [
+>             {
+>                 "Signer" : {
+>                    "Account" : "rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v",
+>                    "SigningPubKey" : "028FFB276505F9AC3F57E8D5242B386A597EF6C40A7999F37F1948636FD484E25B",
+>                    "TxnSignature" : "304402204C1A4FFE1628A4BBEA4E8BEDE7C7080B94299704207479D1334096721629DB9802206BB07EBAB23EA288D5714CF7D3231D041BBB2AFD973D24ED693197C4881DC2E1"
+>                 }
+>             },
+>             {
+>                 "Signer" : {
+>                    "Account" : "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW",
+>                    "SigningPubKey" : "02B3EC4E5DD96029A647CFA20DA07FE1F85296505552CCAC114087E66B46BD77DF",
+>                    "TxnSignature" : "304502210093EED0F75190385282C6369EE3C5C0FCC65227917F545EC8848B94E17105BC3D022073B3FB14452056FF8E966736150E2D75F3B7460AD7DEF6E2932ECD6690B6C3FE"
+>                 }
+>             }
+>         ],
+>         "tx_json": {
+>             "TransactionType": "TrustSet",
+>             "Account": "rnBFvgZphmN39GWzUJeUitaP22Fr9be75H",
+>             "Flags": 262144,
+>             "LimitAmount": {
+>               "currency": "USD",
+>               "issuer": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
+>               "value": "100"
+>             },
+>             "Sequence": 2,
+>             "SigningPubKey":"",
+>             "Fee": "12000"
+>         }
+>     }'
+Loading: "/home/mduo13/.config/ripple/rippled.cfg"
+Connecting to 127.0.0.1:5005
+{
+   "result" : {
+      "engine_result" : "tesSUCCESS",
+      "engine_result_code" : 0,
+      "engine_result_message" : "The transaction was applied. Only final in a validated ledger.",
+      "status" : "success",
+      "tx_blob" : "1200142200040000240000000263D5038D7EA4C6800000000000000000000000000055534400000000004B4E9C06F24296074F7BC48F92A97916C6DC5EA9684000000000002EE0730081142DECAB42CA805119A9BA2FF305C9AFA12F0B86A1F3E010732102B3EC4E5DD96029A647CFA20DA07FE1F85296505552CCAC114087E66B46BD77DF7447304502210093EED0F75190385282C6369EE3C5C0FCC65227917F545EC8848B94E17105BC3D022073B3FB14452056FF8E966736150E2D75F3B7460AD7DEF6E2932ECD6690B6C3FE8114204288D2E47F8EF6C99BCC457966320D12409711E1E0107321028FFB276505F9AC3F57E8D5242B386A597EF6C40A7999F37F1948636FD484E25B7446304402204C1A4FFE1628A4BBEA4E8BEDE7C7080B94299704207479D1334096721629DB9802206BB07EBAB23EA288D5714CF7D3231D041BBB2AFD973D24ED693197C4881DC2E181147908A7F0EDD48EA896C3580A399F0EE78611C8E3E1F1",
+      "tx_json" : {
+         "Account" : "rnBFvgZphmN39GWzUJeUitaP22Fr9be75H",
+         "Fee" : "12000",
+         "Flags" : 262144,
+         "LimitAmount" : {
+            "currency" : "USD",
+            "issuer" : "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
+            "value" : "100"
+         },
+         "Sequence" : 2,
+         "Signers" : [
+            {
+               "Signer" : {
+                  "Account" : "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW",
+                  "SigningPubKey" : "02B3EC4E5DD96029A647CFA20DA07FE1F85296505552CCAC114087E66B46BD77DF",
+                  "TxnSignature" : "304502210093EED0F75190385282C6369EE3C5C0FCC65227917F545EC8848B94E17105BC3D022073B3FB14452056FF8E966736150E2D75F3B7460AD7DEF6E2932ECD6690B6C3FE"
+               }
+            },
+            {
+               "Signer" : {
+                  "Account" : "rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v",
+                  "SigningPubKey" : "028FFB276505F9AC3F57E8D5242B386A597EF6C40A7999F37F1948636FD484E25B",
+                  "TxnSignature" : "304402204C1A4FFE1628A4BBEA4E8BEDE7C7080B94299704207479D1334096721629DB9802206BB07EBAB23EA288D5714CF7D3231D041BBB2AFD973D24ED693197C4881DC2E1"
+               }
+            }
+         ],
+         "SigningPubKey" : "",
+         "TransactionType" : "TrustSet",
+         "hash" : "878C1C988305D87070F3E961FC27AC9D02C46FFDD92FC7EBB74E962344E58C78"
+      }
+   }
+}
+
+

Take note of the hash value from the response (In this case, it's +878C1C988305D87070F3E961FC27AC9D02C46FFDD92FC7EBB74E962344E58C78) so you can +check the results of the transaction later.

+

14. Manually close the ledger one last time

+

Once again, you would wait for the ledger to close on a live network. We use +the ledger_accept command to manually +close the ledger when running rippled in stand-alone mode.

+
$ build/rippled ledger_accept
+Loading: "/home/mduo13/.config/ripple/rippled.cfg"
+Connecting to 127.0.0.1:5005
+{
+   "result" : {
+      "ledger_current_index" : 16061439,
+      "status" : "success"
+   }
+}
+
+

15. Confirm the results of the transaction

+

Use the hash value from the response to the submit_multisigned command.

+
$ build/rippled tx 878C1C988305D87070F3E961FC27AC9D02C46FFDD92FC7EBB74E962344E58C78
+Loading: "/home/mduo13/.config/ripple/rippled.cfg"
+Connecting to 127.0.0.1:5005
+{
+   "result" : {
+      "Account" : "rnBFvgZphmN39GWzUJeUitaP22Fr9be75H",
+      "Fee" : "12000",
+      "Flags" : 262144,
+      "LimitAmount" : {
+         "currency" : "USD",
+         "issuer" : "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
+         "value" : "100"
+      },
+      "Sequence" : 2,
+      "Signers" : [
+         {
+            "Signer" : {
+               "Account" : "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW",
+               "SigningPubKey" : "02B3EC4E5DD96029A647CFA20DA07FE1F85296505552CCAC114087E66B46BD77DF",
+               "TxnSignature" : "304502210093EED0F75190385282C6369EE3C5C0FCC65227917F545EC8848B94E17105BC3D022073B3FB14452056FF8E966736150E2D75F3B7460AD7DEF6E2932ECD6690B6C3FE"
+            }
+         },
+         {
+            "Signer" : {
+               "Account" : "rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v",
+               "SigningPubKey" : "028FFB276505F9AC3F57E8D5242B386A597EF6C40A7999F37F1948636FD484E25B",
+               "TxnSignature" : "304402204C1A4FFE1628A4BBEA4E8BEDE7C7080B94299704207479D1334096721629DB9802206BB07EBAB23EA288D5714CF7D3231D041BBB2AFD973D24ED693197C4881DC2E1"
+            }
+         }
+      ],
+      "SigningPubKey" : "",
+      "TransactionType" : "TrustSet",
+      "date" : 496881900,
+      "hash" : "878C1C988305D87070F3E961FC27AC9D02C46FFDD92FC7EBB74E962344E58C78",
+      "inLedger" : 16061438,
+      "ledger_index" : 16061438,
+      "meta" : {
+         "AffectedNodes" : [
+            {
+               "ModifiedNode" : {
+                  "LedgerEntryType" : "AccountRoot",
+                  "LedgerIndex" : "13F1A95D7AAB7108D5CE7EEAF504B2894B8C674E6D68499076441C4837282BF8",
+                  "PreviousTxnID" : "6ECC8C16B76D9B9AB099CA96DD653D8A321C34F1E5972D5EE6DBA19418F4D0CC",
+                  "PreviousTxnLgrSeq" : 16061436
+               }
+            },
+            {
+               "ModifiedNode" : {
+                  "FinalFields" : {
+                     "Flags" : 0,
+                     "Owner" : "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
+                     "RootIndex" : "3B9C0CE77FCE7BCEE1A68F1E26AC467AF326239D0D816CE705E4A0E2DAD03F6D"
+                  },
+                  "LedgerEntryType" : "DirectoryNode",
+                  "LedgerIndex" : "3B9C0CE77FCE7BCEE1A68F1E26AC467AF326239D0D816CE705E4A0E2DAD03F6D"
+               }
+            },
+            {
+               "CreatedNode" : {
+                  "LedgerEntryType" : "RippleState",
+                  "LedgerIndex" : "3C75A1F3DB61406AC2A9493038E8394A73F103C9229695AC7E57EB0F8AFC69E4",
+                  "NewFields" : {
+                     "Balance" : {
+                        "currency" : "USD",
+                        "issuer" : "rrrrrrrrrrrrrrrrrrrrBZbvji",
+                        "value" : "0"
+                     },
+                     "Flags" : 65536,
+                     "HighLimit" : {
+                        "currency" : "USD",
+                        "issuer" : "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
+                        "value" : "0"
+                     },
+                     "LowLimit" : {
+                        "currency" : "USD",
+                        "issuer" : "rnBFvgZphmN39GWzUJeUitaP22Fr9be75H",
+                        "value" : "100"
+                     }
+                  }
+               }
+            },
+            {
+               "ModifiedNode" : {
+                  "FinalFields" : {
+                     "Account" : "rnBFvgZphmN39GWzUJeUitaP22Fr9be75H",
+                     "Balance" : "109978000",
+                     "Flags" : 0,
+                     "OwnerCount" : 6,
+                     "Sequence" : 3
+                  },
+                  "LedgerEntryType" : "AccountRoot",
+                  "LedgerIndex" : "3D728C1F82CFE419F2DC58707D1AD06E985A29217D21A991ADF154184B664F4F",
+                  "PreviousFields" : {
+                     "Balance" : "109990000",
+                     "OwnerCount" : 5,
+                     "Sequence" : 2
+                  },
+                  "PreviousTxnID" : "3950D98AD20DA52EBB1F3937EF32F382D74092A4C8DF9A0B1A06ED25200B5756",
+                  "PreviousTxnLgrSeq" : 16061437
+               }
+            },
+            {
+               "ModifiedNode" : {
+                  "FinalFields" : {
+                     "Flags" : 0,
+                     "Owner" : "rnBFvgZphmN39GWzUJeUitaP22Fr9be75H",
+                     "RootIndex" : "95DA402B4D58FBFF6BAA4CB84BBC21348CC273949B61FEBCE758410EF90D147D"
+                  },
+                  "LedgerEntryType" : "DirectoryNode",
+                  "LedgerIndex" : "95DA402B4D58FBFF6BAA4CB84BBC21348CC273949B61FEBCE758410EF90D147D"
+               }
+            }
+         ],
+         "TransactionIndex" : 0,
+         "TransactionResult" : "tesSUCCESS"
+      },
+      "status" : "success",
+      "validated" : true
+   }
+}
+
+

In particular, check that the TransactionResult is the string tesSUCCESS.

+

On the live network, you must also confirm that the validated field is set to +the boolean true. If not, you might need to wait longer for the consensus +process to finish; or your transaction may be unable to be included in a ledger +for some reason. In stand-alone mode, the server automatically considers a +ledger to be validated if it has been manually closed.

+
+