XpringKit 5.1.1

XpringKit 5.1.1

Ted KalawAmie CorsoNoah Kramer维护。



 
依赖
Alamofire~> 4.9.0
BigInt~> 5.0.0
SwiftGRPC~> 0.9.1
SwiftProtobuf~> 1.5.0
 

XpringKit 5.1.1

  • Xpring Engineering

CircleCI CodeCov

XpringKit

XpringKit是Xpring SDK的Swift客户端库。

特性

XpringKit提供以下特性

  • 生成的钱包和推导(基于种子或HD钱包)
  • 地址验证
  • 获取账户余额
  • 发送XRP付款
  • 检索付款交易和账户付款历史
  • 为XRPL账户启用存款授权

安装

客户端库

Carthage

XpringKit 可通过 Carthage 获取。简单地将以下内容添加到您的 Cartfile

github "xpring-eng/XpringKit"

CocoaPods

XpringKit 可通过 CocoaPods 获取。简单地将以下内容添加到您的 Podfile

pod 'XpringKit'

rippled Node

Xpring SDK 需要与启用了 gRPC 的 rippled 节点通信。有关如何构建自己的节点,请参阅 rippled 文档 中的详细信息。

为了使开发者能够立即开始,Xpring 目前提供节点

# Testnet
test.xrp.xpring.io:50051

# Mainnet
main.xrp.xpring.io:50051

Hermes Node

Xpring SDK 的 IlpClient 需要通过 Hermes 实例与 Xpring 的 ILP 基础设施通信。

要连接到 Xpring 当前运行的 Hermes 实例,您需要创建一个 ILP 钱包 这里

创建钱包后,您可以使用钱包中指定的 gRPC URL 以及您的 访问令牌 检查您的余额并通过 ILP 发送付款。

用法:XRP

注意: Xpring SDK 只与 X-Address 格式一起工作。有关该格式的更多信息,请参阅 实用工具部分http://xrpaddress.info

钱包

钱包是XpringKit中的一个基本模型对象,提供密钥管理、地址导出和签名功能。钱包可以从种子或助记词以及导出路径生成。您还可以选择生成一个新的随机HD钱包。

钱包导出

XpringKit可以从种子中导出钱包,也可以从助记词和导出路径中导出分层确定性钱包(HD钱包)。

分层确定性钱包

分层确定性钱包是使用助记词和导出路径创建的。只需将助记词和导出路径传递给钱包生成函数。注意,您可以省略导出路径并使用默认路径。

import XpringKit

let mnemonic = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"

let hdWallet1 = Wallet.generateWalletFromMnemonic(mnemonic: mnemonic)! // Has default derivation path
let hdWallet2 = Wallet(mnemonic: mnemonic, derivationPath: Wallet.defaultDerivationPath)! // Same as hdWallet1

let hdWallet = Wallet(mnemonic: mnemonic, derivationPath: "m/44'/144'/0'/0/1"); // Wallet with custom derivation path.
基于种子的钱包

您可以通过传递base58check编码的种子字符串来构建一个基于种子的钱包。

import XpringKit

let seedWallet = Wallet(seed: "snRiAJGeKCkPVddbjB3zRwiYDBm1M")!

钱包生成

XpringKit可以生成一个新的随机HD钱包。钱包生成调用的结果是包含以下内容的元组

  • 随机生成的助记词
  • 使用的导出路径,默认路径
  • 对新钱包的引用
import XpringKit

// Generate a random wallet.
let generationResult = Wallet.generateRandomWallet()!
let newWallet = generationResult.wallet

// Wallet can be recreated with the artifacts of the initial generation.
let copyOfNewWallet = Wallet(mnemonic: generationResult.mnemonic, derivationPath: generationResult.derivationPath)

钱包属性

生成的钱包可以在XRP账本上提供其公钥、私钥和地址。

import XpringKit

let mnemonic = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about";

let wallet = Wallet(mnemonic: mnemonic)!

print(wallet.address) // XVMFQQBMhdouRqhPMuawgBMN1AVFTofPAdRsXG5RkPtUPNQ
print(wallet.publicKey) // 031D68BC1A142E6766B2BDFB006CCFE135EF2E0E2E94ABB5CF5C9AB6104776FBAE
print(wallet.privateKey) // 0090802A50AA84EFB6CDB225F17C27616EA94048C179142FECF03F4712A07EA7A4

签名/验证

