主页 > imtoken浏览器可以下载 > 项目实战:比特币充提一体化

项目实战:比特币充提一体化

imtoken浏览器可以下载 2024-01-26 05:14:10

最近做了一个比特币充提币的试用功能。 作为一名技术爱好者,之前没有这方面的经验,在网上也很难找到更合适的资料,于是摸索着做了一个demo,写了这篇文章。 ,想法可能还不够成熟,需要在实际生产环境中进行更多的考虑和设计,比如手续费的考虑。 希望有相关经验的高手指点,指正错误。

目的:假设某网站提供会员充值和提现功能。 用户通过传统网银收银台或微信支付宝充值,并兑换成平台币或平台积分或干脆对应法币余额,享受更优优惠和奖励。 当然该平台也允许用户提取资金。 现在的目标是增加一个比特币充值和提现通道。 具体功能如下: 1.1 功能需求 1)允许用户通过比特币进行充值,用户转出比特币比特币的地址到底怎么充值的,平台自动转换为平台支持的法币余额或积分。

2)允许用户提取平台余额,由平台将其兑换成相应数量的BTC,转入用户的比特币钱包 1.2 设计考虑 1)系统生成私钥时如何做到不暴露私钥用户的比特币地址?

BIP32 分层确定性密钥用于创建分层确定性密钥。 我们可以通过父节点的扩展公钥生成子节点的比特币地址,这样作为一个直接与外网交互的网站,基本不用担心安全问题。 父节点的扩展公钥不能生成子节点的私钥,所以私钥不会暴露,但是这里的扩展公钥尽量不要暴露为普通公钥,妥善保管,原因如下:

注:BIP32有普通密钥common key和hardened key enhanced key。 只有当父节点为普通密钥时,子节点的公钥才能通过其扩展公钥生成(实际上必须加一个链码)。 另外需要特别注意的是,对于普通的关键节点,一旦黑客掌握了子节点的私钥和父节点的扩展公钥,就可以反向推导出父节点的私钥, 因此父节点将启动所有子节点。

[参考]

2)每个用户都会分配一个比特币地址,如何有效管理这么多比特币地址?

使用BIP44协议,可以更加规范的管理所有的比特币地址。 例如,根据BIP44,我们可以生成两个主账户:

外部账户(分配给用户):m/44'/0'/0'/0/address_index

内部账户(分配给internal):m/44'/0'/1'/0/address_index

通过父节点的扩展密钥和索引号,我们可以为用户和内部生成比特币地址,并进一步绑定数据库中的用户ID和比特币地址信息(比特币地址,编号,创建日期),我们可以实现更复杂的逻辑,比如通过交叉比对充值记录回收三个月内未使用的比特币地址。

3)如何管理分散充值到分配给用户的数千个地址的比特币?

可及时划入内部账户。 比如我们检测到用户充值成功,就可以添加这个转账动作

4)如何给用户提现,比如是从中央钱包转账?

实在没有想到更好更合理的方案,所以在我的设计中,确实需要用中央钱包转出,参考内部账户m/44'/0'/1'/0/address_index 2)中提到,为了简化,可以直接使用固定账户m/44'/0'/1'/0/0作为“结算备付金账户”。 我们需要实时监控这个账户的状态,避免提现失败。

注意:对于简单的监控,可以使用btc exporter grafana

5)我们的需求设计中冷热钱包怎么设计?

安全性的考虑不是简单的一层,而是多层次的设计。 根据不同的风险等级设计相应的安全策略。 一般考虑如下:

i) 分配给用户的外部账号的安全性基本上是比较低的。 对于个人用户,充值金额比较低,而且根据3)充值到外部账户的比特币会及时转出,所以外部账户应该是热钱包

ii) 内部账户的安全等级更高比特币的地址到底怎么充值的,因为内部账户管理的比特币较多,所以安全等级有待提高。 能不能做成100%的冷钱包?应该不可能吧,因为我们还需要从内部账户提款给用户。 想要提现,首先要知道用户的提现记录。 即使不直接连接数据库获取,也必须连接内部系统获取,即使离线签名转账也需要知道UTXO。 ,如果是物理上与网络断开连接的冷钱包,则无法知道它是否未连接到其他系统。 我们只能通过防火墙端口控制、安全通信等内部网络的安全防护来提高它的安全性。 我们可以把它做成一个半冷钱包

iii) 只要以上两点提到的没有物理隔离和断开的钱包都不能称为冷钱包,那么为了进一步提高资金的安全性,我们可以将一些比特币存放在冷钱包中,比如60%的冷钱包wallets 钱包,40%放在ii)半冷钱包。

注意:至于冷钱包是如何与系统交互的,我的demo中忽略了。 网上看资料大概知道这两种方式

一种。 先说一个比较奇怪的设计,用几个电脑摄像头扫描二维码。 比如热钱包生成rawtransaction的二维码,冷钱包摄像头扫描二维码签名生成signedtransaction二维码,再由热钱包扫描。 播送

b. 通过BIP32,我们知道当我们向一个地址转账的时候,这个地址的私钥是不需要计算的。 是的,我们可以直接把一个私钥从来没有出现过的账户当成冷钱包,把冷钱包每次转账的钱都花光,然后把零钱放到另一个新的冷钱包里

