mirror of
https://github.com/XRPLF/xrpl-dev-portal.git
synced 2025-11-05 04:15:50 +00:00
Merge branch 'master' into ka_20250718
This commit is contained in:
@@ -16,8 +16,6 @@ top_nav_grouping: 人気ページ
|
|||||||
|
|
||||||
そしてAPIコールを効率的に処理し、P2Pモードで動作している`rippled`サーバの負荷を軽減することができます。
|
そしてAPIコールを効率的に処理し、P2Pモードで動作している`rippled`サーバの負荷を軽減することができます。
|
||||||
|
|
||||||
[{% inline-svg file="/docs/img/reporting-mode-basic-architecture.svg" /%}](/docs/img/reporting-mode-basic-architecture.svg "図 1: レポートモードでの`rippled`の動作")
|
|
||||||
|
|
||||||
`rippled`のレポートモードでは2種類のデータストアを使用します。
|
`rippled`のレポートモードでは2種類のデータストアを使用します。
|
||||||
|
|
||||||
* トランザクションのメタデータ、アカウントの状態、レジャーのヘッダーを含む`rippled`のプライマリ永続データストア。プライマリ永続データストアとしてNuDB(ソースに付属)または[Cassandra](https://cassandra.apache.org/)を使用できます。Cassandraを使用する場合、複数のレポートモードサーバが単一のCassandraインスタンスまたはクラスター内のデータへのアクセスを共有できます。
|
* トランザクションのメタデータ、アカウントの状態、レジャーのヘッダーを含む`rippled`のプライマリ永続データストア。プライマリ永続データストアとしてNuDB(ソースに付属)または[Cassandra](https://cassandra.apache.org/)を使用できます。Cassandraを使用する場合、複数のレポートモードサーバが単一のCassandraインスタンスまたはクラスター内のデータへのアクセスを共有できます。
|
||||||
|
|||||||
@@ -11,11 +11,11 @@ labels:
|
|||||||
|
|
||||||
Linuxでは、`rippled`が1回限りの`cron`構成を使用して最新バージョンに自動的にアップグレードされるように設定できます。可能であれば自動更新を有効にしておくことが推奨されます。
|
Linuxでは、`rippled`が1回限りの`cron`構成を使用して最新バージョンに自動的にアップグレードされるように設定できます。可能であれば自動更新を有効にしておくことが推奨されます。
|
||||||
|
|
||||||
以下の手順では、`rippled`が[`yum`リポジトリから(CentOS/RedHat)](install-rippled-on-centos-rhel-with-yum.md)、または[`apt`(Ubuntu/Debian)を使用して](install-rippled-on-ubuntu.md)インストールされていることを前提としています。
|
以下の手順では、`rippled`が[`yum`リポジトリから(CentOS/RedHat)](install-rippled-on-rhel.md)、または[`apt`(Ubuntu/Debian)を使用して](install-rippled-on-ubuntu.md)インストールされていることを前提としています。
|
||||||
|
|
||||||
自動更新を設定するには、以下の手順に従います。
|
自動更新を設定するには、以下の手順に従います。
|
||||||
|
|
||||||
1. `/opt/ripple/etc/update-rippled-cron`が存在することを確認します。存在しない場合は、([CentOS/Red Hat](update-rippled-manually-on-centos-rhel.md)または[Ubuntu/Debian](update-rippled-manually-on-ubuntu.md)を)手動で更新します。
|
1. `/opt/ripple/etc/update-rippled-cron`が存在することを確認します。存在しない場合は、([CentOS/Red Hat](update-rippled-manually-on-rhel.md)または[Ubuntu/Debian](update-rippled-manually-on-ubuntu.md)を)手動で更新します。
|
||||||
|
|
||||||
2. `cron.d`フォルダーに、`/opt/ripple/etc/update-rippled-cron`構成ファイルへのsymlinkを作成します。
|
2. `cron.d`フォルダーに、`/opt/ripple/etc/update-rippled-cron`構成ファイルへのsymlinkを作成します。
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ labels:
|
|||||||
|
|
||||||
このページでは、CentOSまたはRed Hat Enterprise Linuxで最新リリースの`rippled`に手動で更新する手順を説明します。可能であれば手動更新ではなく[自動更新](update-rippled-automatically-on-linux.md)を設定することが推奨されます。
|
このページでは、CentOSまたはRed Hat Enterprise Linuxで最新リリースの`rippled`に手動で更新する手順を説明します。可能であれば手動更新ではなく[自動更新](update-rippled-automatically-on-linux.md)を設定することが推奨されます。
|
||||||
|
|
||||||
以下の手順は、[`rippled`がすでに`yum`リポジトリからインストール](install-rippled-on-centos-rhel-with-yum.md)されていることを前提としています。
|
以下の手順は、[`rippled`がすでに`yum`リポジトリからインストール](install-rippled-on-rhel.md)されていることを前提としています。
|
||||||
|
|
||||||
{% admonition type="success" name="ヒント" %}これらの手順をすべて一度に実行するには、`rippled`パッケージに含まれている`/opt/ripple/bin/update-rippled.sh`スクリプトを実行します。このスクリプトは`sudo`ユーザとして実行する必要があります。{% /admonition %}
|
{% admonition type="success" name="ヒント" %}これらの手順をすべて一度に実行するには、`rippled`パッケージに含まれている`/opt/ripple/bin/update-rippled.sh`スクリプトを実行します。このスクリプトは`sudo`ユーザとして実行する必要があります。{% /admonition %}
|
||||||
|
|
||||||
@@ -178,10 +178,10 @@ Automated Market Makers: 自動マーケットメイカー
|
|||||||
Smart contracts to provide liquidity and earn passive income from facilitating currency exchange, complementary with the order-book DEX already built into the XRPL.: XRPLに組み込み済みのオーダーブックDEXと相互に補完する、流動性を提供し、通貨交換を促進することで受動的な収入を得るためのスマートコントラクト。
|
Smart contracts to provide liquidity and earn passive income from facilitating currency exchange, complementary with the order-book DEX already built into the XRPL.: XRPLに組み込み済みのオーダーブックDEXと相互に補完する、流動性を提供し、通貨交換を促進することで受動的な収入を得るためのスマートコントラクト。
|
||||||
Enabled: 利用可能
|
Enabled: 利用可能
|
||||||
Non-Fungible Tokens: 非代替性トークン
|
Non-Fungible Tokens: 非代替性トークン
|
||||||
# Join the Community: XRPL.orgの
|
"Join the Community ": XRPL.orgの
|
||||||
# at XRPL.org: コミュニティに参加
|
" at XRPL.org": コミュニティに参加
|
||||||
'Connect at XRPL.org, a community by and for the developers ': XRPL.orgは、XRPLを利用する開発者と
|
'Connect at XRPL.org, a community by and for the developers ': XRPL.orgは、XRPLを利用する開発者と
|
||||||
' and entrepeneurs who rely on the XRPL.': 起業家のためのコミュニティです。
|
' and entrepreneurs who rely on the XRPL.': 起業家のためのコミュニティです。
|
||||||
Get Involved: 参加する
|
Get Involved: 参加する
|
||||||
|
|
||||||
# about/index.page.tsx
|
# about/index.page.tsx
|
||||||
@@ -571,7 +571,17 @@ Showcase your blockchain project, application, or product: あなたのブロッ
|
|||||||
Get featured on the Developer Reflections blog or Ecosystem page, and amplify your innovation within the blockchain community.: 開発者向けブログやエコシステムのページで紹介され、ブロックチェーンコミュニティ内でのイノベーションを広めましょう。
|
Get featured on the Developer Reflections blog or Ecosystem page, and amplify your innovation within the blockchain community.: 開発者向けブログやエコシステムのページで紹介され、ブロックチェーンコミュニティ内でのイノベーションを広めましょう。
|
||||||
Submit Your Projects: プロジェクトを登録
|
Submit Your Projects: プロジェクトを登録
|
||||||
# TODO: translate project-cards
|
# TODO: translate project-cards
|
||||||
View Projects: プロジェクトを見る
|
RippleX Bug Bounty Program: RippleXのバグ報奨金プログラム
|
||||||
|
community.index.security.subtitle-1: XRP Ledgerのセキュリティへの
|
||||||
|
community.index.security.subtitle-2: 貢献
|
||||||
|
RippleX’s Bug Bounty, part of Ripple's 1 Billion XRP pledge, strengthens XRP Ledger security and supports its ecosystem.: RippleXのバグ報奨金は、Rippleの10億XRPの誓約の一環で、XRP Ledgerのセキュリティを強化し、そのエコシステムをサポートします。
|
||||||
|
community.index.security.description-1: このプログラムを利用して RippleX/rippled のバグを報告してください。該当するバグの詳細なレポートを
|
||||||
|
community.index.security.description-2: 宛に送信し、
|
||||||
|
community.index.security.description-3: 公開鍵
|
||||||
|
community.index.security.description-4: を使用してください。
|
||||||
|
Report a Scam: 詐欺の報告
|
||||||
|
Report Scams to Safeguard Our Community: コミュニティの安全のため、詐欺情報を報告してください
|
||||||
|
In an evolving industry where trust and security are critical, scams continue to impede progress in crypto and blockchain. Help mitigate scammers by reporting scams.: 信頼とセキュリティが極めて重要な進化を続ける業界において、詐欺行為は暗号資産やブロックチェーン技術の発展を妨げ続けています。被害を軽減するため、詐欺行為の報告にご協力ください。
|
||||||
Contribute to Consensus: コンセンサスへの貢献
|
Contribute to Consensus: コンセンサスへの貢献
|
||||||
Run an XRP Ledger network node: XRP Ledgerのノードを実行する
|
Run an XRP Ledger network node: XRP Ledgerのノードを実行する
|
||||||
Thank you for your interest in contributing to XRP Ledger.: XRP Ledgerへの貢献に興味がありますか?
|
Thank you for your interest in contributing to XRP Ledger.: XRP Ledgerへの貢献に興味がありますか?
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Create, claim and verify a Payment Channel.
|
* Create, claim and verify a Payment Channel.
|
||||||
* Reference: https://xrpl.org/paychannel.html
|
* Reference: https://xrpl.org/docs/references/protocol/ledger-data/ledger-entry-types/paychannel
|
||||||
*/
|
*/
|
||||||
import {
|
import {
|
||||||
AccountObjectsRequest,
|
AccountObjectsRequest,
|
||||||
@@ -12,13 +12,11 @@ import {
|
|||||||
|
|
||||||
const client = new Client('wss://s.altnet.rippletest.net:51233')
|
const client = new Client('wss://s.altnet.rippletest.net:51233')
|
||||||
|
|
||||||
void claimPayChannel()
|
|
||||||
|
|
||||||
// The snippet walks us through creating and claiming a Payment Channel.
|
// The snippet walks us through creating and claiming a Payment Channel.
|
||||||
async function claimPayChannel(): Promise<void> {
|
async function claimPayChannel(): Promise<void> {
|
||||||
await client.connect()
|
await client.connect()
|
||||||
|
|
||||||
// creating wallets as prerequisite
|
// Creating wallets as prerequisite
|
||||||
const { wallet: wallet1 } = await client.fundWallet()
|
const { wallet: wallet1 } = await client.fundWallet()
|
||||||
const { wallet: wallet2 } = await client.fundWallet()
|
const { wallet: wallet2 } = await client.fundWallet()
|
||||||
|
|
||||||
@@ -26,13 +24,13 @@ async function claimPayChannel(): Promise<void> {
|
|||||||
console.log(`Balance of ${wallet1.address} is ${await client.getXrpBalance(wallet1.address)} XRP`)
|
console.log(`Balance of ${wallet1.address} is ${await client.getXrpBalance(wallet1.address)} XRP`)
|
||||||
console.log(`Balance of ${wallet2.address} is ${await client.getXrpBalance(wallet2.address)} XRP`)
|
console.log(`Balance of ${wallet2.address} is ${await client.getXrpBalance(wallet2.address)} XRP`)
|
||||||
|
|
||||||
// create a Payment Channel and submit and wait for tx to be validated
|
// Create a Payment Channel and submit and wait for tx to be validated
|
||||||
const paymentChannelCreate: PaymentChannelCreate = {
|
const paymentChannelCreate: PaymentChannelCreate = {
|
||||||
TransactionType: 'PaymentChannelCreate',
|
TransactionType: 'PaymentChannelCreate',
|
||||||
Account: wallet1.classicAddress,
|
Account: wallet1.classicAddress,
|
||||||
Amount: '100',
|
Amount: '100', // 10 XRP
|
||||||
Destination: wallet2.classicAddress,
|
Destination: wallet2.classicAddress,
|
||||||
SettleDelay: 86400,
|
SettleDelay: 86400, // 1 day in seconds
|
||||||
PublicKey: wallet1.publicKey,
|
PublicKey: wallet1.publicKey,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -44,7 +42,7 @@ async function claimPayChannel(): Promise<void> {
|
|||||||
console.log("PaymentChannelCreate transaction response:")
|
console.log("PaymentChannelCreate transaction response:")
|
||||||
console.log(paymentChannelResponse)
|
console.log(paymentChannelResponse)
|
||||||
|
|
||||||
// check that the object was actually created
|
// Check that the object was actually created
|
||||||
const accountObjectsRequest: AccountObjectsRequest = {
|
const accountObjectsRequest: AccountObjectsRequest = {
|
||||||
command: 'account_objects',
|
command: 'account_objects',
|
||||||
account: wallet1.classicAddress,
|
account: wallet1.classicAddress,
|
||||||
@@ -52,25 +50,23 @@ async function claimPayChannel(): Promise<void> {
|
|||||||
|
|
||||||
const accountObjects = (await client.request(accountObjectsRequest)).result
|
const accountObjects = (await client.request(accountObjectsRequest)).result
|
||||||
.account_objects
|
.account_objects
|
||||||
|
|
||||||
console.log("Account Objects:", accountObjects)
|
console.log("Account Objects:", accountObjects)
|
||||||
|
|
||||||
// destination claims the Payment Channel and we see the balances to verify.
|
// Destination claims the Payment Channel and we see the balances to verify.
|
||||||
const paymentChannelClaim: PaymentChannelClaim = {
|
const paymentChannelClaim: PaymentChannelClaim = {
|
||||||
Account: wallet2.classicAddress,
|
Account: wallet2.classicAddress,
|
||||||
TransactionType: 'PaymentChannelClaim',
|
TransactionType: 'PaymentChannelClaim',
|
||||||
Channel: hashes.hashPaymentChannel(
|
Channel: hashes.hashPaymentChannel(
|
||||||
wallet1.classicAddress,
|
wallet1.classicAddress,
|
||||||
wallet2.classicAddress,
|
wallet2.classicAddress,
|
||||||
paymentChannelResponse.result.Sequence ?? 0,
|
paymentChannelResponse.result.tx_json.Sequence ?? 0,
|
||||||
),
|
),
|
||||||
Amount: '100',
|
Amount: '100',
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log("Submitting a PaymentChannelClaim transaction...")
|
console.log("Submitting a PaymentChannelClaim transaction...")
|
||||||
|
|
||||||
const channelClaimResponse = await client.submit(paymentChannelClaim, {
|
const channelClaimResponse = await client.submit(paymentChannelClaim, {
|
||||||
wallet: wallet1,
|
wallet: wallet2,
|
||||||
})
|
})
|
||||||
console.log("PaymentChannelClaim transaction response:")
|
console.log("PaymentChannelClaim transaction response:")
|
||||||
console.log(channelClaimResponse)
|
console.log(channelClaimResponse)
|
||||||
@@ -81,3 +77,5 @@ async function claimPayChannel(): Promise<void> {
|
|||||||
|
|
||||||
await client.disconnect()
|
await client.disconnect()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void claimPayChannel()
|
||||||
|
|||||||
85
_code-samples/claim-payment-channel/py/claim_pay_channel.py
Normal file
85
_code-samples/claim-payment-channel/py/claim_pay_channel.py
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
"""
|
||||||
|
Create, claim and verify a Payment Channel.
|
||||||
|
Reference: https://xrpl.org/docs/references/protocol/ledger-data/ledger-entry-types/paychannel
|
||||||
|
"""
|
||||||
|
from xrpl.clients import JsonRpcClient
|
||||||
|
from xrpl.models import (
|
||||||
|
AccountObjects,
|
||||||
|
PaymentChannelCreate,
|
||||||
|
PaymentChannelClaim,
|
||||||
|
)
|
||||||
|
from xrpl.wallet import generate_faucet_wallet
|
||||||
|
from xrpl.transaction import submit, submit_and_wait
|
||||||
|
from xrpl.account import get_balance
|
||||||
|
|
||||||
|
|
||||||
|
"""The snippet walks us through creating and claiming a Payment Channel."""
|
||||||
|
|
||||||
|
client = JsonRpcClient("https://s.altnet.rippletest.net:51234")
|
||||||
|
|
||||||
|
# Creating wallets as prerequisite
|
||||||
|
print("Setting up wallets...")
|
||||||
|
wallet1 = generate_faucet_wallet(client)
|
||||||
|
wallet2 = generate_faucet_wallet(client)
|
||||||
|
|
||||||
|
print("Balances of wallets before Payment Channel is claimed:")
|
||||||
|
print(f"Balance of {wallet1.address} is {get_balance(wallet1.address, client)} XRP")
|
||||||
|
print(f"Balance of {wallet2.address} is {get_balance(wallet2.address, client)} XRP")
|
||||||
|
|
||||||
|
# Create a Payment Channel and submit and wait for tx to be validated
|
||||||
|
payment_channel_create = PaymentChannelCreate(
|
||||||
|
account=wallet1.address,
|
||||||
|
amount="100", # 10 XRP
|
||||||
|
destination=wallet2.address,
|
||||||
|
settle_delay=86400, # 1 day in seconds
|
||||||
|
public_key=wallet1.public_key,
|
||||||
|
)
|
||||||
|
|
||||||
|
print("\nSubmitting a PaymentChannelCreate transaction...")
|
||||||
|
payment_channel_response = submit_and_wait(
|
||||||
|
payment_channel_create,
|
||||||
|
client,
|
||||||
|
wallet1
|
||||||
|
)
|
||||||
|
print("PaymentChannelCreate transaction response:")
|
||||||
|
print(payment_channel_response.result)
|
||||||
|
|
||||||
|
# Check that the object was actually created
|
||||||
|
account_objects_request = AccountObjects(
|
||||||
|
account=wallet1.address,
|
||||||
|
)
|
||||||
|
account_objects_response = client.request(account_objects_request)
|
||||||
|
account_objects = account_objects_response.result["account_objects"]
|
||||||
|
|
||||||
|
# Find the PayChannel object to get the correct channel ID
|
||||||
|
channel_id = None
|
||||||
|
if 'meta' in payment_channel_response.result and 'AffectedNodes' in payment_channel_response.result['meta']:
|
||||||
|
for node in payment_channel_response.result["meta"]["AffectedNodes"]:
|
||||||
|
if 'CreatedNode' in node and node["CreatedNode"]["LedgerEntryType"] == 'PayChannel':
|
||||||
|
channel_id = node['CreatedNode']['LedgerIndex']
|
||||||
|
break
|
||||||
|
|
||||||
|
if not channel_id:
|
||||||
|
raise Exception("Payment Channel ID not found in the response.")
|
||||||
|
|
||||||
|
print(f"Payment Channel ID: {channel_id}")
|
||||||
|
|
||||||
|
# Destination claims the Payment Channel and we see the balances to verify.
|
||||||
|
payment_channel_claim = PaymentChannelClaim(
|
||||||
|
account=wallet2.address,
|
||||||
|
channel=channel_id,
|
||||||
|
amount="100",
|
||||||
|
)
|
||||||
|
|
||||||
|
print("\nSubmitting a PaymentChannelClaim transaction...")
|
||||||
|
channel_claim_response = submit_and_wait(
|
||||||
|
payment_channel_claim,
|
||||||
|
client,
|
||||||
|
wallet2,
|
||||||
|
)
|
||||||
|
print("PaymentChannelClaim transaction response:")
|
||||||
|
print(channel_claim_response.result)
|
||||||
|
|
||||||
|
print("Balances of wallets after Payment Channel is claimed:")
|
||||||
|
print(f"Balance of {wallet1.address} is {get_balance(wallet1.address, client)} XRP")
|
||||||
|
print(f"Balance of {wallet2.address} is {get_balance(wallet2.address, client)} XRP")
|
||||||
@@ -14,15 +14,6 @@ const seed = "sEd7jfWyNG6J71dEojB3W9YdHp2KCjy";
|
|||||||
async function main() {
|
async function main() {
|
||||||
try {
|
try {
|
||||||
|
|
||||||
// Construct condition and fulfillment ------------------------------------
|
|
||||||
const preimageData = crypto.randomBytes(32);
|
|
||||||
const myFulfillment = new cc.PreimageSha256();
|
|
||||||
myFulfillment.setPreimage(preimageData);
|
|
||||||
const conditionHex = myFulfillment.getConditionBinary().toString('hex').toUpperCase();
|
|
||||||
|
|
||||||
console.log('Condition:', conditionHex);
|
|
||||||
console.log('Fulfillment:', myFulfillment.serializeBinary().toString('hex').toUpperCase());
|
|
||||||
|
|
||||||
// Connect ----------------------------------------------------------------
|
// Connect ----------------------------------------------------------------
|
||||||
const client = new xrpl.Client('wss://s.altnet.rippletest.net:51233');
|
const client = new xrpl.Client('wss://s.altnet.rippletest.net:51233');
|
||||||
await client.connect();
|
await client.connect();
|
||||||
@@ -37,16 +28,26 @@ async function main() {
|
|||||||
finishAfter = new Date(finishAfter * 1000);
|
finishAfter = new Date(finishAfter * 1000);
|
||||||
console.log("This escrow will finish after: ", finishAfter);
|
console.log("This escrow will finish after: ", finishAfter);
|
||||||
|
|
||||||
|
// Construct condition and fulfillment ------------------------------------
|
||||||
|
const preimageData = crypto.randomBytes(32);
|
||||||
|
const myFulfillment = new cc.PreimageSha256();
|
||||||
|
myFulfillment.setPreimage(preimageData);
|
||||||
|
const conditionHex = myFulfillment.getConditionBinary().toString('hex').toUpperCase();
|
||||||
|
|
||||||
|
console.log('Condition:', conditionHex);
|
||||||
|
console.log('Fulfillment:', myFulfillment.serializeBinary().toString('hex').toUpperCase());
|
||||||
|
|
||||||
|
// Prepare EscrowCreate transaction ------------------------------------
|
||||||
const escrowCreateTransaction = {
|
const escrowCreateTransaction = {
|
||||||
"TransactionType": "EscrowCreate",
|
"TransactionType": "EscrowCreate",
|
||||||
"Account": wallet.address,
|
"Account": wallet.address,
|
||||||
"Destination": wallet.address,
|
"Destination": wallet.address,
|
||||||
"Amount": "6000000", //drops XRP
|
"Amount": "6000000", //drops XRP
|
||||||
"DestinationTag": 2023,
|
"DestinationTag": 2023,
|
||||||
"Condition": conditionHex,
|
"Condition": conditionHex, // Omit this for time-held escrows
|
||||||
"Fee": "12",
|
"Fee": "12",
|
||||||
"FinishAfter": xrpl.isoTimeToRippleTime(finishAfter.toISOString()),
|
"FinishAfter": xrpl.isoTimeToRippleTime(finishAfter.toISOString()),
|
||||||
};
|
};
|
||||||
|
|
||||||
xrpl.validate(escrowCreateTransaction);
|
xrpl.validate(escrowCreateTransaction);
|
||||||
|
|
||||||
@@ -54,7 +55,7 @@ async function main() {
|
|||||||
console.log('Signing and submitting the transaction:',
|
console.log('Signing and submitting the transaction:',
|
||||||
JSON.stringify(escrowCreateTransaction, null, "\t"), "\n"
|
JSON.stringify(escrowCreateTransaction, null, "\t"), "\n"
|
||||||
);
|
);
|
||||||
const response = await client.submitAndWait(escrowCreateTransaction, { wallet });
|
const response = await client.submitAndWait(escrowCreateTransaction, { wallet });
|
||||||
console.log(`Sequence number: ${response.result.tx_json.Sequence}`);
|
console.log(`Sequence number: ${response.result.tx_json.Sequence}`);
|
||||||
console.log(`Finished submitting! ${JSON.stringify(response.result, null, "\t")}`);
|
console.log(`Finished submitting! ${JSON.stringify(response.result, null, "\t")}`);
|
||||||
|
|
||||||
|
|||||||
@@ -28,15 +28,18 @@ const main = async () => {
|
|||||||
throw new Error("Please specify the sequence number, condition and fulfillment of the escrow you created");
|
throw new Error("Please specify the sequence number, condition and fulfillment of the escrow you created");
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Prepare EscrowFinish transaction ---------------------------------
|
||||||
const escrowFinishTransaction = {
|
const escrowFinishTransaction = {
|
||||||
"Account": wallet.address,
|
"Account": wallet.address,
|
||||||
"TransactionType": "EscrowFinish",
|
"TransactionType": "EscrowFinish",
|
||||||
"Owner": wallet.address,
|
"Owner": wallet.address,
|
||||||
// This should equal the sequence number of the escrow transaction
|
// This should equal the sequence number of the escrow transaction
|
||||||
"OfferSequence": offerSequence,
|
"OfferSequence": offerSequence,
|
||||||
// Crypto condition that must be met before escrow can be completed, passed on escrow creation
|
// Crypto condition that must be met before escrow can be completed, passed on escrow creation.
|
||||||
|
// Omit this for time-held escrows.
|
||||||
"Condition": condition,
|
"Condition": condition,
|
||||||
// Fulfillment of the condition, passed on escrow creation
|
// Fulfillment of the condition, passed on escrow creation.
|
||||||
|
// Omit this for time-held escrows.
|
||||||
"Fulfillment": fulfillment,
|
"Fulfillment": fulfillment,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,11 @@ escrow_sequence = 30215126
|
|||||||
sender_wallet = generate_faucet_wallet(client=client)
|
sender_wallet = generate_faucet_wallet(client=client)
|
||||||
|
|
||||||
# Build escrow cancel transaction
|
# Build escrow cancel transaction
|
||||||
cancel_txn = EscrowCancel(account=sender_wallet.address, owner=sender_wallet.address, offer_sequence=escrow_sequence)
|
cancel_txn = EscrowCancel(
|
||||||
|
account=sender_wallet.address,
|
||||||
|
owner=sender_wallet.address,
|
||||||
|
offer_sequence=escrow_sequence
|
||||||
|
)
|
||||||
|
|
||||||
# Autofill, sign, then submit transaction and wait for result
|
# Autofill, sign, then submit transaction and wait for result
|
||||||
stxn_response = submit_and_wait(cancel_txn, client, sender_wallet)
|
stxn_response = submit_and_wait(cancel_txn, client, sender_wallet)
|
||||||
|
|||||||
@@ -34,7 +34,8 @@ create_txn = EscrowCreate(
|
|||||||
destination=receiver_addr,
|
destination=receiver_addr,
|
||||||
finish_after=claim_date,
|
finish_after=claim_date,
|
||||||
cancel_after=expiry_date,
|
cancel_after=expiry_date,
|
||||||
condition=condition)
|
condition=condition # Omit this for time-held escrows
|
||||||
|
)
|
||||||
|
|
||||||
# Autofill, sign, then submit transaction and wait for result
|
# Autofill, sign, then submit transaction and wait for result
|
||||||
stxn_response = submit_and_wait(create_txn, client, sender_wallet)
|
stxn_response = submit_and_wait(create_txn, client, sender_wallet)
|
||||||
|
|||||||
@@ -25,7 +25,13 @@ fulfillment = "A0228020AED2C5FE4D147D310D3CFEBD9BFA81AD0F63CE1ADD92E00379DDDAF8E
|
|||||||
sender_wallet = generate_faucet_wallet(client=client)
|
sender_wallet = generate_faucet_wallet(client=client)
|
||||||
|
|
||||||
# Build escrow finish transaction
|
# Build escrow finish transaction
|
||||||
finish_txn = EscrowFinish(account=sender_wallet.address, owner=escrow_creator, offer_sequence=escrow_sequence, condition=condition, fulfillment=fulfillment)
|
finish_txn = EscrowFinish(
|
||||||
|
account=sender_wallet.address,
|
||||||
|
owner=escrow_creator,
|
||||||
|
offer_sequence=escrow_sequence, # The sequence number of the escrow transaction
|
||||||
|
condition=condition, # Omit this for time-held escrows
|
||||||
|
fulfillment=fulfillment # Omit this for time-held escrows
|
||||||
|
)
|
||||||
|
|
||||||
# Autofill, sign, then submit transaction and wait for result
|
# Autofill, sign, then submit transaction and wait for result
|
||||||
stxn_response = submit_and_wait(finish_txn, client, sender_wallet)
|
stxn_response = submit_and_wait(finish_txn, client, sender_wallet)
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ async function multisigning(): Promise<void> {
|
|||||||
const { wallet: wallet1 } = await client.fundWallet()
|
const { wallet: wallet1 } = await client.fundWallet()
|
||||||
const { wallet: wallet2 } = await client.fundWallet()
|
const { wallet: wallet2 } = await client.fundWallet()
|
||||||
const { wallet: walletMaster } = await client.fundWallet()
|
const { wallet: walletMaster } = await client.fundWallet()
|
||||||
|
|
||||||
const signerListSet: SignerListSet = {
|
const signerListSet: SignerListSet = {
|
||||||
TransactionType: 'SignerListSet',
|
TransactionType: 'SignerListSet',
|
||||||
Account: walletMaster.classicAddress,
|
Account: walletMaster.classicAddress,
|
||||||
@@ -56,9 +57,14 @@ async function multisigning(): Promise<void> {
|
|||||||
const accountSetTx = await client.autofill(accountSet, 2)
|
const accountSetTx = await client.autofill(accountSet, 2)
|
||||||
console.log('AccountSet transaction is ready to be multisigned:')
|
console.log('AccountSet transaction is ready to be multisigned:')
|
||||||
console.log(accountSetTx)
|
console.log(accountSetTx)
|
||||||
|
|
||||||
const { tx_blob: tx_blob1 } = wallet1.sign(accountSetTx, true)
|
const { tx_blob: tx_blob1 } = wallet1.sign(accountSetTx, true)
|
||||||
const { tx_blob: tx_blob2 } = wallet2.sign(accountSetTx, true)
|
const { tx_blob: tx_blob2 } = wallet2.sign(accountSetTx, true)
|
||||||
const multisignedTx = multisign([tx_blob1, tx_blob2])
|
const multisignedTx = multisign([tx_blob1, tx_blob2])
|
||||||
|
|
||||||
|
console.log("Successfully multisigned the transaction")
|
||||||
|
console.log(multisignedTx)
|
||||||
|
|
||||||
const submitResponse = await client.submit(multisignedTx)
|
const submitResponse = await client.submit(multisignedTx)
|
||||||
|
|
||||||
if (submitResponse.result.engine_result === 'tesSUCCESS') {
|
if (submitResponse.result.engine_result === 'tesSUCCESS') {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
* Extract best paths from RipplePathFind to trade with and send a payment using paths.
|
* Extract best paths from RipplePathFind to trade with and send a payment using paths.
|
||||||
* Reference: https://xrpl.org/paths.html
|
* Reference: https://xrpl.org/paths.html
|
||||||
*/
|
*/
|
||||||
import { Client, Payment, RipplePathFindResponse } from 'xrpl'
|
import { Client, Payment, RipplePathFindResponse, RipplePathFindRequest } from 'xrpl'
|
||||||
|
|
||||||
const client = new Client('wss://s.altnet.rippletest.net:51233')
|
const client = new Client('wss://s.altnet.rippletest.net:51233')
|
||||||
|
|
||||||
@@ -17,7 +17,7 @@ async function createTxWithPaths(): Promise<void> {
|
|||||||
issuer: 'rVnYNK9yuxBz4uP8zC8LEFokM2nqH3poc',
|
issuer: 'rVnYNK9yuxBz4uP8zC8LEFokM2nqH3poc',
|
||||||
}
|
}
|
||||||
|
|
||||||
const request = {
|
const request: RipplePathFindRequest = {
|
||||||
command: 'ripple_path_find',
|
command: 'ripple_path_find',
|
||||||
source_account: wallet.classicAddress,
|
source_account: wallet.classicAddress,
|
||||||
source_currencies: [
|
source_currencies: [
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ const softwallets = [
|
|||||||
alt: "Gatehub",
|
alt: "Gatehub",
|
||||||
imgclasses: "invertible-img",
|
imgclasses: "invertible-img",
|
||||||
},
|
},
|
||||||
{ href: "https://gemwallet.com/", id: "wallet-gem", alt: "Gem Wallet" },
|
{ href: "https://gemwallet.app/", id: "wallet-gem", alt: "Gem Wallet" },
|
||||||
{ href: "https://coin.space/", id: "wallet-coin", alt: "Coin Space" },
|
{ href: "https://coin.space/", id: "wallet-coin", alt: "Coin Space" },
|
||||||
{ href: "https://crossmark.io/", id: "wallet-crossmark", alt: "Crossmark Wallet" },
|
{ href: "https://crossmark.io/", id: "wallet-crossmark", alt: "Crossmark Wallet" },
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -0,0 +1,79 @@
|
|||||||
|
---
|
||||||
|
category: 2025
|
||||||
|
date: "2025-07-23"
|
||||||
|
template: '../../@theme/templates/blogpost'
|
||||||
|
seo:
|
||||||
|
description: Learn how Frii Pay built a crypto payment solution on the XRP Ledger (XRPL). This case study details their journey, technical integration, and market impact.
|
||||||
|
labels:
|
||||||
|
- Case Study
|
||||||
|
markdown:
|
||||||
|
editPage:
|
||||||
|
hide: true
|
||||||
|
---
|
||||||
|
# Frii Pay & XRPL: Next-Gen Crypto Payment Solution
|
||||||
|
|
||||||
|
One of the promising players leveraging XRPL's payment capabilities is [Frii Pay](https://friipay.io/) — a crypto-native payment solution, focused on widening access to low-cost, [real-time digital payments](/docs/use-cases/payments) at point of sale, and introducing the benefits of blockchain finance to mainstream businesses and consumers alike.
|
||||||
|
|
||||||
|
This case study explores how Frii Pay utilizes XRPL technology, its value proposition, and the business interest and traction it has achieved, serving as a model for payment businesses building on the XRP Ledger (XRPL).
|
||||||
|
|
||||||
|
|
||||||
|
<!-- BREAK -->
|
||||||
|
|
||||||
|
<iframe width="560" height="315" src="https://www.youtube.com/embed/qEcuJCB1tXI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
|
||||||
|
|
||||||
|
## How Frii Pay Utilizes XRPL Technology for Payments
|
||||||
|
|
||||||
|
Frii Pay’s core infrastructure is purpose-built on the XRP Ledger, leveraging its decentralized, fast, and scalable blockchain environment to deliver seamless payment experiences.
|
||||||
|
|
||||||
|
### Key ways Frii Pay leverages XRPL
|
||||||
|
|
||||||
|
* **[Stablecoin Payments](/docs/use-cases/tokenization/stablecoin-issuer)**: Frii Pay issues and supports [multiple stablecoins](https://ripple.com/insights/the-rise-of-global-stablecoins-on-the-xrpl/) (e.g. RLUSD) directly on the XRPL, ensuring price-stable crypto payments while maintaining high transaction speed and low fees.
|
||||||
|
|
||||||
|
* **Instant Settlement Layer**: Utilizing XRPL's average settlement time of 3-5 seconds, Frii Pay enables real-time cross-border and domestic payments without intermediaries.
|
||||||
|
|
||||||
|
* **On-Ledger Tokenization**: Frii Pay uses [XRPL’s native tokenization features](/docs/use-cases/tokenization/real-world-assets) to issue coupons and loyalty rewards in the form of merchant-specific tokens or digital money, creating new and engaging consumer interactions by unlocking the programmable finance capabilities of the XRPL.
|
||||||
|
|
||||||
|
* **Real-time Currency Conversion**: Frii Pay utilizes the XRPL’s [Decentralized Exchange (DEX)](/docs/concepts/tokens/decentralized-exchange) to enable consumers to pay using any tradable currency in their wallet, while ensuring the merchant receives the exact currency and amount they have requested.
|
||||||
|
|
||||||
|
* **Compliance**: Frii Pay’s architecture incorporates XRPL’s compliance-ready infrastructure, facilitating KYC/AML-integrated payment rails that can interact with traditional financial systems to on and off ramp funds for all users.
|
||||||
|
|
||||||
|
|
||||||
|
## Benefits of XRPL for Payment Companies like Frii Pay
|
||||||
|
|
||||||
|
Frii Pay’s value proposition revolves around providing frictionless, stable, and cost-effective payment infrastructure to businesses, powered by XRPL.
|
||||||
|
|
||||||
|
In addition, the application leverages consumer spending data with the real-time, cross-border capabilities of XRPL to introduce new and interesting payment experiences that benefit merchants, consumers, and even brands.
|
||||||
|
|
||||||
|
Imagine spending $100 on a meal and having your $10 loyalty discount sent instantly to a wallet on the other side of the world to pay for a gift, medical treatment, or education.
|
||||||
|
|
||||||
|
|
||||||
|
### How XRPL Adds Value to Frii Pay’s Crypto Payment Solution
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Frii Pay abstracts blockchain complexity for businesses by providing merchant SDKs, customer-facing wallets, payment APIs, settlement & reconciliation dashboards. This allows merchants to accept crypto payments without technical blockchain expertise while tapping into XRPL’s efficiency. They have also expanded their solution to support payments online and via unattended kiosks.
|
||||||
|
|
||||||
|
## Frii Pay's Business Traction and Impact with XRPL
|
||||||
|
|
||||||
|
Since the launch of its XRPL-based payment ecosystem, Frii Pay has achieved significant traction.
|
||||||
|
|
||||||
|
Key results of the partnership include:
|
||||||
|
* **Payment Terminal Compatibility**: Frii Pay has developed its terminal software to be compatible with **50+ million existing card payment terminals worldwide**.
|
||||||
|
* **Merchants & Acquiring Bank Relationships**: Frii Pay has established relationships with a number of acquiring banks covering the UK and Europe to offer crypto acceptance, digital loyalty and digital couponing on XRPL alongside traditional card payments through existing POS terminals.
|
||||||
|
* **Merchant Network**: In the UK, Frii Pay has established a **network of over 900 merchants** who can accept crypto payments once regulation allows.
|
||||||
|
* **Consumer Engagement**: Frii Pay has initiated a program to educate **250 million university students worldwide** on using digital wallets and digital currencies.
|
||||||
|
* **Student POC Deployment**: Frii Pay has successfully launched a Proof-of-Concept (POC) with The University of Birmingham, providing students with a free mobile wallet powered by XRPL, offering coupons for free products, and loyalty discounts at merchants in and around the university campus. The service received **100% uptake** by their pilot cohort, who have been providing feedback to refine the solution and will open up to all **40,000 students** in the 2024-2025 academic year.
|
||||||
|
* **Merchant & Consumer Early Adopter Feedback Includes**:
|
||||||
|
* A smooth transaction experience – validation only takes 3-5 seconds.
|
||||||
|
* Interest in new methods to engage with each other, pay, and get paid.
|
||||||
|
* Enthusiasm for saving and spending in digital assets or other currencies.
|
||||||
|
* A need for lower transaction fees offered by XRPL compared to card networks.
|
||||||
|
* Immediate settlement (seconds instead of days).
|
||||||
|
* Increased customer engagement via loyalty rewards issued on XRPL.
|
||||||
|
|
||||||
|
## Driving Innovation in the Crypto Payment Ecosystem
|
||||||
|
|
||||||
|
Frii Pay illustrates the real-world use case of XRPL technology in payments. By building an accessible, stablecoin payment infrastructure on XRPL, Frii Pay has addressed the core challenges of legacy payment systems: cost, speed, transparency, and global reach.
|
||||||
|
|
||||||
|
To find out more about XRPL’s payment capabilities and start building, visit [XRP Ledger Developer Resources](https://xrpl.org/docs).
|
||||||
|
|
||||||
@@ -7,6 +7,7 @@
|
|||||||
expanded: false
|
expanded: false
|
||||||
items:
|
items:
|
||||||
- page: 2025/dynamicnft-enabled.md
|
- page: 2025/dynamicnft-enabled.md
|
||||||
|
- page: 2025/frii-pay-xrpl-case-study-crypto-payment-solution.md
|
||||||
- page: 2025/rippled-2.5.0.md
|
- page: 2025/rippled-2.5.0.md
|
||||||
- page: 2025/fixes-enabled-dnfts-expected.md
|
- page: 2025/fixes-enabled-dnfts-expected.md
|
||||||
- page: 2025/clio-2.4.1.md
|
- page: 2025/clio-2.4.1.md
|
||||||
|
|||||||
@@ -828,11 +828,9 @@ const CommunityPage: React.FC = () => {
|
|||||||
{translate("RippleX Bug Bounty Program")}
|
{translate("RippleX Bug Bounty Program")}
|
||||||
</h6>
|
</h6>
|
||||||
<h6 className="card-subtitle">
|
<h6 className="card-subtitle">
|
||||||
{translate(
|
{translate("community.index.security.subtitle-1", "Contribute to the XRP Ledger's")}
|
||||||
"Contribute to the XRP Ledger's"
|
|
||||||
)}
|
|
||||||
<br/>
|
<br/>
|
||||||
Security
|
{translate("community.index.security.subtitle-2", "Security")}
|
||||||
</h6>
|
</h6>
|
||||||
<p className="card-description">
|
<p className="card-description">
|
||||||
{translate(
|
{translate(
|
||||||
@@ -840,13 +838,16 @@ const CommunityPage: React.FC = () => {
|
|||||||
)}
|
)}
|
||||||
<p className="card-description">
|
<p className="card-description">
|
||||||
{
|
{
|
||||||
translate("Use this program to report bugs in RippleX/rippled. Send a detailed report of a qualifying bug to ")
|
translate("community.index.security.description-1", "Use this program to report bugs in RippleX/rippled. Send a detailed report of a qualifying bug to ")
|
||||||
|
}
|
||||||
|
<a href="mailto:bugs@ripple.com">bugs@ripple.com</a>
|
||||||
|
{
|
||||||
|
translate("community.index.security.description-2", " and use the ")
|
||||||
|
}
|
||||||
|
<a href="https://ripple.com/files/bug-bounty.asc">{translate("community.index.security.description-3", "Public Key.")}</a>
|
||||||
|
{
|
||||||
|
translate("community.index.security.description-4", " ")
|
||||||
}
|
}
|
||||||
<a href="mailto:bugs@ripple.com">bugs@ripple.com</a>
|
|
||||||
{
|
|
||||||
translate(" and use the ")
|
|
||||||
}
|
|
||||||
<a href="https://ripple.com/files/bug-bounty.asc">Public Key.</a>
|
|
||||||
</p>
|
</p>
|
||||||
</p>
|
</p>
|
||||||
<div className="card-links">
|
<div className="card-links">
|
||||||
|
|||||||
22
docs/_snippets/accepted-credentials-objects.md
Normal file
22
docs/_snippets/accepted-credentials-objects.md
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
Each member of the `AcceptedCredentials` array is an inner object named `Credential` with the following nested fields:
|
||||||
|
|
||||||
|
| Field | JSON Type | [Internal Type][] | Required? | Description |
|
||||||
|
|:-----------------|:---------------------|:------------------|:----------|--------------|
|
||||||
|
| `Issuer` | String - [Address][] | AccountID | Yes | The issuer of the credential. |
|
||||||
|
| `CredentialType` | String | Blob | Yes | The type of credential, as hexadecimal. This is an arbitrary value from 1 to 64 bytes that the issuer sets when they issue a credential. |
|
||||||
|
|
||||||
|
{% admonition type="info" name="Note" %}
|
||||||
|
In the usual JSON format, inner objects are wrapped in an object with one field, whose name defines the inner object type. In this case, the wrapping field is named `Credential`. For example:
|
||||||
|
|
||||||
|
```json
|
||||||
|
"AcceptedCredentials": [
|
||||||
|
{
|
||||||
|
"Credential": {
|
||||||
|
"Issuer": "ra5nK24KXen9AHvsdFTKHSANinZseWnPcX",
|
||||||
|
"CredentialType": "6D795F63726564656E7469616C"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// ... additional Credential inner objects ...
|
||||||
|
]
|
||||||
|
```
|
||||||
|
{% /admonition %}
|
||||||
@@ -129,7 +129,7 @@ _Figure 7: An XRP Ledger Server Calculates a Ledger Validation — Each server a
|
|||||||
|
|
||||||
Validators each relay their results in the form of a signed message containing the hash of the ledger version they calculated. These messages, called _validations_, allow each server to compare the ledger it computed with those of its peers.
|
Validators each relay their results in the form of a signed message containing the hash of the ledger version they calculated. These messages, called _validations_, allow each server to compare the ledger it computed with those of its peers.
|
||||||
|
|
||||||
[{% inline-svg file="/docs/img/consensus-declare-validation.svg" /%}](/docs/img/consensus-declare-validation.svg "Figure 8: Ledger is Validated When Supermajority of Peers Calculate the Same Result Result")
|
[{% inline-svg file="/docs/img/consensus-declare-validation.svg" /%}](/docs/img/consensus-declare-validation.svg "Figure 8: Ledger is Validated When Supermajority of Trusted Validators Calculate the Same Result Result")
|
||||||
|
|
||||||
_Figure 8: Ledger is Validated When Supermajority of Peers Calculate the Same Result — Each server compares its calculated ledger with the hashes received from its chosen validators. If not in agreement, the server must recalculate or retrieve the correct ledger._
|
_Figure 8: Ledger is Validated When Supermajority of Peers Calculate the Same Result — Each server compares its calculated ledger with the hashes received from its chosen validators. If not in agreement, the server must recalculate or retrieve the correct ledger._
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
---
|
---
|
||||||
html: clustering.html
|
|
||||||
parent: networks-and-servers.html
|
|
||||||
seo:
|
seo:
|
||||||
description: Run rippled servers in a cluster to share the load of cryptography between them.
|
description: Run rippled servers in a cluster to share the load of cryptography between them.
|
||||||
labels:
|
labels:
|
||||||
@@ -8,13 +6,13 @@ labels:
|
|||||||
---
|
---
|
||||||
# Clustering
|
# Clustering
|
||||||
|
|
||||||
If you are running multiple `rippled` servers in a single datacenter, you can configure those servers into a cluster to maximize efficiency. Running your `rippled` servers in a cluster provides the following benefits:
|
Clustering is a configuration operation for `rippled` servers that improves efficiency among mutually trusted servers. Clustering should only be used for servers that are located within the same datacenter and are operated by the same organization. Clustering provides the following benefits:
|
||||||
|
|
||||||
- Clustered `rippled` servers share the work of cryptography. If one server has verified the authenticity of a message, the other servers in the cluster trust it and do not re-verify.
|
- Clustered servers share the work of cryptography. If one server has verified the authenticity of a message, the other servers in the cluster trust it and do not re-verify.
|
||||||
- Clustered servers share information about peers and API clients that are misbehaving or abusing the network. This makes it harder to attack all servers of the cluster at once.
|
- Clustered servers share information about peers and API clients that are misbehaving or abusing the network. This makes it harder to attack all servers of the cluster at once.
|
||||||
- Clustered servers always propagate transactions throughout the cluster, even if the transaction does not meet the current load-based transaction fee on some of them.
|
- Clustered servers always propagate transactions throughout the cluster, even if the transaction does not meet the current load-based transaction fee on some of them.
|
||||||
|
|
||||||
If you are running a validator as a [private peer](peer-protocol.md#private-peers), Ripple recommends using a cluster of `rippled` servers as proxy servers.
|
If you are running a validator as a [private peer](peer-protocol.md#private-peers), it's recommended to run a cluster of servers as proxies, since a cluster is more resilient to failure than individual servers.
|
||||||
|
|
||||||
## See Also
|
## See Also
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
|
Before Width: | Height: | Size: 192 KiB |
@@ -1,371 +1,12 @@
|
|||||||
---
|
---
|
||||||
html: build-run-rippled-in-reporting-mode.html
|
|
||||||
parent: install-rippled.html
|
|
||||||
seo:
|
seo:
|
||||||
description: Build and run a special operating mode of rippled that handles remote procedure calls (RPC) for validated data.
|
description: Reporting mode was a rippled server build specialized for for API usage. It has been deprecated in favor of the Clio server.
|
||||||
labels:
|
status: removed
|
||||||
- Core Server
|
|
||||||
- Blockchain
|
|
||||||
top_nav_grouping: Popular Pages
|
|
||||||
---
|
---
|
||||||
# Build and Run `rippled` in Reporting Mode
|
# Build and Run `rippled` in Reporting Mode
|
||||||
|
|
||||||
[Reporting mode](../../concepts/networks-and-servers/rippled-server-modes.md) is a mode of the XRP Ledger core server specialized for serving [HTTP and WebSocket APIs](../../references/http-websocket-apis/index.md).
|
**Reporting mode** was a build option of the `rippled` server, specialized for serving [HTTP and WebSocket APIs](../../references/http-websocket-apis/index.md). It has been removed in favor of the [Clio server](../../concepts/networks-and-servers/the-clio-server.md).
|
||||||
|
|
||||||
In reporting mode, the server does not connect to the peer-to-peer network. Instead, it uses gRPC to get validated data from one or more trusted servers that are connected to the P2P network.
|
Instead, see: [Install Clio on Ubuntu Linux](./install-clio-on-ubuntu.md).
|
||||||
|
|
||||||
It can then efficiently handle API calls, reducing the load on `rippled` servers running in P2P mode.
|
|
||||||
|
|
||||||
[{% inline-svg file="/docs/img/reporting-mode-basic-architecture.svg" /%}](/docs/img/reporting-mode-basic-architecture.svg "Figure 1: Working of `rippled` in reporting mode")
|
|
||||||
|
|
||||||
The reporting mode of `rippled` uses two datastores:
|
|
||||||
|
|
||||||
* The primary persistent datastore for `rippled` that includes transaction metadata, account states, and ledger headers. You can use NuDB (included with the source) or [Cassandra](https://cassandra.apache.org/) as the primary persistent datastore. If you use Cassandra, multiple reporting mode servers can share access to data in a single Cassandra instance or cluster.
|
|
||||||
|
|
||||||
* [PostgreSQL](https://www.postgresql.org/) database to hold relational data, which is used mainly by [tx method][] and [account_tx method][].
|
|
||||||
|
|
||||||
When a reporting mode server receives an API request, it loads the data from these data stores if possible. For requests that require data from the P2P network, the reporting mode forwards the request to a P2P server, and then passes the response back to the client.
|
|
||||||
|
|
||||||
Multiple reporting mode servers can share access to the same network accessible databases (PostgreSQL and Cassandra); at any given time, only one reporting mode server writes to the databases, while all the others read from the databases.
|
|
||||||
|
|
||||||
## How to Run Reporting Mode
|
|
||||||
|
|
||||||
### Prerequisites
|
|
||||||
|
|
||||||
1. Ensure that your system meets the [system requirements](system-requirements.md).
|
|
||||||
|
|
||||||
{% admonition type="info" name="Note" %}If you choose to use Cassandra as the database, the disk requirements for `rippled` will be lower as the data will not be stored on your local disk. {% /admonition %}
|
|
||||||
|
|
||||||
2. You also need to run at least one `rippled` server in P2P mode.
|
|
||||||
|
|
||||||
3. A compatible version of CMake must be installed.
|
|
||||||
|
|
||||||
4. Install and configure the datastores required to run `rippled` in reporting mode.
|
|
||||||
|
|
||||||
1. Install PostgreSQL.
|
|
||||||
|
|
||||||
2. Install and configure the database to be used as the primary persistent datastore. You can choose to use Cassandra or NuDB.
|
|
||||||
|
|
||||||
3. On macOS, you need to manually install the Cassandra cpp driver. On all other platforms, the Cassandra driver is built as part of the `rippled` build.
|
|
||||||
|
|
||||||
```
|
|
||||||
brew install cassandra-cpp-driver
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Install PostgreSQL
|
|
||||||
|
|
||||||
**Install PostgreSQL on Linux**
|
|
||||||
|
|
||||||
1. Download and [install PostgreSQL on Linux](https://www.postgresqltutorial.com/install-postgresql-linux/).
|
|
||||||
|
|
||||||
2. Connect to the PostgreSQL Database Server using `psql`, and create a user `newuser` and a database `reporting`.
|
|
||||||
|
|
||||||
```
|
|
||||||
psql postgres
|
|
||||||
CREATE ROLE newuser WITH LOGIN PASSWORD ‘password’;
|
|
||||||
ALTER ROLE newuser CREATEDB;
|
|
||||||
\q
|
|
||||||
psql postgres -U newuser
|
|
||||||
postgres=# create database reporting;
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
**Install PostgreSQL on macOS**
|
|
||||||
|
|
||||||
1. Download and install PostgreSQL on macOS.
|
|
||||||
|
|
||||||
```
|
|
||||||
brew install postgres
|
|
||||||
brew services start postgres
|
|
||||||
```
|
|
||||||
|
|
||||||
2. Connect to the PostgreSQL Database Server using `psql` and create a user `newuser` and a database `reporting`.
|
|
||||||
|
|
||||||
```
|
|
||||||
psql postgres
|
|
||||||
CREATE ROLE newuser WITH LOGIN PASSWORD ‘password’;
|
|
||||||
ALTER ROLE newuser CREATEDB;
|
|
||||||
\q
|
|
||||||
psql postgres -U newuser
|
|
||||||
postgres=# create database reporting;
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Install and Configure the Primary Persistent Datastore
|
|
||||||
|
|
||||||
**Cassandra**
|
|
||||||
|
|
||||||
Install Cassandra and then create a keyspace for `rippled`, with replication. <!-- SPELLING_IGNORE: keyspace -->
|
|
||||||
|
|
||||||
While a replication factor of 3 is recommended, when running locally, replication is not needed and you can set `replication_factor` to 1.
|
|
||||||
|
|
||||||
```
|
|
||||||
$ cqlsh [host] [port]
|
|
||||||
> CREATE KEYSPACE `rippled` WITH REPLICATION =
|
|
||||||
{'class' : 'SimpleStrategy', 'replication_factor' : 1 };
|
|
||||||
```
|
|
||||||
|
|
||||||
**NuDB**
|
|
||||||
|
|
||||||
If you’re running `rippled` in reporting mode for your local network, you can choose to use NuDB instead of Cassandra as your backend database.
|
|
||||||
|
|
||||||
NuDB is installed as part of your `rippled` build setup and does not require any additional installation steps.
|
|
||||||
|
|
||||||
|
|
||||||
### Steps
|
|
||||||
|
|
||||||
1. Build `rippled` for reporting mode on [Ubuntu or macOS](https://github.com/XRPLF/rippled/blob/release/BUILD.md).
|
|
||||||
|
|
||||||
{% tabs %}
|
|
||||||
|
|
||||||
```{% label="Linux" %}
|
|
||||||
wget https://github.com/Kitware/CMake/releases/download/v3.16.3/cmake-3.16.3-Linux-x86_64.sh
|
|
||||||
sudo sh cmake-3.16.3-Linux-x86_64.sh --prefix=/usr/local --exclude-subdir
|
|
||||||
cmake -B build -Dreporting=ON -DCMAKE_BUILD_TYPE=Debug
|
|
||||||
cmake --build build --parallel $(nproc)
|
|
||||||
```
|
|
||||||
|
|
||||||
```{% label="macOS" %}
|
|
||||||
cmake -B build -G "Unix Makefiles" -Dreporting=ON -DCMAKE_BUILD_TYPE=Debug
|
|
||||||
cmake --build build --parallel $(nproc)
|
|
||||||
```
|
|
||||||
|
|
||||||
{% /tabs %}
|
|
||||||
|
|
||||||
2. Create a configuration file to run `rippled` in reporting mode.
|
|
||||||
|
|
||||||
Make a copy of the example config file, `rippled-example.cfg`, and save it as `rippled-reporting-mode.cfg` in a location that enables you to run `rippled` as a non-root user. For example:
|
|
||||||
|
|
||||||
```
|
|
||||||
mkdir -p $HOME/.config/ripple
|
|
||||||
cp <RIPPLED_SOURCE>/cfg/rippled-example.cfg $HOME/.config/ripple/rippled-reporting-mode.cfg
|
|
||||||
```
|
|
||||||
|
|
||||||
3. Edit rippled-reporting-mode.cfg to set necessary file paths. The user you plan to run `rippled` as must have write permissions to all of the paths you specify here.
|
|
||||||
|
|
||||||
1. Set the `[node_db]` path to the location where you want to store the ledger database.
|
|
||||||
|
|
||||||
2. Set the `[database_path]` to the location where you want to store other database data. (This includes an SQLite database with configuration data, and is typically one level above the `[node_db]` path field.)
|
|
||||||
|
|
||||||
3. Set the `[debug_logfile]` to a path where `rippled` can write logging information.
|
|
||||||
|
|
||||||
Note that these are the only configurations required for `rippled` to start up successfully. All other configurations are optional and can be tweaked after you have a working server.
|
|
||||||
|
|
||||||
4. Edit the `rippled-reporting-mode.cfg` file to enable reporting mode:
|
|
||||||
|
|
||||||
1. Uncomment the `[reporting]` stanza or add a new one:
|
|
||||||
|
|
||||||
```
|
|
||||||
[reporting]
|
|
||||||
etl_source
|
|
||||||
read_only=0
|
|
||||||
```
|
|
||||||
|
|
||||||
2. List the `rippled` sources (ETL sources) to extract data from. These `rippled` servers must have gRPC enabled.
|
|
||||||
|
|
||||||
NOTE: Only include servers that you trust as reporting mode does not connect to the P2P network and hence cannot verify that the data actually matches the network consensus ledger.
|
|
||||||
|
|
||||||
```
|
|
||||||
[etl_source]
|
|
||||||
source_grpc_port=50051
|
|
||||||
source_ws_port=6006
|
|
||||||
source_ip=127.0.0.1
|
|
||||||
```
|
|
||||||
|
|
||||||
5. Configure the databases
|
|
||||||
|
|
||||||
1. Specify the Postgres DB for `[ledger_tx_tables]`:
|
|
||||||
|
|
||||||
```
|
|
||||||
[ledger_tx_tables]
|
|
||||||
conninfo = postgres://newuser:password@127.0.0.1/reporting
|
|
||||||
use_tx_tables=1
|
|
||||||
```
|
|
||||||
|
|
||||||
2. Specify the database for `[node_db]`.
|
|
||||||
|
|
||||||
{% tabs %}
|
|
||||||
|
|
||||||
```{% label="NuDB" %}
|
|
||||||
[node_db]
|
|
||||||
type=NuDB
|
|
||||||
path=/home/ubuntu/ripple/
|
|
||||||
|
|
||||||
[ledger_history]
|
|
||||||
1000000
|
|
||||||
```
|
|
||||||
|
|
||||||
```{% label="Cassandra" %}
|
|
||||||
[node_db]
|
|
||||||
type=Cassandra
|
|
||||||
|
|
||||||
[ledger_history]
|
|
||||||
1000000
|
|
||||||
```
|
|
||||||
|
|
||||||
{% /tabs %}
|
|
||||||
|
|
||||||
6. Modify the configuration for `rippled` to open up ports.
|
|
||||||
|
|
||||||
1. Open the public websocket port:
|
|
||||||
|
|
||||||
```
|
|
||||||
[port_ws_admin_local]
|
|
||||||
port = 6006
|
|
||||||
ip = 127.0.0.1
|
|
||||||
admin = 127.0.0.1
|
|
||||||
protocol = ws
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
2. Open the gRPC port:
|
|
||||||
|
|
||||||
```
|
|
||||||
[port_grpc]
|
|
||||||
port = 60051
|
|
||||||
ip = 0.0.0.0
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
3. Add a secured gateway to the IP of your reporting system:
|
|
||||||
|
|
||||||
```
|
|
||||||
secure_gateway = 127.0.0.1
|
|
||||||
```
|
|
||||||
|
|
||||||
7. Run `rippled` in reporting mode:
|
|
||||||
|
|
||||||
```
|
|
||||||
./rippled --conf /home/ubuntu/.config/ripple/rippled-reporting-example.cfg
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
### What to Expect
|
|
||||||
|
|
||||||
Here are the excerpts of what you can expect to see on your terminal.
|
|
||||||
|
|
||||||
```text
|
|
||||||
Loading: "/home/ubuntu/.config/ripple/rippled-reporting-example.cfg"
|
|
||||||
2021-Dec-09 21:31:52.245577 UTC JobQueue:NFO Using 10 threads
|
|
||||||
2021-Dec-09 21:31:52.255422 UTC LedgerConsensus:NFO Consensus engine started (cookie: 17859050541656985684)
|
|
||||||
2021-Dec-09 21:31:52.256542 UTC ReportingETL::ETLSource:NFO Using IP to connect to ETL source: 127.0.0.1:50051
|
|
||||||
2021-Dec-09 21:31:52.257784 UTC ReportingETL::ETLSource:NFO Made stub for remote = { validated_ledger : , ip : 127.0.0.1 , web socket port : 6006, grpc port : 50051 }
|
|
||||||
2021-Dec-09 21:31:52.258032 UTC ReportingETL::LoadBalancer:NFO add : added etl source - { validated_ledger : , ip : 127.0.0.1 , web socket port : 6006, grpc port : 50051 }
|
|
||||||
2021-Dec-09 21:31:52.258327 UTC Application:NFO process starting: rippled-1.8.1+DEBUG
|
|
||||||
2021-Dec-09 21:31:52.719186 UTC PgPool:DBG max_connections: 18446744073709551615, timeout: 600, connection params: port: 5432, hostaddr: 127.0.0.1, user: newuser, password: *, channel_binding: prefer, dbname: reporting_test_core, host: 127.0.0.1, options: , sslmode: prefer, sslcompression: 0, sslsni: 1, ssl_min_protocol_version: TLSv1.2, gssencmode: prefer, krbsrvname: postgres, target_session_attrs: any
|
|
||||||
2021-Dec-09 21:31:52.788851 UTC PgPool:NFO server message: NOTICE: relation "version" already exists, skipping
|
|
||||||
|
|
||||||
2021-Dec-09 21:31:53.282807 UTC TaggedCache:DBG LedgerCache target size set to 384
|
|
||||||
2021-Dec-09 21:31:53.282892 UTC TaggedCache:DBG LedgerCache target age set to 240000000000
|
|
||||||
2021-Dec-09 21:31:53.283741 UTC Amendments:DBG Amendment 98DECF327BF79997AEC178323AD51A830E457BFC6D454DAF3E46E5EC42DC619F (CheckCashMakesTrustLine) is supported and will be down voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.283836 UTC Amendments:DBG Amendment 157D2D480E006395B76F948E3E07A45A05FE10230D88A7993C71F97AE4B1F2D1 (Checks) is supported and will be up voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.283917 UTC Amendments:DBG Amendment 1562511F573A19AE9BD103B5D6B9E01B3B46805AEC5D3C4805C902B514399146 (CryptoConditions) is supported and will be down voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.283975 UTC Amendments:DBG Amendment 86E83A7D2ECE3AD5FA87AB2195AE015C950469ABF0B72EAACED318F74886AE90 (CryptoConditionsSuite) is supported and will be down voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.284016 UTC Amendments:DBG Amendment 30CD365592B8EE40489BA01AE2F7555CAC9C983145871DC82A42A31CF5BAE7D9 (DeletableAccounts) is supported and will be up voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.284062 UTC Amendments:DBG Amendment F64E1EABBE79D55B3BB82020516CEC2C582A98A6BFE20FBE9BB6A0D233418064 (DepositAuth) is supported and will be up voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.284099 UTC Amendments:DBG Amendment 3CBC5C4E630A1B82380295CDA84B32B49DD066602E74E39B85EF64137FA65194 (DepositPreauth) is supported and will be up voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.284126 UTC Amendments:DBG Amendment DC9CA96AEA1DCF83E527D1AFC916EFAF5D27388ECA4060A88817C1238CAEE0BF (EnforceInvariants) is supported and will be down voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.284153 UTC Amendments:DBG Amendment 07D43DCE529B15A10827E5E04943B496762F9A88E3268269D69C44BE49E21104 (Escrow) is supported and will be down voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.284189 UTC Amendments:DBG Amendment 42426C4D4F1009EE67080A9B7965B44656D7714D104A72F9B4369F97ABF044EE (FeeEscalation) is supported and will be down voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.284216 UTC Amendments:DBG Amendment 740352F2412A9909880C23A559FCECEDA3BE2126FED62FC7660D628A06927F11 (Flow) is supported and will be up voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.284241 UTC Amendments:DBG Amendment 3012E8230864E95A58C60FD61430D7E1B4D3353195F2981DC12B0C7C0950FFAC (FlowCross) is supported and will be up voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.284284 UTC Amendments:DBG Amendment AF8DF7465C338AE64B1E937D6C8DA138C0D63AD5134A68792BBBE1F63356C422 (FlowSortStrands) is supported and will be up voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.284337 UTC Amendments:DBG Amendment 1F4AFA8FA1BC8827AD4C0F682C03A8B671DCDF6B5C4DE36D44243A684103EF88 (HardenedValidations) is supported and will be up voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.284412 UTC Amendments:DBG Amendment 4C97EBA926031A7CF7D7B36FDE3ED66DDA5421192D63DE53FFB46E43B9DC8373 (MultiSign) is supported and will be down voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.284455 UTC Amendments:DBG Amendment 586480873651E106F1D6339B0C4A8945BA705A777F3F4524626FF1FC07EFE41D (MultiSignReserve) is supported and will be up voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.284491 UTC Amendments:DBG Amendment B4E4F5D2D6FB84DF7399960A732309C9FD530EAE5941838160042833625A6076 (NegativeUNL) is supported and will be down voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.284528 UTC Amendments:DBG Amendment 08DE7D96082187F6E6578530258C77FAABABE4C20474BDB82F04B021F1A68647 (PayChan) is supported and will be down voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.284592 UTC Amendments:DBG Amendment 00C1FC4A53E60AB02C864641002B3172F38677E29C26C5406685179B37E1EDAC (RequireFullyCanonicalSig) is supported and will be up voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.284649 UTC Amendments:DBG Amendment CC5ABAE4F3EC92E94A59B1908C2BE82D2228B6485C00AFF8F22DF930D89C194E (SortedDirectories) is supported and will be down voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.284703 UTC Amendments:DBG Amendment 532651B4FD58DF8922A49BA101AB3E996E5BFBF95A913B3E392504863E63B164 (TickSize) is supported and will be down voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.284787 UTC Amendments:DBG Amendment 955DF3FA5891195A9DAEFA1DDC6BB244B545DDE1BAA84CBB25D5F12A8DA68A0C (TicketBatch) is supported and will be up voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.284950 UTC Amendments:DBG Amendment 6781F8368C4771B83E8B821D88F580202BCB4228075297B19E4FDC5233F1EFDC (TrustSetAuth) is supported and will be down voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.284997 UTC Amendments:DBG Amendment B4D44CC3111ADD964E846FC57760C8B50FFCD5A82C86A72756F6B058DDDF96AD (fix1201) is supported and will be down voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.285025 UTC Amendments:DBG Amendment E2E6F2866106419B88C50045ACE96368558C345566AC8F2BDF5A5B5587F0E6FA (fix1368) is supported and will be down voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.285067 UTC Amendments:DBG Amendment 42EEA5E28A97824821D4EF97081FE36A54E9593C6E4F20CBAE098C69D2E072DC (fix1373) is supported and will be down voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.285103 UTC Amendments:DBG Amendment 6C92211186613F9647A89DFFBAB8F94C99D4C7E956D495270789128569177DA1 (fix1512) is supported and will be down voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.285129 UTC Amendments:DBG Amendment 67A34F2CF55BFC0F93AACD5B281413176FEE195269FA6D95219A2DF738671172 (fix1513) is supported and will be up voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.285153 UTC Amendments:DBG Amendment 5D08145F0A4983F23AFFFF514E83FAD355C5ABFBB6CAB76FB5BC8519FF5F33BE (fix1515) is supported and will be up voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.285176 UTC Amendments:DBG Amendment B9E739B8296B4A1BB29BE990B17D66E21B62A300A909F25AC55C22D6C72E1F9D (fix1523) is supported and will be down voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.285202 UTC Amendments:DBG Amendment 1D3463A5891F9E589C5AE839FFAC4A917CE96197098A1EF22304E1BC5B98A454 (fix1528) is supported and will be down voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.285256 UTC Amendments:DBG Amendment CA7C02118BA27599528543DFE77BA6838D1B0F43B447D4D7F53523CE6A0E9AC2 (fix1543) is supported and will be up voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.285290 UTC Amendments:DBG Amendment 7117E2EC2DBF119CA55181D69819F1999ECEE1A0225A7FD2B9ED47940968479C (fix1571) is supported and will be up voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.285343 UTC Amendments:DBG Amendment FBD513F1B893AC765B78F250E6FFA6A11B573209D1842ADC787C850696741288 (fix1578) is supported and will be up voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.285381 UTC Amendments:DBG Amendment 58BE9B5968C4DA7C59BA900961828B113E5490699B21877DEF9A31E9D0FE5D5F (fix1623) is supported and will be up voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.285424 UTC Amendments:DBG Amendment 25BA44241B3BD880770BFA4DA21C7180576831855368CBEC6A3154FDE4A7676E (fix1781) is supported and will be up voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.285464 UTC Amendments:DBG Amendment 4F46DF03559967AC60F2EB272FEFE3928A7594A45FF774B87A7E540DB0F8F068 (fixAmendmentMajorityCalc) is supported and will be up voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.285500 UTC Amendments:DBG Amendment 8F81B066ED20DAECA20DF57187767685EEF3980B228E0667A650BAF24426D3B4 (fixCheckThreading) is supported and will be up voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.285527 UTC Amendments:DBG Amendment C4483A1896170C66C098DEA5B0E024309C60DC960DE5F01CD7AF986AA3D9AD37 (fixMasterKeyAsRegularKey) is supported and will be up voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.285550 UTC Amendments:DBG Amendment 621A0B264970359869E3C0363A899909AAB7A887C8B73519E4ECF952D33258A8 (fixPayChanRecipientOwnerDir) is supported and will be up voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.285575 UTC Amendments:DBG Amendment 89308AF3B8B10B7192C4E613E1D2E4D9BA64B2EE2D5232402AE82A6A7220D953 (fixQualityUpperBound) is supported and will be up voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.285614 UTC Amendments:DBG Amendment B6B3EEDC0267AB50491FDC450A398AF30DBCD977CECED8BEF2499CAB5DAC19E2 (fixRmSmallIncreasedQOffers) is supported and will be up voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.285651 UTC Amendments:DBG Amendment 452F5906C46D46F407883344BFDD90E672B672C5E9943DB4891E3A34FEEEB9DB (fixSTAmountCanonicalize) is supported and will be up voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.285725 UTC Amendments:DBG Amendment 2CD5286D8D687E98B41102BDD797198E81EA41DF7BD104E6561FEB104EFF2561 (fixTakerDryOfferRemoval) is supported and will be up voted if not enabled on the ledger.
|
|
||||||
2021-Dec-09 21:31:53.290446 UTC Server:NFO Opened 'port_rpc_admin_local' (ip=127.0.0.1:7005, admin IPs:127.0.0.1, http)
|
|
||||||
2021-Dec-09 21:31:53.290834 UTC Server:NFO Opened 'port_ws_admin_local' (ip=127.0.0.1:7006, admin IPs:127.0.0.1, ws)
|
|
||||||
2021-Dec-09 21:31:53.290984 UTC Application:WRN Running in standalone mode
|
|
||||||
2021-Dec-09 21:31:53.291048 UTC NetworkOPs:NFO STATE->full
|
|
||||||
2021-Dec-09 21:31:53.291192 UTC Application:FTL Startup RPC:
|
|
||||||
{
|
|
||||||
"command" : "log_level",
|
|
||||||
"severity" : "debug"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
2021-Dec-09 21:31:53.291347 UTC RPCHandler:DBG RPC call log_level completed in 2.2e-08seconds
|
|
||||||
2021-Dec-09 21:31:53.291440 UTC Application:FTL Result:
|
|
||||||
{
|
|
||||||
"warnings" :
|
|
||||||
[
|
|
||||||
|
|
||||||
{
|
|
||||||
"id" : 1004,
|
|
||||||
"message" : "This is a reporting server. The default behavior of a reporting server is to only return validated data. If you are looking for not yet validated data, include \"ledger_index : current\" in your request, which will cause this server to forward the request to a p2p node. If the forward is successful the response will include \"forwarded\" : \"true\""
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
2021-Dec-09 21:31:53.291502 UTC ReportingETL:NFO Starting reporting etl
|
|
||||||
2021-Dec-09 21:31:53.291605 UTC Application:NFO Application starting. Version is 1.8.1+DEBUG
|
|
||||||
2021-Dec-09 21:31:53.291747 UTC LoadManager:DBG Starting
|
|
||||||
2021-Dec-09 21:31:53.291846 UTC gRPC Server:NFO Starting gRPC server at 0.0.0.0:60051
|
|
||||||
2021-Dec-09 21:31:53.293246 UTC LedgerCleaner:DBG Started
|
|
||||||
2021-Dec-09 21:31:53.295543 UTC ReportingETL::ETLSource:DBG handleMessage : Received a message on ledger subscription stream. Message : {
|
|
||||||
"result" : {},
|
|
||||||
"status" : "success",
|
|
||||||
"type" : "response"
|
|
||||||
}
|
|
||||||
- { validated_ledger : , ip : 127.0.0.1 , web socket port : 6006, grpc port : 50051 }
|
|
||||||
2021-Dec-09 21:31:53.368075 UTC ReportingETL:NFO monitor : Database is empty. Will download a ledger from the network.
|
|
||||||
2021-Dec-09 21:31:53.368183 UTC ReportingETL:NFO monitor : Waiting for next ledger to be validated by network...
|
|
||||||
```
|
|
||||||
|
|
||||||
## Frequently Asked Questions
|
|
||||||
<!-- STYLE_OVERRIDE: frequently -->
|
|
||||||
|
|
||||||
**Do I need to run more than one instance of `rippled` to use reporting mode?**
|
|
||||||
|
|
||||||
Yes. A `rippled` server running in reporting mode does not connect to the peer-to-peer network, but instead extracts validated data from one or more `rippled` servers that are connected to the network, so you need to run at least one P2P mode server.
|
|
||||||
|
|
||||||
**I’ve already installed `rippled`. Can I update the configuration file to enable reporting mode and restart `rippled`?**
|
|
||||||
|
|
||||||
No. Currently, you need to download the source and build `rippled` for reporting mode. There are initiatives in progress to provide packages for reporting mode.
|
|
||||||
|
|
||||||
|
|
||||||
**To run `rippled` in reporting mode, I need at least one `rippled` server running in P2P mode too. Does this mean I need double the disk space?**
|
|
||||||
|
|
||||||
The answer depends on the location of your primary data store. If you use Cassandra as the primary data store, the reporting mode server stores much less data on its local disk. The PostgreSQL server can be remote as well. You can have multiple reporting mode servers share the same data this way.
|
|
||||||
|
|
||||||
Lastly, the P2P mode server only needs to keep very recent history, while the reporting mode server keeps long term history.
|
|
||||||
|
|
||||||
For more information on system requirements to run `rippled`, see the [`rippled` system requirements](system-requirements.md).
|
|
||||||
|
|
||||||
**How can I confirm the validity of the data that comes from the PostgreSQL or Cassandra database?**
|
|
||||||
|
|
||||||
When `rippled` runs in reporting mode, it only serves validated data from the ETL source specified in the config file. If you are using someone else's `rippled` server in P2P mode as the ETL source, you are implicitly trusting that server. If not, you need to run your own `rippled` node in P2P mode.
|
|
||||||
|
|
||||||
**Is it possible to make traditional SQL queries to the relational database rather than using the API?**
|
|
||||||
|
|
||||||
Technically, you *can* directly access the database if you want. However, the data is stored as binary blobs and you have to decode the blobs to access the data in them. This makes traditional SQL queries much less useful since they cannot find and filter the individual fields of the data.
|
|
||||||
|
|
||||||
{% raw-partial file="/docs/_snippets/common-links.md" /%}
|
{% raw-partial file="/docs/_snippets/common-links.md" /%}
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ seo:
|
|||||||
---
|
---
|
||||||
# Installation
|
# Installation
|
||||||
|
|
||||||
Install and update XRP Ledger servers including the core server, rippled, and API server, Clio.
|
Install and update the core XRP Ledger server (`rippled`) or the API server (Clio).
|
||||||
|
|
||||||
|
|
||||||
{% child-pages /%}
|
{% child-pages /%}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ labels:
|
|||||||
---
|
---
|
||||||
# Install Clio on Ubuntu Linux
|
# Install Clio on Ubuntu Linux
|
||||||
|
|
||||||
This page describes the recommended instructions for installing the latest stable version of Clio on **Ubuntu Linux 20.04 or higher** using the [`apt`](https://ubuntu.com/server/docs) utility.
|
This page describes the recommended instructions for installing the latest stable version of Clio on **Ubuntu Linux 22.04 or higher** using the [`apt`](https://ubuntu.com/server/docs) utility.
|
||||||
|
|
||||||
These instructions install an Ubuntu package that has been compiled and published by Ripple. You can also:
|
These instructions install an Ubuntu package that has been compiled and published by Ripple. You can also:
|
||||||
|
|
||||||
@@ -93,11 +93,11 @@ Before you install Clio, you must meet the following requirements.
|
|||||||
5. Add the appropriate Ripple repository for your operating system version:
|
5. Add the appropriate Ripple repository for your operating system version:
|
||||||
|
|
||||||
```
|
```
|
||||||
echo "deb [signed-by=/usr/local/share/keyrings/ripple-key.gpg] https://repos.ripple.com/repos/rippled-deb focal stable" | \
|
echo "deb [signed-by=/usr/local/share/keyrings/ripple-key.gpg] https://repos.ripple.com/repos/rippled-deb noble stable" | \
|
||||||
sudo tee -a /etc/apt/sources.list.d/ripple.list
|
sudo tee -a /etc/apt/sources.list.d/ripple.list
|
||||||
```
|
```
|
||||||
|
|
||||||
The above example is appropriate for **Ubuntu 20.04 Focal Fossa**.
|
The above example is appropriate for **Ubuntu 24.04 Noble Numbat**.
|
||||||
|
|
||||||
If you want access to development or pre-release versions, use one of the following instead of `stable`:
|
If you want access to development or pre-release versions, use one of the following instead of `stable`:
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +1,14 @@
|
|||||||
---
|
---
|
||||||
html: install-rippled-on-centos-rhel-with-yum.html
|
|
||||||
parent: install-rippled.html
|
|
||||||
seo:
|
seo:
|
||||||
description: Install a precompiled rippled binary on CentOS or Red Hat Enterprise Linux.
|
description: Install a precompiled rippled binary on Red Hat Enterprise Linux.
|
||||||
labels:
|
labels:
|
||||||
- Core Server
|
- Core Server
|
||||||
---
|
---
|
||||||
# Install on CentOS/Red Hat with yum
|
# Install on Red Hat Enterprise Linux
|
||||||
|
|
||||||
This page describes the recommended instructions for installing the latest stable version of `rippled` on **CentOS 7** or **Red Hat Enterprise Linux 7**, using Ripple's [yum](https://en.wikipedia.org/wiki/Yellowdog_Updater,_Modified) repository.
|
This page describes the recommended instructions for installing the latest stable version of `rippled` on **Red Hat Enterprise Linux**, using a binary that has been compiled and published by Ripple as an `rpm` package.
|
||||||
|
|
||||||
These instructions install a binary that has been compiled by Ripple.
|
|
||||||
|
|
||||||
|
Currently, **Red Hat Enterprise Linux (RHEL) 9.6 is supported on x86_64 processors**. You may also be able to adapt these instructions to similar Linux distributions including CentOS or Rocky Linux, but other configurations are not officially supported.
|
||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
@@ -8,9 +8,9 @@ labels:
|
|||||||
---
|
---
|
||||||
# Install on Ubuntu or Debian Linux
|
# Install on Ubuntu or Debian Linux
|
||||||
|
|
||||||
This page describes the recommended instructions for installing the latest stable version of `rippled` on **Ubuntu Linux 18.04 or higher** or **Debian 10 or higher**, using the [`apt`](https://ubuntu.com/server/docs) utility.
|
This page describes the recommended instructions for installing the latest stable version of `rippled` on **Ubuntu Linux**, using a binary that has been compiled and published by Ripple as a `deb` package.
|
||||||
|
|
||||||
These instructions install a binary that has been compiled by Ripple.
|
Currently, **Ubuntu 22.04 and Ubuntu 24.04 on x86_64 processors** have received the highest level of support and testing. Packages are also available for **Debian Linux 12 Bookworm**. You may be able to adapt these instructions to other Linux distributions that also use the `apt` package manager, but other configurations are not officially supported.
|
||||||
|
|
||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
@@ -40,7 +40,6 @@ Before you install `rippled`, you must meet the [System Requirements](system-req
|
|||||||
sudo gpg --dearmor -o /etc/apt/keyrings/ripple.gpg
|
sudo gpg --dearmor -o /etc/apt/keyrings/ripple.gpg
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
4. Check the fingerprint of the newly-added key:
|
4. Check the fingerprint of the newly-added key:
|
||||||
|
|
||||||
```
|
```
|
||||||
@@ -56,22 +55,19 @@ Before you install `rippled`, you must meet the [System Requirements](system-req
|
|||||||
sub rsa3072 2019-02-14 [E] [expires: 2026-02-17]
|
sub rsa3072 2019-02-14 [E] [expires: 2026-02-17]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
In particular, make sure that the fingerprint matches. (In the above example, the fingerprint is on the second line, starting with `C001`.)
|
In particular, make sure that the fingerprint matches. (In the above example, the fingerprint is on the second line, starting with `C001`.)
|
||||||
|
|
||||||
5. Add the appropriate Ripple repository for your operating system version:
|
5. Add the appropriate Ripple repository for your operating system version:
|
||||||
|
|
||||||
```
|
```
|
||||||
echo "deb [signed-by=/etc/apt/keyrings/ripple.gpg] https://repos.ripple.com/repos/rippled-deb focal stable" | \
|
echo "deb [signed-by=/etc/apt/keyrings/ripple.gpg] https://repos.ripple.com/repos/rippled-deb noble stable" | \
|
||||||
sudo tee -a /etc/apt/sources.list.d/ripple.list
|
sudo tee -a /etc/apt/sources.list.d/ripple.list
|
||||||
```
|
```
|
||||||
|
|
||||||
The above example is appropriate for **Ubuntu 20.04 Focal Fossa**. For other operating systems, replace the word `focal` with one of the following:
|
The above example is appropriate for **Ubuntu 24.04 Noble Numbat**. For other operating systems, replace the word `noble` with one of the following:
|
||||||
|
|
||||||
- `buster` for **Debian 10 Buster**
|
|
||||||
- `bullseye` for **Debian 11 Bullseye**
|
- `bullseye` for **Debian 11 Bullseye**
|
||||||
- `bookworm` for **Debian 12 Bookworm**
|
- `bookworm` for **Debian 12 Bookworm**
|
||||||
- `bionic` for **Ubuntu 18.04 Bionic Beaver**
|
|
||||||
- `jammy` for **Ubuntu 22.04 Jammy Jellyfish**
|
- `jammy` for **Ubuntu 22.04 Jammy Jellyfish**
|
||||||
- `noble` for **Ubuntu 24.04 Noble Numbat**
|
- `noble` for **Ubuntu 24.04 Noble Numbat**
|
||||||
|
|
||||||
@@ -88,7 +84,6 @@ Before you install `rippled`, you must meet the [System Requirements](system-req
|
|||||||
sudo apt -y update && sudo apt -y install rippled
|
sudo apt -y update && sudo apt -y install rippled
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
7. Check the status of the `rippled` service:
|
7. Check the status of the `rippled` service:
|
||||||
|
|
||||||
```
|
```
|
||||||
@@ -101,7 +96,6 @@ Before you install `rippled`, you must meet the [System Requirements](system-req
|
|||||||
sudo systemctl start rippled.service
|
sudo systemctl start rippled.service
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
8. Optional: allow `rippled` to bind to privileged ports.
|
8. Optional: allow `rippled` to bind to privileged ports.
|
||||||
|
|
||||||
This allows you to serve incoming API requests on port 80 or 443. (If you want to do so, you must also update the config file's port settings.)
|
This allows you to serve incoming API requests on port 80 or 443. (If you want to do so, you must also update the config file's port settings.)
|
||||||
@@ -110,7 +104,6 @@ Before you install `rippled`, you must meet the [System Requirements](system-req
|
|||||||
sudo setcap 'cap_net_bind_service=+ep' /opt/ripple/bin/rippled
|
sudo setcap 'cap_net_bind_service=+ep' /opt/ripple/bin/rippled
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
9. Optional: configure core dumps
|
9. Optional: configure core dumps
|
||||||
|
|
||||||
By default Ubuntu is not configured to produce core files useful for debugging crashes.
|
By default Ubuntu is not configured to produce core files useful for debugging crashes.
|
||||||
|
|||||||
@@ -1,129 +0,0 @@
|
|||||||
---
|
|
||||||
html: rippled-1-3-migration-instructions.html
|
|
||||||
parent: install-rippled.html
|
|
||||||
seo:
|
|
||||||
description: Use these instructions to upgrade rippled packages from 1.2.x or below to 1.3.x or higher.
|
|
||||||
status: removed
|
|
||||||
---
|
|
||||||
# rippled v1.3.x Migration Instructions
|
|
||||||
|
|
||||||
This document describes the migration process for upgrading from `rippled` 1.2.4 or earlier to `rippled` v1.3 or later. This migration process is necessary because the `rippled` install process has changed as of version 1.3.
|
|
||||||
|
|
||||||
This document provides migration steps for upgrading on supported platforms:
|
|
||||||
|
|
||||||
- [CentOS or Red Hat Enterprise Linux (RHEL)](#migration-on-centos-or-red-hat-enterprise-linux-rhel)
|
|
||||||
- [Ubuntu Linux](#migration-on-ubuntu-linux)
|
|
||||||
|
|
||||||
For other platforms, see the updated instructions for compiling from source. ([Ubuntu](build-on-linux-mac-windows.md), [macOS](build-on-linux-mac-windows.md), or [Windows](https://github.com/XRPLF/rippled/tree/develop/Builds/VisualStudio2017))
|
|
||||||
|
|
||||||
|
|
||||||
## Migration on CentOS or Red Hat Enterprise Linux (RHEL)
|
|
||||||
|
|
||||||
Ripple's official RPM repository and instructions for using it have changed. If you have [automatic updates](update-rippled-automatically-on-linux.md) enabled, your system should perform the migration automatically. To migrate manually from the old repository to the new one, complete the following steps:
|
|
||||||
|
|
||||||
1. Stop the `rippled` server.
|
|
||||||
|
|
||||||
```
|
|
||||||
$ sudo systemctl stop rippled.service
|
|
||||||
```
|
|
||||||
|
|
||||||
2. Remove the old Ripple repository package.
|
|
||||||
|
|
||||||
```
|
|
||||||
$ sudo rpm -e ripple-repo
|
|
||||||
```
|
|
||||||
|
|
||||||
The `rippled-repo` package is now **DEPRECATED**. The package has been updated one last time for version 1.3.1. In the future, any changes to the repositories will require manual changes to the `ripple.repo` file. <!-- STYLE_OVERRIDE: will -->
|
|
||||||
|
|
||||||
3. Add Ripple's new yum repository:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ cat << REPOFILE | sudo tee /etc/yum.repos.d/ripple.repo
|
|
||||||
[ripple-stable]
|
|
||||||
name=XRP Ledger Packages
|
|
||||||
baseurl=https://repos.ripple.com/repos/rippled-rpm/stable/
|
|
||||||
enabled=1
|
|
||||||
gpgcheck=0
|
|
||||||
gpgkey=https://repos.ripple.com/repos/rippled-rpm/stable/repodata/repomd.xml.key
|
|
||||||
repo_gpgcheck=1
|
|
||||||
REPOFILE
|
|
||||||
```
|
|
||||||
|
|
||||||
4. Install the new `rippled` package:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ sudo yum install rippled
|
|
||||||
```
|
|
||||||
|
|
||||||
Version 1.3.1 does not require any changes to your config files (`rippled.cfg` and `validators.txt`). This update procedure leaves your existing config files in place.
|
|
||||||
|
|
||||||
5. Reload systemd unit files:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ sudo systemctl daemon-reload
|
|
||||||
```
|
|
||||||
|
|
||||||
6. Start the `rippled` service:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ sudo systemctl start rippled.service
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
{% admonition type="danger" name="Warning" %}If you use [automatic updates](update-rippled-automatically-on-linux.md), they should continue working after performing this migration process. However, **the `ripple-repo` package is now deprecated**. As a consequence, in the future, any changes to Ripple's repositories may require you to manually update your repos file.{% /admonition %}
|
|
||||||
|
|
||||||
|
|
||||||
## Migration on Ubuntu Linux
|
|
||||||
|
|
||||||
Prior to version 1.3, the supported way to install `rippled` on Ubuntu Linux was using Alien to install the RPM package. Starting with `rippled` v1.3.1, Ripple provides a native package for Ubuntu and Debian Linux, which is the recommended way of installing it. If you already have the RPM package installed, complete the [installation steps](install-rippled-on-ubuntu.md) to upgrade the package and switch over to the native APT (`.deb`) package.
|
|
||||||
|
|
||||||
If you have made any changes to your config files (`/opt/ripple/etc/rippled.cfg` and `/opt/ripple/etc/validators.txt`), `apt` may prompt you during installation asking if you want to overwrite your config files with the newest versions from the packages. Version 1.3 does not require any changes to the config file, so you can safely keep your existing config files unchanged.
|
|
||||||
|
|
||||||
After installing the native APT package for 1.3, you need to reload/restart the service:
|
|
||||||
|
|
||||||
1. Reload systemd unit files:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ sudo systemctl daemon-reload
|
|
||||||
```
|
|
||||||
|
|
||||||
2. Restart the `rippled` service:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ sudo systemctl restart rippled.service
|
|
||||||
```
|
|
||||||
|
|
||||||
If you no longer need Alien for any other packages, you may optionally uninstall it and its dependencies using the following steps:
|
|
||||||
|
|
||||||
1. Uninstall Alien:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ sudo apt -y remove alien
|
|
||||||
```
|
|
||||||
|
|
||||||
2. Uninstall unused dependencies:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ sudo apt -y autoremove
|
|
||||||
```
|
|
||||||
|
|
||||||
### Automatic Updates
|
|
||||||
|
|
||||||
The `rippled` v1.3 package includes an updated auto-update script that works on Ubuntu and Debian Linux. For more information, see [Update `rippled` Automatically on Linux](update-rippled-automatically-on-linux.md).
|
|
||||||
|
|
||||||
## See Also
|
|
||||||
|
|
||||||
- **[`rippled` v1.3.1 Release Notes](https://github.com/XRPLF/rippled/releases/1.3.1)**
|
|
||||||
- **Concepts:**
|
|
||||||
- [The `rippled` Server](../../concepts/networks-and-servers/index.md)
|
|
||||||
- [Consensus](../../concepts/consensus-protocol/index.md)
|
|
||||||
- **Tutorials:**
|
|
||||||
- [Update Automatically on Linux](update-rippled-automatically-on-linux.md)
|
|
||||||
- [Troubleshoot rippled](../troubleshooting/index.md)
|
|
||||||
- [Get Started with the rippled API](../../tutorials/http-websocket-apis/build-apps/get-started.md)
|
|
||||||
- **References:**
|
|
||||||
- [rippled API Reference](../../references/http-websocket-apis/index.md)
|
|
||||||
- [`rippled` Commandline Usage](../commandline-usage.md)
|
|
||||||
- [server_info method][]
|
|
||||||
|
|
||||||
{% raw-partial file="/docs/_snippets/common-links.md" /%}
|
|
||||||
@@ -1,16 +1,16 @@
|
|||||||
---
|
---
|
||||||
html: system-requirements.html
|
|
||||||
parent: install-rippled.html
|
|
||||||
seo:
|
seo:
|
||||||
description: Hardware and software requirements for running rippled.
|
description: Hardware and software requirements for running rippled or Clio.
|
||||||
labels:
|
labels:
|
||||||
- Core Server
|
- Core Server
|
||||||
---
|
---
|
||||||
# System Requirements
|
# System Requirements
|
||||||
|
|
||||||
|
The following system requirements apply to both the core XRP Ledger server, `rippled`, and the Clio server for API access.
|
||||||
|
|
||||||
## Recommended Specifications
|
## Recommended Specifications
|
||||||
|
|
||||||
For reliable performance in production environments, it is recommended to run an XRP Ledger (`rippled`) server on bare metal with the following characteristics or better:
|
For reliable performance in production environments, it is recommended to run a server on bare metal with the following characteristics or better:
|
||||||
|
|
||||||
- Operating System: Ubuntu (LTS), Red Hat Enterprise Linux (latest release), or a compatible Linux distribution.
|
- Operating System: Ubuntu (LTS), Red Hat Enterprise Linux (latest release), or a compatible Linux distribution.
|
||||||
- CPU: 3+ GHz 64-bit x86_64 processor with 8+ cores.
|
- CPU: 3+ GHz 64-bit x86_64 processor with 8+ cores.
|
||||||
@@ -28,6 +28,7 @@ For testing purposes, you can run an XRP Ledger server on commodity hardware wit
|
|||||||
|
|
||||||
- Operating System: macOS, Windows (64-bit), or most Linux distributions (Red Hat, Ubuntu, and Debian supported).
|
- Operating System: macOS, Windows (64-bit), or most Linux distributions (Red Hat, Ubuntu, and Debian supported).
|
||||||
- CPU: 64-bit x86_64, 4+ cores.
|
- CPU: 64-bit x86_64, 4+ cores.
|
||||||
|
- For development purposes, it is also possible to compile `rippled` for some Apple Silicon or ARM processors. See the [Build instructions](https://github.com/XRPLF/rippled/blob/develop/BUILD.md) for guidance. However, architectures other than x86_64 are not officially supported and are not recommended for production.
|
||||||
- Disk: SSD / NVMe (10,000 IOPS sustained - not burst or peak - or better). Minimum 50 GB for the database partition. Do not use Amazon Elastic Block Store (AWS EBS) because its latency is too high to sync reliably.
|
- Disk: SSD / NVMe (10,000 IOPS sustained - not burst or peak - or better). Minimum 50 GB for the database partition. Do not use Amazon Elastic Block Store (AWS EBS) because its latency is too high to sync reliably.
|
||||||
- RAM: 16 GB+.
|
- RAM: 16 GB+.
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
---
|
---
|
||||||
html: update-rippled-automatically-on-linux.html
|
|
||||||
parent: install-rippled.html
|
|
||||||
seo:
|
seo:
|
||||||
description: Set up automatic updates for rippled on Linux.
|
description: Set up automatic updates for rippled on Linux.
|
||||||
labels:
|
labels:
|
||||||
@@ -9,13 +7,13 @@ labels:
|
|||||||
---
|
---
|
||||||
# Update Automatically on Linux
|
# Update Automatically on Linux
|
||||||
|
|
||||||
On Linux, you can set up `rippled` to automatically upgrade to the latest version with a one-time `cron` configuration. Ripple recommends enabling automatic updates if possible.
|
On Linux, you can set up `rippled` to automatically upgrade to the latest version with a one-time `cron` configuration.
|
||||||
|
|
||||||
These instructions assume you have already installed `rippled` [from the `yum` repository (CentOS/RedHat)](install-rippled-on-centos-rhel-with-yum.md) or [using `apt` (Ubuntu/Debian)](install-rippled-on-ubuntu.md).
|
These instructions assume you have already installed `rippled` from a package on [Red Hat Enterprise Linux](install-rippled-on-rhel.md), [Ubuntu Linux, or Debian Linux](install-rippled-on-ubuntu.md).
|
||||||
|
|
||||||
To set up automatic updates, complete the following steps:
|
To set up automatic updates, complete the following steps:
|
||||||
|
|
||||||
1. Check that `/opt/ripple/etc/update-rippled-cron` exists. If it does not, update manually ([CentOS/Red Hat](update-rippled-manually-on-centos-rhel.md) or [Ubuntu/Debian](update-rippled-manually-on-ubuntu.md)).
|
1. Check that `/opt/ripple/etc/update-rippled-cron` exists. If it does not, update manually ([Red Hat](update-rippled-manually-on-rhel.md) or [Ubuntu/Debian](update-rippled-manually-on-ubuntu.md)).
|
||||||
|
|
||||||
2. Create a symlink in your `cron.d` folder to the `/opt/ripple/etc/update-rippled-cron` config file:
|
2. Create a symlink in your `cron.d` folder to the `/opt/ripple/etc/update-rippled-cron` config file:
|
||||||
|
|
||||||
@@ -23,7 +21,7 @@ To set up automatic updates, complete the following steps:
|
|||||||
sudo ln -s /opt/ripple/etc/update-rippled-cron /etc/cron.d/
|
sudo ln -s /opt/ripple/etc/update-rippled-cron /etc/cron.d/
|
||||||
```
|
```
|
||||||
|
|
||||||
This configuration runs a script to update the installed `rippled` package within an hour of each new release. To avoid network instability from too many servers updating at the same time, this script does not automatically restart the server, so it continues to run the old version until it restarts. {% badge href="https://github.com/XRPLF/rippled/releases/tag/1.8.1" %}Updated in: rippled 1.8.1{% /badge %}
|
This configuration runs a script to update the installed `rippled` package within an hour of each new release. To avoid network instability from too many servers updating at the same time, this script does not automatically restart the server, so it continues to run the old version until it restarts.
|
||||||
|
|
||||||
3. **Whenever a new release comes out,** you must manually restart the `rippled` service to switch to the updated software.
|
3. **Whenever a new release comes out,** you must manually restart the `rippled` service to switch to the updated software.
|
||||||
|
|
||||||
|
|||||||
@@ -1,40 +1,24 @@
|
|||||||
---
|
---
|
||||||
html: update-rippled-manually-on-centos-rhel.html
|
|
||||||
parent: install-rippled.html
|
|
||||||
seo:
|
seo:
|
||||||
description: Manually update rippled on CentOS or Red Hat Enterprise Linux.
|
description: Manually update rippled on CentOS or Red Hat Enterprise Linux.
|
||||||
labels:
|
labels:
|
||||||
- Core Server
|
- Core Server
|
||||||
- Security
|
- Security
|
||||||
---
|
---
|
||||||
# Update Manually on CentOS/Red Hat
|
# Update Manually on Red Hat Enterprise Linux
|
||||||
|
|
||||||
This page describes how to update manually to the latest release of `rippled` on CentOS or Red Hat Enterprise Linux. Ripple recommends setting up [automatic updates](update-rippled-automatically-on-linux.md) instead, where possible.
|
This page describes how to update manually to the latest release of `rippled` on Red Hat Enterprise Linux. You can also set up [automatic updates](update-rippled-automatically-on-linux.md).
|
||||||
|
|
||||||
These instructions assume you have already [installed `rippled` from the `yum` repository](install-rippled-on-centos-rhel-with-yum.md).
|
These instructions assume you have already [installed `rippled` on a supported version of Red Hat Enterprise Linux using Ripple's `rpm` package distribution](install-rippled-on-rhel.md). If you are upgrading from `rippled` 1.6.x or older, remove it and perform a fresh install instead.
|
||||||
|
|
||||||
{% admonition type="success" name="Tip" %}To perform these steps all at once, you can run the `/opt/ripple/bin/update-rippled.sh` script, which is included with the `rippled` package. This script should be run as a `sudo` user.{% /admonition %}
|
{% admonition type="success" name="Tip" %}To perform these steps all at once, you can run the `/opt/ripple/bin/update-rippled.sh` script, which is included with the `rippled` package. This script should be run as a `sudo` user.{% /admonition %}
|
||||||
|
|
||||||
To update manually, complete the following steps:
|
To update manually, complete the following steps:
|
||||||
|
|
||||||
1. If you are upgrading to `rippled` 1.7.0 from an earlier version, re-add the repository to get Ripple's updated GPG key. Otherwise, skip this step:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ cat << REPOFILE | sudo tee /etc/yum.repos.d/ripple.repo
|
|
||||||
[ripple-stable]
|
|
||||||
name=XRP Ledger Packages
|
|
||||||
enabled=1
|
|
||||||
gpgcheck=0
|
|
||||||
repo_gpgcheck=1
|
|
||||||
baseurl=https://repos.ripple.com/repos/rippled-rpm/stable
|
|
||||||
gpgkey=https://repos.ripple.com/repos/rippled-rpm/stable/repodata/repomd.xml.key
|
|
||||||
REPOFILE
|
|
||||||
```
|
|
||||||
|
|
||||||
1. Download and install the latest `rippled` package:
|
1. Download and install the latest `rippled` package:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ sudo yum update rippled
|
sudo yum update rippled
|
||||||
```
|
```
|
||||||
|
|
||||||
This update procedure leaves your existing config files in place.
|
This update procedure leaves your existing config files in place.
|
||||||
@@ -42,13 +26,13 @@ To update manually, complete the following steps:
|
|||||||
2. Reload the `systemd` unit files:
|
2. Reload the `systemd` unit files:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ sudo systemctl daemon-reload
|
sudo systemctl daemon-reload
|
||||||
```
|
```
|
||||||
|
|
||||||
3. Restart the `rippled` service:
|
3. Restart the `rippled` service:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ sudo service rippled restart
|
sudo service rippled restart
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
@@ -58,7 +42,6 @@ To update manually, complete the following steps:
|
|||||||
- [The `rippled` Server](../../concepts/networks-and-servers/index.md)
|
- [The `rippled` Server](../../concepts/networks-and-servers/index.md)
|
||||||
- [Consensus](../../concepts/consensus-protocol/index.md)
|
- [Consensus](../../concepts/consensus-protocol/index.md)
|
||||||
- **Tutorials:**
|
- **Tutorials:**
|
||||||
- [`rippled` v1.3.x Migration Instructions](rippled-1-3-migration-instructions.md) <!-- Note: remove when versions older than v1.3 are basically extinct -->
|
|
||||||
- [Troubleshoot rippled](../troubleshooting/index.md)
|
- [Troubleshoot rippled](../troubleshooting/index.md)
|
||||||
- **References:**
|
- **References:**
|
||||||
- [rippled API Reference](../../references/http-websocket-apis/index.md)
|
- [rippled API Reference](../../references/http-websocket-apis/index.md)
|
||||||
@@ -1,6 +1,4 @@
|
|||||||
---
|
---
|
||||||
html: update-rippled-manually-on-ubuntu.html
|
|
||||||
parent: install-rippled.html
|
|
||||||
seo:
|
seo:
|
||||||
description: Manually update rippled on Ubuntu Linux.
|
description: Manually update rippled on Ubuntu Linux.
|
||||||
labels:
|
labels:
|
||||||
@@ -9,18 +7,9 @@ labels:
|
|||||||
---
|
---
|
||||||
# Update Manually on Ubuntu or Debian
|
# Update Manually on Ubuntu or Debian
|
||||||
|
|
||||||
This page describes how to update manually to the latest release of `rippled` on Ubuntu Linux. These instructions assume you have already [installed `rippled` using the native package](install-rippled-on-ubuntu.md). Ripple recommends setting up [automatic updates](update-rippled-automatically-on-linux.md) instead, where possible.
|
This page describes how to manually update to the latest release of `rippled` on Ubuntu Linux. You can also set up [automatic updates](update-rippled-automatically-on-linux.md).
|
||||||
|
|
||||||
{% admonition type="warning" name="Caution" %}
|
These instructions assume you have already [installed `rippled` on a supported version of Ubuntu using Ripple's `deb` package](install-rippled-on-ubuntu.md). If you are upgrading from `rippled` 1.6.x or older, remove it and perform a fresh install instead.
|
||||||
Ripple renewed the GPG key used to sign binary packages shortly before the release of v1.7.0. If you are upgrading from a version earlier than 1.7.0, you must first download and manually trust the updated public key as follows:
|
|
||||||
|
|
||||||
```
|
|
||||||
wget -q -O - "https://repos.ripple.com/repos/api/gpg/key/public" | \
|
|
||||||
sudo apt-key add -
|
|
||||||
```
|
|
||||||
|
|
||||||
For more information, see the [`rippled` 1.7.0 release notes](https://xrpl.org/blog/2021/rippled-1.7.0.html#upgrading-special-action-required).
|
|
||||||
{% /admonition %}
|
|
||||||
|
|
||||||
{% admonition type="success" name="Tip" %}To perform these steps all at once, you can run the `/opt/ripple/bin/update-rippled.sh` script, which is included with the `rippled` package and is compatible with Ubuntu and Debian. This script should be run as a `sudo` user.{% /admonition %}
|
{% admonition type="success" name="Tip" %}To perform these steps all at once, you can run the `/opt/ripple/bin/update-rippled.sh` script, which is included with the `rippled` package and is compatible with Ubuntu and Debian. This script should be run as a `sudo` user.{% /admonition %}
|
||||||
|
|
||||||
@@ -29,25 +18,25 @@ To update manually, complete the following steps:
|
|||||||
1. Update repositories:
|
1. Update repositories:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ sudo apt -y update
|
sudo apt -y update
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Upgrade the `rippled` package:
|
2. Upgrade the `rippled` package:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ sudo apt -y upgrade rippled
|
sudo apt -y upgrade rippled
|
||||||
```
|
```
|
||||||
|
|
||||||
3. Reload the `systemd` unit files:
|
3. Reload the `systemd` unit files:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ sudo systemctl daemon-reload
|
sudo systemctl daemon-reload
|
||||||
```
|
```
|
||||||
|
|
||||||
4. Restart the `rippled` service:
|
4. Restart the `rippled` service:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ sudo service rippled restart
|
sudo systemctl restart rippled
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
@@ -57,7 +46,6 @@ To update manually, complete the following steps:
|
|||||||
- [The `rippled` Server](../../concepts/networks-and-servers/index.md)
|
- [The `rippled` Server](../../concepts/networks-and-servers/index.md)
|
||||||
- [Consensus](../../concepts/consensus-protocol/index.md)
|
- [Consensus](../../concepts/consensus-protocol/index.md)
|
||||||
- **Tutorials:**
|
- **Tutorials:**
|
||||||
- [`rippled` v1.3.x Migration Instructions](rippled-1-3-migration-instructions.md) <!-- Note: remove when versions older than v1.3 are basically extinct -->
|
|
||||||
- [Troubleshoot rippled](../troubleshooting/index.md)
|
- [Troubleshoot rippled](../troubleshooting/index.md)
|
||||||
- **References:**
|
- **References:**
|
||||||
- [rippled API Reference](../../references/http-websocket-apis/index.md)
|
- [rippled API Reference](../../references/http-websocket-apis/index.md)
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ For a more thorough explanation of various types of log messages, see [Understan
|
|||||||
|
|
||||||
If you have problems diagnosing the problem, or you are unable to resolve the problem with any of the common fixes, you may want to ask for help in a support forum or the [GitHub issues](https://github.com/XRPLF/rippled/issues). When asking for help, you can use an info collection script to gather information about your system to help others diagnose the issue.
|
If you have problems diagnosing the problem, or you are unable to resolve the problem with any of the common fixes, you may want to ask for help in a support forum or the [GitHub issues](https://github.com/XRPLF/rippled/issues). When asking for help, you can use an info collection script to gather information about your system to help others diagnose the issue.
|
||||||
|
|
||||||
The official package installation (for [Ubuntu/Debian](../installation/install-rippled-on-ubuntu.md) or [CentOS/RedHat](../installation/install-rippled-on-centos-rhel-with-yum.md)) installs such a script by default, to `/opt/ripple/bin/getRippledInfo`. If you compiled `rippled` yourself, you can find the same script [in the `rippled` source code repository](https://github.com/XRPLF/rippled/blob/develop/bin/getRippledInfo).
|
The official package installation (for [Ubuntu/Debian](../installation/install-rippled-on-ubuntu.md) or [CentOS/RedHat](../installation/install-rippled-on-rhel.md)) installs such a script by default, to `/opt/ripple/bin/getRippledInfo`. If you compiled `rippled` yourself, you can find the same script [in the `rippled` source code repository](https://github.com/XRPLF/rippled/blob/develop/bin/getRippledInfo).
|
||||||
|
|
||||||
To use the script:
|
To use the script:
|
||||||
|
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ The following script is a sample that can be created as `/etc/logrotate.d/ripple
|
|||||||
|
|
||||||
You can configure parameters such as `minsize` and `rotate` depending on the amount of logs you keep. Use the `log_level` setting in your `rippled.cfg` file to configure how verbose your server's logs are. This sample script is based on standard `log_level` and stores approximately 2 weeks worth of logs in a compressed format.
|
You can configure parameters such as `minsize` and `rotate` depending on the amount of logs you keep. Use the `log_level` setting in your `rippled.cfg` file to configure how verbose your server's logs are. This sample script is based on standard `log_level` and stores approximately 2 weeks worth of logs in a compressed format.
|
||||||
|
|
||||||
The official packages [for CentOS/Red Hat](../../../../infrastructure/installation/install-rippled-on-centos-rhel-with-yum.md) and [Ubuntu or Debian](../../../../infrastructure/installation/install-rippled-on-ubuntu.md) provide the script `/etc/logrotate.d/rippled` by default. You can make modifications to this as required. Your modifications will not be overwritten on package upgrades. <!-- STYLE_OVERRIDE: will -->
|
The official packages [for CentOS/Red Hat](../../../../infrastructure/installation/install-rippled-on-rhel.md) and [Ubuntu or Debian](../../../../infrastructure/installation/install-rippled-on-ubuntu.md) provide the script `/etc/logrotate.d/rippled` by default. You can make modifications to this as required. Your modifications will not be overwritten on package upgrades. <!-- STYLE_OVERRIDE: will -->
|
||||||
|
|
||||||
{% admonition type="info" name="Note" %}You should have only one system log rotation script per application. Please ensure that you do not have any other log rotation that handles the same directory.{% /admonition %}
|
{% admonition type="info" name="Note" %}You should have only one system log rotation script per application. Please ensure that you do not have any other log rotation that handles the same directory.{% /admonition %}
|
||||||
|
|
||||||
|
|||||||
@@ -338,7 +338,7 @@ Some fields specify a _type_ of asset, which could be XRP or a fungible [token](
|
|||||||
|
|
||||||
|
|
||||||
### Object Fields
|
### Object Fields
|
||||||
[STObject]: #object-fields
|
[Object]: #object-fields
|
||||||
|
|
||||||
Some fields, such as `SignerEntry` (in [SignerListSet transactions][]), and `Memo` (in `Memos` arrays) are objects (called the "STObject" type). The serialization of objects is very similar to that of arrays, with one difference: **object members must be placed in canonical order** within the object field, where array fields have an explicit order already.
|
Some fields, such as `SignerEntry` (in [SignerListSet transactions][]), and `Memo` (in `Memos` arrays) are objects (called the "STObject" type). The serialization of objects is very similar to that of arrays, with one difference: **object members must be placed in canonical order** within the object field, where array fields have an explicit order already.
|
||||||
|
|
||||||
|
|||||||
@@ -52,31 +52,9 @@ In addition to the [common fields](../common-fields.md), {% code-page-name /%} e
|
|||||||
| `PreviousTxnLgrSeq` | Number | UInt32 | Yes | The [index of the ledger][Ledger Index] that contains the transaction that most recently modified this object. |
|
| `PreviousTxnLgrSeq` | Number | UInt32 | Yes | The [index of the ledger][Ledger Index] that contains the transaction that most recently modified this object. |
|
||||||
| `Sequence` | Number | UInt32 | Yes | The `Sequence` value of the transaction that created this entry. |
|
| `Sequence` | Number | UInt32 | Yes | The `Sequence` value of the transaction that created this entry. |
|
||||||
|
|
||||||
|
|
||||||
### AcceptedCredentials Objects
|
### AcceptedCredentials Objects
|
||||||
|
|
||||||
Each member of the `AcceptedCredentials` array is an inner object named `Credential` with the following nested fields:
|
{% raw-partial file="/docs/_snippets/accepted-credentials-objects.md" /%}
|
||||||
|
|
||||||
| Field | JSON Type | [Internal Type][] | Required? | Description |
|
|
||||||
|:-----------------|:---------------------|:------------------|:----------|--------------|
|
|
||||||
| `Issuer` | String - [Address][] | AccountID | Yes | The issuer of the credential. |
|
|
||||||
| `CredentialType` | String | Blob | Yes | The type of credential, as hexadecimal. This is an arbitrary value from 1 to 64 bytes that the issuer sets when they issue a credential. |
|
|
||||||
|
|
||||||
{% admonition type="info" name="Note" %}
|
|
||||||
In the usual JSON format, inner objects are wrapped in an object with one field, whose name defines the inner object type. In this case, the wrapping field is named `Credential`. For example:
|
|
||||||
|
|
||||||
```json
|
|
||||||
"AcceptedCredentials": [
|
|
||||||
{
|
|
||||||
"Credential": {
|
|
||||||
"Issuer": "ra5nK24KXen9AHvsdFTKHSANinZseWnPcX",
|
|
||||||
"CredentialType": "6D795F63726564656E7469616C"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
// ... additional Credential inner objects ...
|
|
||||||
]
|
|
||||||
```
|
|
||||||
{% /admonition %}
|
|
||||||
|
|
||||||
|
|
||||||
## {% $frontmatter.seo.title %} Flags
|
## {% $frontmatter.seo.title %} Flags
|
||||||
|
|||||||
@@ -40,6 +40,8 @@ _(Requires the [PermissionedDomains amendment][] {% not-enabled /%})_
|
|||||||
| `DomainID` | String - [Hash][] | UInt256 | No | The ledger entry ID of an existing permissioned domain to modify. If omitted, creates a new permissioned domain. |
|
| `DomainID` | String - [Hash][] | UInt256 | No | The ledger entry ID of an existing permissioned domain to modify. If omitted, creates a new permissioned domain. |
|
||||||
| `AcceptedCredentials` | Array | Array | Yes | A list of 1 to 10 [**Accepted Credentials objects**](#accepted-credentials-objects) that grant access to this domain. The list does not need to be sorted, but it cannot contain duplicates. When modifying an existing domain, this list replaces the existing list. |
|
| `AcceptedCredentials` | Array | Array | Yes | A list of 1 to 10 [**Accepted Credentials objects**](#accepted-credentials-objects) that grant access to this domain. The list does not need to be sorted, but it cannot contain duplicates. When modifying an existing domain, this list replaces the existing list. |
|
||||||
|
|
||||||
|
### AcceptedCredentials Objects
|
||||||
|
|
||||||
{% raw-partial file="/docs/_snippets/accepted-credentials-objects.md" /%}
|
{% raw-partial file="/docs/_snippets/accepted-credentials-objects.md" /%}
|
||||||
|
|
||||||
## {% $frontmatter.seo.title %} Flags
|
## {% $frontmatter.seo.title %} Flags
|
||||||
|
|||||||
@@ -308,7 +308,7 @@ If the transaction fails with the result `tecNO_ALTERNATIVE_KEY`, your account d
|
|||||||
|
|
||||||
### 4. Wait for validation
|
### 4. Wait for validation
|
||||||
|
|
||||||
{% partial file="/docs/_snippets/wait-for-validation.md" /%}
|
{% raw-partial file="/docs/_snippets/wait-for-validation.md" /%}
|
||||||
|
|
||||||
### 5. Confirm Account Flags
|
### 5. Confirm Account Flags
|
||||||
|
|
||||||
|
|||||||
@@ -25,6 +25,9 @@ Keep in mind that the `Fee` for multi-signed transactions is significantly highe
|
|||||||
|
|
||||||
Here's an example transaction ready to be multi-signed:
|
Here's an example transaction ready to be multi-signed:
|
||||||
|
|
||||||
|
{% tabs %}
|
||||||
|
|
||||||
|
{% tab label="JSON" %}
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"TransactionType": "TrustSet",
|
"TransactionType": "TrustSet",
|
||||||
@@ -42,7 +45,17 @@ Here's an example transaction ready to be multi-signed:
|
|||||||
```
|
```
|
||||||
|
|
||||||
(This transaction creates an accounting relationship from `rEuLyBCvcw4CFmzv8RepSiAoNgF8tTGJQC` to `rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh` with a maximum balance of 100 USD.)
|
(This transaction creates an accounting relationship from `rEuLyBCvcw4CFmzv8RepSiAoNgF8tTGJQC` to `rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh` with a maximum balance of 100 USD.)
|
||||||
|
{% /tab %}
|
||||||
|
|
||||||
|
{% tab label="Javascript" %}
|
||||||
|
{% code-snippet file="/_code-samples/multisigning/js/multisigning.ts" language="js" from="const accountSet: AccountSet = {" before="const { tx_blob" /%}
|
||||||
|
{% /tab %}
|
||||||
|
|
||||||
|
{% tab label="Python" %}
|
||||||
|
{% code-snippet file="/_code-samples/multisigning/py/multisigning.py" language="py" from="account_set_tx = AccountSet" before="# Since" /%}
|
||||||
|
{% /tab %}
|
||||||
|
|
||||||
|
{% /tabs %}
|
||||||
|
|
||||||
## 2. Get one signature
|
## 2. Get one signature
|
||||||
|
|
||||||
@@ -185,6 +198,9 @@ If you collected the signatures in serial, the `tx_json` from the last `sign_for
|
|||||||
|
|
||||||
If you collected the signatures in parallel, you must manually construct a `tx_json` object with all the signatures included. Take the `Signers` arrays from all the `sign_for` responses, and combine their contents into a single `Signers` array that has each signature. Add the combined `Signers` array to the original transaction JSON value, and use that as the argument to the [submit_multisigned method][].
|
If you collected the signatures in parallel, you must manually construct a `tx_json` object with all the signatures included. Take the `Signers` arrays from all the `sign_for` responses, and combine their contents into a single `Signers` array that has each signature. Add the combined `Signers` array to the original transaction JSON value, and use that as the argument to the [submit_multisigned method][].
|
||||||
|
|
||||||
|
{% tabs %}
|
||||||
|
|
||||||
|
{% tab label="Commandline" %}
|
||||||
```
|
```
|
||||||
$ rippled submit_multisigned '{
|
$ rippled submit_multisigned '{
|
||||||
> "Account" : "rEuLyBCvcw4CFmzv8RepSiAoNgF8tTGJQC",
|
> "Account" : "rEuLyBCvcw4CFmzv8RepSiAoNgF8tTGJQC",
|
||||||
@@ -256,9 +272,18 @@ Connecting to 127.0.0.1:5005
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
Take note of the `hash` value from the response so you can check the results of the transaction later. (In this case, the hash is `BD636194C48FD7A100DE4C972336534C8E710FD008C0F3CF7BC5BF34DAF3C3E6`.)
|
Take note of the `hash` value from the response so you can check the results of the transaction later. (In this case, the hash is `BD636194C48FD7A100DE4C972336534C8E710FD008C0F3CF7BC5BF34DAF3C3E6`.)
|
||||||
|
{% /tab %}
|
||||||
|
|
||||||
|
{% tab label="Javascript" %}
|
||||||
|
{% code-snippet file="/_code-samples/multisigning/js/multisigning.ts" language="js" from="const { tx_blob" before="if (submitResponse" /%}
|
||||||
|
{% /tab %}
|
||||||
|
|
||||||
|
{% tab label="Python" %}
|
||||||
|
{% code-snippet file="/_code-samples/multisigning/py/multisigning.py" language="py" from="tx_1 =" before="if multisigned_tx_response" /%}
|
||||||
|
{% /tab %}
|
||||||
|
|
||||||
|
{% /tabs %}
|
||||||
|
|
||||||
## 5. Close the ledger
|
## 5. Close the ledger
|
||||||
|
|
||||||
@@ -278,7 +303,6 @@ Connecting to 127.0.0.1:5005
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
## 6. Confirm transaction results
|
## 6. Confirm transaction results
|
||||||
|
|
||||||
Use the hash value from the response to the `submit_multisigned` command to look up the transaction using the [tx method][]. In particular, check that the `TransactionResult` is the string `tesSUCCESS`.
|
Use the hash value from the response to the `submit_multisigned` command to look up the transaction using the [tx method][]. In particular, check that the `TransactionResult` is the string `tesSUCCESS`.
|
||||||
@@ -287,6 +311,9 @@ On the live network, you must also confirm that the `validated` field is set to
|
|||||||
|
|
||||||
In stand-alone mode, the server automatically considers a ledger to be `validated` if it has been manually closed.
|
In stand-alone mode, the server automatically considers a ledger to be `validated` if it has been manually closed.
|
||||||
|
|
||||||
|
{% tabs %}
|
||||||
|
|
||||||
|
{% tab label="Commandline" %}
|
||||||
```
|
```
|
||||||
$ rippled tx BD636194C48FD7A100DE4C972336534C8E710FD008C0F3CF7BC5BF34DAF3C3E6
|
$ rippled tx BD636194C48FD7A100DE4C972336534C8E710FD008C0F3CF7BC5BF34DAF3C3E6
|
||||||
Loading: "/etc/opt/ripple/rippled.cfg"
|
Loading: "/etc/opt/ripple/rippled.cfg"
|
||||||
@@ -399,5 +426,17 @@ Connecting to 127.0.0.1:5005
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
{% /tab %}
|
||||||
|
|
||||||
|
{% tab label="Javascript" %}
|
||||||
|
{% code-snippet file="/_code-samples/multisigning/js/multisigning.ts" language="js" from="if (submitResponse" before="await client.disconnect" /%}
|
||||||
|
{% /tab %}
|
||||||
|
|
||||||
|
{% tab label="Python" %}
|
||||||
|
{% code-snippet file="/_code-samples/multisigning/py/multisigning.py" language="py" from="if multisigned_tx_response" /%}
|
||||||
|
{% /tab %}
|
||||||
|
|
||||||
|
{% /tabs %}
|
||||||
|
|
||||||
|
|
||||||
{% raw-partial file="/docs/_snippets/common-links.md" /%}
|
{% raw-partial file="/docs/_snippets/common-links.md" /%}
|
||||||
|
|||||||
@@ -67,7 +67,9 @@ In this example, the signer list has 3 members, with the weights and quorum set
|
|||||||
|
|
||||||
{% partial file="/docs/_snippets/secret-key-warning.md" /%}
|
{% partial file="/docs/_snippets/secret-key-warning.md" /%}
|
||||||
|
|
||||||
|
{% tabs %}
|
||||||
|
|
||||||
|
{% tab label="Commandline" %}
|
||||||
```
|
```
|
||||||
$ rippled submit shqZZy2Rzs9ZqWTCQAdqc3bKgxnYq '{
|
$ rippled submit shqZZy2Rzs9ZqWTCQAdqc3bKgxnYq '{
|
||||||
> "Flags": 0,
|
> "Flags": 0,
|
||||||
@@ -139,6 +141,17 @@ Connecting to 127.0.0.1:5005
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
{% /tab %}
|
||||||
|
|
||||||
|
{% tab label="Javascript" %}
|
||||||
|
{% code-snippet file="/_code-samples/multisigning/js/multisigning.ts" language="js" from=" const { wallet: wallet1" before="const accountSet:" /%}
|
||||||
|
{% /tab %}
|
||||||
|
|
||||||
|
{% tab label="Python" %}
|
||||||
|
{% code-snippet file="/_code-samples/multisigning/py/multisigning.py" language="py" from="master_wallet =" before="# Now that" /%}
|
||||||
|
{% /tab %}
|
||||||
|
|
||||||
|
{% /tabs %}
|
||||||
|
|
||||||
Make sure that the [Transaction Result](../../../references/protocol/transactions/transaction-results/index.md) is [**`tesSUCCESS`**](../../../references/protocol/transactions/transaction-results/tes-success.md). Otherwise, the transaction failed. If you have a problem in stand-alone mode or a non-production network, check that [multi-sign is enabled](../../../infrastructure/testing-and-auditing/start-a-new-genesis-ledger-in-stand-alone-mode.md#settings-in-new-genesis-ledgers).
|
Make sure that the [Transaction Result](../../../references/protocol/transactions/transaction-results/index.md) is [**`tesSUCCESS`**](../../../references/protocol/transactions/transaction-results/tes-success.md). Otherwise, the transaction failed. If you have a problem in stand-alone mode or a non-production network, check that [multi-sign is enabled](../../../infrastructure/testing-and-auditing/start-a-new-genesis-ledger-in-stand-alone-mode.md#settings-in-new-genesis-ledgers).
|
||||||
|
|
||||||
@@ -147,7 +160,7 @@ Make sure that the [Transaction Result](../../../references/protocol/transaction
|
|||||||
|
|
||||||
## 4. Wait for validation
|
## 4. Wait for validation
|
||||||
|
|
||||||
{% partial file="/docs/_snippets/wait-for-validation.md" /%}
|
{% raw-partial file="/docs/_snippets/wait-for-validation.md" /%}
|
||||||
|
|
||||||
|
|
||||||
## 5. Confirm the new signer list
|
## 5. Confirm the new signer list
|
||||||
|
|||||||
@@ -67,31 +67,31 @@ Response:
|
|||||||
|
|
||||||
{% partial file="/docs/_snippets/secret-key-warning.md" /%}
|
{% partial file="/docs/_snippets/secret-key-warning.md" /%}
|
||||||
|
|
||||||
Request:
|
|
||||||
|
|
||||||
{% tabs %}
|
{% tabs %}
|
||||||
|
|
||||||
{% tab label="Websocket" %}
|
{% tab label="Websocket" %}
|
||||||
|
Request:
|
||||||
{% code-snippet file="/_api-examples/escrow/websocket/submit-request-escrowcancel.json" language="json" /%}
|
{% code-snippet file="/_api-examples/escrow/websocket/submit-request-escrowcancel.json" language="json" /%}
|
||||||
{% /tab %}
|
|
||||||
|
|
||||||
{% /tabs %}
|
|
||||||
|
|
||||||
Response:
|
Response:
|
||||||
|
|
||||||
{% tabs %}
|
|
||||||
|
|
||||||
{% tab label="Websocket" %}
|
|
||||||
{% code-snippet file="/_api-examples/escrow/websocket/submit-response-escrowcancel.json" language="json" /%}
|
{% code-snippet file="/_api-examples/escrow/websocket/submit-response-escrowcancel.json" language="json" /%}
|
||||||
{% /tab %}
|
{% /tab %}
|
||||||
|
|
||||||
|
{% tab label="Javascript" %}
|
||||||
|
{% code-snippet file="/_code-samples/escrow/js/cancel-escrow.js" language="js" from="const escrowCancelTransaction" before="await client.disconnect" /%}
|
||||||
|
{% /tab %}
|
||||||
|
|
||||||
|
{% tab label="Python" %}
|
||||||
|
{% code-snippet file="/_code-samples/escrow/py/cancel_escrow.py" language="py" from="# Build escrow cancel" /%}
|
||||||
|
{% /tab %}
|
||||||
|
|
||||||
{% /tabs %}
|
{% /tabs %}
|
||||||
|
|
||||||
Take note of the transaction's identifying `hash` value so you can check its final status when it is included in a validated ledger version.
|
Take note of the transaction's identifying `hash` value so you can check its final status when it is included in a validated ledger version.
|
||||||
|
|
||||||
## 4. Wait for validation
|
## 4. Wait for validation
|
||||||
|
|
||||||
{% partial file="/docs/_snippets/wait-for-validation.md" /%}
|
{% raw-partial file="/docs/_snippets/wait-for-validation.md" /%}
|
||||||
|
|
||||||
## 5. Confirm final result
|
## 5. Confirm final result
|
||||||
|
|
||||||
|
|||||||
@@ -15,30 +15,28 @@ All pending escrows are stored in the ledger as [Escrow objects](../../../../con
|
|||||||
|
|
||||||
Use the [account_objects method][], where the sender or destination address is the `account` value.
|
Use the [account_objects method][], where the sender or destination address is the `account` value.
|
||||||
|
|
||||||
Request:
|
|
||||||
|
|
||||||
{% tabs %}
|
{% tabs %}
|
||||||
|
|
||||||
{% tab label="Websocket" %}
|
{% tab label="Websocket" %}
|
||||||
|
Request:
|
||||||
{% code-snippet file="/_api-examples/escrow/websocket/account_objects-request.json" language="json" /%}
|
{% code-snippet file="/_api-examples/escrow/websocket/account_objects-request.json" language="json" /%}
|
||||||
{% /tab %}
|
|
||||||
|
|
||||||
{% /tabs %}
|
|
||||||
|
|
||||||
The response includes all pending escrow objects with `rfztBskAVszuS3s5Kq7zDS74QtHrw893fm`, where the sender address is the `Account` value, or the destination address is the `Destination` value.
|
|
||||||
|
|
||||||
Response:
|
Response:
|
||||||
|
|
||||||
{% tabs %}
|
|
||||||
|
|
||||||
{% tab label="Websocket" %}
|
|
||||||
{% code-snippet file="/_api-examples/escrow/websocket/account_objects-response.json" language="json" /%}
|
{% code-snippet file="/_api-examples/escrow/websocket/account_objects-response.json" language="json" /%}
|
||||||
|
|
||||||
|
The response includes all pending escrow objects with `rfztBskAVszuS3s5Kq7zDS74QtHrw893fm`, where the sender address is the `Account` value, or the destination address is the `Destination` value.
|
||||||
|
{% /tab %}
|
||||||
|
|
||||||
|
{% tab label="Javascript" %}
|
||||||
|
{% code-snippet file="/_code-samples/escrow/js/list-escrows.js" language="js" from="const response" before="client.disconnect" /%}
|
||||||
|
{% /tab %}
|
||||||
|
|
||||||
|
{% tab label="Python" %}
|
||||||
|
{% code-snippet file="/_code-samples/escrow/py/account_escrows.py" language="py" from="req =" /%}
|
||||||
{% /tab %}
|
{% /tab %}
|
||||||
|
|
||||||
{% /tabs %}
|
{% /tabs %}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## See Also
|
## See Also
|
||||||
|
|
||||||
- **Concepts:**
|
- **Concepts:**
|
||||||
|
|||||||
@@ -96,29 +96,29 @@ print(cancel_after)
|
|||||||
|
|
||||||
{% partial file="/docs/_snippets/secret-key-warning.md" /%}
|
{% partial file="/docs/_snippets/secret-key-warning.md" /%}
|
||||||
|
|
||||||
Request:
|
|
||||||
|
|
||||||
{% tabs %}
|
{% tabs %}
|
||||||
|
|
||||||
{% tab label="Websocket" %}
|
{% tab label="Websocket" %}
|
||||||
|
Request:
|
||||||
{% code-snippet file="/_api-examples/escrow/websocket/submit-request-escrowcreate-condition.json" language="json" /%}
|
{% code-snippet file="/_api-examples/escrow/websocket/submit-request-escrowcreate-condition.json" language="json" /%}
|
||||||
{% /tab %}
|
|
||||||
|
|
||||||
{% /tabs %}
|
|
||||||
|
|
||||||
Response:
|
Response:
|
||||||
|
|
||||||
{% tabs %}
|
|
||||||
|
|
||||||
{% tab label="Websocket" %}
|
|
||||||
{% code-snippet file="/_api-examples/escrow/websocket/submit-response-escrowcreate-condition.json" language="json" /%}
|
{% code-snippet file="/_api-examples/escrow/websocket/submit-response-escrowcreate-condition.json" language="json" /%}
|
||||||
{% /tab %}
|
{% /tab %}
|
||||||
|
|
||||||
|
{% tab label="Javascript" %}
|
||||||
|
{% code-snippet file="/_code-samples/escrow/js/create-escrow.js" language="js" from="// Prepare EscrowCreate" before="await client.disconnect" /%}
|
||||||
|
{% /tab %}
|
||||||
|
|
||||||
|
{% tab label="Python" %}
|
||||||
|
{% code-snippet file="/_code-samples/escrow/py/create_escrow.py" language="py" from="# Build escrow create" /%}
|
||||||
|
{% /tab %}
|
||||||
|
|
||||||
{% /tabs %}
|
{% /tabs %}
|
||||||
|
|
||||||
## 4. Wait for validation
|
## 4. Wait for validation
|
||||||
|
|
||||||
{% partial file="/docs/_snippets/wait-for-validation.md" /%}
|
{% raw-partial file="/docs/_snippets/wait-for-validation.md" /%}
|
||||||
|
|
||||||
## 5. Confirm that the escrow was created
|
## 5. Confirm that the escrow was created
|
||||||
|
|
||||||
@@ -157,26 +157,28 @@ If the escrow has expired, you can only [cancel the escrow](cancel-an-expired-es
|
|||||||
{% tabs %}
|
{% tabs %}
|
||||||
|
|
||||||
{% tab label="Websocket" %}
|
{% tab label="Websocket" %}
|
||||||
|
Request:
|
||||||
{% code-snippet file="/_api-examples/escrow/websocket/submit-request-escrowfinish-condition.json" language="json" /%}
|
{% code-snippet file="/_api-examples/escrow/websocket/submit-request-escrowfinish-condition.json" language="json" /%}
|
||||||
{% /tab %}
|
|
||||||
|
|
||||||
{% /tabs %}
|
|
||||||
|
|
||||||
Response:
|
Response:
|
||||||
|
|
||||||
{% tabs %}
|
|
||||||
|
|
||||||
{% tab label="Websocket" %}
|
|
||||||
{% code-snippet file="/_api-examples/escrow/websocket/submit-response-escrowfinish-condition.json" language="json" /%}
|
{% code-snippet file="/_api-examples/escrow/websocket/submit-response-escrowfinish-condition.json" language="json" /%}
|
||||||
{% /tab %}
|
{% /tab %}
|
||||||
|
|
||||||
|
{% tab label="Javascript" %}
|
||||||
|
{% code-snippet file="/_code-samples/escrow/js/finish-escrow.js" language="js" from="// Prepare EscrowFinish" before="await client.disconnect" /%}
|
||||||
|
{% /tab %}
|
||||||
|
|
||||||
|
{% tab label="Python" %}
|
||||||
|
{% code-snippet file="/_code-samples/escrow/py/finish_escrow.py" language="py" from="# Build escrow finish" /%}
|
||||||
|
{% /tab %}
|
||||||
|
|
||||||
{% /tabs %}
|
{% /tabs %}
|
||||||
|
|
||||||
Take note of the transaction's identifying `hash` value so you can check its final status when it is included in a validated ledger version.
|
Take note of the transaction's identifying `hash` value so you can check its final status when it is included in a validated ledger version.
|
||||||
|
|
||||||
## 7. Wait for validation
|
## 7. Wait for validation
|
||||||
|
|
||||||
{% partial file="/docs/_snippets/wait-for-validation.md" /%}
|
{% raw-partial file="/docs/_snippets/wait-for-validation.md" /%}
|
||||||
|
|
||||||
## 8. Confirm final result
|
## 8. Confirm final result
|
||||||
|
|
||||||
|
|||||||
@@ -47,32 +47,31 @@ print(release_date_ripple)
|
|||||||
|
|
||||||
{% partial file="/docs/_snippets/secret-key-warning.md" /%}
|
{% partial file="/docs/_snippets/secret-key-warning.md" /%}
|
||||||
|
|
||||||
|
|
||||||
|
{% tabs %}
|
||||||
|
|
||||||
|
{% tab label="Websocket" %}
|
||||||
Request:
|
Request:
|
||||||
|
|
||||||
{% tabs %}
|
|
||||||
|
|
||||||
{% tab label="Websocket" %}
|
|
||||||
{% code-snippet file="/_api-examples/escrow/websocket/submit-request-escrowcreate-time.json" language="json" /%}
|
{% code-snippet file="/_api-examples/escrow/websocket/submit-request-escrowcreate-time.json" language="json" /%}
|
||||||
{% /tab %}
|
|
||||||
|
|
||||||
{% /tabs %}
|
|
||||||
|
|
||||||
Response:
|
Response:
|
||||||
|
|
||||||
{% tabs %}
|
|
||||||
|
|
||||||
{% tab label="Websocket" %}
|
|
||||||
{% code-snippet file="/_api-examples/escrow/websocket/submit-response-escrowcreate-time.json" language="json" /%}
|
{% code-snippet file="/_api-examples/escrow/websocket/submit-response-escrowcreate-time.json" language="json" /%}
|
||||||
{% /tab %}
|
{% /tab %}
|
||||||
|
|
||||||
{% /tabs %}
|
{% tab label="Javascript" %}
|
||||||
|
{% code-snippet file="/_code-samples/escrow/js/create-escrow.js" language="js" from="// Prepare EscrowCreate" before="await client.disconnect" /%}
|
||||||
|
{% /tab %}
|
||||||
|
|
||||||
|
{% tab label="Python" %}
|
||||||
|
{% code-snippet file="/_code-samples/escrow/py/create_escrow.py" language="py" from="# Build escrow create" /%}
|
||||||
|
{% /tab %}
|
||||||
|
|
||||||
|
{% /tabs %}
|
||||||
|
|
||||||
Take note of the transaction's identifying `hash` value so you can check its final status when it is included in a validated ledger version.
|
Take note of the transaction's identifying `hash` value so you can check its final status when it is included in a validated ledger version.
|
||||||
|
|
||||||
## 3. Wait for validation
|
## 3. Wait for validation
|
||||||
|
|
||||||
{% partial file="/docs/_snippets/wait-for-validation.md" /%}
|
{% raw-partial file="/docs/_snippets/wait-for-validation.md" /%}
|
||||||
|
|
||||||
## 4. Confirm that the escrow was created
|
## 4. Confirm that the escrow was created
|
||||||
|
|
||||||
@@ -138,22 +137,22 @@ If the escrow has expired, you can only [cancel the escrow](cancel-an-expired-es
|
|||||||
|
|
||||||
{% partial file="/docs/_snippets/secret-key-warning.md" /%}
|
{% partial file="/docs/_snippets/secret-key-warning.md" /%}
|
||||||
|
|
||||||
Request:
|
|
||||||
|
|
||||||
{% tabs %}
|
{% tabs %}
|
||||||
|
|
||||||
{% tab label="Websocket" %}
|
{% tab label="Websocket" %}
|
||||||
|
Request:
|
||||||
{% code-snippet file="/_api-examples/escrow/websocket/submit-request-escrowfinish-time.json" language="json" /%}
|
{% code-snippet file="/_api-examples/escrow/websocket/submit-request-escrowfinish-time.json" language="json" /%}
|
||||||
{% /tab %}
|
|
||||||
|
|
||||||
{% /tabs %}
|
|
||||||
|
|
||||||
Response:
|
Response:
|
||||||
|
{% code-snippet file="/_api-examples/escrow/websocket/tx-response-escrowfinish-time.json" language="json" /%}
|
||||||
|
{% /tab %}
|
||||||
|
|
||||||
{% tabs %}
|
{% tab label="Javascript" %}
|
||||||
|
{% code-snippet file="/_code-samples/escrow/js/finish-escrow.js" language="js" from="// Prepare EscrowFinish" before="await client.disconnect" /%}
|
||||||
|
{% /tab %}
|
||||||
|
|
||||||
{% tab label="Websocket" %}
|
{% tab label="Python" %}
|
||||||
{% code-snippet file="/_api-examples/escrow/websocket/submit-response-escrowfinish-time.json" language="json" /%}
|
{% code-snippet file="/_code-samples/escrow/py/finish_escrow.py" language="py" from="# Build escrow finish" /%}
|
||||||
{% /tab %}
|
{% /tab %}
|
||||||
|
|
||||||
{% /tabs %}
|
{% /tabs %}
|
||||||
@@ -162,7 +161,7 @@ Take note of the transaction's identifying `hash` value so you can check its fin
|
|||||||
|
|
||||||
## 7. Wait for validation
|
## 7. Wait for validation
|
||||||
|
|
||||||
{% partial file="/docs/_snippets/wait-for-validation.md" /%}
|
{% raw-partial file="/docs/_snippets/wait-for-validation.md" /%}
|
||||||
|
|
||||||
## 8. Confirm final result
|
## 8. Confirm final result
|
||||||
|
|
||||||
|
|||||||
@@ -62,6 +62,9 @@ The following example shows creation of a payment channel by [submitting](../../
|
|||||||
|
|
||||||
{% admonition type="info" name="Note" %}A payment channel counts as one object toward the payer's [owner reserve](../../../../concepts/accounts/reserves.md#owner-reserves). The owner must keep at least enough XRP to satisfy the reserve after subtracting the XRP allocated to the payment channel.{% /admonition %}
|
{% admonition type="info" name="Note" %}A payment channel counts as one object toward the payer's [owner reserve](../../../../concepts/accounts/reserves.md#owner-reserves). The owner must keep at least enough XRP to satisfy the reserve after subtracting the XRP allocated to the payment channel.{% /admonition %}
|
||||||
|
|
||||||
|
{% tabs %}
|
||||||
|
|
||||||
|
{% tab label="JSON-RPC" %}
|
||||||
Request:
|
Request:
|
||||||
|
|
||||||
```json
|
```json
|
||||||
@@ -84,7 +87,7 @@ Content-Type: application/json
|
|||||||
"fee_mult_max": 1000
|
"fee_mult_max": 1000
|
||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
```json
|
```
|
||||||
|
|
||||||
Response:
|
Response:
|
||||||
|
|
||||||
@@ -105,7 +108,17 @@ Response:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
{% /tab %}
|
||||||
|
|
||||||
|
{% tab label="Javascript" %}
|
||||||
|
{% code-snippet file="/_code-samples/claim-payment-channel/js/claimPayChannel.ts" language="js" from="// Create a Payment" before="// Check" /%}
|
||||||
|
{% /tab %}
|
||||||
|
|
||||||
|
{% tab label="Python" %}
|
||||||
|
{% code-snippet file="/_code-samples/claim-payment-channel/py/claim_pay_channel.py" language="py" from="# Create a Payment" before="# Check" /%}
|
||||||
|
{% /tab %}
|
||||||
|
|
||||||
|
{% /tabs %}
|
||||||
|
|
||||||
The immediate response to the `submit` request contains a _provisional_ result with the transaction's identifying `hash` value. The payer should check the transaction's _final_ result in a validated ledger and get the Channel ID from the metadata. This can be done with the `tx` command:
|
The immediate response to the `submit` request contains a _provisional_ result with the transaction's identifying `hash` value. The payer should check the transaction's _final_ result in a validated ledger and get the Channel ID from the metadata. This can be done with the `tx` command:
|
||||||
|
|
||||||
@@ -400,6 +413,9 @@ The payee can do this multiple times, to settle partially while still doing busi
|
|||||||
|
|
||||||
Example of claiming XRP from a channel:
|
Example of claiming XRP from a channel:
|
||||||
|
|
||||||
|
{% tabs %}
|
||||||
|
|
||||||
|
{% tab label="JSON-RPC" %}
|
||||||
Request:
|
Request:
|
||||||
|
|
||||||
```json
|
```json
|
||||||
@@ -454,6 +470,17 @@ Response:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
{% /tab %}
|
||||||
|
|
||||||
|
{% tab label="Javascript" %}
|
||||||
|
{% code-snippet file="/_code-samples/claim-payment-channel/js/claimPayChannel.ts" language="js" from="// Destination claims" before="console.log('Balances of" /%}
|
||||||
|
{% /tab %}
|
||||||
|
|
||||||
|
{% tab label="Python" %}
|
||||||
|
{% code-snippet file="/_code-samples/claim-payment-channel/py/claim_pay_channel.py" language="py" from="# Destination claims" before="print(\"Balances of" /%}
|
||||||
|
{% /tab %}
|
||||||
|
|
||||||
|
{% /tabs %}
|
||||||
|
|
||||||
The payee should confirm that this transaction is successful in a validated ledger. For the full details, see [Reliable Transaction Submission](../../../../concepts/transactions/reliable-transaction-submission.md).
|
The payee should confirm that this transaction is successful in a validated ledger. For the full details, see [Reliable Transaction Submission](../../../../concepts/transactions/reliable-transaction-submission.md).
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ const cards = [
|
|||||||
id: 'low-cost',
|
id: 'low-cost',
|
||||||
title: 'Low Cost',
|
title: 'Low Cost',
|
||||||
description: <>
|
description: <>
|
||||||
At fractions of a penny per transaction, costs are inexpensive enough to enable a wide variety of <a href='/about/uses'>blockchain use cases</a>
|
At fractions of a penny per transaction, costs are inexpensive enough to enable a wide variety of <Link to='/about/uses'>blockchain use cases</Link>
|
||||||
</>
|
</>
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
14
package-lock.json
generated
14
package-lock.json
generated
@@ -3228,20 +3228,20 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/axios": {
|
"node_modules/axios": {
|
||||||
"version": "1.10.0",
|
"version": "1.11.0",
|
||||||
"resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz",
|
"resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz",
|
||||||
"integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==",
|
"integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"follow-redirects": "^1.15.6",
|
"follow-redirects": "^1.15.6",
|
||||||
"form-data": "^4.0.0",
|
"form-data": "^4.0.4",
|
||||||
"proxy-from-env": "^1.1.0"
|
"proxy-from-env": "^1.1.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/axios/node_modules/form-data": {
|
"node_modules/axios/node_modules/form-data": {
|
||||||
"version": "4.0.3",
|
"version": "4.0.4",
|
||||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
|
||||||
"integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==",
|
"integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"asynckit": "^0.4.0",
|
"asynckit": "^0.4.0",
|
||||||
|
|||||||
@@ -1,3 +1,12 @@
|
|||||||
|
/docs/infrastructure/installation/rippled-1-3-migration-instructions/:
|
||||||
|
to: /docs/infrastructure/installation/
|
||||||
|
type: 301
|
||||||
|
/docs/infrastructure/installation/update-rippled-manually-on-centos-rhel/:
|
||||||
|
to: /docs/infrastructure/installation/update-rippled-manually-on-rhel/
|
||||||
|
type: 301
|
||||||
|
/docs/infrastructure/installation/install-rippled-on-centos-rhel-with-yum/:
|
||||||
|
to: /docs/infrastructure/installation/install-rippled-on-rhel/
|
||||||
|
type: 301
|
||||||
/docs/concepts/xrpl-sidechains/price-oracles/:
|
/docs/concepts/xrpl-sidechains/price-oracles/:
|
||||||
to: /docs/concepts/decentralized-storage/price-oracles/
|
to: /docs/concepts/decentralized-storage/price-oracles/
|
||||||
type: 301
|
type: 301
|
||||||
@@ -1436,7 +1445,7 @@ system-requirements.html:
|
|||||||
to: /docs/infrastructure/installation/system-requirements
|
to: /docs/infrastructure/installation/system-requirements
|
||||||
type: 301
|
type: 301
|
||||||
install-rippled-on-centos-rhel-with-yum.html:
|
install-rippled-on-centos-rhel-with-yum.html:
|
||||||
to: /docs/infrastructure/installation/install-rippled-on-centos-rhel-with-yum
|
to: /docs/infrastructure/installation/install-rippled-on-rhel
|
||||||
type: 301
|
type: 301
|
||||||
install-rippled-on-ubuntu.html:
|
install-rippled-on-ubuntu.html:
|
||||||
to: /docs/infrastructure/installation/install-rippled-on-ubuntu
|
to: /docs/infrastructure/installation/install-rippled-on-ubuntu
|
||||||
@@ -1448,7 +1457,7 @@ update-rippled-automatically-on-linux.html:
|
|||||||
to: /docs/infrastructure/installation/update-rippled-automatically-on-linux
|
to: /docs/infrastructure/installation/update-rippled-automatically-on-linux
|
||||||
type: 301
|
type: 301
|
||||||
update-rippled-manually-on-centos-rhel.html:
|
update-rippled-manually-on-centos-rhel.html:
|
||||||
to: /docs/infrastructure/installation/update-rippled-manually-on-centos-rhel
|
to: /docs/infrastructure/installation/update-rippled-manually-on-rhel
|
||||||
type: 301
|
type: 301
|
||||||
update-rippled-manually-on-ubuntu.html:
|
update-rippled-manually-on-ubuntu.html:
|
||||||
to: /docs/infrastructure/installation/update-rippled-manually-on-ubuntu
|
to: /docs/infrastructure/installation/update-rippled-manually-on-ubuntu
|
||||||
@@ -2326,6 +2335,15 @@ code_of_conduct.ja:
|
|||||||
type: 301
|
type: 301
|
||||||
|
|
||||||
# Japanese
|
# Japanese
|
||||||
|
/ja/docs/infrastructure/installation/rippled-1-3-migration-instructions/:
|
||||||
|
to: /ja/docs/infrastructure/installation/
|
||||||
|
type: 301
|
||||||
|
/ja/docs/infrastructure/installation/update-rippled-manually-on-centos-rhel/:
|
||||||
|
to: /ja/docs/infrastructure/installation/update-rippled-manually-on-rhel/
|
||||||
|
type: 301
|
||||||
|
/ja/docs/infrastructure/installation/install-rippled-on-centos-rhel-with-yum/:
|
||||||
|
to: /ja/docs/infrastructure/installation/install-rippled-on-rhel/
|
||||||
|
type: 301
|
||||||
/ja/docs/tutorials/javascript/trade-on-ledger/earn-passive-income-as-a-liquidity-provider:
|
/ja/docs/tutorials/javascript/trade-on-ledger/earn-passive-income-as-a-liquidity-provider:
|
||||||
to: /ja/docs/tutorials/javascript/amm/add-assets-to-amm
|
to: /ja/docs/tutorials/javascript/amm/add-assets-to-amm
|
||||||
type: 301
|
type: 301
|
||||||
@@ -3755,7 +3773,7 @@ code_of_conduct.ja:
|
|||||||
to: /ja/docs/infrastructure/installation/system-requirements
|
to: /ja/docs/infrastructure/installation/system-requirements
|
||||||
type: 301
|
type: 301
|
||||||
/ja/install-rippled-on-centos-rhel-with-yum.html:
|
/ja/install-rippled-on-centos-rhel-with-yum.html:
|
||||||
to: /ja/docs/infrastructure/installation/install-rippled-on-centos-rhel-with-yum
|
to: /ja/docs/infrastructure/installation/install-rippled-on-rhel
|
||||||
type: 301
|
type: 301
|
||||||
/ja/install-rippled-on-ubuntu.html:
|
/ja/install-rippled-on-ubuntu.html:
|
||||||
to: /ja/docs/infrastructure/installation/install-rippled-on-ubuntu
|
to: /ja/docs/infrastructure/installation/install-rippled-on-ubuntu
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import * as React from "react";
|
import * as React from "react";
|
||||||
import { useThemeHooks } from '@redocly/theme/core/hooks';
|
import { useThemeHooks } from '@redocly/theme/core/hooks';
|
||||||
|
import { Link } from "@redocly/theme/components/Link/Link";
|
||||||
|
|
||||||
export const frontmatter = {
|
export const frontmatter = {
|
||||||
seo: {
|
seo: {
|
||||||
@@ -192,9 +193,9 @@ export default function DevTools() {
|
|||||||
<h4> {translate("Explorers")}</h4>
|
<h4> {translate("Explorers")}</h4>
|
||||||
<div className="row row-cols-1 row-cols-lg-3 card-deck">
|
<div className="row row-cols-1 row-cols-lg-3 card-deck">
|
||||||
{explorers_tools.map((card) => (
|
{explorers_tools.map((card) => (
|
||||||
<a
|
<Link
|
||||||
className="card"
|
className="card"
|
||||||
href={card.href}
|
to={card.href}
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
id={card.id}
|
id={card.id}
|
||||||
@@ -208,7 +209,7 @@ export default function DevTools() {
|
|||||||
<p className="card-text">{translate(card.description)}</p>
|
<p className="card-text">{translate(card.description)}</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="card-footer"> </div>
|
<div className="card-footer"> </div>
|
||||||
</a>
|
</Link>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -221,9 +222,9 @@ export default function DevTools() {
|
|||||||
<h4> {translate("API Access")}</h4>
|
<h4> {translate("API Access")}</h4>
|
||||||
<div className="row row-cols-1 row-cols-lg-3 card-deck">
|
<div className="row row-cols-1 row-cols-lg-3 card-deck">
|
||||||
{api_access_tools.map((card) => (
|
{api_access_tools.map((card) => (
|
||||||
<a
|
<Link
|
||||||
className="card"
|
className="card"
|
||||||
href={card.href}
|
to={card.href}
|
||||||
target="_blank"
|
target="_blank"
|
||||||
id={card.id}
|
id={card.id}
|
||||||
key={card.id}
|
key={card.id}
|
||||||
@@ -238,7 +239,7 @@ export default function DevTools() {
|
|||||||
<p className="card-text">{translate(card.description)}</p>
|
<p className="card-text">{translate(card.description)}</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="card-footer"> </div>
|
<div className="card-footer"> </div>
|
||||||
</a>
|
</Link>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -251,9 +252,9 @@ export default function DevTools() {
|
|||||||
<h4> {translate("Other")}</h4>
|
<h4> {translate("Other")}</h4>
|
||||||
<div className="row row-cols-1 row-cols-lg-3 card-deck">
|
<div className="row row-cols-1 row-cols-lg-3 card-deck">
|
||||||
{other.map((card) => (
|
{other.map((card) => (
|
||||||
<a
|
<Link
|
||||||
className="card"
|
className="card"
|
||||||
href={card.href}
|
to={card.href}
|
||||||
target="_blank"
|
target="_blank"
|
||||||
id={card.id}
|
id={card.id}
|
||||||
key={card.id}
|
key={card.id}
|
||||||
@@ -268,7 +269,7 @@ export default function DevTools() {
|
|||||||
<p className="card-text">{translate(card.description)}</p>
|
<p className="card-text">{translate(card.description)}</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="card-footer"> </div>
|
<div className="card-footer"> </div>
|
||||||
</a>
|
</Link>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -629,16 +629,14 @@
|
|||||||
expanded: false
|
expanded: false
|
||||||
items:
|
items:
|
||||||
- page: docs/infrastructure/installation/system-requirements.md
|
- page: docs/infrastructure/installation/system-requirements.md
|
||||||
- page: docs/infrastructure/installation/install-rippled-on-centos-rhel-with-yum.md
|
- page: docs/infrastructure/installation/install-rippled-on-rhel.md
|
||||||
- page: docs/infrastructure/installation/install-rippled-on-ubuntu.md
|
- page: docs/infrastructure/installation/install-rippled-on-ubuntu.md
|
||||||
- page: docs/infrastructure/installation/install-clio-on-ubuntu.md
|
- page: docs/infrastructure/installation/install-clio-on-ubuntu.md
|
||||||
- page: docs/infrastructure/installation/update-rippled-automatically-on-linux.md
|
- page: docs/infrastructure/installation/update-rippled-automatically-on-linux.md
|
||||||
- page: docs/infrastructure/installation/update-rippled-manually-on-centos-rhel.md
|
- page: docs/infrastructure/installation/update-rippled-manually-on-rhel.md
|
||||||
- page: docs/infrastructure/installation/update-rippled-manually-on-ubuntu.md
|
- page: docs/infrastructure/installation/update-rippled-manually-on-ubuntu.md
|
||||||
- page: docs/infrastructure/installation/build-on-linux-mac-windows.md
|
- page: docs/infrastructure/installation/build-on-linux-mac-windows.md
|
||||||
- page: docs/infrastructure/installation/build-run-rippled-in-reporting-mode.md
|
|
||||||
- page: docs/infrastructure/installation/capacity-planning.md
|
- page: docs/infrastructure/installation/capacity-planning.md
|
||||||
- page: docs/infrastructure/installation/rippled-1-3-migration-instructions.md
|
|
||||||
- page: docs/infrastructure/configuration/index.md
|
- page: docs/infrastructure/configuration/index.md
|
||||||
expanded: false
|
expanded: false
|
||||||
items:
|
items:
|
||||||
@@ -699,7 +697,7 @@
|
|||||||
labelTranslationKey: sidebar.resources.codesamples
|
labelTranslationKey: sidebar.resources.codesamples
|
||||||
page: resources/code-samples.page.tsx
|
page: resources/code-samples.page.tsx
|
||||||
- group: Dev Tools
|
- group: Dev Tools
|
||||||
labelTranslationKey: sidebar.resources.dev-tools
|
groupTranslationKey: sidebar.resources.dev-tools
|
||||||
page: resources/dev-tools/index.page.tsx
|
page: resources/dev-tools/index.page.tsx
|
||||||
expanded: false
|
expanded: false
|
||||||
items:
|
items:
|
||||||
|
|||||||
Reference in New Issue
Block a user