钱包还可以签署和验证任意十六进制消息。通常,用户应使用XRPClient上的功能来执行加密函数,而不是使用这些低级API。

import XpringKit

let mnemonic = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"
let message = "deadbeef";

let wallet = Wallet(mnemonic: mnemonic)!

let signature = wallet.sign(message)
wallet.verify(message, signature); // true

XRPClient

XRPClient是XRP账本的一个入口。它用一个参数初始化,即远程适配器的URL(参见上文“服务器端组件”部分)。

import XpringKit

let remoteURL = "test.xrp.xpring.io:50051"; // Testnet URL, use main.xrp.xpring.io:50051 for Mainnet
let xrpClient = XRPClient(grpcURL: remoteURL, network: XRPLNetwork.test)

检索余额

XRPClient可以检查XRP账本上一个账户的余额。

import XpringKit

let remoteURL = "test.xrp.xpring.io:50051"; // Testnet URL, use main.xrp.xpring.io:50051 for Mainnet
let xrpClient = XRPClient(grpcURL: remoteURL, network: XRPLNetwork.test)

let address = "XVMFQQBMhdouRqhPMuawgBMN1AVFTofPAdRsXG5RkPtUPNQ"

let balance = try! xrpClient.getBalance(for: address)
print(balance) // Logs a balance in drops of XRP

检查支付状态

可以检查XRP账本上一个支付的状态。

此方法只能确定没有设部分支付标志(支付事务)(tfPartialPayment)设置的支付事务的状态。

XpringKit返回以下事务状态:

  • 成功:事务已成功验证并应用到了XRP账本。
  • 失败:事务已成功验证但未应用到XRP账本。或者该操作永远不会被验证。
  • pending:该交易尚未被验证,但将来可能会被验证。
  • unknown:无法确定交易状态,哈希代表非付款类型交易,或哈希表示设置了tfPartialPayment标志的交易。

注意:更多信息,请参考可靠的交易提交交易结果

这些状态由TransactionStatus枚举确定。

import XpringKit

let remoteURL = "test.xrp.xpring.io:50051"; // Testnet URL, use main.xrp.xpring.io:50051 for Mainnet
let xrpClient = XRPClient(grpcURL: remoteURL, network: XRPLNetwork.test)

let transactionHash = "9FC7D277C1C8ED9CE133CC17AEA9978E71FC644CE6F5F0C8E26F1C635D97AF4A"

let transactionStatus = xrpClient.paymentStatus(for: transactionHash) // TransactionStatus.succeeded

注意:示例中的transactionHash可能会导致“交易未找到”错误,因为TestNet会定期重置,或者访问的节点可能只维护一个月的历史记录。最近的交易哈希可以在XRP账本浏览器 中找到。

检索特定付款

XRPClient可以按哈希检索特定付款交易。

import XpringKit

let remoteURL = "alpha.test.xrp.xpring.io:50051"; // TestNet URL, use alpha.xrp.xpring.io:50051 for Mainnet
let xrpClient = XRPClient(grpcURL: remoteURL, network: XRPLNetwork.test)

let transactionHash = "9FC7D277C1C8ED9CE133CC17AEA9978E71FC644CE6F5F0C8E26F1C635D97AF4A"
let payment = try! xrpClient.getPayment(for: transactionHash)

注意:示例中的transactionHash可能会导致“交易未找到”错误,因为TestNet会定期重置,或者访问的节点可能只维护一个月的历史记录。最近的交易哈希可以在XRP账本浏览器 中找到。

检索特定付款

XRPClient可以按哈希检索特定付款交易。

import xpringkit

let remoteURL = "alpha.test.xrp.xpring.io:50051"; // TestNet URL, use alpha.xrp.xpring.io:50051 for Mainnet
let xrpClient = XRPClient(grpcURL: remoteURL, useNewProtocolBuffers: true)

let transactionHash = "9FC7D277C1C8ED9CE133CC17AEA9978E71FC644CE6F5F0C8E26F1C635D97AF4A"
let payment = try! xrpClient.getPayment(for: transactionHash)

注意:示例中的交易哈希可能会导致“交易未找到”错误,因为TestNet会定期重置,或者访问的节点可能只维护一个月的历史记录。最近的交易哈希可以在XRP账本浏览器中找到。

付款历史记录

XRPClient可以返回特定账户的付款记录。

import XpringKit

