BitcoinCore.swift 0.15.4

BitcoinCore.swift 0.15.4

Horizontal Systems 维护。



 
依赖
OpenSslKit.swift~> 1.0
Secp256k1Kit.swift~> 1.0
HdWalletKit.swift~> 1.5
HsToolKit.swift~> 1.1.0
UIExtensions.swift~> 1.1.1
ObjectMapper~> 3.0
RxSwift~> 5.0
BigInt~> 5.0
GRDB.swift~> 4.0
 

BitcoinKit-iOS

为 Swift 专门开发的比特币、BitcoinCash(ABC) 和 Dash 钱包工具包。这是一个包括钱包创建/恢复、与网络同步、发送/接收交易等完整 SPV 节点的实现。仓库包括主要的 BitcoinCore.swiftBitcoinKit.swift,还有单独的 BitcoinCashKit.swiftDashKit.swift Pod。

功能

  • 完整的 SPV 实现以实现快速移动性能
  • 发送/接收经典交易 (P2PKHP2PKP2SH)
  • BIP32 级联确定性钱包实现。
  • BIP39 碎片代码用于生成确定性密钥。
  • BIP44 多账户层次结构用于确定性钱包。
  • BIP21 URI 计划,包括付款地址、金额、标签和其他参数

BitcoinKit.swift

  • 发送/接收 Segwit 交易 (P2WPKH)
  • 与经典钱包兼容的发送/接收 Segwit 交易 (P2WPKH-SH)
  • base58, bech32

BitcoinCashKit.swift

  • bech32现金地址

DashKit.swift

  • 即时发送
  • LLMQ锁定,主节点验证

使用方法

在本页中,我们将使用套件来指代以下套件之一:BitcoinKit.swiftBitcoinCashKit.swiftDashKit.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 参数定义了从哪里拉取历史交易。syncMode 被用于初始同步,一旦拉取,无论使用什么同步模式,都将继续根据 SPV 协议同步。有 3 个模式可供选择

  • .full:从 bip44 介绍的块开始,从点对点网络完全同步。这种模式最私密(因为它完全符合 SPV 协议),但至今(2019 年 6 月 10 日)大约需要同步 2 小时。
  • .api:在检查点之前的交易从 API(目前为 Insight APIBcoinAPI)中拉取。然后从点对点网络同步剩余的部分。这是最快的一种,但攻击者可能学会您拥有的地址。检查点会随着每个新版本的发布而更新,并被硬编码,因此不会破坏块验证。
  • .newWallet:不需要拉取交易。
其他参数
  • confirmationsThreshold:未花费输出在传入交易中被花费所需的最低确认数量(默认:6)
  • minLogLevel:如果需要,可以配置为调试目的。

启动和停止

套件 需要使用 start 命令启动。只要可能,它将保持在同步状态。您可以通过调用 stop 来停止它。

bitcoinKit.start()
bitcoinKit.stop()

获取钱包数据

套件 保存从区块链网络获取的所有类型的数据以及为了使用区块链网络所需的所有数据。

当前余额

余额以 塞特oshi 提供。

bitcoinKit.balance

// 2937096768

最新区块信息

最新区块信息包含 headerHashheighttimestamp,这些可以用来向用户展示同步信息。

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 Single Observers

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

创建新交易

为了创建新交易,请在 Kits 上调用 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

示例项目

所有库功能都在示例项目中使用。它可以作为使用库的起点。

依赖项

Dash 依赖项

许可证

BitcoinKit-iOS工具套件为开源软件,根据MIT 许可协议条款可供使用。