XRP API
XrpApp クラスは、XRP Ledger
のアドレス取得とトランザクション署名を提供します。Ed25519(デフォルト)と
secp256k1 の両方の楕円曲線をサポートしています。
Ethereum との主な違い
| 項目 |
Ethereum |
XRP |
| アドレス形式 |
0x... (hex) |
r... (Base58Check) |
| デフォルト曲線 |
secp256k1 |
Ed25519 |
| Ed25519 公開鍵 |
— |
0xED プレフィックス付き |
| 署名フォーマット |
v/r/s |
raw bytes (Ed25519: 64B, secp256k1: DER) |
| BIP44 パス |
44'/60'/... |
44'/144'/...(Ed25519: 全ハードニング) |
インポート
import {
XrpApp,
DEFAULT_XRP_PATH,
type XrpSignatureResult,
type XrpCurve,
} from '@openloop/sdk-core'
初期化
const xrp = new XrpApp(transport)
メソッド一覧
| メソッド |
説明 |
getAddress(path, curve?) |
XRP アドレスと公開鍵を取得 |
signTransaction(path, txBlob) |
シリアライズ済みトランザクションに署名 |
getAddress
デバイスから XRP Ledger アドレスを取得します。
async getAddress(
path: string,
curve?: XrpCurve
): Promise<{
publicKey: string // 公開鍵 (hex, Ed25519: 33B with 0xED prefix, secp256k1: 33B compressed)
address: string // XRP アドレス ("r...")
}>
パラメータ
| 名前 |
型 |
デフォルト |
説明 |
path |
string |
— |
BIP44 パス |
curve |
XrpCurve |
'ed25519' |
'ed25519' or 'secp256k1' |
XrpCurve 型
type XrpCurve = 'ed25519' | 'secp256k1'
デフォルトパス
DEFAULT_XRP_PATH = "44'/144'/0'/0'/0'"(Ed25519:
全要素ハードニング)
使用例
// Ed25519(デフォルト)
const { address, publicKey } = await xrp.getAddress(DEFAULT_XRP_PATH)
// address: "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"
// publicKey: "ed01a2b3c4..." (0xED prefix)
// secp256k1
const { address, publicKey } = await xrp.getAddress(
"44'/144'/0'/0/0", // secp256k1 は非ハードニングパスも可
'secp256k1'
)
曲線選択と P2 値
| 曲線 |
P2 値 |
説明 |
'ed25519' |
0x80 |
Ed25519(デフォルト、推奨) |
'secp256k1' |
0x40 |
secp256k1(Ethereum 互換) |
signTransaction
シリアライズ済みの XRP トランザクションに署名します。
async signTransaction(
path: string,
txBlob: string
): Promise<XrpSignatureResult>
パラメータ
| 名前 |
型 |
説明 |
path |
string |
BIP44 パス |
txBlob |
string |
シリアライズ済みトランザクション (hex, 0x
あり/なし) |
返り値:
XrpSignatureResult
| フィールド |
型 |
説明 |
signature |
string |
署名の hex(Ed25519: 64 bytes, secp256k1: DER
エンコード可変長) |
使用例
const { signature } = await xrp.signTransaction(
DEFAULT_XRP_PATH,
'120000228...' // serialized transaction blob
)
xrpl.js 連携
import { Client, Wallet, encode, decode } from 'xrpl'
import { XrpApp, DEFAULT_XRP_PATH } from '@openloop/sdk-core'
import { WebHidTransport } from '@openloop/transport-webhid'
const transport = await WebHidTransport.connect()
const xrp = new XrpApp(transport)
// アドレス取得
const { address, publicKey } = await xrp.getAddress(DEFAULT_XRP_PATH)
// XRP Ledger に接続
const client = new Client('wss://xrplcluster.com/')
await client.connect()
// トランザクション作成
const prepared = await client.autofill({
TransactionType: 'Payment',
Account: address,
Amount: '1000000', // 1 XRP = 1,000,000 drops
Destination: 'rPT1Sjq2YGrBMTttX4GZHjKu9dyfzbpAYe',
})
// シリアライズしてデバイスで署名
const txBlob = encode(prepared)
const { signature } = await xrp.signTransaction(DEFAULT_XRP_PATH, txBlob)
// 署名をトランザクションに追加
const signedTx = {
...prepared,
TxnSignature: signature.toUpperCase(),
SigningPubKey: publicKey.toUpperCase(),
}
// ブロードキャスト
const result = await client.submitAndWait(encode(signedTx))
console.log('TX Result:', result.result.meta.TransactionResult)
await client.disconnect()
次のステップ