let remoteURL = "alpha.test.xrp.xpring.io:50051"; // TestNet URL, use alpha.xrp.xpring.io:50051 for Mainnet
let xrpClient = XRPClient(grpcURL: remoteURL, network: XRPLNetwork.test)

let address = "XVMFQQBMhdouRqhPMuawgBMN1AVFTofPAdRsXG5RkPtUPNQ"

let transactions = try! xrpClient.paymentHistory(for: address)

发送XRP

XRPClient可以向XRP账本上的其他账户发送XRP。

注意:支付操作将阻塞调用线程,直到操作达到明确的且不可逆转的成功或失败状态。

import XpringKit

let remoteURL = "test.xrp.xpring.io:50051"; // TestNet URL, use main.xrp.xpring.io:50051 for Mainnet
let xrpClient = XRPClient(grpcURL: remoteURL, network: XRPLNetwork.test)

// Wallet which will send XRP
let generationResult = Wallet.generateRandomWallet()!
let senderWallet = generationResult.wallet

// Destination address.
let address = "X7u4MQVhU2YxS4P9fWzQjnNuDRUkP3GM6kiVjTjcQgUU3Jr"

// Amount of XRP to send, in drops.
let amount: UInt64 = 10

let transactionHash = try! xrpClient.send(amount, to: destinationAddress, from: senderWallet)

注意:上述示例将产生“账户未找到”错误,因为随机生成的钱包中没有任何XRP。

启用存款授权

let remoteURL = "test.xrp.xpring.io:50051" // TestNet URL, use main.xrp.xpring.io:50051 for Mainnet
let xrpClient = new XRPClient(remoteURL, XRPLNetwork.test)

// Wallet for which to enable Deposit Authorization
let seedWallet = Wallet("snRiAJGeKCkPVddbjB3zRwwoiYDBm1M")

let transactionResult: TransactionResult = xrpClient.enableDepositAuth(seedWallet)
let transactionHash: String = transactionResult.hash
let transactionStatus: TransactionStatus = transactionResult.status
let validated: Bool = transactionResult.validated

实用工具

地址验证

Utils对象提供了一个简便的方式来验证地址。

import XpringKit

let rippleClassicAddress = "rnysDDrRXxz9z66DmCmfWpq4Z5s4TyUP3G"
let rippleXAddress = "X7jjQ4d6bz1qmjwxYUsw6gtxSyjYv5iWPqPEjGqqhn9Woti"
let bitcoinAddress = "1DiqLtKZZviDxccRpowkhVowsbLSNQWBE8"

Utils.isValid(address: rippleAddress); // returns true
Utils.isValid(address: bitcoinAddress); // returns false

您还可以验证一个地址是否是X-地址或经典地址。

import XpringKit

let rippleClassicAddress = "rnysDDrRXxz9z66DmCmfWpq4Z5s4TyUP3G"
let rippleXAddress = "X7jjQ4d6bz1qmjwxYUsw6gtxSyjYv5iWPqPEjGqqhn9Woti"
let bitcoinAddress = "1DiqLtKZZviDxccRpowkhVowsbLSNQWBE8"

Utils.isValidXAddress(address: rippleClassicAddress); // returns false
Utils.isValidXAddress(address: rippleXAddress); // returns true
Utils.isValidXAddress(address: bitcoinAddress); // returns false

Utils.isValidClassicAddress(address: rippleClassicAddress); // returns true
Utils.isValidClassicAddress(address: rippleXAddress); // returns false
Utils.isValidClassicAddress(address: bitcoinAddress); // returns false

X-地址编码

您可以使用SDK对X-地址进行编码和解码。

import XpringKit

let rippleClassicAddress = "rnysDDrRXxz9z66DmCmfWpq4Z5s4TyUP3G"
let tag: UInt32 = 12345;

// Encode an X-Address.
let xAddress = Utils.encode(classicAddress: address, tag: tag) // X7jjQ4d6bz1qmjwxYUsw6gtxSyjYv5xRB7JM3ht8XC4P45P

// Decode an X-Address.
let classicAddressTuple = Utils.decode(xAddress: address)!
print(classicAddressTuple.classicAddress); // rnysDDrRXxz9z66DmCmfWpq4Z5s4TyUP3G
print(classicAddressTuple.tag); // 12345

使用: PayID

使用了两个类与PayID进行工作:`PayIDClient`和`XRPPayIDClient`。

PayIDClient

单地址解析

