Chance Bitcoin Wallet——swift opensource bitcoin wallet
MIT License
这是一个iOS终端的比特币钱包应用,此应用非完全节点钱包,是一个适合移动设备使用的瘦钱包,它只关心安全地保存好用户重要的私钥信息,并支持比特币账户的创建,发送比特币,接收比特币,查询钱包子账户,备份钱包,恢复钱包等功能。它不具有存储完整区块链数据,验证P2P网络广播的交易,挖矿等功能。
技术支持: 🐧QQ群:624834691 📮Email:[email protected]
给予BTC支持: 3G4NdQQyCJK1RS5URb4h5KogWEyR4Mk16A
本应用对数据资料划分为三部分:“恢复密语和密码”,“账户体系”,“交易数据”。
当我们通过分享公钥创建了多重签名账户后,账户并不会收集其它公钥提供者的私钥,但有这些公钥生产出的“赎回脚本”,并保存在账户数据库中。这个“赎回脚本”的地址所收的资产就是大家的资产,当账户要动用资产发送交易时,需要大家提供必要数目的签名才能被比特币网络验证确认。
在联合签名这一步,我们有以下注意事项:
- 我们不可能把所有的私钥提供给交易发起者去做签名,这样会违背了多重签名账户创造的意义。
- 比特币的脚本系统是堆栈结构的,所以它验证签名时,需要的签名排序要与赎回脚本里的key排序一致,这样脚本才能验证正确。
- 动用账户的未花交易记录的条数可能是多条的,每条记录都要进行签名。
- 可能只有账户的维护者才持有赎回脚本,其他人没有必要长期持有赎回脚本,当有交易发起时,他们只要提供签名就是。
为了解决上述问题,我定义了一种多重签名交易协议。发起交易者生成一张待签名的交易单数据,通过网络发送给其它待签名者(不论签名顺序),对方接收后进行签名并验证已得到的签名是否足够,验证通过就广播给比特币网络,不通过就把签名信息合并到待签名的交易单中,转发给其它待签名者(不论签名顺序),如此类推,直到最后一个收集完所有签名的人广播交易到比特币网络。此协议数据文本使用“multisig:”作为协议标识开头。
文本格式:multisig:{"rawTx":"01000000021138...","redeemScriptHex":"532103324c4"...,"keySignatures":{"0":["3045022100...","304402..."],"2":["30450221...","3044022059bd..."]}}
“multisig:”后的内容其实是一个json结构体
{
//rawTx,空白签名交易单的hex
"rawTx": "01000000021138c1e2f7735a8589fa2a3df2426fbaf24a047330c5a0dc14ffadf7dd8767b10000000000ffffffff6d3c772c389561f20b4afec072cbb61cbe15b42aa37fb50e98ad78f3021241790000000000ffffffff02409c0000000000001976a914d1f9af334c34de5558c0d6785d2f22e25a9eff6d88ac80131c000000000017a914dde71db06038ed3a3bead881b20176dd6de8ec068700000000",
//redeemScriptHex,多重签名赎回脚本的hex
"redeemScriptHex": "532103324c40d0042fb1c21be5d0688e1e0c7090e16d0fc6abbb0563ba368bc2d7f20b2102c6287fd02ec3f5c3689d9152688553670d9f84fdc124c621e2ffe7be8ccc60bc21028c42e572d465753610915266f5f7855ebcb74b7f7db434a2732685cb290c20a953ae",
//keySignatures,各私钥提供的交易签名hex
"keySignatures": {
//第1条钥匙所在赎回脚本的位置
"0": [
//对第1条未花交易输入的签名
"3045022100ddccdb3a60054cb3fd8973ecf24ca0f09f27533a42a7d1b8f30768b03350513002201b034827ad6a3a23850d485bf09f4b6c1e4a15d081f22a376992e61aa37ca81501",
//对第2条未花交易输入的签名
"304402205f11cf0824a435f6445b20f941d74d4f1e879bd5b3b6c2cb72e58e5e335796b9022042cb6d3b28c70316e71b6ae6b4ca4103cb25bc3f57dab7f5fe9a5534f2d5e30f01"
],
//第2条钥匙的交易签名信息
"2": [
"30450221008dd0d34169ecc73022f3ab7adb190068e8a85c09f5b578c73746d7118aaf3e3e02200830884592a60313a1432c494af62fe658361c23919401d59d6c850feac5216f01",
"3044022059bdd1ff6a07bc3bcd4fc58f8a171ee2a77d7ac22c9f69a812d665032da48259022076fe2dcd69b2e0bf05e87c09a419e3f1202529f8a39858ae0170a84be34276e201"
]
}
}
协议解析:
- rawTx:不包含签名的交易单,用于给待签名者查看交易单详情——转账多少比特币到哪个地址上。
- redeemScriptHex:每个待签名者都有可能是最后一个完成验证通过的,广播交易时需要,交易单的脚本需要包含赎回脚本信息。而且赎回脚本包公钥哈希,能用来确定待签名者的签名顺序位置。
- keySignatures:交易单签名数据结构,这个结构以签名顺序号作为key值,对应签名提供者的多个交易输入的签名数据
最后,解析协议和封装协议的工作由我的钱包程序处理,在MultiSigTransaction类中实现。注意,这个协议并非比特币促进协议(BIP)里头的,仅仅适合这个钱包应用。
在Setting - Blockchain Node,选择testnet的在线节点。
可以在这个网站获取一些Bitcoin测试币。 https://testnet.manu.backend.hamburg/faucet
开发Swift版的Bitcoin Core(独立的一个项目)。目前使用的是Objective-C版的coreBitcoin开源库,这个库设计得非常好,很多好的BIP都实现了,代码稳定易用。问题是作者已经很少更新了,面对未来可能出现的“隔离验证”升级,我们需要自己改造。我已经开发Swift项目多年了,我也很喜欢Swfit语言,所以我就有了,开发Swift语言版的Bitcoin Core冲动。这样做有很多好处:
- 因为Swift的开源,新的库可以支持iOS/macOS/Linux,甚至有可能Windows。
- 支持“隔离验证”升级,有利于日后开发更多扩展支持。
开发支持比特币全球行情订阅。
开发一个开放的钱包服务平台,用于应用内账户收发信息,收发比特币,多重签名账户创建,多重签名交易。
为了让开发者更积极分享技术,开源程序代码,我们发起数字货币捐助计划,捐款接收以下货币。