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文件。