mirror of
https://github.com/XRPLF/xrpl-dev-portal.git
synced 2025-11-13 00:05:49 +00:00
Merge pull request #2305 from XRPLF/xchain-bridge-docs
XChainBridge Docs
This commit is contained in:
@@ -16,6 +16,7 @@ labels:
|
||||
|
||||
| 名前 | 登場 | ステータス |
|
||||
|:----------------------------------|:-----------|:------------------------------------|
|
||||
| [XChainBridge][] | v2.0.0 | [投票中: 2024-01-09](https://xrpl.org/blog/2024/rippled-2.0.0.html "BADGE_80d0e0") |
|
||||
| [AMM][] | v1.12.0 | [投票中: 2023-09-06](https://xrpl.org/blog/2023/rippled-1.12.0.html "BADGE_80d0e0") |
|
||||
| [Clawback][] | v1.12.0 | [投票中: 2023-09-06](https://xrpl.org/blog/2023/rippled-1.12.0.html "BADGE_80d0e0") |
|
||||
| [XRPFees][] | v1.10.0 | [投票中: 2023-03-14](https://xrpl.org/blog/2023/rippled-1.10.0.html "BADGE_80d0e0") |
|
||||
@@ -82,7 +83,6 @@ labels:
|
||||
| 名前 | ステータス | 追加情報 |
|
||||
|:----------------------------------|:------------------------------------------|:-------------------------------|
|
||||
| [Hooks][] | [開発中: 未定]( "BADGE_LIGHTGREY") | [XRPL Hooks](https://hooks.xrpl.org/) |
|
||||
| [XChainBridge][] | [開発中: 未定]( "BADGE_LIGHTGREY") | [XLS-38d](https://github.com/XRPLF/XRPL-Standards/blob/master/XLS-38d-XChainBridge/README.md) [ドキュメント](https://opensource.ripple.com/docs/xls-38d-cross-chain-bridge/cross-chain-bridges/) |
|
||||
| [OwnerPaysFee][] | [開発中: 未定]( "BADGE_LIGHTGREY") | |
|
||||
|
||||
**注記:** このリストは手動で更新されています。もしあなたがAmendmentに取り組んでいて、その変更をテストするためのテストネットワークを持っているなら、このページを編集して開発中のamendmentをこのリストに追加することができます。XRP Ledgerへの貢献についての詳細は、[XRP Ledgerのコードへの貢献](contribute-code-flow.html)をご覧ください。
|
||||
@@ -193,11 +193,30 @@ Clawbackはデフォルトでは無効になっています。Clawbackを使用
|
||||
| Amendment | XChainBridge |
|
||||
|:-------------|:-----------------|
|
||||
| Amendment ID | C98D98EE9616ACD36E81FDEB8D41D349BF5F1B41DD64A0ABC1FE9AA5EA267E9C |
|
||||
| Status | 開発中 |
|
||||
| デフォルトの投票(最新の安定版) | いいえ |
|
||||
| Amendment前の機能は廃止? | いいえ |
|
||||
| Status | Open for Voting |
|
||||
| Default Vote (Latest stable release) | No |
|
||||
| Pre-amendment functionality retired? | No |
|
||||
|
||||
メインネットとサイドチェーンなど異なるネットワーク間でアセットを同期させるための「クロスチェーンブリッジ」を追加します。標準規格: [XLS-38d Cross-Chain Bridge](https://github.com/XRPLF/XRPL-Standards/blob/master/XLS-38d-XChainBridge/README.md)。
|
||||
Adds cross-chain bridges, enabling the transfer of digital assets between networks, such as Mainnet and a sidechain.
|
||||
|
||||
Adds new transactions:
|
||||
|
||||
- XChainAccountCreateCommit - Create a new account for a witness server to submit transactions on an issuing chain..
|
||||
- XChainAddAccountCreateAttestation - Provide an attestation that an account was created for a witness server to use.
|
||||
- XChainAddClaimAttestation - Provide an attestation that assets were locked on a locking chain.
|
||||
- XChainClaim - Claim assets on the destination chain.
|
||||
- XChainCommit - Locks assets on the locking chain.
|
||||
- XChainCreateBridge - Create a bridge ledger object.
|
||||
- XChainCreateClaimID - Create a new cross-chain claim ID that is used for a cross-chain transfer.
|
||||
- XChainModifyBridge - Modify the parameters of a bridge.
|
||||
|
||||
Adds new ledger entry types:
|
||||
|
||||
- Bridge - A single cross-chain bridge that connects the XRP Ledger with another blockchain.
|
||||
- XChainOwnedClaimID - A cross-chain transfer of value that includes information of the account on the source chain that locks or burns the funds on the source chain.
|
||||
- XChainOwnedCreateAccountClaimID - Collects attestations for creating an account via a cross-chain transfer.
|
||||
|
||||
Adds several new transaction result codes.
|
||||
|
||||
|
||||
### CryptoConditions
|
||||
|
||||
229
content/_img-sources/serialization-xchainbridge.uxf
Normal file
229
content/_img-sources/serialization-xchainbridge.uxf
Normal file
@@ -0,0 +1,229 @@
|
||||
<?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>770</x>
|
||||
<y>240</y>
|
||||
<w>310</w>
|
||||
<h>30</h>
|
||||
</coordinates>
|
||||
<panel_attributes>Issuer AccountID (160 bits)
|
||||
lt=.</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<id>UMLClass</id>
|
||||
<coordinates>
|
||||
<x>480</x>
|
||||
<y>240</y>
|
||||
<w>280</w>
|
||||
<h>30</h>
|
||||
</coordinates>
|
||||
<panel_attributes>Currency code (160 bits)</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<id>Relation</id>
|
||||
<coordinates>
|
||||
<x>460</x>
|
||||
<y>90</y>
|
||||
<w>400</w>
|
||||
<h>160</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=..</panel_attributes>
|
||||
<additional_attributes>10.0;140.0;380.0;10.0</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<id>Relation</id>
|
||||
<coordinates>
|
||||
<x>1080</x>
|
||||
<y>90</y>
|
||||
<w>30</w>
|
||||
<h>160</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=..</panel_attributes>
|
||||
<additional_attributes>10.0;140.0;10.0;10.0</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<id>Text</id>
|
||||
<coordinates>
|
||||
<x>50</x>
|
||||
<y>30</y>
|
||||
<w>160</w>
|
||||
<h>30</h>
|
||||
</coordinates>
|
||||
<panel_attributes>XChainBridge Format</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<id>UMLClass</id>
|
||||
<coordinates>
|
||||
<x>50</x>
|
||||
<y>60</y>
|
||||
<w>1050</w>
|
||||
<h>50</h>
|
||||
</coordinates>
|
||||
<panel_attributes/>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<id>Text</id>
|
||||
<coordinates>
|
||||
<x>580</x>
|
||||
<y>200</y>
|
||||
<w>240</w>
|
||||
<h>30</h>
|
||||
</coordinates>
|
||||
<panel_attributes>STIssue Format</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<id>UMLClass</id>
|
||||
<coordinates>
|
||||
<x>470</x>
|
||||
<y>230</y>
|
||||
<w>620</w>
|
||||
<h>50</h>
|
||||
</coordinates>
|
||||
<panel_attributes/>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<id>UMLClass</id>
|
||||
<coordinates>
|
||||
<x>100</x>
|
||||
<y>70</y>
|
||||
<w>210</w>
|
||||
<h>30</h>
|
||||
</coordinates>
|
||||
<panel_attributes>Locking chain door (160 bits)</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<id>UMLClass</id>
|
||||
<coordinates>
|
||||
<x>320</x>
|
||||
<y>70</y>
|
||||
<w>250</w>
|
||||
<h>30</h>
|
||||
</coordinates>
|
||||
<panel_attributes>Locking Chain Issue</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<id>UMLClass</id>
|
||||
<coordinates>
|
||||
<x>60</x>
|
||||
<y>70</y>
|
||||
<w>40</w>
|
||||
<h>30</h>
|
||||
</coordinates>
|
||||
<panel_attributes>0x14</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<id>Text</id>
|
||||
<coordinates>
|
||||
<x>100</x>
|
||||
<y>120</y>
|
||||
<w>270</w>
|
||||
<h>40</h>
|
||||
</coordinates>
|
||||
<panel_attributes>Door account length prefixes (8 bits)
|
||||
Always 0x14</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<id>Relation</id>
|
||||
<coordinates>
|
||||
<x>60</x>
|
||||
<y>90</y>
|
||||
<w>60</w>
|
||||
<h>70</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<<-</panel_attributes>
|
||||
<additional_attributes>10.0;10.0;10.0;50.0;40.0;50.0</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<id>UMLClass</id>
|
||||
<coordinates>
|
||||
<x>580</x>
|
||||
<y>70</y>
|
||||
<w>40</w>
|
||||
<h>30</h>
|
||||
</coordinates>
|
||||
<panel_attributes>0x14</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<id>Relation</id>
|
||||
<coordinates>
|
||||
<x>360</x>
|
||||
<y>90</y>
|
||||
<w>250</w>
|
||||
<h>70</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<<-</panel_attributes>
|
||||
<additional_attributes>230.0;10.0;230.0;50.0;10.0;50.0</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<id>UMLClass</id>
|
||||
<coordinates>
|
||||
<x>620</x>
|
||||
<y>70</y>
|
||||
<w>210</w>
|
||||
<h>30</h>
|
||||
</coordinates>
|
||||
<panel_attributes>Issuing chain door (160 bits)</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<id>UMLClass</id>
|
||||
<coordinates>
|
||||
<x>840</x>
|
||||
<y>70</y>
|
||||
<w>250</w>
|
||||
<h>30</h>
|
||||
</coordinates>
|
||||
<panel_attributes>Issuing Chain Issue</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<id>Relation</id>
|
||||
<coordinates>
|
||||
<x>770</x>
|
||||
<y>260</y>
|
||||
<w>60</w>
|
||||
<h>70</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<<-</panel_attributes>
|
||||
<additional_attributes>10.0;10.0;10.0;50.0;40.0;50.0</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<id>Text</id>
|
||||
<coordinates>
|
||||
<x>810</x>
|
||||
<y>290</y>
|
||||
<w>270</w>
|
||||
<h>30</h>
|
||||
</coordinates>
|
||||
<panel_attributes>Omitted if the currency code is all 0's</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<id>UMLNote</id>
|
||||
<coordinates>
|
||||
<x>170</x>
|
||||
<y>210</y>
|
||||
<w>260</w>
|
||||
<h>80</h>
|
||||
</coordinates>
|
||||
<panel_attributes>*Note:*
|
||||
Unlike in Object and Array fields, the nested STIssue types here do not begin with a Field ID.
|
||||
bg=yellow
|
||||
style=wordwrap</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
</diagram>
|
||||
@@ -252,6 +252,7 @@
|
||||
"Tickets",
|
||||
"TickSize",
|
||||
"TrustSetAuth",
|
||||
"XChainBridge",
|
||||
"XRPFees"
|
||||
] %}
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ To help members of the XRP Ledger community interact with XRP Ledger technology
|
||||
| Testnet | Stable releases | An "alternate universe" network that acts as a testing ground for software built on the XRP Ledger, without impacting production XRP Ledger users and without risking real money. The [amendment status](known-amendments.html) of the Testnet is intended to closely mirror the Mainnet, although slight variations in timing may occur due to the unpredictable nature of decentralized systems. |
|
||||
| Devnet | Beta releases | A preview of coming attractions, where unstable changes to the core XRP Ledger software may be tested out. Developers can use this altnet to interact with and learn about planned new XRP Ledger features and amendments that are not yet enabled on the Mainnet. |
|
||||
| [Hooks V3 Testnet](https://hooks-testnet-v3.xrpl-labs.com/) | [Hooks server](https://github.com/XRPL-Labs/xrpld-hooks) | A preview of on-chain smart contract functionality using [hooks](https://xrpl-hooks.readme.io/). |
|
||||
| Sidechain-Devnet | Beta releases | A sidechain to test cross-chain bridge features. Devnet is treated as the locking chain and this sidechain is the issuing chain.<br>Library support:<br>- [xrpl.js 2.12.0](https://www.npmjs.com/package/xrpl/v/2.12.0)<br>- [xrpl-py 2.4.0](https://pypi.org/project/xrpl-py/2.4.0/)<br>**Note**: You can also use the [`xbridge-cli`](https://github.com/XRPLF/xbridge-cli) commandline tool to set up a cross-chain bridge on your local machine. |
|
||||
|
||||
Each altnet has its own separate supply of test XRP, which is [given away for free](xrp-testnet-faucet.html) to parties interested in experimenting with the XRP Ledger and developing applications and integrations. Test XRP does not have real-world value and is lost when the network is reset.
|
||||
|
||||
|
||||
45
content/concepts/xrpl-sidechains/cross-chain-bridges.md
Normal file
45
content/concepts/xrpl-sidechains/cross-chain-bridges.md
Normal file
@@ -0,0 +1,45 @@
|
||||
---
|
||||
html: cross-chain-bridges.html
|
||||
parent: xrpl-sidechains.html
|
||||
blurb: Cross-chain bridges for the XRP Ledger enable value in the form of XRP and other tokens (IOUs) to move efficiently between blockchains.
|
||||
status: not_enabled
|
||||
labels:
|
||||
- Blockchain
|
||||
- Interoperability
|
||||
---
|
||||
# Cross-Chain Bridges
|
||||
|
||||
_(Requires the [XChainBridge amendment][] :not_enabled:)_
|
||||
|
||||
Cross-chain bridges enable you to move XRP and tokens between the XRP Ledger and other blockchains. When referring to the blockchains connected by a bridge, one is the locking chain and the other the issuing chain.
|
||||
|
||||
A locking chain is where the digital asset originates from. These assets are locked in a trust when sent across a bridge to an issuing chain.
|
||||
|
||||
An issuing chain is an independent ledger with its own consensus algorithm and transaction types and rules. A wrapped version of the digital asset is minted and burned, depending on if an asset is received or sent from the locking chain.
|
||||
|
||||
**Note:** Bridges utilize special _door accounts_ when moving assets cross-chain. The door account on a locking chain is used to put assets into trust, and the door account on an issuing chain is used to issue wrapped assets.
|
||||
|
||||
Both the locking and issuing chains operate as parallel networks with independent nodes and validators. They rely on independent [witness servers](witness-servers.html) to watch transactions between the two chains and attest that assets have moved into specifically designated accounts.
|
||||
|
||||
|
||||
## How Do Bridges Work?
|
||||
|
||||
At a high-level, bridges enable cross-chain transactions through these steps:
|
||||
|
||||
1. Create a cross-chain claim ID on the issuing chain. A cross-chain claim ID represents one transfer of value between blockchains.
|
||||
2. Submit a commit transaction on the locking chain, putting the assets in a trust. The transaction includes the cross-chain claim ID and reward for witness servers.
|
||||
|
||||
**Note:** Witness servers monitor transactions on both chains. They provide attestations, or signed messages, to verify a transaction occurred. There are attestations for `XChainCommit` and `XChainAccountCreateCommit` transactions.
|
||||
|
||||
3. Witness servers provide attestations to the issuing chain, saying the assets were locked on the locking chain.
|
||||
4. When there are enough signatures to reach quorum, the assets are released on the issuing chain to the destination account.
|
||||
|
||||
**Note:** In some cases, such as deposit authorization being enabled, you'll need to submit a transaction claim for the transferred assets on the issuing chain.
|
||||
|
||||
5. Rewards are distributed to the witness servers' accounts on the issuing chain.
|
||||
|
||||
|
||||
<!--{# common link defs #}-->
|
||||
{% include '_snippets/rippled-api-links.md' %}
|
||||
{% include '_snippets/tx-type-links.md' %}
|
||||
{% include '_snippets/rippled_versions.md' %}
|
||||
74
content/concepts/xrpl-sidechains/index.md
Normal file
74
content/concepts/xrpl-sidechains/index.md
Normal file
@@ -0,0 +1,74 @@
|
||||
---
|
||||
html: xrpl-sidechains.html
|
||||
parent: concepts.html
|
||||
blurb: An XRPL sidechain is an independent ledger with its own consensus algorithm, transaction types, and rules.
|
||||
labels:
|
||||
- Blockchain
|
||||
- Interoperability
|
||||
---
|
||||
# XRPL Sidechains
|
||||
|
||||
_(Requires the [XChainBridge amendment][] :not_enabled:)_
|
||||
|
||||
A sidechain is an independent ledger with its own consensus algorithm, transaction types, rules, and nodes. It acts as its own blockchain, running parallel to the mainchain (XRP Ledger), enabling value to move between the two without compromising the speed, efficiency, and throughput of the mainchain.
|
||||
|
||||
Sidechains can customize the XRP Ledger protocol to the needs of a specific use case or project and run it as its own blockchain. Some examples include:
|
||||
|
||||
* Adding a smart contract layer. See: [Xahau](https://xahau.network/)
|
||||
* Adding Ethereum Virtual Machine (EVM) compatibility. See: [EVM Sidechain](https://opensource.ripple.com/docs/evm-sidechain/intro-to-evm-sidechain/).
|
||||
* Building your own algorithmic stable coin with customised ledger types and transaction rules.
|
||||
* Building permissioned or nearly permissionless, centralized or largely decentralized ledgers whose assets can be traded on the Mainnet [decentralized exchange](decentralized-exchange.html).
|
||||
|
||||
|
||||
**Notes:**
|
||||
|
||||
- Sidechains use their own validators and require a separate UNL from the mainchain `rippled` UNL.
|
||||
- Nodes on the mainchain and sidechain have no knowledge of each other.
|
||||
|
||||
|
||||
## Legal FAQs
|
||||
|
||||
### What is a Sidechain?
|
||||
|
||||
A sidechain is a separate blockchain that links the XRPL Mainnet chain (the “Mainchain”) to a sidechain (each a “Sidechain”), allowing for cross-chain exchanges of assets and information.
|
||||
|
||||
|
||||
### What are Witness Servers?
|
||||
|
||||
“Witness Servers” validate transfers between “door wallets” that connect the Mainchain to each Sidechain. A series of decentralized entities and individuals will operate Witness Servers.
|
||||
|
||||
|
||||
### Are there risks associated with operating a Witness Server?
|
||||
|
||||
There are certain risks associated with operating a Witness Server for a Sidechain, including the following:
|
||||
|
||||
_Regulatory Considerations_: Operating a Witness Server carries some regulatory risk. A few risks are identified below, some of which pertain to regulatory regimes that only apply to projects that serve those located in the U.S. U.S. regimes are identified here because they are commonly considered some of the strictest regulatory regimes in the world.
|
||||
|
||||
The regulatory regime in the U.S. concerning the operation of a “money transmitting business” requiring federal registration as a money service business (“MSB”) and state money transmitter licenses (“MTLs”) is unclear as it pertains to operating Witness Servers. The Witness Servers are intended to be operated by a series of decentralized entities and persons. Despite this intention, if a regulator determined that there was “centralized” control of the Witness Servers by a particular entity or coordinated group, it may deem such activity to be money transmission. The U.S. Treasury Department recently issued a report identifying a series of factors it would consider when determining whether a particular project is “decentralized.” See [2023 DeFi Illicit Finance Risk Assessment](https://home.treasury.gov/news/press-releases/jy1391). This recent regulatory guidance is important because it indicates that the U.S. Treasury recognizes that certain projects may be “decentralized” and if the operation of the Witness Servers is “decentralized” it may not be considered a “money transmitting business.”
|
||||
|
||||
While U.S. crypto regulations have consistently remained among the most stringent and aggressively enforced, other jurisdictions also have regulation and laws relating to the transfer of “money” and other value. For example, in March of 2022, U.K. regulatory authorities published a series of documentary guidance regarding crypto and decentralized finance. See [Financial Stability in Focus: Cryptoassets and Decentralized Finance](https://www.bankofengland.co.uk/financial-stability-in-focus/2022/march-2022). More recently, in June of 2023, the E.U. formally adopted a regulatory framework which in part imposes codified rules and regulations pertaining to decentralized crypto platforms. See [Markets in Crypto-Assets Regulation](https://www.esma.europa.eu/esmas-activities/digital-finance-and-innovation/markets-crypto-assets-regulation-mica). For those considering operating a Witness Server, it is critical to stay informed and compliant with the specific requirements of each jurisdiction involved to effectively manage associated risks.
|
||||
|
||||
_Technology and Network Security_: Those intending to run a Witness Server should be familiar with the technical and security aspects of doing so. Before agreeing to run a Witness Server, one should fully understand the functionality, potential vulnerabilities, and necessary technological and security measures involved.
|
||||
|
||||
_Civil Liability_: Operating a Witness Server, like participating in any blockchain project, carries an unspecified level of civil liability risk. There has been an influx of plaintiffs’ lawsuits in the U.S. and other jurisdictions, and it is difficult to evaluate what theories a particular plaintiffs’ attorney may implement in a civil lawsuit. Regardless of any real or perceived civil liability risk, it should be noted that even a frivolous lawsuit could take time and money to respond.
|
||||
|
||||
|
||||
### Should I seek independent advice before agreeing to operate a Witness Server?
|
||||
|
||||
Yes. Any party considering running a Witness Server should seek independent legal and tax advice from experienced professionals. Please note, that as the Witness Servers must mutually attest to confirm cross-chain transfers, they may be understood to operate as a common enterprise - as it is defined by US regulators. In a common enterprise, joint and several liability may apply, meaning that each Witness Server could be held individually responsible for all liability or damages incurred. Given the evolving regulatory landscape, it’s critical to consult with a legal professional who can help navigate the complex and changing global regulatory landscape associated with the expectations and obligations of running a Witness Server. As with any blockchain project, please do your own research. These FAQs are just general guidance and are not legal or tax advice.
|
||||
|
||||
|
||||
### Who should not run a Witness Server?
|
||||
|
||||
You should not run a Witness Server if you are not experienced (or do not have access to experienced support) in blockchain, MSB and MTL regulations, and other applicable regulations and laws. You should also not operate a Witness Server if you are not an experienced person or entity with technical and compliance expertise. Few individuals are qualified and experienced enough to operate Witness Servers on their own. You should also not operate a Witness Server if you have not sought and obtained independent legal and tax advice.
|
||||
|
||||
|
||||
### Are these FAQs comprehensive and conclusive advice?
|
||||
|
||||
No. These FAQs are intended to provide general guidance and do not constitute technical, financial, or legal advice. These FAQs should not be used as a substitute for professional advice tailored to one’s specific circumstances. The blockchain and digital asset landscape is complex and constantly changing, which necessitates staying updated and seeking expert advice. It is recommended that those engaging with a Sidechain regularly check official resources such as governmental and regulatory body websites. Nonetheless, consulting with legal professionals who specialize in blockchain, and cryptocurrency is the most reliable way to get accurate and personalized advice.
|
||||
|
||||
|
||||
<!--{# common link defs #}-->
|
||||
{% include '_snippets/rippled-api-links.md' %}
|
||||
{% include '_snippets/tx-type-links.md' %}
|
||||
{% include '_snippets/rippled_versions.md' %}
|
||||
151
content/concepts/xrpl-sidechains/witness-servers.md
Normal file
151
content/concepts/xrpl-sidechains/witness-servers.md
Normal file
@@ -0,0 +1,151 @@
|
||||
---
|
||||
html: witness-servers.html
|
||||
parent: xrpl-sidechains.html
|
||||
blurb: A witness server is a light-weight server that witnesses and signs transactions between the XRP Ledger and another chain.
|
||||
status: not_enabled
|
||||
labels:
|
||||
- Blockchain
|
||||
- Interoperability
|
||||
---
|
||||
# Witness Servers
|
||||
[[Source]](https://github.com/seelabs/xbridge_witness "Source")
|
||||
|
||||
_(Requires the [XChainBridge amendment][] :not_enabled:)_
|
||||
|
||||
A _witness server_ acts as a neutral witness for transactions between a locking chain and an issuing chain. It listens to the door accounts on both sides of a bridge and signs attestations that confirm a transaction occurred. They are essentially acting as an oracle to “prove” that value was locked or burned on a source account, which allows the recipient to then claim (via minting or unlocking) the equivalent funds on the destination account.
|
||||
|
||||
The bridge between the locking chain and the issuing chain includes the following information in its configuration:
|
||||
|
||||
* Witness servers that monitor transactions on the bridge. You can choose one or more witness servers.
|
||||
* Fee for witness servers for their service.
|
||||
|
||||
Anyone can run a witness server. However, the burden is on the participants of the issuing chain to evaluate the reliability of witness servers. If you run a witness server, you must also run a `rippled` node and sync it to the chain the witness server needs access to.
|
||||
|
||||
**Note:** Issuing chains may choose to configure a bridge with only one witness server initially and run the witness server itself. This strategy is helpful in the initial period, when the issuing chain hasn't established itself yet in the marketplace.
|
||||
|
||||
|
||||
## Witness Server Configuration
|
||||
|
||||
The witness server takes a JSON configuration file, specified using the `--conf` command-line argument.
|
||||
|
||||
|
||||
### Example Configuration JSON
|
||||
|
||||
```json
|
||||
{
|
||||
"LockingChain": {
|
||||
"Endpoint": {
|
||||
"Host": "127.0.0.1",
|
||||
"Port": 6005
|
||||
},
|
||||
"TxnSubmit": {
|
||||
"ShouldSubmit": true,
|
||||
"SigningKeySeed": "shUe3eSgGK4e6xMFuCakZnxsMN1uk",
|
||||
"SigningKeyType": "ed25519",
|
||||
"SubmittingAccount": "rpFp36UHW6FpEcZjZqq5jSJWY6UCj3k4Es"
|
||||
},
|
||||
"RewardAccount": "rpFp36UHW6FpEcZjZqq5jSJWY6UCj3k4Es"
|
||||
},
|
||||
"IssuingChain": {
|
||||
"Endpoint": {
|
||||
"Host": "127.0.0.1",
|
||||
"Port": 6007
|
||||
},
|
||||
"TxnSubmit": {
|
||||
"ShouldSubmit": true,
|
||||
"SigningKeySeed": "shUe3eSgGK4e6xMFuCakZnxsMN1uk",
|
||||
"SigningKeyType": "ed25519",
|
||||
"SubmittingAccount": "rpFp36UHW6FpEcZjZqq5jSJWY6UCj3k4Es"
|
||||
},
|
||||
"RewardAccount": "rpFp36UHW6FpEcZjZqq5jSJWY6UCj3k4Es"
|
||||
},
|
||||
"RPCEndpoint": {
|
||||
"Host": "127.0.0.1",
|
||||
"Port": 6010
|
||||
},
|
||||
"DBDir": "/var/lib/witness/witness01/db",
|
||||
"LogFile": "/var/log/witness/witness01.log",
|
||||
"SigningKeySeed": "spkHEwDKeChm8PAFApLkF1E2sDs6t",
|
||||
"SigningKeyType": "ed25519",
|
||||
"XChainBridge": {
|
||||
"LockingChainDoor": "r3nCVTbZGGYoWvZ58BcxDmiMUU7ChMa1eC",
|
||||
"LockingChainIssue": {
|
||||
"currency": "XRP"
|
||||
},
|
||||
"IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
|
||||
"IssuingChainIssue": {
|
||||
"currency": "XRP"
|
||||
}
|
||||
},
|
||||
"Admin": {
|
||||
"Username": "username01",
|
||||
"Password": "password01"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
### Configuration Fields
|
||||
|
||||
| Field Name | JSON Type | Required? | Description |
|
||||
|------------------|----------------|-----------|-------------|
|
||||
| `Admin` | Object | No | The `Username` and `Password` fields (as strings) for privileged requests to the witness server. **Note:** Both or none of the admin fields must be set. |
|
||||
| [`IssuingChain`](#issuingchain-and-lockingchain-fields) | Object | Yes | The parameters for interacting with the issuing chain. |
|
||||
| [`LockingChain`](#issuingchain-and-lockingchain-fields) | Object | Yes | The parameters for interacting with the locking chain. |
|
||||
| `RPCEndpoint` | Object | Yes | The endpoint for RPC requests to the witness server. |
|
||||
| `LogFile` | String | Yes | The location of the log file. |
|
||||
| `LogLevel` | String | Yes | The level of logs to store in the log file. The options are `All`, `Trace`, `Debug`, `Info`, `Warning`, `Error`, `Fatal`, `Disabled`, and `None`. |
|
||||
| `DBDir` | String | Yes | The location of the directory where the databases are stored. |
|
||||
| `SigningKeySeed` | String | Yes | The seed that the witness server should use to sign its attestations. |
|
||||
| `SigningKeyType` | String | Yes | The algorithm used to encode the `SigningKeySeed`. The options are `secp256k1` and `ed25519`. |
|
||||
| [`XChainBridge`](#xchainbridge-fields) | XChainBridge | Yes | The bridge that the witness server is monitoring. |
|
||||
|
||||
|
||||
#### IssuingChain and LockingChain Fields
|
||||
|
||||
| Field Name | JSON Type | Required? | Description |
|
||||
|-----------------|-----------|-----------|-------------|
|
||||
| `Endpoint` | Object | Yes | The websocket endpoint of a `rippled` node synced with the chain. **Note:** The same person needs to control the `rippled` node and witness server. |
|
||||
| `TxnSubmit` | Object | Yes | The parameters for transaction submission on the chain. |
|
||||
| `RewardAccount` | String | Yes | The account that should receive the witness's share of the `SignatureReward` on the chain. |
|
||||
|
||||
|
||||
#### Endpoint Fields
|
||||
|
||||
| Field Name | JSON Type | Required? | Description |
|
||||
|------------|-----------|-----------|-------------|
|
||||
| `Host` | String | Yes | The IP address of the `rippled` node. **Note:** This accepts an IPv4 address or URL. |
|
||||
| `Port` | String | Yes | The port used for the websocket endpoint. |
|
||||
|
||||
|
||||
#### RPCEndpoint Fields
|
||||
|
||||
| Field Name | JSON Type | Required? | Description |
|
||||
|------------|-----------|-----------|-------------|
|
||||
| `Host` | String | Yes | The IP address of the witness server for RPC requests. **Note:** This accepts an IPv4 address or URL. |
|
||||
| `Port` | String | Yes | The port used for the websocket endpoint. |
|
||||
|
||||
|
||||
#### TxnSubmit Fields
|
||||
|
||||
| Field Name | JSON Type | Required? | Description |
|
||||
|---------------------|-----------|-----------|-------------|
|
||||
| `ShouldSubmit` | Boolean | Yes | A boolean indicating whether or not the witness server should submit transactions on the locking chain. |
|
||||
| `SigningKeySeed` | String | No | The seed that the witness server should use to sign its transactions on the locking chain. This is required if `ShouldSubmit` is `true`. |
|
||||
| `SigningKeyType` | String | No | The algorithm used to encode the `SigningKeySeed`. The options are `secp256k1` and `ed25519`. This is required if `ShouldSubmit` is `true`. |
|
||||
| `SubmittingAccount` | String | No | The account from which the `XChainAddClaimAttestation` and `XChainAddAccountCreateAttestation` transactions should be sent. This is required if `ShouldSubmit` is `true`. |
|
||||
|
||||
|
||||
#### XChainBridge Fields
|
||||
|
||||
| Field | JSON Type | [Internal Type][] | Required? | Description |
|
||||
|:--------------------|:----------|:------------------|:----------|:----------------|
|
||||
| `IssuingChainDoor` | String | Account | Yes | The door account on the issuing chain. For an XRP-XRP bridge, this must be the genesis account (the account that is created when the network is first started, which contains all of the XRP). |
|
||||
| `IssuingChainIssue` | Issue | Issue | Yes | The asset that is minted and burned on the issuing chain. For an IOU-IOU bridge, the issuer of the asset must be the door account on the issuing chain, to avoid supply issues. |
|
||||
| `LockingChainDoor` | String | Account | Yes | The door account on the locking chain. |
|
||||
| `LockingChainIssue` | Issue | Issue | Yes | The asset that is locked and unlocked on the locking chain. |
|
||||
|
||||
<!--{# common link defs #}-->
|
||||
{% include '_snippets/rippled-api-links.md' %}
|
||||
{% include '_snippets/tx-type-links.md' %}
|
||||
{% include '_snippets/rippled_versions.md' %}
|
||||
@@ -42,6 +42,11 @@ Edit your `rippled.cfg` file.
|
||||
|
||||
# No [ips] stanza. Use the default hubs to connect to Mainnet.
|
||||
|
||||
*Sidechain-Devnet*
|
||||
|
||||
[ips]
|
||||
sidechain-net2.devnet.rippletest.net 51235
|
||||
|
||||
<!-- MULTICODE_BLOCK_END -->
|
||||
|
||||
2. Comment out the previous `[ips]` stanza, if there is one:
|
||||
@@ -70,6 +75,11 @@ Edit your `rippled.cfg` file.
|
||||
[network_id]
|
||||
main
|
||||
|
||||
*Sidechain-Devnet*
|
||||
|
||||
[network_id]
|
||||
262
|
||||
|
||||
<!-- MULTICODE_BLOCK_END -->
|
||||
|
||||
For custom networks, everyone who connects to the network should use a value unique to that network. When creating a new network, choose a network ID at random from the integers 11 to 4,294,967,295.
|
||||
@@ -109,6 +119,14 @@ Edit your `validators.txt` file. This file is located in the same folder as your
|
||||
[validator_list_keys]
|
||||
ED2677ABFFD1B33AC6FBC3062B71F1E8397C1505E1C42C64D11AD1B28FF73F4734
|
||||
|
||||
*Sidechain-Devnet*
|
||||
|
||||
[validator_list_sites]
|
||||
https://vlsidechain-net2.devnet.rippletest.net
|
||||
|
||||
[validator_list_keys]
|
||||
EDA5504C7133743FADA46342229B4E9CBBE1CF9BCA19D16633574F7CBB72F79569
|
||||
|
||||
<!-- MULTICODE_BLOCK_END -->
|
||||
|
||||
**Tip:** Preview packages might come with the necessary stanzas pre-configured, but check them just in case.
|
||||
@@ -160,6 +178,13 @@ _Mainnet_
|
||||
# Delete or comment out. Don't force-enable features on Mainnet.
|
||||
```
|
||||
|
||||
_Sidechain-Devnet_
|
||||
|
||||
```
|
||||
[features]
|
||||
XChainBridge
|
||||
```
|
||||
|
||||
<!-- MULTICODE_BLOCK_END -->
|
||||
|
||||
**Warning:** Do not use the `[features]` stanza when connecting to Mainnet or Testnet. Forcefully enabling different features than the rest of the network could cause your server to diverge from the network.
|
||||
|
||||
@@ -189,6 +189,7 @@ Transaction instructions may contain fields of any of the following types:
|
||||
| [UInt8][] | 16 | 8 | No | An 8-bit unsigned integer. |
|
||||
| [UInt16][] | 1 | 16 | No | A 16-bit unsigned integer. The `TransactionType` is a special case of this type, with specific strings mapping to integer values. |
|
||||
| [UInt32][] | 2 | 32 | No | A 32-bit unsigned integer. The `Flags` and `Sequence` fields on all transactions are examples of this type. |
|
||||
| [XChainBridge][] | 25 | Variable | No | A bridge between two blockchains, identified by the door accounts and issued assets on both chains. |
|
||||
|
||||
[Length-prefixed]: #length-prefixing
|
||||
|
||||
@@ -368,6 +369,25 @@ When representing these fields in JSON objects, most are represented as JSON num
|
||||
|
||||
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.
|
||||
|
||||
|
||||
### XChainBridge Fields
|
||||
[XChainBridge]: #xchainbridge-fields
|
||||
|
||||
{{ include_svg("img/serialization-xchainbridge.svg", "XChainBridge format diagram") }}
|
||||
|
||||
The `XChainBridge` field, used in transactions and ledger entries related to [cross-chain bridges](cross-chain-bridges.html), is the only field of the XChainBridge type. It consists of 4 parts which together define a bridge between blockchains:
|
||||
|
||||
- The locking chain door account, a length-prefixed [AccountID][].
|
||||
- The locking chain asset type, an [STIssue][].
|
||||
- The issuing chain door account, a length-prefixed [AccountID][].
|
||||
- The issuing chain asset type, an [STIssue][].
|
||||
|
||||
The two nested [STIssue][] types are each either 160 or 320 bits. The STIssue field is 160 bits if the currency code it contains is all 0's, meaning that the bridged asset is the native asset of its respective chain, for example XRP on the XRP Ledger Mainnet. If the currency code is nonzero, then the STIssue field also contains the (non-length-prefixed) AccountID of the token's issuer on its native chain.
|
||||
|
||||
**Note:** The door AccountID values are length-prefixed, but the issuer AccountID values are not.
|
||||
|
||||
In total, an XChainBridge field is always either 656, 816, or 976 bits (82, 102, or 122 bytes) depending on whether zero, one, or both of the assets are the native asset on their respective chain.
|
||||
|
||||
<!-- SPELLING_IGNORE: pathset, stobject, starray, ledgerentry, vector256, accountids, uint -->
|
||||
<!--{# common link defs #}-->
|
||||
{% include '_snippets/rippled-api-links.md' %}
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
---
|
||||
html: bridge.html
|
||||
parent: ledger-entry-types.html
|
||||
blurb: A `bridge` object represents a single cross-chain bridge that connects and enables value to move efficiently between two blockchains.
|
||||
labels:
|
||||
- Interoperability
|
||||
status: not_enabled
|
||||
---
|
||||
# Bridge
|
||||
_(Requires the [XChainBridge amendment][] :not_enabled:)_
|
||||
|
||||
[[Source]](https://github.com/XRPLF/rippled/blob/master/src/ripple/protocol/impl/LedgerFormats.cpp#L286-L300 "Source")
|
||||
|
||||
The `Bridge` ledger entry represents a single cross-chain bridge that connects the XRP Ledger with another blockchain, such as its sidechain, and enables value in the form of XRP and other tokens (IOUs) to move efficiently between the two blockchains.
|
||||
|
||||
|
||||
## Example Bridge JSON
|
||||
|
||||
```json
|
||||
{
|
||||
"Account": "r3nCVTbZGGYoWvZ58BcxDmiMUU7ChMa1eC",
|
||||
"Flags": 0,
|
||||
"LedgerEntryType": "Bridge",
|
||||
"MinAccountCreateAmount": "2000000000",
|
||||
"OwnerNode": "0",
|
||||
"PreviousTxnID": "67A8A1B36C1B97BE3AAB6B19CB3A3069034877DE917FD1A71919EAE7548E5636",
|
||||
"PreviousTxnLgrSeq": 102,
|
||||
"SignatureReward": "204",
|
||||
"XChainAccountClaimCount": "0",
|
||||
"XChainAccountCreateCount": "0",
|
||||
"XChainBridge": {
|
||||
"IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
|
||||
"IssuingChainIssue": {
|
||||
"currency": "XRP"
|
||||
},
|
||||
"LockingChainDoor": "r3nCVTbZGGYoWvZ58BcxDmiMUU7ChMa1eC",
|
||||
"LockingChainIssue": {
|
||||
"currency": "XRP"
|
||||
}
|
||||
},
|
||||
"XChainClaimID": "1",
|
||||
"index": "9F2C9E23343852036AFD323025A8506018ABF9D4DBAA746D61BF1CFB5C297D10"
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
## Bridge Fields
|
||||
|
||||
In addition to the [common fields](ledger-entry-common-fields.html), `{{currentpage.name}}` entries have the following fields:
|
||||
|
||||
| Field | JSON Type | Internal Type | Required? | Description |
|
||||
|:---------------------------|:--------------------|:------------------|:----------|:------------|
|
||||
| `Account` | String | Account | Yes | The account that submitted the `XChainCreateBridge` transaction on the blockchain. |
|
||||
| `MinAccountCreateAmount` | [Currency Amount][] | Amount | No | The minimum amount, in XRP, required for an `XChainAccountCreateCommit` transaction. If this isn't present, the `XChainAccountCreateCommit` transaction will fail. This field can only be present on XRP-XRP bridges. |
|
||||
| `SignatureReward` | [Currency Amount][] | Amount | Yes | The total amount, in XRP, to be rewarded for providing a signature for cross-chain transfer or for signing for the cross-chain reward. This amount will be split among the signers. |
|
||||
| `XChainAccountClaimCount` | Number | UInt64 | Yes | A counter used to order the execution of account create transactions. It is incremented every time a `XChainAccountCreateCommit` transaction is "claimed" on the destination chain. When the "claim" transaction is run on the destination chain, the `XChainAccountClaimCount` must match the value that the `XChainAccountCreateCount` had at the time the `XChainAccountClaimCount` was run on the source chain. This orders the claims so that they run in the same order that the `XChainAccountCreateCommit` transactions ran on the source chain, to prevent transaction replay. |
|
||||
| `XChainAccountCreateCount` | Number | UInt64 | Yes | A counter used to order the execution of account create transactions. It is incremented every time a successful `XChainAccountCreateCommit` transaction is run for the source chain. |
|
||||
| `XChainBridge` | XChainBridge | XChain_Bridge | Yes | The door accounts and assets of the bridge this object correlates to. |
|
||||
| `XChainClaimID` | Number | UInt64 | Yes | The value of the next `XChainClaimID` to be created. |
|
||||
|
||||
|
||||
### XChainBridge Fields
|
||||
|
||||
| Field | JSON Type | Internal Type | Required? | Description |
|
||||
|:--------------------|:----------|:------------------|:----------|:----------------|
|
||||
| `IssuingChainDoor` | String | Account | Yes | The door account on the issuing chain. For an XRP-XRP bridge, this must be the genesis account (the account that is created when the network is first started, which contains all of the XRP). |
|
||||
| `IssuingChainIssue` | Issue | Issue | Yes | The asset that is minted and burned on the issuing chain. For an IOU-IOU bridge, the issuer of the asset must be the door account on the issuing chain, to avoid supply issues. |
|
||||
| `LockingChainDoor` | String | Account | Yes | The door account on the locking chain. |
|
||||
| `LockingChainIssue` | Issue | Issue | Yes | The asset that is locked and unlocked on the locking chain. |
|
||||
|
||||
|
||||
<!--{# common link defs #}-->
|
||||
{% include '_snippets/rippled-api-links.md' %}
|
||||
{% include '_snippets/tx-type-links.md' %}
|
||||
{% include '_snippets/rippled_versions.md' %}
|
||||
@@ -0,0 +1,109 @@
|
||||
---
|
||||
html: xchainownedclaimid.html
|
||||
parent: ledger-entry-types.html
|
||||
blurb: An `XChainOwnedClaimID` object represents *one* cross-chain transfer of value.
|
||||
labels:
|
||||
- Interoperability
|
||||
status: not_enabled
|
||||
---
|
||||
# XChainOwnedClaimID
|
||||
_(Requires the [XChainBridge amendment][] :not_enabled:)_
|
||||
|
||||
[[Source]](https://github.com/seelabs/rippled/blob/xbridge/src/ripple/protocol/impl/LedgerFormats.cpp#L281-L293 "Source")
|
||||
|
||||
An `XChainOwnedClaimID` object represents *one* cross-chain transfer of value and includes information of the account on the source chain that locks or burns the funds on the source chain.
|
||||
|
||||
The `XChainOwnedClaimID` object must be acquired on the destination chain before submitting a `XChainCommit` on the source chain. Its purpose is to prevent transaction replay attacks and is also used as a place to collect attestations from witness servers.
|
||||
|
||||
An `XChainCreateClaimID` transaction is used to create a new `XChainOwnedClaimID`. The ledger object is destroyed when the funds are successfully claimed on the destination chain.
|
||||
|
||||
|
||||
## Example XChainOwnedClaimID JSON
|
||||
|
||||
```json
|
||||
{
|
||||
"Account": "rBW1U7J9mEhEdk6dMHEFUjqQ7HW7WpaEMi",
|
||||
"Flags": 0,
|
||||
"OtherChainSource": "r9oXrvBX5aDoyMGkoYvzazxDhYoWFUjz8p",
|
||||
"OwnerNode": "0",
|
||||
"PreviousTxnID": "1CFD80E9CF232B8EED62A52857DE97438D12230C06496932A81DEFA6E66070A6",
|
||||
"PreviousTxnLgrSeq": 58673,
|
||||
"SignatureReward": "100",
|
||||
"XChainBridge": {
|
||||
"IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
|
||||
"IssuingChainIssue": {
|
||||
"currency": "XRP"
|
||||
},
|
||||
"LockingChainDoor": "rMAXACCrp3Y8PpswXcg3bKggHX76V3F8M4",
|
||||
"LockingChainIssue": {
|
||||
"currency": "XRP"
|
||||
}
|
||||
},
|
||||
"XChainClaimAttestations": [
|
||||
{
|
||||
"XChainClaimProofSig": {
|
||||
"Amount": "1000000",
|
||||
"AttestationRewardAccount": "rfgjrgEJGDxfUY2U8VEDs7BnB1jiH3ofu6",
|
||||
"AttestationSignerAccount": "rfsxNxZ6xB1nTPhTMwQajNnkCxWG8B714n",
|
||||
"Destination": "rBW1U7J9mEhEdk6dMHEFUjqQ7HW7WpaEMi",
|
||||
"PublicKey": "025CA526EF20567A50FEC504589F949E0E3401C13EF76DD5FD1CC2850FA485BD7B",
|
||||
"WasLockingChainSend": 1
|
||||
}
|
||||
},
|
||||
{
|
||||
"XChainClaimProofSig": {
|
||||
"Amount": "1000000",
|
||||
"AttestationRewardAccount": "rUUL1tP523M8KimERqVS7sxb1tLLmpndyv",
|
||||
"AttestationSignerAccount": "rEg5sHxZVTNwRL3BAdMwJatkmWDzHMmzDF",
|
||||
"Destination": "rBW1U7J9mEhEdk6dMHEFUjqQ7HW7WpaEMi",
|
||||
"PublicKey": "03D40434A6843638681E2F215310EBC4131AFB12EA85985DA073183B732525F7C9",
|
||||
"WasLockingChainSend": 1
|
||||
},
|
||||
}
|
||||
],
|
||||
"XChainClaimID": "b5",
|
||||
"LedgerEntryType": "XChainOwnedClaimID",
|
||||
"LedgerIndex": "20B136D7BF6D2E3D610E28E3E6BE09F5C8F4F0241BBF6E2D072AE1BACB1388F5"
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
## XChainOwnedClaimID Fields
|
||||
|
||||
| Field | JSON Type | Internal Type | Required? | Description |
|
||||
|:--------------------------|:------------------|:------------------|:----------|:----------------|
|
||||
| `Account` | `string` | `ACCOUNT` | Yes | The account that owns this object. |
|
||||
| `LedgerIndex` | `string` | `HASH256` | Yes | The ledger index is a hash of a unique prefix for `XChainOwnedClaimID`s, the actual `XChainClaimID` value, and the fields in `XChainBridge`. |
|
||||
| `OtherChainSource` | `string` | `ACCOUNT` | Yes | The account that must send the corresponding `XChainCommit` on the source chain. The destination may be specified in the `XChainCommit` transaction, which means that if the `OtherChainSource` isn't specified, another account can try to specify a different destination and steal the funds. This also allows tracking only a single set of signatures, since we know which account will send the `XChainCommit` transaction. |
|
||||
| `SignatureReward` | `Currency Amount` | `AMOUNT` | Yes | The total amount to pay the witness servers for their signatures. It must be at least the value of `SignatureReward` in the `Bridge` ledger object. |
|
||||
| `XChainBridge` | `XChainBridge` | `XCHAIN_BRIDGE` | Yes | The door accounts and assets of the bridge this object correlates to. |
|
||||
| `XChainClaimAttestations` | `array` | `ARRAY` | Yes | Attestations collected from the witness servers. This includes the parameters needed to recreate the message that was signed, including the amount, which chain (locking or issuing), optional destination, and reward account for that signature. |
|
||||
| `XChainClaimID` | `string` | `UINT64` | Yes | The unique sequence number for a cross-chain transfer. |
|
||||
|
||||
|
||||
### XChainClaimAttestations Fields
|
||||
|
||||
| Field | JSON Type | Internal Type | Required | Description |
|
||||
|-------------------------------|-------------------|---------------|----------|-------------|
|
||||
| `XChainClaimProofSig` | `array` | `OBJECT` | Yes | An attestation from one witness server. |
|
||||
| `Amount` | `Currency Amount` | `AMOUNT` | Yes | The amount to claim in the `XChainCommit` transaction on the destination chain. |
|
||||
| `AttestationRewardAccount` | `string` | `ACCOUNT` | Yes | The account that should receive this signer's share of the `SignatureReward`. |
|
||||
| `AttestationSignerAccount` | `string` | `ACCOUNT` | Yes | The account on the door account's signer list that is signing the transaction. |
|
||||
| `Destination` | `string` | `ACCOUNT` | No | The destination account for the funds on the destination chain. |
|
||||
| `PublicKey` | `string` | `BLOB` | Yes | The public key used to verify the signature. |
|
||||
| `WasLockingChainSend` | `number` | `UINT8` | Yes | A boolean representing the chain where the event occurred. |
|
||||
|
||||
|
||||
### XChainBridge Fields
|
||||
|
||||
| Field | JSON Type | Internal Type | Required? | Description |
|
||||
|:--------------------|:----------|:------------------|:----------|:----------------|
|
||||
| `IssuingChainDoor` | `string` | `ACCOUNT` | Yes | The door account on the issuing chain. For an XRP-XRP bridge, this must be the genesis account (the account that is created when the network is first started, which contains all of the XRP). |
|
||||
| `IssuingChainIssue` | `Issue` | `ISSUE` | Yes | The asset that is minted and burned on the issuing chain. For an IOU-IOU bridge, the issuer of the asset must be the door account on the issuing chain, to avoid supply issues. |
|
||||
| `LockingChainDoor` | `string` | `ACCOUNT` | Yes | The door account on the locking chain. |
|
||||
| `LockingChainIssue` | `Issue` | `ISSUE` | Yes | The asset that is locked and unlocked on the locking chain. |
|
||||
|
||||
<!--{# common link defs #}-->
|
||||
{% include '_snippets/rippled-api-links.md' %}
|
||||
{% include '_snippets/tx-type-links.md' %}
|
||||
{% include '_snippets/rippled_versions.md' %}
|
||||
@@ -0,0 +1,95 @@
|
||||
---
|
||||
html: xchainownedcreateaccountclaimid.html
|
||||
parent: ledger-entry-types.html
|
||||
blurb: The `XChainOwnedCreateAccountClaimID` ledger object is used to collect attestations for creating an account via a cross-chain transfer.
|
||||
labels:
|
||||
- Interoperability
|
||||
status: not_enabled
|
||||
---
|
||||
# XChainOwnedCreateAccountClaimID
|
||||
_(Requires the [XChainBridge amendment][] :not_enabled:)_
|
||||
|
||||
[[Source]](https://github.com/seelabs/rippled/blob/xbridge/src/ripple/protocol/impl/LedgerFormats.cpp#L296-L306 "Source")
|
||||
|
||||
The `XChainOwnedCreateAccountClaimID` ledger object is used to collect attestations for creating an account via a cross-chain transfer.
|
||||
|
||||
It is created when an `XChainAddAccountCreateAttestation` transaction adds a signature attesting to a `XChainAccountCreateCommit` transaction and the `XChainAccountCreateCount` is greater than or equal to the current `XChainAccountClaimCount` on the `Bridge` ledger object.
|
||||
|
||||
The ledger object is destroyed when all the attestations have been received and the funds have transferred to the new account.
|
||||
|
||||
|
||||
## Example XChainOwnedCreateAccountClaimID JSON
|
||||
|
||||
```json
|
||||
{
|
||||
"LedgerEntryType": "XChainOwnedCreateAccountClaimID",
|
||||
"LedgerIndex": "5A92F6ED33FDA68FB4B9FD140EA38C056CD2BA9673ECA5B4CEF40F2166BB6F0C",
|
||||
"NewFields": {
|
||||
"Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
|
||||
"XChainAccountCreateCount": "66",
|
||||
"XChainBridge": {
|
||||
"IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
|
||||
"IssuingChainIssue": {
|
||||
"currency": "XRP"
|
||||
},
|
||||
"LockingChainDoor": "rMAXACCrp3Y8PpswXcg3bKggHX76V3F8M4",
|
||||
"LockingChainIssue": {
|
||||
"currency": "XRP"
|
||||
}
|
||||
},
|
||||
"XChainCreateAccountAttestations": [
|
||||
{
|
||||
"XChainCreateAccountProofSig": {
|
||||
"Amount": "20000000",
|
||||
"AttestationRewardAccount": "rMtYb1vNdeMDpD9tA5qSFm8WXEBdEoKKVw",
|
||||
"AttestationSignerAccount": "rL8qTrAvZ8Q1o1H9H9Ahpj3xjgmRvFLvJ3",
|
||||
"Destination": "rBW1U7J9mEhEdk6dMHEFUjqQ7HW7WpaEMi",
|
||||
"PublicKey": "021F7CC4033EFBE5E8214B04D1BAAEC14808DC6C02F4ACE930A8EF0F5909B0C438",
|
||||
"SignatureReward": "100",
|
||||
"WasLockingChainSend": 1
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
## XChainOwnedCreateAccountClaimID Fields
|
||||
|
||||
| Field | JSON Type | Internal Type | Required? | Description |
|
||||
|:----------------------------------|:---------------|:------------------|:----------|:------------|
|
||||
| `Account` | `string` | `ACCOUNT` | Yes | The account that owns this object. |
|
||||
| `LedgerIndex` | `string` | `HASH256` | Yes | The ledger index is a hash of a unique prefix for `XChainOwnedClaimID`s, the actual `XChainClaimID` value, and the fields in `XChainBridge`. |
|
||||
| `XChainAccountCreateCount` | `number` | `UINT64` | Yes | An integer that determines the order that accounts created through cross-chain transfers must be performed. Smaller numbers must execute before larger numbers. |
|
||||
| `XChainBridge` | `XChainBridge` | `XCHAIN_BRIDGE` | Yes | The door accounts and assets of the bridge this object correlates to. |
|
||||
| `XChainCreateAccountAttestations` | `array` | `ARRAY` | Yes | Attestations collected from the witness servers. This includes the parameters needed to recreate the message that was signed, including the amount, destination, signature reward amount, and reward account for that signature. With the exception of the reward account, all signatures must sign the message created with common parameters. |
|
||||
|
||||
|
||||
### XChainCreateAccountAttestations Fields
|
||||
|
||||
| Field | JSON Type | Internal Type | Required | Description |
|
||||
|-------------------------------|-------------------|---------------|----------|-------------|
|
||||
| `XChainCreateAccountProofSig` | `array` | `OBJECT` | Yes | An attestation from one witness server. |
|
||||
| `Amount` | `Currency Amount` | `AMOUNT` | Yes | The amount committed by the `XChainAccountCreateCommit` transaction on the source chain. |
|
||||
| `AttestationRewardAccount` | `string` | `ACCOUNT` | Yes | The account that should receive this signer's share of the `SignatureReward`. |
|
||||
| `AttestationSignerAccount` | `string` | `ACCOUNT` | Yes | The account on the door account's signer list that is signing the transaction. |
|
||||
| `Destination` | `string` | `ACCOUNT` | Yes | The destination account for the funds on the destination chain. |
|
||||
| `PublicKey` | `string` | `BLOB` | Yes | The public key used to verify the signature. |
|
||||
| `WasLockingChainSend` | `number` | `UINT8` | Yes | A boolean representing the chain where the event occurred. |
|
||||
|
||||
|
||||
### XChainBridge Fields
|
||||
|
||||
| Field | JSON Type | Internal Type | Required? | Description |
|
||||
|:--------------------|:----------|:------------------|:----------|:----------------|
|
||||
| `IssuingChainDoor` | `string` | `ACCOUNT` | Yes | The door account on the issuing chain. For an XRP-XRP bridge, this must be the genesis account (the account that is created when the network is first started, which contains all of the XRP). |
|
||||
| `IssuingChainIssue` | `Issue` | `ISSUE` | Yes | The asset that is minted and burned on the issuing chain. For an IOU-IOU bridge, the issuer of the asset must be the door account on the issuing chain, to avoid supply issues. |
|
||||
| `LockingChainDoor` | `string` | `ACCOUNT` | Yes | The door account on the locking chain. |
|
||||
| `LockingChainIssue` | `Issue` | `ISSUE` | Yes | The asset that is locked and unlocked on the locking chain. |
|
||||
|
||||
|
||||
<!--{# common link defs #}-->
|
||||
{% include '_snippets/rippled-api-links.md' %}
|
||||
{% include '_snippets/tx-type-links.md' %}
|
||||
{% include '_snippets/rippled_versions.md' %}
|
||||
@@ -0,0 +1,66 @@
|
||||
---
|
||||
html: xchainaccountcreatecommit.html
|
||||
parent: transaction-types.html
|
||||
blurb: Create an account on one of the chains that the bridge connects. This account serves as the bridge entrance for that chain.
|
||||
labels:
|
||||
- Interoperability
|
||||
status: not_enabled
|
||||
---
|
||||
# XChainAccountCreateCommit
|
||||
[[Source]](https://github.com/XRPLF/rippled/blob/master/src/ripple/protocol/impl/TxFormats.cpp#L466-L474 "Source")
|
||||
|
||||
_(Requires the [XChainBridge amendment][] :not_enabled:)_
|
||||
|
||||
This transaction can only be used for XRP-XRP bridges.
|
||||
|
||||
The `XChainAccountCreateCommit` transaction creates a new account for a witness server to submit transactions on an issuing chain.
|
||||
|
||||
**Warning:** This transaction should only be executed if the witness attestations will be reliably delivered to the destination chain. If the signatures aren't delivered, then account creation will be blocked until attestations are received. This can be used maliciously; to disable this transaction on XRP-XRP bridges, omit the bridge's `MinAccountCreateAmount` field.
|
||||
|
||||
|
||||
## Example XChainAccountCreateCommit JSON
|
||||
|
||||
```json
|
||||
{
|
||||
"Account": "rwEqJ2UaQHe7jihxGqmx6J4xdbGiiyMaGa",
|
||||
"Destination": "rD323VyRjgzzhY4bFpo44rmyh2neB5d8Mo",
|
||||
"TransactionType": "XChainAccountCreateCommit",
|
||||
"Amount": "20000000",
|
||||
"SignatureReward": "100",
|
||||
"XChainBridge": {
|
||||
"LockingChainDoor": "rMAXACCrp3Y8PpswXcg3bKggHX76V3F8M4",
|
||||
"LockingChainIssue": {
|
||||
"currency": "XRP"
|
||||
},
|
||||
"IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
|
||||
"IssuingChainIssue": {
|
||||
"currency": "XRP"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
## XChainAccountCreateCommit Fields
|
||||
|
||||
| Field | JSON Type | Internal Type | Required? | Description |
|
||||
|:------------------|:------------------|:------------------|:----------| :-----------|
|
||||
| `Amount` | `Currency Amount` | `AMOUNT` | Yes | The amount, in XRP, to use for account creation. This must be greater than or equal to the `MinAccountCreateAmount` specified in the `Bridge` ledger object. |
|
||||
| `Destination` | `string` | `ACCOUNT` | Yes | The destination account on the destination chain. |
|
||||
| `SignatureReward` | `Currency Amount` | `AMOUNT` | No | The amount, in XRP, to be used to reward the witness servers for providing signatures. This must match the amount on the `Bridge` ledger object. |
|
||||
| `XChainBridge` | `XChainBridge` | `XCHAIN_BRIDGE` | Yes | The bridge to create accounts for. |
|
||||
|
||||
|
||||
### XChainBridge Fields
|
||||
|
||||
| Field | JSON Type | Internal Type | Required? | Description |
|
||||
|:--------------------|:----------|:------------------|:----------|:----------------|
|
||||
| `IssuingChainDoor` | `string` | `ACCOUNT` | Yes | The door account on the issuing chain. For an XRP-XRP bridge, this must be the genesis account (the account that is created when the network is first started, which contains all of the XRP). |
|
||||
| `IssuingChainIssue` | `Issue` | `ISSUE` | Yes | The asset that is minted and burned on the issuing chain. For an IOU-IOU bridge, the issuer of the asset must be the door account on the issuing chain, to avoid supply issues. |
|
||||
| `LockingChainDoor` | `string` | `ACCOUNT` | Yes | The door account on the locking chain. |
|
||||
| `LockingChainIssue` | `Issue` | `ISSUE` | Yes | The asset that is locked and unlocked on the locking chain. |
|
||||
|
||||
<!--{# common link defs #}-->
|
||||
{% include '_snippets/rippled-api-links.md' %}
|
||||
{% include '_snippets/tx-type-links.md' %}
|
||||
{% include '_snippets/rippled_versions.md' %}
|
||||
@@ -0,0 +1,83 @@
|
||||
---
|
||||
html: xchainaddaccountcreateattestation.html
|
||||
parent: transaction-types.html
|
||||
blurb: The `XChainAddAccountCreateAttestation` transaction provides an attestation from a witness server that a `XChainAccountCreateCommit` transaction occurred on the other chain.
|
||||
labels:
|
||||
- Interoperability
|
||||
status: not_enabled
|
||||
---
|
||||
# XChainAddAccountCreateAttestation
|
||||
[[Source]](https://github.com/XRPLF/rippled/blob/master/src/ripple/protocol/impl/TxFormats.cpp#L447-L464 "Source")
|
||||
|
||||
_(Requires the [XChainBridge amendment][] :not_enabled:)_
|
||||
|
||||
The `XChainAddAccountCreateAttestation` transaction provides an attestation from a witness server that an `XChainAccountCreateCommit` transaction occurred on the other chain.
|
||||
|
||||
The signature must be from one of the keys on the door's signer list at the time the signature was provided. If the signature list changes between the time the signature was submitted and the quorum is reached, the new signature set is used and some of the currently collected signatures may be removed.
|
||||
|
||||
Any account can submit signatures.
|
||||
|
||||
**Note:** The reward is only sent to accounts that have keys on the current list. A quorum of signers need to agree on the `SignatureReward`, the same way they need to agree on the other data. A single witness server can't provide an incorrect value for this in an attempt to collect a larger reward.
|
||||
|
||||
|
||||
## Example XChainAddAccountCreateAttestation JSON
|
||||
|
||||
```json
|
||||
{
|
||||
"Account": "rDr5okqGKmMpn44Bbhe5WAfDQx8e9XquEv",
|
||||
"TransactionType": "XChainAddAccountCreateAttestation",
|
||||
"OtherChainSource": "rUzB7yg1LcFa7m3q1hfrjr5w53vcWzNh3U",
|
||||
"Destination": "rJMfWNVbyjcCtds8kpoEjEbYQ41J5B6MUd",
|
||||
"Amount": "2000000000",
|
||||
"PublicKey": "EDF7C3F9C80C102AF6D241752B37356E91ED454F26A35C567CF6F8477960F66614",
|
||||
"Signature": "F95675BA8FDA21030DE1B687937A79E8491CE51832D6BEEBC071484FA5AF5B8A0E9AFF11A4AA46F09ECFFB04C6A8DAE8284AF3ED8128C7D0046D842448478500",
|
||||
"WasLockingChainSend": 1,
|
||||
"AttestationRewardAccount": "rpFp36UHW6FpEcZjZqq5jSJWY6UCj3k4Es",
|
||||
"AttestationSignerAccount": "rpWLegmW9WrFBzHUj7brhQNZzrxgLj9oxw",
|
||||
"XChainAccountCreateCount": "2",
|
||||
"SignatureReward": "204",
|
||||
"XChainBridge": {
|
||||
"LockingChainDoor": "r3nCVTbZGGYoWvZ58BcxDmiMUU7ChMa1eC",
|
||||
"LockingChainIssue": {
|
||||
"currency": "XRP"
|
||||
},
|
||||
"IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
|
||||
"IssuingChainIssue": {
|
||||
"currency": "XRP"
|
||||
}
|
||||
},
|
||||
"Fee": "20"
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
## XChainAddAccountCreateAttestation Fields
|
||||
|
||||
| Field | JSON Type | Internal Type | Required? | Description |
|
||||
|:---------------------------|:------------------|:------------------|:----------|:------------|
|
||||
| `Amount` | `Currency Amount` | `AMOUNT` | Yes | The amount committed by the `XChainAccountCreateCommit` transaction on the source chain. |
|
||||
| `AttestationRewardAccount` | `string` | `ACCOUNT` | Yes | The account that should receive this signer's share of the `SignatureReward`. |
|
||||
| `AttestationSignerAccount` | `string` | `ACCOUNT` | Yes | The account on the door account's signer list that is signing the transaction. |
|
||||
| `Destination` | `string` | `ACCOUNT` | Yes | The destination account for the funds on the destination chain. |
|
||||
| `OtherChainSource` | `string` | `ACCOUNT` | Yes | The account on the source chain that submitted the `XChainAccountCreateCommit` transaction that triggered the event associated with the attestation. |
|
||||
| `PublicKey` | `string` | `BLOB` | Yes | The public key used to verify the signature. |
|
||||
| `Signature` | `string` | `BLOB` | Yes | The signature attesting to the event on the other chain. |
|
||||
| `SignatureReward` | `Currency Amount` | `AMOUNT` | Yes | The signature reward paid in the `XChainAccountCreateCommit` transaction. |
|
||||
| `WasLockingChainSend` | `number` | `UINT8` | Yes | A boolean representing the chain where the event occurred. |
|
||||
| `XChainAccountCreateCount` | `string` | `UINT64` | Yes | The counter that represents the order that the claims must be processed in. |
|
||||
| `XChainBridge` | `XChainBridge` | `XCHAIN_BRIDGE` | Yes | The bridge associated with the attestation. |
|
||||
|
||||
|
||||
### XChainBridge Fields
|
||||
|
||||
| Field | JSON Type | Internal Type | Required? | Description |
|
||||
|:--------------------|:----------|:------------------|:----------|:----------------|
|
||||
| `IssuingChainDoor` | `string` | `ACCOUNT` | Yes | The door account on the issuing chain. For an XRP-XRP bridge, this must be the genesis account (the account that is created when the network is first started, which contains all of the XRP). |
|
||||
| `IssuingChainIssue` | `Issue` | `ISSUE` | Yes | The asset that is minted and burned on the issuing chain. For an IOU-IOU bridge, the issuer of the asset must be the door account on the issuing chain, to avoid supply issues. |
|
||||
| `LockingChainDoor` | `string` | `ACCOUNT` | Yes | The door account on the locking chain. |
|
||||
| `LockingChainIssue` | `Issue` | `ISSUE` | Yes | The asset that is locked and unlocked on the locking chain. |
|
||||
|
||||
<!--{# common link defs #}-->
|
||||
{% include '_snippets/rippled-api-links.md' %}
|
||||
{% include '_snippets/tx-type-links.md' %}
|
||||
{% include '_snippets/rippled_versions.md' %}
|
||||
@@ -0,0 +1,103 @@
|
||||
---
|
||||
html: xchainaddclaimattestation.html
|
||||
parent: transaction-types.html
|
||||
blurb: Submit proof (attestation) to the destination chain that an event that happened on the source chain.
|
||||
labels:
|
||||
- Interoperability
|
||||
status: not_enabled
|
||||
---
|
||||
# XChainAddClaimAttestation
|
||||
[[Source]](https://github.com/XRPLF/rippled/blob/master/src/ripple/protocol/impl/TxFormats.cpp#L429-L445 "Source")
|
||||
|
||||
_(Requires the [XChainBridge amendment][] :not_enabled:)_
|
||||
|
||||
The `XChainAddClaimAttestation` transaction provides proof from a witness server, attesting to an `XChainCommit` transaction.
|
||||
|
||||
The signature must be from one of the keys on the door's signer list at the time the signature was provided. However, if the signature list changes between the time the signature was submitted and the quorum is reached, the new signature set is used and some of the currently collected signatures may be removed.
|
||||
|
||||
Any account can submit signatures.
|
||||
|
||||
**Note:** The reward is only sent to accounts that have keys on the current list. A quorum of signers need to agree on the `SignatureReward`, the same way they need to agree on the other data. A single witness server can't provide an incorrect value for this in an attempt to collect a larger reward.
|
||||
|
||||
|
||||
## Example XChainAddClaimAttestation JSON
|
||||
|
||||
```json
|
||||
{
|
||||
"TransactionType": "XChainAddClaimAttestation",
|
||||
"Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
|
||||
"XChainAttestationBatch": {
|
||||
"XChainBridge": {
|
||||
"IssuingChainDoor": "rKeSSvHvaMZJp9ykaxutVwkhZgWuWMLnQt",
|
||||
"IssuingChainIssue": {
|
||||
"currency": "XRP"
|
||||
},
|
||||
"LockingChainDoor": "rJvExveLEL4jNDEeLKCVdxaSCN9cEBnEQC",
|
||||
"LockingChainIssue": {
|
||||
"currency": "XRP"
|
||||
}
|
||||
},
|
||||
"XChainClaimAttestationBatch" : [
|
||||
{
|
||||
"XChainClaimAttestationBatchElement" : {
|
||||
"Account" : "rnJmYAiqEVngtnb5ckRroXLtCbWC7CRUBx",
|
||||
"Amount" : "100000000",
|
||||
"AttestationSignerAccount" : "rnJmYAiqEVngtnb5ckRroXLtCbWC7CRUBx",
|
||||
"Destination" : "r9A8UyNpW3X46FUc6P7JZqgn6WgAPjBwPg",
|
||||
"PublicKey" : "03DAB289CA36FF377F3F4304C7A7203FDE5EDCBFC209F430F6A4355361425526D0",
|
||||
"Signature" : "616263",
|
||||
"WasLockingChainSend" : 1,
|
||||
"XChainClaimID" : "0000000000000000"
|
||||
}
|
||||
}
|
||||
],
|
||||
"XChainCreateAccountAttestationBatch": [
|
||||
{
|
||||
"XChainCreateAccountAttestationBatchElement": {
|
||||
"Account": "rnJmYAiqEVngtnb5ckRroXLtCbWC7CRUBx",
|
||||
"Amount": "1000000000",
|
||||
"AttestationSignerAccount": "rEziJZmeZzsJvGVUmpUTey7qxQLKYxaK9f",
|
||||
"Destination": "rKT9gDkaedAosiHyHZTjyZs2HvXpzuiGmC",
|
||||
"PublicKey": "03ADB44CA8E56F78A0096825E5667C450ABD5C24C34E027BC1AAF7E5BD114CB5B5",
|
||||
"Signature": "3044022036C8B90F85E8073C465F00625248A72D4714600F98EBBADBAD3B7ED226109A3A02204C5A0AE12D169CF790F66541F3DB59C289E0D9CA7511FDFE352BB601F667A26",
|
||||
"SignatureReward": "1000000",
|
||||
"WasLockingChainSend": 1,
|
||||
"XChainAccountCreateCount": "0000000000000001"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
## XChainAddClaimAttestation Fields
|
||||
|
||||
| Field | JSON Type | Internal Type | Required? | Description |
|
||||
|:---------------------------|:------------------|:------------------|:----------|-------------|
|
||||
| `Amount` | `Currency Amount` | `AMOUNT` | Yes | The amount committed by the `XChainCommit` transaction on the source chain. |
|
||||
| `AttestationRewardAccount` | `string` | `ACCOUNT` | Yes | The account that should receive this signer's share of the `SignatureReward`. |
|
||||
| `AttestationSignerAccount` | `string` | `ACCOUNT` | Yes | The account on the door account's signer list that is signing the transaction. |
|
||||
| `Destination` | `string` | `ACCOUNT` | No | The destination account for the funds on the destination chain (taken from the `XChainCommit` transaction).
|
||||
| `OtherChainSource` | `string` | `ACCOUNT` | Yes | The account on the source chain that submitted the `XChainCommit` transaction that triggered the event associated with the attestation.
|
||||
| `PublicKey` | `string` | `BLOB` | Yes | The public key used to verify the attestation signature. |
|
||||
| `Signature` | `string` | `BLOB` | Yes | The signature attesting to the event on the other chain. |
|
||||
| `WasLockingChainSend` | `number` | `UINT8` | Yes | A boolean representing the chain where the event occurred. |
|
||||
| `XChainBridge` | `XChainBridge` | `XCHAIN_BRIDGE` | Yes | The bridge to use to transfer funds. |
|
||||
| `XChainClaimID` | `string` | `UINT64` | Yes | The `XChainClaimID` associated with the transfer, which was included in the `XChainCommit` transaction. |
|
||||
|
||||
|
||||
### XChainBridge Fields
|
||||
|
||||
| Field | JSON Type | Internal Type | Required? | Description |
|
||||
|:--------------------|:----------|:------------------|:----------|:----------------|
|
||||
| `IssuingChainDoor` | `string` | `ACCOUNT` | Yes | The door account on the issuing chain. For an XRP-XRP bridge, this must be the genesis account (the account that is created when the network is first started, which contains all of the XRP). |
|
||||
| `IssuingChainIssue` | `Issue` | `ISSUE` | Yes | The asset that is minted and burned on the issuing chain. For an IOU-IOU bridge, the issuer of the asset must be the door account on the issuing chain, to avoid supply issues. |
|
||||
| `LockingChainDoor` | `string` | `ACCOUNT` | Yes | The door account on the locking chain. |
|
||||
| `LockingChainIssue` | `Issue` | `ISSUE` | Yes | The asset that is locked and unlocked on the locking chain. |
|
||||
|
||||
|
||||
<!--{# common link defs #}-->
|
||||
{% include '_snippets/rippled-api-links.md' %}
|
||||
{% include '_snippets/tx-type-links.md' %}
|
||||
{% include '_snippets/rippled_versions.md' %}
|
||||
@@ -0,0 +1,66 @@
|
||||
---
|
||||
html: xchainclaim.html
|
||||
parent: transaction-types.html
|
||||
blurb: Complete a cross-chain transfer of value by claiming the value on the destination chain.
|
||||
labels:
|
||||
- Interoperability
|
||||
status: not_enabled
|
||||
---
|
||||
# XChainClaim
|
||||
[[Source]](https://github.com/XRPLF/rippled/blob/master/src/ripple/protocol/impl/TxFormats.cpp#L418-L427 "Source")
|
||||
|
||||
_(Requires the [XChainBridge amendment][] :not_enabled:)_
|
||||
|
||||
The `XChainClaim` transaction completes a cross-chain transfer of value. It allows a user to claim the value on the destination chain - the equivalent of the value locked on the source chain. A user can only claim the value if they own the cross-chain claim ID associated with the value locked on the source chain (the `Account` field). The user can send the funds to anyone (the `Destination` field). This transaction is only needed if an `OtherChainDestination` isn't specified in the `XChainCommit` transaction, or if something goes wrong with the automatic transfer of funds.
|
||||
|
||||
If the transaction succeeds in moving funds, the referenced `XChainOwnedClaimID` ledger object will be destroyed. This prevents transaction replay. If the transaction fails, the `XChainOwnedClaimID` won't be destroyed and the transaction can be re-run with different parameters.
|
||||
|
||||
|
||||
## Example XChainClaim JSON
|
||||
|
||||
```json
|
||||
{
|
||||
"Account": "rahDmoXrtPdh7sUdrPjini3gcnTVYjbjjw",
|
||||
"Amount": "10000",
|
||||
"TransactionType": "XChainClaim",
|
||||
"XChainClaimID": "13f",
|
||||
"Destination": "rahDmoXrtPdh7sUdrPjini3gcnTVYjbjjw",
|
||||
"XChainBridge": {
|
||||
"LockingChainDoor": "rMAXACCrp3Y8PpswXcg3bKggHX76V3F8M4",
|
||||
"LockingChainIssue": {
|
||||
"currency": "XRP"
|
||||
},
|
||||
"IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
|
||||
"IssuingChainIssue": {
|
||||
"currency": "XRP"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
## XChainClaim Fields
|
||||
|
||||
| Field | JSON Type | Internal Type | Required? | Description |
|
||||
|:------------------------|:------------------|:------------------|:----------|-------------|
|
||||
| `Amount` | `Currency Amount` | `AMOUNT` | Yes | The amount to claim on the destination chain. This must match the amount attested to on the attestations associated with this `XChainClaimID`. |
|
||||
| `Destination` | `string` | `ACCOUNT` | Yes | The destination account on the destination chain. It must exist or the transaction will fail. However, if the transaction fails in this case, the sequence number and collected signatures won't be destroyed, and the transaction can be rerun with a different destination. |
|
||||
| `DestinationTag` | `int` | `UINT32` | No | An integer destination tag. |
|
||||
| `XChainBridge` | `XChainBridge` | `XCHAIN_BRIDGE` | Yes | The bridge to use for the transfer. |
|
||||
| `XChainClaimID` | `string` | `UINT64` | Yes | The unique integer ID for the cross-chain transfer that was referenced in the corresponding `XChainCommit` transaction. |
|
||||
|
||||
|
||||
### XChainBridge Fields
|
||||
|
||||
| Field | JSON Type | Internal Type | Required? | Description |
|
||||
|:--------------------|:----------|:------------------|:----------|:----------------|
|
||||
| `IssuingChainDoor` | `string` | `ACCOUNT` | Yes | The door account on the issuing chain. For an XRP-XRP bridge, this must be the genesis account (the account that is created when the network is first started, which contains all of the XRP). |
|
||||
| `IssuingChainIssue` | `Issue` | `ISSUE` | Yes | The asset that is minted and burned on the issuing chain. For an IOU-IOU bridge, the issuer of the asset must be the door account on the issuing chain, to avoid supply issues. |
|
||||
| `LockingChainDoor` | `string` | `ACCOUNT` | Yes | The door account on the locking chain. |
|
||||
| `LockingChainIssue` | `Issue` | `ISSUE` | Yes | The asset that is locked and unlocked on the locking chain. |
|
||||
|
||||
|
||||
<!--{# common link defs #}-->
|
||||
{% include '_snippets/rippled-api-links.md' %}
|
||||
{% include '_snippets/tx-type-links.md' %}
|
||||
{% include '_snippets/rippled_versions.md' %}
|
||||
@@ -0,0 +1,62 @@
|
||||
---
|
||||
html: xchaincommit.html
|
||||
parent: transaction-types.html
|
||||
blurb: Initiate a cross-chain transfer of value.
|
||||
labels:
|
||||
- Interoperability
|
||||
status: not_enabled
|
||||
---
|
||||
# XChainCommit
|
||||
[[Source]](https://github.com/XRPLF/rippled/blob/master/src/ripple/protocol/impl/TxFormats.cpp#L408-L416 "Source")
|
||||
|
||||
_(Requires the [XChainBridge amendment][] :not_enabled:)_
|
||||
|
||||
The `XChainCommit` is the second step in a cross-chain transfer. It puts assets into trust on the locking chain so that they can be wrapped on the issuing chain, or burns wrapped assets on the issuing chain so that they can be returned on the locking chain.
|
||||
|
||||
|
||||
## Example XChainCommit JSON
|
||||
|
||||
```json
|
||||
{
|
||||
"Account": "rMTi57fNy2UkUb4RcdoUeJm7gjxVQvxzUo",
|
||||
"TransactionType": "XChainCommit",
|
||||
"XChainBridge": {
|
||||
"LockingChainDoor": "rMAXACCrp3Y8PpswXcg3bKggHX76V3F8M4",
|
||||
"LockingChainIssue": {
|
||||
"currency": "XRP"
|
||||
},
|
||||
"IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
|
||||
"IssuingChainIssue": {
|
||||
"currency": "XRP"
|
||||
}
|
||||
},
|
||||
"Amount": "10000",
|
||||
"XChainClaimID": "13f"
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
## XChainCommit Fields
|
||||
|
||||
| Field | JSON Type | Internal Type | Required? | Description |
|
||||
|:------------------------|:------------------|:------------------|:----------|-------------|
|
||||
| `Amount` | `Currency Amount` | `AMOUNT` | Yes | The asset to commit, and the quantity. This must match the door account's `LockingChainIssue` (if on the locking chain) or the door account's `IssuingChainIssue` (if on the issuing chain). |
|
||||
| `OtherChainDestination` | `string` | `ACCOUNT` | No | The destination account on the destination chain. If this is not specified, the account that submitted the `XChainCreateClaimID` transaction on the destination chain will need to submit a `XChainClaim` transaction to claim the funds. |
|
||||
| `XChainBridge` | `XChainBridge` | `XCHAIN_BRIDGE` | Yes | The bridge to use to transfer funds. |
|
||||
| `XChainClaimID` | `string` | `UINT64` | Yes | The unique integer ID for a cross-chain transfer. This must be acquired on the destination chain (via a `XChainCreateClaimID` transaction) and checked from a validated ledger before submitting this transaction. If an incorrect sequence number is specified, the funds will be lost. |
|
||||
|
||||
|
||||
### XChainBridge Fields
|
||||
|
||||
| Field | JSON Type | Internal Type | Required? | Description |
|
||||
|:--------------------|:----------|:------------------|:----------|:----------------|
|
||||
| `IssuingChainDoor` | `string` | `ACCOUNT` | Yes | The door account on the issuing chain. For an XRP-XRP bridge, this must be the genesis account (the account that is created when the network is first started, which contains all of the XRP). |
|
||||
| `IssuingChainIssue` | `Issue` | `ISSUE` | Yes | The asset that is minted and burned on the issuing chain. For an IOU-IOU bridge, the issuer of the asset must be the door account on the issuing chain, to avoid supply issues. |
|
||||
| `LockingChainDoor` | `string` | `ACCOUNT` | Yes | The door account on the locking chain. |
|
||||
| `LockingChainIssue` | `Issue` | `ISSUE` | Yes | The asset that is locked and unlocked on the locking chain. |
|
||||
|
||||
|
||||
<!--{# common link defs #}-->
|
||||
{% include '_snippets/rippled-api-links.md' %}
|
||||
{% include '_snippets/tx-type-links.md' %}
|
||||
{% include '_snippets/rippled_versions.md' %}
|
||||
@@ -0,0 +1,67 @@
|
||||
---
|
||||
html: xchaincreatebridge.html
|
||||
parent: transaction-types.html
|
||||
blurb: Create a bridge between two chains.
|
||||
labels:
|
||||
- Interoperability
|
||||
status: not_enabled
|
||||
---
|
||||
# XChainCreateBridge
|
||||
[[Source]](https://github.com/XRPLF/rippled/blob/master/src/ripple/protocol/impl/TxFormats.cpp#L381-L388 "Source")
|
||||
|
||||
_(Requires the [XChainBridge amendment][] :not_enabled:)_
|
||||
|
||||
The `XChainCreateBridge` transaction creates a new `Bridge` ledger object and defines a new cross-chain bridge entrance on the chain that the transaction is submitted on. It includes information about door accounts and assets for the bridge.
|
||||
|
||||
The transaction must be submitted first by the locking chain door account. To set up a valid bridge, door accounts on both chains must submit this transaction, in addition to setting up witness servers.
|
||||
|
||||
The complete production-grade setup would also include a `SignerListSet` transaction on the two door accounts for the witnesses’ signing keys, as well as disabling the door accounts’ master key. This ensures that the witness servers are truly in control of the funds.
|
||||
|
||||
**Note:** Each door account can only have one bridge. This prevents the creation of duplicate bridges for the same asset, which can cause asset imbalances on either chain.
|
||||
|
||||
|
||||
## Example XChainCreateBridge JSON
|
||||
|
||||
```json
|
||||
{
|
||||
"TransactionType": "XChainCreateBridge",
|
||||
"Account": "rhWQzvdmhf5vFS35vtKUSUwNZHGT53qQsg",
|
||||
"XChainBridge": {
|
||||
"LockingChainDoor": "rhWQzvdmhf5vFS35vtKUSUwNZHGT53qQsg",
|
||||
"LockingChainIssue": {
|
||||
"currency": "XRP"
|
||||
},
|
||||
"IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
|
||||
"IssuingChainIssue": {
|
||||
"currency": "XRP"
|
||||
}
|
||||
},
|
||||
"SignatureReward": 200,
|
||||
"MinAccountCreateAmount": 1000000
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
## XChainCreateBridge Fields
|
||||
|
||||
| Field | JSON Type | Internal Type | Required? | Description |
|
||||
|:-------------------------|:------------------|:------------------|:----------------|:------|
|
||||
| `MinAccountCreateAmount` | `Currency Amount` | `AMOUNT` | No | The minimum amount, in XRP, required for a `XChainAccountCreateCommit` transaction. If this isn't present, the `XChainAccountCreateCommit` transaction will fail. This field can only be present on XRP-XRP bridges. |
|
||||
| `SignatureReward` | `Currency Amount` | `AMOUNT` | Yes | The total amount to pay the witness servers for their signatures. This amount will be split among the signers. |
|
||||
| `XChainBridge` | `XChainBridge` | `XCHAIN_BRIDGE` | Yes | The bridge (door accounts and assets) to create. |
|
||||
|
||||
|
||||
### XChainBridge Fields
|
||||
|
||||
| Field | JSON Type | Internal Type | Required? | Description |
|
||||
|:--------------------|:----------|:------------------|:----------|:----------------|
|
||||
| `IssuingChainDoor` | `string` | `ACCOUNT` | Yes | The door account on the issuing chain. For an XRP-XRP bridge, this must be the genesis account (the account that is created when the network is first started, which contains all of the XRP). |
|
||||
| `IssuingChainIssue` | `Issue` | `ISSUE` | Yes | The asset that is minted and burned on the issuing chain. For an IOU-IOU bridge, the issuer of the asset must be the door account on the issuing chain, to avoid supply issues. |
|
||||
| `LockingChainDoor` | `string` | `ACCOUNT` | Yes | The door account on the locking chain. |
|
||||
| `LockingChainIssue` | `Issue` | `ISSUE` | Yes | The asset that is locked and unlocked on the locking chain. |
|
||||
|
||||
|
||||
<!--{# common link defs #}-->
|
||||
{% include '_snippets/rippled-api-links.md' %}
|
||||
{% include '_snippets/tx-type-links.md' %}
|
||||
{% include '_snippets/rippled_versions.md' %}
|
||||
@@ -0,0 +1,65 @@
|
||||
---
|
||||
html: xchaincreateclaimid.html
|
||||
parent: transaction-types.html
|
||||
blurb: Create a cross-chain claim ID that is used for a cross-chain transfer.
|
||||
labels:
|
||||
- Interoperability
|
||||
status: not_enabled
|
||||
---
|
||||
# XChainCreateClaimID
|
||||
[[Source]](https://github.com/XRPLF/rippled/blob/master/src/ripple/protocol/impl/TxFormats.cpp#L399-L406 "Source")
|
||||
|
||||
_(Requires the [XChainBridge amendment][] :not_enabled:)_
|
||||
|
||||
The `XChainCreateClaimID` transaction creates a new cross-chain claim ID that is used for a cross-chain transfer. A cross-chain claim ID represents *one* cross-chain transfer of value.
|
||||
|
||||
This transaction is the first step of a cross-chain transfer of value and is submitted on the destination chain, not the source chain.
|
||||
|
||||
It also includes the account on the source chain that locks or burns the funds on the source chain.
|
||||
|
||||
|
||||
## Example XChainCreateClaimID JSON
|
||||
|
||||
```json
|
||||
{
|
||||
"Account": "rahDmoXrtPdh7sUdrPjini3gcnTVYjbjjw",
|
||||
"OtherChainSource": "rMTi57fNy2UkUb4RcdoUeJm7gjxVQvxzUo",
|
||||
"TransactionType": "XChainCreateClaimID",
|
||||
"SignatureReward": "100",
|
||||
"XChainBridge": {
|
||||
"LockingChainDoor": "rMAXACCrp3Y8PpswXcg3bKggHX76V3F8M4",
|
||||
"LockingChainIssue": {
|
||||
"currency": "XRP"
|
||||
},
|
||||
"IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
|
||||
"IssuingChainIssue": {
|
||||
"currency": "XRP"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
## XChainCreateClaimID Fields
|
||||
|
||||
| Field | JSON Type | Internal Type | Required? | Description |
|
||||
|:-------------------|:------------------|:------------------|:----------|-------------|
|
||||
| `OtherChainSource` | `string` | `ACCOUNT` | Yes | The account that must send the `XChainCommit` transaction on the source chain. |
|
||||
| `SignatureReward` | `string` | `ACCOUNT` | Yes | The amount, in XRP, to reward the witness servers for providing signatures. This must match the amount on the `Bridge` ledger object. |
|
||||
| `XChainBridge` | `XChainBridge` | `XCHAIN_BRIDGE` | Yes | The bridge to create the claim ID for. |
|
||||
|
||||
|
||||
### XChainBridge Fields
|
||||
|
||||
| Field | JSON Type | Internal Type | Required? | Description |
|
||||
|:--------------------|:----------|:------------------|:----------|:----------------|
|
||||
| `IssuingChainDoor` | `string` | `ACCOUNT` | Yes | The door account on the issuing chain. For an XRP-XRP bridge, this must be the genesis account (the account that is created when the network is first started, which contains all of the XRP). |
|
||||
| `IssuingChainIssue` | `Issue` | `ISSUE` | Yes | The asset that is minted and burned on the issuing chain. For an IOU-IOU bridge, the issuer of the asset must be the door account on the issuing chain, to avoid supply issues. |
|
||||
| `LockingChainDoor` | `string` | `ACCOUNT` | Yes | The door account on the locking chain. |
|
||||
| `LockingChainIssue` | `Issue` | `ISSUE` | Yes | The asset that is locked and unlocked on the locking chain. |
|
||||
|
||||
|
||||
<!--{# common link defs #}-->
|
||||
{% include '_snippets/rippled-api-links.md' %}
|
||||
{% include '_snippets/tx-type-links.md' %}
|
||||
{% include '_snippets/rippled_versions.md' %}
|
||||
@@ -0,0 +1,75 @@
|
||||
---
|
||||
html: xchainmodifybridge.html
|
||||
parent: transaction-types.html
|
||||
blurb: Modify the parameters of a bridge.
|
||||
labels:
|
||||
- Interoperability
|
||||
status: not_enabled
|
||||
---
|
||||
# XChainModifyBridge
|
||||
[[Source]](https://github.com/XRPLF/rippled/blob/develop/src/ripple/protocol/impl/TxFormats.cpp#L390-L397 "Source")
|
||||
|
||||
_(Requires the [XChainBridge amendment][] :not_enabled:)_
|
||||
|
||||
The `XChainModifyBridge` transaction allows bridge managers to modify the parameters of the bridge. They can only change the `SignatureReward` and the `MinAccountCreateAmount`.
|
||||
|
||||
This transaction must be sent by the door account and requires the entities that control the witness servers to coordinate and provide the signatures for this transaction. This coordination happens outside the ledger.
|
||||
|
||||
**Note:** You can't modify the signer list for the bridge with this transaction. The signer list is on the door account itself and is changed in the same way signer lists are changed on accounts (via a `SignerListSet` transaction).
|
||||
|
||||
|
||||
## Example XChainModifyBridge JSON
|
||||
|
||||
```json
|
||||
{
|
||||
"TransactionType": "XChainModifyBridge",
|
||||
"Account": "rhWQzvdmhf5vFS35vtKUSUwNZHGT53qQsg",
|
||||
"XChainBridge": {
|
||||
"LockingChainDoor": "rhWQzvdmhf5vFS35vtKUSUwNZHGT53qQsg",
|
||||
"LockingChainIssue": {
|
||||
"currency": "XRP"
|
||||
},
|
||||
"IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
|
||||
"IssuingChainIssue": {
|
||||
"currency": "XRP"
|
||||
}
|
||||
},
|
||||
"SignatureReward": 200,
|
||||
"MinAccountCreateAmount": 1000000
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
## XChainModifyBridge Fields
|
||||
|
||||
| Field | JSON Type | Internal Type | Required? | Description |
|
||||
|:-------------------------|:------------------|:------------------|:----------|-------------|
|
||||
| `Flags` | `number` | `UINT32` | Yes | Specifies the flags for this transaction. |
|
||||
| `MinAccountCreateAmount` | `Currency Amount` | `AMOUNT` | No | The minimum amount, in XRP, required for a `XChainAccountCreateCommit` transaction. If this is not present, the `XChainAccountCreateCommit` transaction will fail. This field can only be present on XRP-XRP bridges. |
|
||||
| `SignatureReward` | `Currency Amount` | `AMOUNT` | No | The signature reward split between the witnesses for submitting attestations. |
|
||||
| `XChainBridge` | `XChainBridge` | `XCHAIN_BRIDGE` | Yes | The bridge to modify. |
|
||||
|
||||
|
||||
### XChainBridge Fields
|
||||
|
||||
| Field | JSON Type | Internal Type | Required? | Description |
|
||||
|:--------------------|:----------|:------------------|:----------|:----------------|
|
||||
| `IssuingChainDoor` | `string` | `ACCOUNT` | Yes | The door account on the issuing chain. For an XRP-XRP bridge, this must be the genesis account (the account that is created when the network is first started, which contains all of the XRP). |
|
||||
| `IssuingChainIssue` | `Issue` | `ISSUE` | Yes | The asset that is minted and burned on the issuing chain. For an IOU-IOU bridge, the issuer of the asset must be the door account on the issuing chain, to avoid supply issues. |
|
||||
| `LockingChainDoor` | `string` | `ACCOUNT` | Yes | The door account on the locking chain. |
|
||||
| `LockingChainIssue` | `Issue` | `ISSUE` | Yes | The asset that is locked and unlocked on the locking chain. |
|
||||
|
||||
|
||||
## Transaction Flags
|
||||
|
||||
In addition to the universal transaction flags that are applicable to all transactions, you can specify this flag:
|
||||
|
||||
| Flag Name | Flag Value | Description |
|
||||
|------------------------------|--------------|-------------|
|
||||
| `tfClearAccountCreateAmount` | `0x00010000` | Clears the `MinAccountCreateAmount` of the bridge. |
|
||||
|
||||
|
||||
<!--{# common link defs #}-->
|
||||
{% include '_snippets/rippled-api-links.md' %}
|
||||
{% include '_snippets/tx-type-links.md' %}
|
||||
{% include '_snippets/rippled_versions.md' %}
|
||||
@@ -16,6 +16,7 @@ The following is a comprehensive list of all known [amendments](amendments.html)
|
||||
|
||||
| Name | Introduced | Status |
|
||||
|:----------------------------------|:-----------|:------------------------------|
|
||||
| [XChainBridge][] | v2.0.0 | [Open for Voting: 2024-01-09](https://xrpl.org/blog/2024/rippled-2.0.0.html "BADGE_80d0e0") |
|
||||
| [AMM][] | v1.12.0 | [Open for Voting: 2023-09-06](https://xrpl.org/blog/2023/rippled-1.12.0.html "BADGE_80d0e0") |
|
||||
| [Clawback][] | v1.12.0 | [Open for Voting: 2023-09-06](https://xrpl.org/blog/2023/rippled-1.12.0.html "BADGE_80d0e0") |
|
||||
| [XRPFees][] | v1.10.0 | [Open for Voting: 2023-03-14](https://xrpl.org/blog/2023/rippled-1.10.0.html "BADGE_80d0e0") |
|
||||
@@ -82,7 +83,6 @@ The following is a list of [amendments](amendments.html) that are being develope
|
||||
| Name | Status | Additional Information |
|
||||
|:----------------------------------|:------------------------------------------|:-------------------------------|
|
||||
| [Hooks][] | [In Development: TBD]( "BADGE_LIGHTGREY") | [XRPL Hooks](https://hooks.xrpl.org/) |
|
||||
| [XChainBridge][] | [In Development: TBD]( "BADGE_LIGHTGREY") | [XLS-38d](https://github.com/XRPLF/XRPL-Standards/blob/master/XLS-38d-XChainBridge/README.md) [Documentation](https://opensource.ripple.com/docs/xls-38d-cross-chain-bridge/cross-chain-bridges/) |
|
||||
| [OwnerPaysFee][] | [In Development: TBD]( "BADGE_LIGHTGREY") | |
|
||||
|
||||
**Tip:** This list is updated manually. If you're working on an amendment and have a private network to test the changes, you can edit this page to add your in-development amendment to this list. For more information on contributing to the XRP Ledger, see [Contribute Code to the XRP Ledger](contribute-code-flow.html).
|
||||
@@ -193,11 +193,30 @@ See [Clawback](https://opensource.ripple.com/docs/clawback/clawback-of-issued-cu
|
||||
| Amendment | XChainBridge |
|
||||
|:-------------|:-----------------|
|
||||
| Amendment ID | C98D98EE9616ACD36E81FDEB8D41D349BF5F1B41DD64A0ABC1FE9AA5EA267E9C |
|
||||
| Status | In Development |
|
||||
| Status | Open for Voting |
|
||||
| Default Vote (Latest stable release) | No |
|
||||
| Pre-amendment functionality retired? | No |
|
||||
|
||||
Adds "cross-chain bridges" for synchronizing assets between different networks, such as Mainnet and a sidechain. Standards draft: [XLS-38d Cross-Chain Bridge](https://github.com/XRPLF/XRPL-Standards/blob/master/XLS-38d-XChainBridge/README.md).
|
||||
Adds cross-chain bridges, enabling the transfer of digital assets between networks, such as Mainnet and a sidechain.
|
||||
|
||||
Adds new transactions:
|
||||
|
||||
- XChainAccountCreateCommit - Create a new account for a witness server to submit transactions on an issuing chain..
|
||||
- XChainAddAccountCreateAttestation - Provide an attestation that an account was created for a witness server to use.
|
||||
- XChainAddClaimAttestation - Provide an attestation that assets were locked on a locking chain.
|
||||
- XChainClaim - Claim assets on the destination chain.
|
||||
- XChainCommit - Locks assets on the locking chain.
|
||||
- XChainCreateBridge - Create a bridge ledger object.
|
||||
- XChainCreateClaimID - Create a new cross-chain claim ID that is used for a cross-chain transfer.
|
||||
- XChainModifyBridge - Modify the parameters of a bridge.
|
||||
|
||||
Adds new ledger entry types:
|
||||
|
||||
- Bridge - A single cross-chain bridge that connects the XRP Ledger with another blockchain.
|
||||
- XChainOwnedClaimID - A cross-chain transfer of value that includes information of the account on the source chain that locks or burns the funds on the source chain.
|
||||
- XChainOwnedCreateAccountClaimID - Collects attestations for creating an account via a cross-chain transfer.
|
||||
|
||||
Adds several new transaction result codes.
|
||||
|
||||
|
||||
### CryptoConditions
|
||||
|
||||
@@ -17,6 +17,7 @@ If you don't [run your own `rippled` server](install-rippled.html), you can use
|
||||
| Ripple[¹][] | Testnet | `https://s.altnet.rippletest.net:51234/` | `wss://s.altnet.rippletest.net:51233/` | Testnet public server |
|
||||
| XRPL Labs | Testnet | `https://testnet.xrpl-labs.com/` | `wss://testnet.xrpl-labs.com/` | Testnet public server with CORS support |
|
||||
| Ripple[¹][] | Devnet | `https://s.devnet.rippletest.net:51234/` | `wss://s.devnet.rippletest.net:51233/` | Devnet public server |
|
||||
| Ripple[¹][] | Sidechain-Devnet | `https://sidechain-net2.devnet.rippletest.net:51234/` | `wss://sidechain-net2.devnet.rippletest.net:51233/` | Sidechain Devnet to test cross-chain bridge features. Devnet serves as the locking chain while this sidechain serves as the issuing chain. |
|
||||
| XRPL Labs | Xahau Testnet | `https://xahau-test.net/` | `wss://xahau-test.net/` | [Hooks-enabled](https://hooks.xrpl.org/) Xahau Testnet |
|
||||
|
||||
[Network]: parallel-networks.html
|
||||
|
||||
8
content/tutorials/tasks/use-xrpl-sidechains/index.md
Normal file
8
content/tutorials/tasks/use-xrpl-sidechains/index.md
Normal file
@@ -0,0 +1,8 @@
|
||||
---
|
||||
html: use-xrpl-sidechains.html
|
||||
parent: tasks.html
|
||||
template: pagetype-category.html.jinja
|
||||
---
|
||||
# Use XRPL Sidechains
|
||||
|
||||
Bridge XRP and tokens from _Mainnet_ to XRPL sidechains.
|
||||
@@ -0,0 +1,168 @@
|
||||
---
|
||||
html: set-up-iou-iou-bridge.html
|
||||
parent: use-xrpl-sidechains.html
|
||||
blurb: Steps to set up an IOU-IOU bridge.
|
||||
labels:
|
||||
- Interoperability
|
||||
---
|
||||
# Set Up an IOU-IOU Bridge
|
||||
|
||||
_(Requires the [XChainBridge amendment][] :not_enabled:)_
|
||||
|
||||
Setting up an IOU-IOU bridge enables you to move tokens between chains.
|
||||
|
||||
**Note**: The code samples on this page illustrate how to bridge a hypotethical "TST" token from *Devnet* to *Sidechain-Devnet*, using a supported [client library](client-libraries.html) to query and submit transactions.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- An XRP-XRP bridge must be set up between the locking and issuing chain.
|
||||
- Ensure the witnesses' transaction submission accounts are funded on the locking and issuing chains.
|
||||
- Set up an issuer on the issuing chain to mint and burn a wrapped version of the token you want to bridge. See: [Issue a Fungible Token](issue-a-fungible-token.html)
|
||||
|
||||
## Steps
|
||||
|
||||
### 1. Connect to the locking chain (Devnet) and issuing chain (Sidechain-Devnet).
|
||||
|
||||
```javascript
|
||||
const xrpl = require('xrpl')
|
||||
|
||||
const WS_URL_lockingchain = 'wss://s.devnet.rippletest.net:51233/' // Locking chain
|
||||
const WS_URL_issuingchain = 'wss://sidechain-net2.devnet.rippletest.net:51233/' // Issuing chain
|
||||
|
||||
// Define the XChainBridge, using the "TST" token.
|
||||
const xchainbridge = {
|
||||
"LockingChainDoor": "rn895gh1MHnnAgL4hR9q464PJSFiYwQYcV",
|
||||
"LockingChainIssue": {
|
||||
"currency": "TST",
|
||||
"issuer": "rP9jPyP5kyvFRb6ZiRghAGw5u8SGAmU4bd"
|
||||
},
|
||||
"IssuingChainDoor": "ra1MsW5s6Qg4NXUAJVKw8f21ZghSYG1DQw", // Use the account issuing the wrapped token
|
||||
"IssuingChainIssue": {
|
||||
"currency": "TST",
|
||||
"issuer": "ra1MsW5s6Qg4NXUAJVKw8f21ZghSYG1DQw"
|
||||
}
|
||||
}
|
||||
|
||||
async function main() {
|
||||
// Define the network clients.
|
||||
const client_lockingchain = new xrpl.Client(WS_URL_lockingchain)
|
||||
await client_lockingchain.connect()
|
||||
|
||||
const client_issuingchain = new xrpl.Client(WS_URL_issuingchain)
|
||||
await client_issuingchain.connect()
|
||||
|
||||
// ... custom code goes here
|
||||
|
||||
// Disconnect when done (If you omit this, Node.js won't end the process)
|
||||
await client_lockingchain.disconnect()
|
||||
await client_issuingchain.disconnect()
|
||||
}
|
||||
|
||||
main()
|
||||
```
|
||||
|
||||
### 2. Submit an `XChainCreateBridge` transaction from the door account on the locking chain.
|
||||
|
||||
Don't include a `MinAccountCreateAmount` value.
|
||||
|
||||
```javascript
|
||||
const wallet_lockingchain = xrpl.Wallet.fromSeed('s████████████████████████████') // Locking chain door account
|
||||
const xchaincreatebridge_lockingchain = await client_lockingchain.submitAndWait({
|
||||
"TransactionType": "XChainCreateBridge",
|
||||
"Account": wallet_lockingchain.address,
|
||||
"XChainBridge": xchainbridge,
|
||||
"SignatureReward": 200
|
||||
}, {autofill: true, wallet: wallet_lockingchain})
|
||||
```
|
||||
|
||||
### 3. Submit a `SignerListSet` transaction from the door account on the locking chain.
|
||||
|
||||
```javascript
|
||||
const signerlistset_lockingchain = await client_lockingchain.submitAndWait({
|
||||
"TransactionType": "SignerListSet",
|
||||
"Account": wallet_lockingchain.address,
|
||||
"Fee": "12",
|
||||
"SignerQuorum": 2,
|
||||
// Use the witness servers' submitting accounts on the locking chain.
|
||||
"SignerEntries": [
|
||||
{
|
||||
"SignerEntry": {
|
||||
"Account": "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW",
|
||||
"SignerWeight": 1
|
||||
}
|
||||
},
|
||||
{
|
||||
"SignerEntry": {
|
||||
"Account": "rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v",
|
||||
"SignerWeight": 1
|
||||
}
|
||||
}
|
||||
]
|
||||
}, {autofill: true, wallet: wallet_lockingchain})
|
||||
```
|
||||
|
||||
### 4. Disable the master key on the locking chain's door account with an `AccountSet` transaction.
|
||||
|
||||
```javascript
|
||||
const disablekey_lockingchain = await client_lockingchain.submitAndWait({
|
||||
"TransactionType": "AccountSet",
|
||||
"Account": wallet_lockingchain.address,
|
||||
"SetFlag": 4
|
||||
}, {autofill: true, wallet: wallet_lockingchain})
|
||||
```
|
||||
|
||||
### 5. Submit an `XChainCreateBridge` transaction from the door account on the issuing chain.
|
||||
|
||||
Don't include a `MinAccountCreateAmount` value.
|
||||
|
||||
```javascript
|
||||
const wallet_issuingchain = xrpl.Wallet.fromSeed('s████████████████████████████') // The account issuing the wrapped token
|
||||
const xchaincreatebridge_issuingchain = await client_issuingchain.submitAndWait({
|
||||
"TransactionType": "XChainCreateBridge",
|
||||
"Account": wallet_issuingchain.address,
|
||||
"XChainBridge": xchainbridge,
|
||||
"SignatureReward": 200
|
||||
}, {autofill: true, wallet: wallet_issuingchain})
|
||||
```
|
||||
|
||||
### 6. Submit a `SignerListSet` transaction from the door account on the issuing chain.
|
||||
|
||||
```javascript
|
||||
const signerlistset_issuingchain = await client_issuingchain.submitAndWait({
|
||||
"TransactionType": "SignerListSet",
|
||||
"Account": wallet_issuingchain.address,
|
||||
"Fee": "12",
|
||||
"SignerQuorum": 2,
|
||||
// Use the witness servers' submitting accounts on the issuing chain.
|
||||
"SignerEntries": [
|
||||
{
|
||||
"SignerEntry": {
|
||||
"Account": "rD323VyRjgzzhY4bFpo44rmyh2neB5d8Mo",
|
||||
"SignerWeight": 1
|
||||
}
|
||||
},
|
||||
{
|
||||
"SignerEntry": {
|
||||
"Account": "rJMfWNVbyjcCtds8kpoEjEbYQ41J5B6MUd",
|
||||
"SignerWeight": 1
|
||||
}
|
||||
}
|
||||
]
|
||||
}, {autofill: true, wallet: wallet_issuingchain})
|
||||
```
|
||||
|
||||
### 7. Disable the master key on the issuing chain's door account with an `AccountSet` transaction.
|
||||
|
||||
```javascript
|
||||
const disablekey_issuingchain = await client_issuingchain.submitAndWait({
|
||||
"TransactionType": "AccountSet",
|
||||
"Account": wallet_issuingchain.address,
|
||||
"SetFlag": 4
|
||||
}, {autofill: true, wallet: wallet_issuingchain})
|
||||
```
|
||||
|
||||
|
||||
<!--{# common link defs #}-->
|
||||
{% include '_snippets/rippled-api-links.md' %}
|
||||
{% include '_snippets/tx-type-links.md' %}
|
||||
{% include '_snippets/rippled_versions.md' %}
|
||||
@@ -0,0 +1,234 @@
|
||||
---
|
||||
html: set-up-xrp-xrp-bridge.html
|
||||
parent: use-xrpl-sidechains.html
|
||||
blurb: Steps to create an XRP-XRP bridge with a new sidechain.
|
||||
labels:
|
||||
- Interoperability
|
||||
---
|
||||
# Set Up an XRP-XRP Bridge
|
||||
|
||||
_(Requires the [XChainBridge amendment][] :not_enabled:)_
|
||||
|
||||
Setting up an XRP-XRP bridge enables you to move XRP between chains. The set up requires using the genesis account on the issuing chain as a door account to submit attestations and create transaction submission accounts for witnesses.
|
||||
|
||||
**Note**: The code samples on this page illustrate how a bridge was set up between *Devnet* and *Sidechain-Devnet*, using a supported [client library](client-libraries.html) to query and submit transactions. This bridge is already created, so the process can't be reproduced on these networks.
|
||||
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- The issuing chain is set up and active. Validators must be running and successfully closing ledgers.
|
||||
- The witnesses' accounts on the locking chain are funded, so they can submit transactions.
|
||||
- A door account for the bridge exists on the locking chain.
|
||||
|
||||
|
||||
## Steps
|
||||
|
||||
### 1. Connect to the locking chain (Devnet) and issuing chain (Sidechain-Devnet).
|
||||
|
||||
```javascript
|
||||
const xrpl = require('xrpl')
|
||||
|
||||
const WS_URL_lockingchain = 'wss://s.devnet.rippletest.net:51233/' // Locking chain
|
||||
const WS_URL_issuingchain = 'wss://sidechain-net2.devnet.rippletest.net:51233/' // Issuing chain
|
||||
|
||||
// Define the XChainBridge
|
||||
const xchainbridge = {
|
||||
"LockingChainDoor": "rnQAXXWoFNN6PEqwqsdTngCtFPCrmfuqFJ", // Locking chain door account
|
||||
"LockingChainIssue": {
|
||||
"currency": "XRP"
|
||||
},
|
||||
"IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", // Use the genesis address hardcoded in rippled
|
||||
"IssuingChainIssue": {
|
||||
"currency": "XRP"
|
||||
}
|
||||
}
|
||||
|
||||
async function main() {
|
||||
// Define the network clients.
|
||||
const client_lockingchain = new xrpl.Client(WS_URL_lockingchain)
|
||||
await client_lockingchain.connect()
|
||||
|
||||
const client_issuingchain = new xrpl.Client(WS_URL_issuingchain)
|
||||
await client_issuingchain.connect()
|
||||
|
||||
// ... custom code goes here
|
||||
|
||||
// Disconnect when done (If you omit this, Node.js won't end the process)
|
||||
await client_lockingchain.disconnect()
|
||||
await client_issuingchain.disconnect()
|
||||
}
|
||||
|
||||
main()
|
||||
```
|
||||
|
||||
### 2. Submit an `XChainCreateBridge` transaction from the door account on the locking chain.
|
||||
|
||||
```javascript
|
||||
const wallet_lockingchain = xrpl.Wallet.fromSeed('s████████████████████████████') // Locking chain door account
|
||||
const xchaincreatebridge_lockingchain = await client_lockingchain.submitAndWait({
|
||||
"TransactionType": "XChainCreateBridge",
|
||||
"Account": wallet_lockingchain.address,
|
||||
"XChainBridge": xchainbridge,
|
||||
"SignatureReward": 200,
|
||||
"MinAccountCreateAmount": 1000000 // This value should at least be equal to the account reserve on the issuing chain.
|
||||
}, {autofill: true, wallet: wallet_lockingchain})
|
||||
```
|
||||
|
||||
### 3. Submit a `SignerListSet` transaction from the door account on the locking chain.
|
||||
|
||||
```javascript
|
||||
const signerlistset_lockingchain = await client_lockingchain.submitAndWait({
|
||||
"TransactionType": "SignerListSet",
|
||||
"Account": wallet_lockingchain.address,
|
||||
"Fee": "12",
|
||||
"SignerQuorum": 2,
|
||||
// Use the witness servers' submitting accounts on the locking chain.
|
||||
"SignerEntries": [
|
||||
{
|
||||
"SignerEntry": {
|
||||
"Account": "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW",
|
||||
"SignerWeight": 1
|
||||
}
|
||||
},
|
||||
{
|
||||
"SignerEntry": {
|
||||
"Account": "rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v",
|
||||
"SignerWeight": 1
|
||||
}
|
||||
}
|
||||
]
|
||||
}, {autofill: true, wallet: wallet_lockingchain})
|
||||
```
|
||||
|
||||
### 4. Disable the master key on the locking chain's door account with an `AccountSet` transaction.
|
||||
|
||||
```javascript
|
||||
const disablekey_lockingchain = await client_lockingchain.submitAndWait({
|
||||
"TransactionType": "AccountSet",
|
||||
"Account": wallet_lockingchain.address,
|
||||
"SetFlag": 4
|
||||
}, {autofill: true, wallet: wallet_lockingchain})
|
||||
```
|
||||
|
||||
### 5. Submit an `XChainCreateBridge` transaction from the genesis account on the issuing chain.
|
||||
|
||||
```javascript
|
||||
const wallet_issuingchain = xrpl.Wallet.fromSeed('snoPBrXtMeMyMHUVTgbuqAfg1SUTb') // Use the genesis secret hardcoded in rippled.
|
||||
const xchaincreatebridge_issuingchain = await client_issuingchain.submitAndWait({
|
||||
"TransactionType": "XChainCreateBridge",
|
||||
"Account": wallet_issuingchain.address,
|
||||
"XChainBridge": xchainbridge,
|
||||
"SignatureReward": 200,
|
||||
"MinAccountCreateAmount": 1000000
|
||||
}, {autofill: true, wallet: wallet_issuingchain})
|
||||
```
|
||||
|
||||
### 6. Submit `XChainAccountCreateCommit` transactions from the witnesses' locking chain accounts to create corresponding accounts on the issuing chain.
|
||||
|
||||
```javascript
|
||||
const wallet_witness_1 = xrpl.Wallet.fromSeed('s████████████████████████████') // Witness server 1 from `SignerListSet`: rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW
|
||||
const wallet_witness_2 = xrpl.Wallet.fromSeed('s████████████████████████████') // Witness server 2 from `SignerListSet`: rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v
|
||||
|
||||
const xchainaccountcreatecommit_witness_1 = await client_lockingchain.submitAndWait({
|
||||
"TransactionType": "XChainAccountCreateCommit",
|
||||
"Account": wallet_witness_1.address,
|
||||
"Destination": "rD323VyRjgzzhY4bFpo44rmyh2neB5d8Mo", // The account to create and fund for witness 1 on the issuing chain.
|
||||
"TransactionType": "XChainAccountCreateCommit",
|
||||
"Amount": "20000000",
|
||||
"SignatureReward": "100",
|
||||
"XChainBridge": xchainbridge
|
||||
}, {autofill: true, wallet: wallet_witness_1})
|
||||
|
||||
const xchainaccountcreatecommit_witness_2 = await client_lockingchain.submitAndWait({
|
||||
"TransactionType": "XChainAccountCreateCommit",
|
||||
"Account": wallet_witness_2.address,
|
||||
"Destination": "rJMfWNVbyjcCtds8kpoEjEbYQ41J5B6MUd", // The account to create and fund for witness 2 on the issuing chain.
|
||||
"TransactionType": "XChainAccountCreateCommit",
|
||||
"Amount": "20000000",
|
||||
"SignatureReward": "100",
|
||||
"XChainBridge": xchainbridged
|
||||
}, {autofill: true, wallet: wallet_witness_1})
|
||||
```
|
||||
|
||||
### 7. Submit attestations for each `XChainAccountCreateCommit` transaction.
|
||||
|
||||
Use the `XChainAddAccountCreateAttestation` transaction to submit each attestation on the issuing chain. Sign these transactions with the genesis account on the issuing chain.
|
||||
|
||||
```javascript
|
||||
// Witness 1 attestation
|
||||
const xchainaddaccountcreateattestation_witness_1 = await client_issuingchain.submitAndWait({
|
||||
"TransactionType": "XChainAddAccountCreateAttestation",
|
||||
"Account": wallet_issuingchain.address,
|
||||
"OtherChainSource": wallet_witness_1.address,
|
||||
"Destination": "rD323VyRjgzzhY4bFpo44rmyh2neB5d8Mo",
|
||||
"Amount": "2000000000",
|
||||
"PublicKey": wallet_witness_1.publicKey,
|
||||
"Signature": xchainaccountcreatecommit_witness_1.result.TxnSignature,
|
||||
"WasLockingChainSend": 1,
|
||||
"AttestationRewardAccount": "rD323VyRjgzzhY4bFpo44rmyh2neB5d8Mo",
|
||||
"AttestationSignerAccount": wallet_witness_1.address,
|
||||
"XChainAccountCreateCount": "1",
|
||||
"SignatureReward": "204",
|
||||
"XChainBridge": xchainbridge,
|
||||
"Fee": "20"
|
||||
}, {autofill: true, wallet: wallet_issuingchain})
|
||||
|
||||
// Witness 2 attestation
|
||||
const xchainaddaccountcreateattestation_witness_2 = await client_issuingchain.submitAndWait({
|
||||
"TransactionType": "XChainAddAccountCreateAttestation",
|
||||
"Account": wallet_issuingchain.address,
|
||||
"OtherChainSource": wallet_witness_2.address,
|
||||
"Destination": "rJMfWNVbyjcCtds8kpoEjEbYQ41J5B6MUd",
|
||||
"Amount": "2000000000",
|
||||
"PublicKey": wallet_witness_2.publicKey,
|
||||
"Signature": xchainaccountcreatecommit_witness_2.result.TxnSignature,
|
||||
"WasLockingChainSend": 1,
|
||||
"AttestationRewardAccount": "rJMfWNVbyjcCtds8kpoEjEbYQ41J5B6MUd",
|
||||
"AttestationSignerAccount": wallet_witness_2.address,
|
||||
"XChainAccountCreateCount": "1",
|
||||
"SignatureReward": "204",
|
||||
"XChainBridge": xchainbridge,
|
||||
"Fee": "20"
|
||||
}, {autofill: true, wallet: wallet_issuingchain})
|
||||
```
|
||||
|
||||
### 8. Submit a `SignerListSet` transaction from the genesis account on the issuing chain.
|
||||
|
||||
```javascript
|
||||
const signerlistset_issuingchain = await client_issuingchain.submitAndWait({
|
||||
"TransactionType": "SignerListSet",
|
||||
"Account": wallet_issuingchain.address,
|
||||
"Fee": "12",
|
||||
"SignerQuorum": 2,
|
||||
// Use the witness servers' submitting accounts on the issuing chain created in step 7
|
||||
"SignerEntries": [
|
||||
{
|
||||
"SignerEntry": {
|
||||
"Account": "rD323VyRjgzzhY4bFpo44rmyh2neB5d8Mo",
|
||||
"SignerWeight": 1
|
||||
}
|
||||
},
|
||||
{
|
||||
"SignerEntry": {
|
||||
"Account": "rJMfWNVbyjcCtds8kpoEjEbYQ41J5B6MUd",
|
||||
"SignerWeight": 1
|
||||
}
|
||||
}
|
||||
]
|
||||
}, {autofill: true, wallet: wallet_issuingchain})
|
||||
```
|
||||
|
||||
### 9. Disable the master key on the issuing chain's genesis account with an `AccountSet` transaction.
|
||||
|
||||
```javascript
|
||||
const disablekey_issuingchain = await client_issuingchain.submitAndWait({
|
||||
"TransactionType": "AccountSet",
|
||||
"Account": wallet_issuingchain.address,
|
||||
"SetFlag": 4
|
||||
}, {autofill: true, wallet: wallet_issuingchain})
|
||||
```
|
||||
|
||||
<!--{# common link defs #}-->
|
||||
{% include '_snippets/rippled-api-links.md' %}
|
||||
{% include '_snippets/tx-type-links.md' %}
|
||||
{% include '_snippets/rippled_versions.md' %}
|
||||
@@ -0,0 +1,136 @@
|
||||
---
|
||||
html: submit-cross-chain-transactions.html
|
||||
parent: use-xrpl-sidechains.html
|
||||
blurb: Steps to submit a cross-chain transaction, using a bridge.
|
||||
labels:
|
||||
- Interoperability
|
||||
---
|
||||
# Submit Cross-chain Transactions
|
||||
|
||||
_(Requires the [XChainBridge amendment][] :not_enabled:)_
|
||||
|
||||
This tutorial explains how to create a test account on a locking chain (_Devent_), and transfer XRP to an issuing chain (_Sidechain-Devnet_), using a supported [client library](client-libraries.html) to query and submit transactions. Witness servers are already set up to monitor the XRP-XRP bridge and submit attestations.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- The locking and issuing chains are both up and running.
|
||||
- The witness servers are up and running.
|
||||
- Set up the XRP-XRP bridge.
|
||||
|
||||
|
||||
## Steps
|
||||
|
||||
### 1. Connect to the locking chain (Devnet) and issuing chain (Sidechain-Devnet).
|
||||
|
||||
```javascript
|
||||
const xrpl = require('xrpl')
|
||||
|
||||
const WS_URL_lockingchain = 'wss://s.devnet.rippletest.net:51233/' // Locking chain
|
||||
const WS_URL_issuingchain = 'wss://sidechain-net2.devnet.rippletest.net:51233/' // Issuing chain
|
||||
|
||||
// Define the XChainBridge
|
||||
const xchainbridge = {
|
||||
"LockingChainDoor": "rnQAXXWoFNN6PEqwqsdTngCtFPCrmfuqFJ", // Locking chain door account
|
||||
"LockingChainIssue": {
|
||||
"currency": "XRP"
|
||||
},
|
||||
"IssuingChainDoor": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", // Use the genesis address hardcoded in rippled
|
||||
"IssuingChainIssue": {
|
||||
"currency": "XRP"
|
||||
}
|
||||
}
|
||||
|
||||
async function main() {
|
||||
// Define the network clients.
|
||||
const client_lockingchain = new xrpl.Client(WS_URL_lockingchain)
|
||||
await client_lockingchain.connect()
|
||||
|
||||
const client_issuingchain = new xrpl.Client(WS_URL_issuingchain)
|
||||
await client_issuingchain.connect()
|
||||
|
||||
// ... custom code goes here
|
||||
|
||||
// Disconnect when done (If you omit this, Node.js won't end the process)
|
||||
await client_lockingchain.disconnect()
|
||||
await client_issuingchain.disconnect()
|
||||
}
|
||||
|
||||
main()
|
||||
```
|
||||
|
||||
### 2. Fund a wallet on Devnet and generate a wallet address for Sidechain-Devnet.
|
||||
|
||||
```javascript
|
||||
// Create a wallet and fund it using the XRP faucet on Devnet.
|
||||
const wallet_lockingchain = (await client_lockingchain.fundWallet()).wallet
|
||||
console.log(wallet_lockingchain.address)
|
||||
|
||||
// Generate a wallet to create and fund on the issuing chain.
|
||||
const wallet_issuingchain = await xrpl.Wallet.generate()
|
||||
console.log(wallet_issuingchain.address)
|
||||
```
|
||||
|
||||
### 3. Submit an `XChainAccountCreateCommit` transaction from the Devnet wallet.
|
||||
|
||||
```javascript
|
||||
const createwallet_issuingchain = await client_lockingchain.submitAndWait({
|
||||
"TransactionType": "XChainAccountCreateCommit",
|
||||
"Account": wallet_lockingchain.address,
|
||||
"Destination": wallet_issuingchain.address,
|
||||
"XChainBridge": xchainbridge,
|
||||
"SignatureReward": "100",
|
||||
"Amount": "5000000000"
|
||||
}, {autofill: true, wallet: wallet_lockingchain})
|
||||
```
|
||||
|
||||
### 4. Create a claim ID with `XChainCreateClaimID`, using your account on the issuing chain.
|
||||
|
||||
```javascript
|
||||
const createclaim = await client_issuingchain.submitAndWait({
|
||||
"TransactionType": "XChainCreateClaimID",
|
||||
"Account": wallet_issuingchain.address,
|
||||
"OtherChainSource": wallet_lockingchain.address,
|
||||
"SignatureReward": "100",
|
||||
"XChainBridge": xchainbridge
|
||||
}, {autofill: true, wallet: wallet_issuingchain})
|
||||
```
|
||||
|
||||
### 5. Retrieve the claim ID from the transaction metadata.
|
||||
|
||||
```javascript
|
||||
let metadata = createclaim.result.meta.AffectedNodes
|
||||
|
||||
let claimnode = null;
|
||||
|
||||
for (const item of metadata) {
|
||||
if (item.CreatedNode && item.CreatedNode.LedgerEntryType === 'XChainOwnedClaimID') {
|
||||
claimnode = item.CreatedNode
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
const claimID = claimnode.NewFields.XChainClaimID
|
||||
```
|
||||
|
||||
### 6. Submit an `XChainCommit` transaction with the claim ID, using your account on the locking chain.
|
||||
|
||||
If you don't specify an "OtherChainDestination", the account that submitted the `XChainCreateClaimID` transaction needs to submit an `XChainClaim` transaction to claim the funds.
|
||||
|
||||
```javascript
|
||||
const xchaincommit = await client_lockingchain.submitAndWait({
|
||||
"TransactionType": "XChainCommit",
|
||||
"Account": wallet_lockingchain.address,
|
||||
"OtherChainDestination": wallet_issuingchain.address,
|
||||
"Amount": "10000",
|
||||
"XChainBridge": xchainbridge,
|
||||
"XChainClaimID": claimID
|
||||
}, {autofill: true, wallet: wallet_lockingchain})
|
||||
```
|
||||
|
||||
**Note:** When enough `XChainAddClaimAttestation` signatures are submitted by the witness servers to reach quorum, the funds are released on the issuing chain to the `OtherChainDestination`.
|
||||
|
||||
|
||||
<!--{# common link defs #}-->
|
||||
{% include '_snippets/rippled-api-links.md' %}
|
||||
{% include '_snippets/tx-type-links.md' %}
|
||||
{% include '_snippets/rippled_versions.md' %}
|
||||
@@ -1535,6 +1535,23 @@ pages:
|
||||
- ja
|
||||
|
||||
|
||||
# XRPL Sidechains -----------------------------------------------------------
|
||||
|
||||
- md: concepts/xrpl-sidechains/index.md
|
||||
targets:
|
||||
- en
|
||||
- ja
|
||||
|
||||
- md: concepts/xrpl-sidechains/cross-chain-bridges.md
|
||||
targets:
|
||||
- en
|
||||
- ja
|
||||
|
||||
- md: concepts/xrpl-sidechains/witness-servers.md
|
||||
targets:
|
||||
- en
|
||||
- ja
|
||||
|
||||
|
||||
# Tutorials --------------------------------------------------------------------
|
||||
|
||||
@@ -2273,6 +2290,29 @@ pages:
|
||||
- en
|
||||
- ja
|
||||
|
||||
# Use XRPL Sidechains ----------------------------------------------------------
|
||||
|
||||
- md: tutorials/tasks/use-xrpl-sidechains/index.md
|
||||
targets:
|
||||
- en
|
||||
- ja
|
||||
|
||||
- md: tutorials/tasks/use-xrpl-sidechains/set-up-xrp-xrp-bridge.md
|
||||
targets:
|
||||
- en
|
||||
- ja
|
||||
|
||||
- md: tutorials/tasks/use-xrpl-sidechains/set-up-iou-iou-bridge.md
|
||||
targets:
|
||||
- en
|
||||
- ja
|
||||
|
||||
- md: tutorials/tasks/use-xrpl-sidechains/submit-cross-chain-transaction.md
|
||||
targets:
|
||||
- en
|
||||
- ja
|
||||
|
||||
|
||||
# References -------------------------------------------------------------------
|
||||
|
||||
- name: References
|
||||
@@ -2413,6 +2453,11 @@ pages:
|
||||
targets:
|
||||
- ja
|
||||
|
||||
- md: references/protocol/ledger-data/ledger-entry-types/bridge.md
|
||||
targets:
|
||||
- en
|
||||
- ja
|
||||
|
||||
- md: references/protocol/ledger-data/ledger-entry-types/check.md
|
||||
targets:
|
||||
- en
|
||||
@@ -2525,6 +2570,16 @@ pages:
|
||||
targets:
|
||||
- ja
|
||||
|
||||
- md: references/protocol/ledger-data/ledger-entry-types/xchainownedclaimid.md
|
||||
targets:
|
||||
- en
|
||||
- ja
|
||||
|
||||
- md: references/protocol/ledger-data/ledger-entry-types/xchainownedcreateaccountclaimid.md
|
||||
targets:
|
||||
- en
|
||||
- ja
|
||||
|
||||
- md: references/protocol/transactions/index.md
|
||||
targets:
|
||||
- en
|
||||
@@ -2799,6 +2854,46 @@ pages:
|
||||
targets:
|
||||
- ja
|
||||
|
||||
- md: references/protocol/transactions/types/xchainaccountcreatecommit.md
|
||||
targets:
|
||||
- en
|
||||
- ja
|
||||
|
||||
- md: references/protocol/transactions/types/xchainaddaccountcreateattestation.md
|
||||
targets:
|
||||
- en
|
||||
- ja
|
||||
|
||||
- md: references/protocol/transactions/types/xchainaddclaimattestation.md
|
||||
targets:
|
||||
- en
|
||||
- ja
|
||||
|
||||
- md: references/protocol/transactions/types/xchainclaim.md
|
||||
targets:
|
||||
- en
|
||||
- ja
|
||||
|
||||
- md: references/protocol/transactions/types/xchaincommit.md
|
||||
targets:
|
||||
- en
|
||||
- ja
|
||||
|
||||
- md: references/protocol/transactions/types/xchaincreatebridge.md
|
||||
targets:
|
||||
- en
|
||||
- ja
|
||||
|
||||
- md: references/protocol/transactions/types/xchaincreateclaimid.md
|
||||
targets:
|
||||
- en
|
||||
- ja
|
||||
|
||||
- md: references/protocol/transactions/types/xchainmodifybridge.md
|
||||
targets:
|
||||
- en
|
||||
- ja
|
||||
|
||||
- md: references/protocol/transactions/pseudo-transaction-types/pseudo-transaction-types.md
|
||||
targets:
|
||||
- en
|
||||
@@ -2909,6 +3004,7 @@ pages:
|
||||
- en
|
||||
|
||||
- md: "@i18n/ja/references/protocol/binary-format.md"
|
||||
outdated_translation: true
|
||||
targets:
|
||||
- ja
|
||||
|
||||
|
||||
195
img/serialization-xchainbridge.svg
Normal file
195
img/serialization-xchainbridge.svg
Normal file
@@ -0,0 +1,195 @@
|
||||
<?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="1100" stroke-miterlimit="10" shape-rendering="auto" stroke-opacity="1" fill="black" stroke-dasharray="none" font-weight="normal" stroke-width="1" viewBox="30 10 1100 340" height="340" 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 80 L260 80 L260 0 Z"
|
||||
/></clipPath
|
||||
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath3"
|
||||
><path d="M0 0 L0 30 L270 30 L270 0 Z"
|
||||
/></clipPath
|
||||
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath4"
|
||||
><path d="M0 0 L0 30 L250 30 L250 0 Z"
|
||||
/></clipPath
|
||||
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath5"
|
||||
><path d="M0 0 L0 30 L210 30 L210 0 Z"
|
||||
/></clipPath
|
||||
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath6"
|
||||
><path d="M0 0 L0 30 L40 30 L40 0 Z"
|
||||
/></clipPath
|
||||
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath7"
|
||||
><path d="M0 0 L0 40 L270 40 L270 0 Z"
|
||||
/></clipPath
|
||||
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath8"
|
||||
><path d="M0 0 L0 50 L620 50 L620 0 Z"
|
||||
/></clipPath
|
||||
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath9"
|
||||
><path d="M0 0 L0 30 L240 30 L240 0 Z"
|
||||
/></clipPath
|
||||
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath10"
|
||||
><path d="M0 0 L0 50 L1050 50 L1050 0 Z"
|
||||
/></clipPath
|
||||
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath11"
|
||||
><path d="M0 0 L0 30 L160 30 L160 0 Z"
|
||||
/></clipPath
|
||||
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath12"
|
||||
><path d="M0 0 L0 30 L280 30 L280 0 Z"
|
||||
/></clipPath
|
||||
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath13"
|
||||
><path d="M0 0 L0 30 L310 30 L310 0 Z"
|
||||
/></clipPath
|
||||
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath14"
|
||||
><path d="M0 0 L0 70 L60 70 L60 0 Z"
|
||||
/></clipPath
|
||||
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath15"
|
||||
><path d="M0 0 L0 70 L250 70 L250 0 Z"
|
||||
/></clipPath
|
||||
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath16"
|
||||
><path d="M0 0 L0 160 L30 160 L30 0 Z"
|
||||
/></clipPath
|
||||
><clipPath clipPathUnits="userSpaceOnUse" id="clipPath17"
|
||||
><path d="M0 0 L0 160 L400 160 L400 0 Z"
|
||||
/></clipPath
|
||||
></defs
|
||||
><g fill="rgb(255,255,0)" fill-opacity="0.4902" transform="translate(170,210)" stroke-opacity="0.4902" stroke="rgb(255,255,0)"
|
||||
><path d="M0.5 0.5 L248.5 0.5 L259 12.5 L259 79 L0.5 79 Z" stroke="none" clip-path="url(#clipPath2)"
|
||||
/></g
|
||||
><g transform="translate(170,210)"
|
||||
><path fill="none" d="M0.5 0.5 L248.5 0.5 L259 12.5 L259 79 L0.5 79 Z" clip-path="url(#clipPath2)"
|
||||
/><path fill="none" d="M248.5 0.5 L248.5 12.5 L259 12.5" clip-path="url(#clipPath2)"
|
||||
/><text x="5" font-size="14px" y="18.1094" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" font-weight="bold" xml:space="preserve"
|
||||
>Note:</text
|
||||
><text x="5" font-size="14px" y="34.2188" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" xml:space="preserve"
|
||||
>Unlike in Object and Array fields,</text
|
||||
><text x="5" font-size="14px" y="50.3281" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" xml:space="preserve"
|
||||
>the nested STIssue types here do</text
|
||||
><text x="5" font-size="14px" y="66.4375" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" xml:space="preserve"
|
||||
>not begin with a Field ID.</text
|
||||
></g
|
||||
><g font-family="sans-serif" font-size="14px" transform="translate(810,290)"
|
||||
><text x="5" xml:space="preserve" y="18.1094" clip-path="url(#clipPath3)" stroke="none"
|
||||
>Omitted if the currency code is all 0's</text
|
||||
></g
|
||||
><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(840,70)" stroke-opacity="0" stroke="rgb(255,255,255)"
|
||||
><rect x="0.5" width="248.5" height="28.5" y="0.5" clip-path="url(#clipPath4)" stroke="none"
|
||||
/></g
|
||||
><g transform="translate(840,70)"
|
||||
><rect fill="none" x="0.5" width="248.5" height="28.5" y="0.5" clip-path="url(#clipPath4)"
|
||||
/><text x="57" font-size="14px" y="18.1094" clip-path="url(#clipPath4)" font-family="sans-serif" stroke="none" xml:space="preserve"
|
||||
>Issuing Chain Issue</text
|
||||
></g
|
||||
><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(620,70)" stroke-opacity="0" stroke="rgb(255,255,255)"
|
||||
><rect x="0.5" width="208.5" height="28.5" y="0.5" clip-path="url(#clipPath5)" stroke="none"
|
||||
/></g
|
||||
><g transform="translate(620,70)"
|
||||
><rect fill="none" x="0.5" width="208.5" height="28.5" y="0.5" clip-path="url(#clipPath5)"
|
||||
/><text x="5" font-size="14px" y="18.1094" clip-path="url(#clipPath5)" font-family="sans-serif" stroke="none" xml:space="preserve"
|
||||
>Issuing chain door (160 bits)</text
|
||||
></g
|
||||
><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(580,70)" stroke-opacity="0" stroke="rgb(255,255,255)"
|
||||
><rect x="0.5" width="38.5" height="28.5" y="0.5" clip-path="url(#clipPath6)" stroke="none"
|
||||
/></g
|
||||
><g transform="translate(580,70)"
|
||||
><rect fill="none" x="0.5" width="38.5" height="28.5" y="0.5" clip-path="url(#clipPath6)"
|
||||
/><text x="2" font-size="14px" y="18.1094" clip-path="url(#clipPath6)" font-family="sans-serif" stroke="none" xml:space="preserve"
|
||||
>0x14</text
|
||||
></g
|
||||
><g font-family="sans-serif" font-size="14px" transform="translate(100,120)"
|
||||
><text x="5" xml:space="preserve" y="18.1094" clip-path="url(#clipPath7)" stroke="none"
|
||||
>Door account length prefixes (8 bits)</text
|
||||
><text x="5" xml:space="preserve" y="34.2188" clip-path="url(#clipPath7)" stroke="none"
|
||||
>Always 0x14</text
|
||||
></g
|
||||
><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(60,70)" stroke-opacity="0" stroke="rgb(255,255,255)"
|
||||
><rect x="0.5" width="38.5" height="28.5" y="0.5" clip-path="url(#clipPath6)" stroke="none"
|
||||
/></g
|
||||
><g transform="translate(60,70)"
|
||||
><rect fill="none" x="0.5" width="38.5" height="28.5" y="0.5" clip-path="url(#clipPath6)"
|
||||
/><text x="2" font-size="14px" y="18.1094" clip-path="url(#clipPath6)" font-family="sans-serif" stroke="none" xml:space="preserve"
|
||||
>0x14</text
|
||||
></g
|
||||
><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(320,70)" stroke-opacity="0" stroke="rgb(255,255,255)"
|
||||
><rect x="0.5" width="248.5" height="28.5" y="0.5" clip-path="url(#clipPath4)" stroke="none"
|
||||
/></g
|
||||
><g transform="translate(320,70)"
|
||||
><rect fill="none" x="0.5" width="248.5" height="28.5" y="0.5" clip-path="url(#clipPath4)"
|
||||
/><text x="55" font-size="14px" y="18.1094" clip-path="url(#clipPath4)" font-family="sans-serif" stroke="none" xml:space="preserve"
|
||||
>Locking Chain Issue</text
|
||||
></g
|
||||
><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(100,70)" stroke-opacity="0" stroke="rgb(255,255,255)"
|
||||
><rect x="0.5" width="208.5" height="28.5" y="0.5" clip-path="url(#clipPath5)" stroke="none"
|
||||
/></g
|
||||
><g transform="translate(100,70)"
|
||||
><rect fill="none" x="0.5" width="208.5" height="28.5" y="0.5" clip-path="url(#clipPath5)"
|
||||
/><text x="2" font-size="14px" y="18.1094" clip-path="url(#clipPath5)" font-family="sans-serif" stroke="none" xml:space="preserve"
|
||||
>Locking chain door (160 bits)</text
|
||||
></g
|
||||
><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(470,230)" stroke-opacity="0" stroke="rgb(255,255,255)"
|
||||
><rect x="0.5" width="618.5" height="48.5" y="0.5" clip-path="url(#clipPath8)" stroke="none"
|
||||
/></g
|
||||
><g transform="translate(470,230)"
|
||||
><rect fill="none" x="0.5" width="618.5" height="48.5" y="0.5" clip-path="url(#clipPath8)"
|
||||
/></g
|
||||
><g font-family="sans-serif" font-size="14px" transform="translate(580,200)"
|
||||
><text x="5" xml:space="preserve" y="18.1094" clip-path="url(#clipPath9)" stroke="none"
|
||||
>STIssue Format</text
|
||||
></g
|
||||
><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(50,60)" stroke-opacity="0" stroke="rgb(255,255,255)"
|
||||
><rect x="0.5" width="1048.5" height="48.5" y="0.5" clip-path="url(#clipPath10)" stroke="none"
|
||||
/></g
|
||||
><g transform="translate(50,60)"
|
||||
><rect fill="none" x="0.5" width="1048.5" height="48.5" y="0.5" clip-path="url(#clipPath10)"
|
||||
/></g
|
||||
><g font-family="sans-serif" font-size="14px" transform="translate(50,30)"
|
||||
><text x="5" xml:space="preserve" y="18.1094" clip-path="url(#clipPath11)" stroke="none"
|
||||
>XChainBridge Format</text
|
||||
></g
|
||||
><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(480,240)" stroke-opacity="0" stroke="rgb(255,255,255)"
|
||||
><rect x="0.5" width="278.5" height="28.5" y="0.5" clip-path="url(#clipPath12)" stroke="none"
|
||||
/></g
|
||||
><g transform="translate(480,240)"
|
||||
><rect fill="none" x="0.5" width="278.5" height="28.5" y="0.5" clip-path="url(#clipPath12)"
|
||||
/><text x="53" font-size="14px" y="18.1094" clip-path="url(#clipPath12)" font-family="sans-serif" stroke="none" xml:space="preserve"
|
||||
>Currency code (160 bits)</text
|
||||
></g
|
||||
><g fill="rgb(255,255,255)" fill-opacity="0" transform="translate(770,240)" stroke-opacity="0" stroke="rgb(255,255,255)"
|
||||
><rect x="0.5" width="308.5" height="28.5" y="0.5" clip-path="url(#clipPath13)" stroke="none"
|
||||
/></g
|
||||
><g stroke-dasharray="8,5" stroke-miterlimit="5" transform="translate(770,240)" stroke-linecap="butt"
|
||||
><rect fill="none" x="0.5" width="308.5" height="28.5" y="0.5" clip-path="url(#clipPath13)"
|
||||
/><text x="59" font-size="14px" y="18.1094" clip-path="url(#clipPath13)" font-family="sans-serif" stroke="none" xml:space="preserve"
|
||||
>Issuer AccountID (160 bits)</text
|
||||
></g
|
||||
><g transform="translate(770,260)"
|
||||
><path fill="none" d="M10.5 11.5 L10.5 50.5" clip-path="url(#clipPath14)"
|
||||
/><path fill="none" d="M10.5 50.5 L40.5 50.5" clip-path="url(#clipPath14)"
|
||||
/><path fill="white" d="M4 22.2583 L10.5 11 L17 22.2583 Z" clip-path="url(#clipPath14)" stroke="none"
|
||||
/><path fill="none" d="M4 22.2583 L10.5 11 L17 22.2583 Z" clip-path="url(#clipPath14)"
|
||||
/></g
|
||||
><g transform="translate(360,90)"
|
||||
><path fill="none" d="M230.5 11.5 L230.5 50.5" clip-path="url(#clipPath15)"
|
||||
/><path fill="none" d="M230.5 50.5 L10.5 50.5" clip-path="url(#clipPath15)"
|
||||
/><path fill="white" d="M224 22.2583 L230.5 11 L237 22.2583 Z" clip-path="url(#clipPath15)" stroke="none"
|
||||
/><path fill="none" d="M224 22.2583 L230.5 11 L237 22.2583 Z" clip-path="url(#clipPath15)"
|
||||
/></g
|
||||
><g transform="translate(60,90)"
|
||||
><path fill="none" d="M10.5 11.5 L10.5 50.5" clip-path="url(#clipPath14)"
|
||||
/><path fill="none" d="M10.5 50.5 L40.5 50.5" clip-path="url(#clipPath14)"
|
||||
/><path fill="white" d="M4 22.2583 L10.5 11 L17 22.2583 Z" clip-path="url(#clipPath14)" stroke="none"
|
||||
/><path fill="none" d="M4 22.2583 L10.5 11 L17 22.2583 Z" clip-path="url(#clipPath14)"
|
||||
/></g
|
||||
><g stroke-dasharray="1,2" stroke-miterlimit="5" transform="translate(1080,90)" stroke-linecap="butt"
|
||||
><path fill="none" d="M10.5 140.5 L10.5 10.5" clip-path="url(#clipPath16)"
|
||||
/></g
|
||||
><g stroke-dasharray="1,2" stroke-miterlimit="5" transform="translate(460,90)" stroke-linecap="butt"
|
||||
><path fill="none" d="M10.5 140.5 L380.5 10.5" clip-path="url(#clipPath17)"
|
||||
/></g
|
||||
></g
|
||||
></svg
|
||||
>
|
||||
|
After Width: | Height: | Size: 12 KiB |
@@ -136,6 +136,13 @@
|
||||
"shortname": "Devnet",
|
||||
"longname": "s.devnet.rippletest.net (Devnet Public Cluster)"
|
||||
},
|
||||
{
|
||||
"id": "wstool-1-connection-sidechain-devnet",
|
||||
"ws_url": "wss://sidechain-net2.devnet.rippletest.net:51233/",
|
||||
"jsonrpc_url": "https://sidechain-net2.devnet.rippletest.net:51234/",
|
||||
"shortname": "Sidechain-Devnet",
|
||||
"longname": "sidechain-net2.devnet.rippletest.net (Issuing Sidechain Devnet Public Cluster)"
|
||||
},
|
||||
{
|
||||
"id": "wstool-1-connection-localhost",
|
||||
"ws_url": "ws://localhost:6006/",
|
||||
|
||||
Reference in New Issue
Block a user