PayIDClient 可以解析任意加密货币网络上的地址。

import XpringKit

// Resolve on Bitcoin Mainnet.
let network = "btc-mainnet"
let payIDClient = PayIDClient()
let payID = "georgewashington$xpring.money"

let result = payIDClient.cryptoAddress(for: payID, on: network)
switch result {
case .success(let btcAddressComponents)
  print("Resolved to \(btcAddressComponents.address)")
case .failure(let error):
  fatalError("Unknown error resolving address: \(error)")
}

#### Single Address Resolution

`PayIdClient` can retrieve all available addresses.

```swift
import XpringKit

let payID = "georgewashington$xpring.money"
let payIDClient = new PayIDClient()

let allAddresses = payIDClient.allAddresses(for: payID)
case .success(let addresses)
  print("All addresses: \(allAddresses)")
case .failure(let error):
  fatalError("Unknown error retrieving all addresses: \(error)")
}

还提供了异步API。

XRPPayIDClient

XRPPayIDClient 可以解析XRP账本网络上的地址。该类总是将返回的地址强制转换为X-地址。(参见 https://xrpaddress.info/

import XpringKit

// Use XrplNetwork.main for Mainnet.
let xrpPayIDClient = XRPPayIDClient(xrplNetwork: .main)

let payID = 'georgewashington$xpring.money'
let result = xrpPayIDClient.xrpAddress(for: payID)
switch result {
case .success(let xrpAddress):
  print("Resolved to \(xrpAddress)")
case .failure(let error):
  fatalError("Unknown error resolving address: \(error)")
}

还提供了异步API。

用法:ILP

ILPClient

ILPClient 是进入ILP网络的主要接口。必须使用Hermer实例的URL来初始化 ILPClient。这可以在您的 钱包 中找到。

所有调用的 ILPClient 都必须传递一个访问令牌,该令牌可以在您的 钱包 中生成。

import XpringKit

let grpcUrl = "hermes-grpc-test.xpring.dev" // TestNet Hermes URL
let ilpClient = ILPClient(grpcURL: grpcUrl)

获取余额

ILPClient 可以检查连接器上账户的余额。

import XpringKit

let grpcUrl = "hermes-grpc-test.xpring.dev" // TestNet Hermes URL
let ilpClient = ILPClient(grpcURL: grpcUrl)

let getBalance = try ilpClient.getBalance(for: "demo_user", withAuthorization: "2S1PZh3fEKnKg") // Just a demo user on Testnet
print("Net balance was \(getBalance.netBalance) with asset scale \(getBalance.assetScale)")

发送支付

ILPClient 可以通过提供 支付指针对象 和发送者的账户ID,将ILP支付发送到另一个ILP地址。

import XpringKit

let grpcUrl = "hermes-grpc-test.xpring.dev" // TestNet Hermes URL
let ilpClient = ILPClient(grpcURL: grpcUrl)

let paymentRequest = PaymentRequest(
    100,
    to: "$xpring.money/demo_receiver",
    from: "demo_user"
)
let payment = try ilpClient.sendPayment(
    paymentRequest,
    withAuthorization: "2S1PZh3fEKnKg"
)

使用:Xpring

Xpring组件通过集成PayID和XRP组件,使复杂的交互变得简单。

import XpringKit

let network = XRPLNetwork.test

// Build an XRPClient
let rippledUrl = "test.xrp.xpring.io:50051"
let xrpClient = XRPClient(rippledUrl, network)

// Build a PayIDClient
let payIDClient = XRPPayIDClient(network)

// XpringClient combines functionality from XRP and PayID
let xpringClient = XpringClient(payIdClient, xrpClient)

// A wallet with some balance on TestNet.
let wallet = Wallet(seed: "snYP7oArxKepd3GPDcrjMsJYiJeJB")!

// A PayID which will receive the payment.
let payId = "georgewashington$xpring.money"

// Send XRP to the given PayID.
let result = xpringClient.send(dropsToSend, to: payID, from: wallet)
switch result {
case .success(let hash):
  print("Hash for transaction:\n\(hash)\n")
case .failure:
  fatalError("Unable to send transaction.")
}

还提供了异步API。

贡献

欢迎提交Pull请求!要开始构建这个库和打开Pull请求,请参见contributing.md

感谢所有为这个库做出贡献的用户!

许可

Xpring SDK遵循MIT许可。有关更多信息,请参阅LICENSE文件。