很好奇真正的交易所是如何定义冷热钱包并实现交互的 1.3 工作流程 1)充值流程 i)用户选择比特币充值,输入15000人民币,网站根据当前汇率自动显示0.5BTC,然后用户确认并提交

ii)网站生成比特币充值地址(M/44'/0'/0'/0/address_index)并生成订单[insert into topup_order],

同时网站还生成支付二维码,格式:bitcoin:?amount=&message=

iii) 用户从交易所或自己的钱包中手动输入或扫描二维码进行转账

iv) 定时任务程序会从数据库中获取充值请求,通过RPC请求比特币节点检测与请求地址相关的交易。 一旦检测到,更新用户平台余额并保留比特币交易信息txid/vout/scriptPub[update topup_orderrealamt,txid,vout,scriptpub>]。

v) 定时任务程序根据realamt、txid、vout、scriptpub创建一个rawtransaction,将比特币转入内部账户 2) 提现流程 i) 用户选择将平台余额转换为比特币现金提现,输入15000元并提供个人比特币地址,网站程序根据当前汇率自动显示0.5 BTC,用户确认并提交提现请求

ii) 网站验证用户余额和比特币地址的有效性,并创建提款记录[insert into withdraw_order]

iii) 定时任务程序从数据库中获取取款请求,从内部账户批量转账比特币到用户的比特币地址

1.4 准备工作 1) Bitcoin core v0.17.1

2)Bx工具(libbitcoin)

注意:注意需要更改testnet或regtest的配置

~/libbitcoin-explorer/etc/libbitcoin/bx.cfg

比特币的地址到底怎么充值的_比特币地址怎么充值_火币网查询自己的比特币钱包地址

3) Python库

pip 安装 python-bitcoinrpc

bip32utils

4) 其他

BTC-法币汇率api

BTC交易手续费api

1.5 入门 1.5.1 创建密钥(遵守bip32 bip39 bip44标准) 注意如果是testnet或者regtest,必须根据配置配置config文件。 如果你和我一样使用bx工具,请参考1.4中的说明进行配置;

另外,testnet的cointype是1,

现在使用bx工具创建助记词mnemonic和根节点master节点

火币网查询自己的比特币钱包地址_比特币地址怎么充值_比特币的地址到底怎么充值的

网站程序使用xpub(m/44'/1'/0'/0)[tpubDFCmqNxHDiBWw9e8XUEhkHqcw1i4drCe2mwwpR83eA2Arfmq8hJkUeVYY7hYaQWEo4HZDQ86FiRYj8Lr3e9UT8bYi7yLvbNbXgqyJeqLYii]生成用户充值地址

定时任务程序使用xprv(m/44'/1'/0'/0)[tprv8iWjgxv35LVr3gcLdpa7LtBWMzC8UX1jTUMAXu5kDtDn2BX4WJVAJ9sgMzFjuoiWjhUdamEeB7sxPS6uzkmcEAAXNAevuaRWYQFMwX713mP] 来转移集中比特币到内部账号,为简化本demo使用固定的账号地址addr( m/44'/1'/ 1'/0/0)[muz1awk6YXQkP29dt1tdRpBTonmqAqwdst]).1.5.2 搭建测试环境 1) 使用比特币测试网钱包

2) 获取测试比特币

3)允许比特币核心

测试网配置 ~/.bitcoin/bitcoin.conf

比特币地址怎么充值_比特币的地址到底怎么充值的_火币网查询自己的比特币钱包地址

bitcoind -testnet -printtoconsole/-daemon

然后导入内部账号测试地址

bitcoin-cli -testnet importprivkey cVHBtHK7kzze7yqF5En4Psbw2ZZdUEJ8jF4KAMXhLpuSwUf4fZAU "internal0" true

4) 测试网浏览器

1.5.3 网站程序可以使用nodejs webpack创建一个简单的web app

引用bitcoinjs库,参考代码:

使用 xpub(m/44'/1'/0'/0) 为用户生成地址

火币网查询自己的比特币钱包地址_比特币地址怎么充值_比特币的地址到底怎么充值的

1.5.4 定时任务程序 1)充值

比特币地址怎么充值_火币网查询自己的比特币钱包地址_比特币的地址到底怎么充值的

2) 将中心化用户转入内部账户充值

火币网查询自己的比特币钱包地址_比特币地址怎么充值_比特币的地址到底怎么充值的

3) 提款

比特币的地址到底怎么充值的_比特币地址怎么充值_火币网查询自己的比特币钱包地址

注意:取款,也就是从内部账户转btc到用户个人地址,本来想用signtransactionwithkey离线签名的方式,但是问题是这个需要知道所有的utxo,也就是说所有的utxo都必须好管理。 当然,你可以观察钱包获取utxo的方式(未测试),将pubkey导入bitcoin core,rpc获取未花费的交易,但仍然需要一定的策略来使用这些utxo,比如使用低余额的output每次,否则可能会产生越来越小的输出量,所以其实这个demo是偷懒的,直接用sendmany处理