BitcoinKit-iOS
Bitcoin,BitcoinCash(ABC) 和 Dash 钱包工具包,适用于 Swift。这是一个完整的 SPV 节点实现,包括钱包创建/恢复,与网络的同步,发送/接收交易等等。仓库包括主要的 BitcoinCore.swift
和 BitcoinKit.swift
,BitcoinCashKit.swift
和 DashKit.swift
独立的 pods。
特性
- 完整的 SPV 实现以实现快速的移动性能
- 发送/接收旧交易(P2PKH,P2PK,P2SH)
- BIP32 层次确定型钱包实现。
- BIP39 作为生成确定性密钥的助记码。
- BIP44 用于确定型钱包的多账户层次结构。
- BIP21 URI 方案,包括付款地址、金额、标签和其他参数
BitcoinKit.swift
- 发送/接收 Segwit 交易(P2WPKH)
- 发送/接收与旧钱包兼容的 Segwit 交易(P2WPKH-SH)
- base58, bech32
BitcoinCashKit.swift
- bech32 现金地址
DashKit.swift
- 即时发送
- LLMQ 锁定,主节点验证
用法
在本页中,我们将使用 套件 来指代以下之一:BitcoinKit.swift
、BitcoinCashKit.swift
和 DashKit.swift
套件。
初始化
套件 需要在初始化时提供助记词短语。
let words = ["word1", ... , "word12"]
比特币
let bitcoinKit = BitcoinKit(withWords: words, walletId: "bitcoin-wallet-id", syncMode: .api, networkType: .mainNet)
比特币现金
let bitcoinCashKit = BitcoinCashKit(withWords: words, walletId: "bitcoin-cash-wallet-id", syncMode: .api, networkType: .mainNet)
达世币
let dashKit = DashKit(withWords: words, walletId: "dash-wallet-id", syncMode: .api, networkType: .mainNet)
所有 3 个 套件 都可以配置为在 .mainNet
或 .testNet
上工作。
syncMode
参数
工具包可以恢复现有钱包或创建一个新的钱包。在恢复过程中,它根据 bip44 协议为给定钱包生成地址,然后从这些地址中的每个地址拉取所有历史交易。这项操作仅在初始同步时进行一次。syncMode
参数定义了它从哪里拉取历史交易。在拉取时,它继续根据SPV协议进行同步,无论初始同步时使用了哪种同步模式。有 3 种模式可供选择
.full
:从头开始从点对点网络同步,从 bip44 介绍时的区块开始。此模式最私密(因为它完全符合SPV协议),但迄今为止(2019年6月10日)同步需要大约2小时。.api
:从 API(目前为 Insight API 或 BcoinAPI)拉取检查点之前的交易。然后从点对点网络同步其余部分。这是最快的一个,但也有攻击者可能了解你拥有哪些地址的风险。检查点会随着每个新版本的发布而更新,并以硬编码的方式进行,所以不会破坏区块验证。.newWallet
:无需拉取交易。
其他参数
confirmationsThreshold
:支出未花费输出在传入交易中所需的最低确认数(默认:6)minLogLevel
:如有需要,可以配置为调试用途。
启动和停止
工具包 需要使用 start
命令启动。只要可能,它就会处于同步状态。您可以调用 stop
来停止它。
bitcoinKit.start()
bitcoinKit.stop()
获取钱包数据
工具包 存储从区块链网络中获取的所有种类的数据和需要用于工作的数据。
当前余额
余额以 塞塔币
计价
bitcoinKit.balance
// 2937096768
最新区块信息
最新区块信息包含 headerHash
、height
和 timestamp
,可用于向用户显示同步信息
bitcoinKit.lastBlockInfo
// ▿ Optional<BlockInfo>
// ▿ some : BlockInfo
// - headerHash : //"00000000000041ae2164b486398415cca902a41214cad72291ee04b212bed4c4"
// - height : 1446751
// ▿ timestamp : Optional<Int>
// - some : 1544097931
接收地址
获取一个您可以接收币的地址。每次您在该地址接收币后,接收地址都会更改
bitcoinKit.receiveAddress
// "mgv1KTzGZby57K5EngZVaPdPtphPmEWjiS"
交易
套件 有 transactions(fromHash: nil, limit: nil)
方法,该方法返回 Single<TransactionInfo>
(用于 BitcoinKit 和 BitcoinCashKit)和 Single<DashTransactionInfo>
(用于 DashKit) RX 单次观察者。
TransactionInfo
:
// ▿ TransactionInfo
// - transactionHash : "0f83c9b330f936dc4a2458b7d3bb06dce6647a521bf6d98f9c9d3cdd5f6d2a73"
// - transactionIndex : 500000
// ▿ from : 2 elements
// ▿ 0 : TransactionAddressInfo
// - address : "mft8jpnf3XwwqhaYSYMSXePFN85mGU4oBd"
// - mine : true
// ▿ 1 : TransactionAddressInfo
// - address : "mnNS5LEQDnYC2xqT12MnQmcuSvhfpem8gt"
// - mine : true
// ▿ to : 2 elements
// ▿ 0 : TransactionAddressInfo
// - address : "n43efNftHQ1cXYMZK4Dc53wgR6XgzZHGjs"
// - mine : false
// ▿ 1 : TransactionAddressInfo
// - address : "mrjQyzbX9SiJxRC2mQhT4LvxFEmt9KEeRY"
// - mine : true
// - amount : -800378
// ▿ blockHeight : Optional<Int>
// - some : 1446602
// ▿ timestamp : Optional<Int>
// - some : 1543995972
DashTransactionInfo
:
// ▿ DashTransactionInfo
// - transactionHash : "0f83c9b330f936dc4a2458b7d3bb06dce6647a521bf6d98f9c9d3cdd5f6d2a73"
// - transactionIndex : 500000
// - instantTx : true
// ▿ from : 2 elements
// ▿ 0 : TransactionAddressInfo
// - address : "mft8jpnf3XwwqhaYSYMSXePFN85mGU4oBd"
// - mine : true
// ▿ 1 : TransactionAddressInfo
// - address : "mnNS5LEQDnYC2xqT12MnQmcuSvhfpem8gt"
// - mine : true
// ▿ to : 2 elements
// ▿ 0 : TransactionAddressInfo
// - address : "n43efNftHQ1cXYMZK4Dc53wgR6XgzZHGjs"
// - mine : false
// ▿ 1 : TransactionAddressInfo
// - address : "mrjQyzbX9SiJxRC2mQhT4LvxFEmt9KEeRY"
// - mine : true
// - amount : -800378
// ▿ blockHeight : Optional<Int>
// - some : 1446602
// ▿ timestamp : Optional<Int>
// - some : 1543995972
创建新交易
要创建新交易,请在 套件 上调用 send(to: String, value: Int, feeRate: Int)
方法
try bitcoinKit.send(to: "mrjQyzbX9SiJxRC2mQhT4LvxFEmt9KEeRY", value: 1000000, feeRate: 10000)
这首先验证了提供的地址和金额,创建了新交易,然后将其发送到对等网络。如果地址/金额或网络存在任何错误,则抛出异常。
在发送前验证交易
可以通过以下方法验证地址和费用
try bitcoinKit.validate(address: "mrjQyzbX9SiJxRC2mQhT4LvxFEmt9KEeRY")
try bitcoinKit.fee(for: 1000000, toAddress: "mrjQyzbX9SiJxRC2mQhT4LvxFEmt9KEeRY", senderPay: true, feeRate: 10000)
senderPay
参数定义了谁支付了费用
解析 BIP21 URI
您可以使用 parse
方法解析 BIP21 URI
bitcoinKit.parse(paymentAddress: "bitcoin:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?amount=50&label=Luke-Jr&message=Donation%20for%20project%20xyz")
// ▿ BitcoinPaymentData
// - address : "175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W"
// - version : nil
// ▿ amount : Optional<Double>
// - some : 50.0
// ▿ label : Optional<String>
// - some : "Luke-Jr"
// ▿ message : Optional<String>
// - some : "Donation for project xyz"
// - parameters : nil
订阅 BitcoinKit 数据
套件 提供实时数据,例如交易、区块、余额、套件状态。必须实现 BitcoinCoreDelegate
协议并将其实例设置为 套件 以接收该数据。
class Manager {
init(words: [String]) {
bitcoinKit = BitcoinKit(withWords: words, walletId: "bitcoin-wallet-id")
bitcoinKit.delegate = self
}
}
extension Manager: BitcoinCoreDelegate {
func transactionsUpdated(inserted: [TransactionInfo], updated: [TransactionInfo]) {
}
func transactionsDeleted(hashes: [String]) {
}
func balanceUpdated(balance: Int) {
}
func lastBlockInfoUpdated(lastBlockInfo: BlockInfo) {
}
public func kitStateUpdated(state: BitcoinCore.KitState) {
// BitcoinCore.KitState can be one of 3 following states:
// .synced
// .syncing(progress: Double)
// .notSynced
//
// These states can be used to implement progress bar, etc
}
}
监听事件在专用后台线程中运行。可以通过将 delegateQueue
属性设置为 DispatchQueue.main
来切换到主线程。
bitcoinKit.delegateQueue = DispatchQueue.main
先决条件
- Xcode 10.0+
- Swift 5+
- iOS 11+
安装
CocoaPods
CocoaPods 是 Cocoa 项目的依赖管理器。您可以使用以下命令安装它:
$ gem install cocoapods
BitcoinKit 需要 CocoaPods 1.5.0+ 版本才能构建。
要使用 CocoaPods 将 BitcoinKit 集成到您的 Xcode 项目中,请在您的 Podfile
中指定它:
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '10.0'
use_frameworks!
target '<Your Target Name>' do
pod 'BitcoinCore.swift'
pod 'BitcoinKit.swift'
pod 'BitcoinCashKit.swift'
pod 'DashKit.swift'
end
然后,运行以下命令:
$ pod install
示例项目
示例项目中使用了该库的所有功能。它可以作为使用库的起始点。
依赖项
- HSHDWalletKit - 与 HD 钱包相关的功能,生成助记短语。
- OpenSslKit.swift - 在区块链中工作时所需的加密功能。
- Secp256k1Kit.swift - 在区块链中工作时所需的加密功能。
Dash 依赖项
许可协议
BitcoinKit-iOS
工具包是开源的,受 MIT 许可协议条款约束。