用bsv.js和MatterCloud实现可以收发比特币BSV的极简钱包

开发实战 专栏收录该内容
2 篇文章 0 订阅

这篇文章教大家如何自己编写一个极简的BSV钱包,可以生成私钥、地址,并发送交易。

 

准备工作

语言:JavaScript

环境:Node.js

操作系统:Win、Mac、Linux

推荐IDE:VSCode

 

首先,确保计算机上安装了Node.js并配置了环境变量,如果没有安装Node.js,可以到官网(https://nodejs.org/zh-cn/)下载安装。

 

新建一个工程文件夹,名字任意,例如SimplestWallet。用命令行打开这个文件夹。

依次输入如下命令安装所需的依赖包:

npm install bsv
npm install mattercloudjs

如果看到如下log,说明依赖包安装成功(版本号不一样没关系)。

...
+ bsv@1.5.3
...
+ mattercloudjs@1.1.2
...

其中,bsv库(https://docs.moneybutton.com/docs/bsv-overview.html)是用于比特币BSV的事务数据操作方法的库。

mattercloudjs库(https://www.mattercloud.net)封装了和比特币运营节点MatterCloud通信的网络API。

 

然后,我们需要申请一下MatterCloud的免费API权限。到官网(https://www.mattercloud.net)点击 `Get API Key` 按钮,

再点击Generate,即可得到Key。

 

 

生成私钥和地址

在制作钱包之前,我们先随机生成一个私钥。我们当然可以手动打入随机数,但正常做法是用随机算法生成,这样可以保证编码正确。

创建一个random-key.js文件,代码如下

const BSV = require('bsv') //引用bsv库
let priKey = BSV.PrivateKey.fromRandom() //随机生成私钥
console.log(priKey.toHex()) //输出Hex格式私钥
console.log(priKey.toAddress()) //输出地址

保存后,在命令行里用如下node命令运行该代码

node .\random-key.js

随即输出一个私钥和对应的地址,例如

79f5876834b1e179de0112fd150e3170259fc2863328bb39a3f6f07403686158

1F9929pRu1TETjzd69Yf3znzG5baywqFva

记录好私钥,但千万不要公开。这个地址就可以用来收款。

可以在https://cli.im自行制作地址的二维码,方便手机钱包扫码付款。

 

转入少量BSV

为了测试我们的钱包,需要一定的币,你也可以在写完代码后再转币。

在此列举几个获取少量币的方法。

https://sv.cafe/buy 小额人民币快速买BSV,下限1元。

https://if.cash/bsv/faucet BSV水龙头,免费领取币,但可能失败。

https://www.freebsv.com BSV水龙头,未测试。

 

如果你想知道当前地址的余额,可以在区块链浏览器查询到,如

https://whatsonchain.com

https://satomoto.com/bitcoin-sv

https://www.oklink.com/bsv

 

编写转账功能

在工程文件夹里新建文件send-money.js,粘贴如下代码

const BSV = require('bsv') //引用bsv库
const MatterCloud = require('mattercloudjs') //引用MatterCloud库

const MatterCloudAPIKey = "CeJg9E1uuVJueBoJg6fkD5f5u7jBv4k7jj4cr6mmo8UTMzuqbq8Muzp3aXYTZ6bTh" //MatterCloud API Key
const matterAPI = MatterCloud.instance({
    api_key: MatterCloudAPIKey, 
})

let priKeyHex = "79f5876834b1e179de0112fd150e3170259fc2863328bb39a3f6f07403686158" //钱包私钥

let receiverAddresss = "1FjdJzaGXiUKQjnPBiTXqbuTPZMwypfoPC" //收款地址
let value = 1000 //收款金额(单位:Sat)

async function main() {

    let priKey = BSV.PrivateKey.fromHex(priKeyHex) //组装私钥
    let address = priKey.toAddress() //获取自己钱包的地址

    //获取锁定在钱包地址上的所有UTXO
    await matterAPI.getUtxos(address).then(async utxos => {

        let newTx = new BSV.Transaction() //创建一个transaction

        newTx.feePerKb(600) //设置手续费率为 0.6 Sat/Byte。 FIXME: 最终得到的tx的手续费和这里设置的不一致,原因不明
        //不同服务商的费率不同,经测试MatterCloud的广播API至少要 0.5 Sat/Byte。

        //将所有UTXO全部填入transaction的输入端(这是一种无脑做法,优秀的钱包应该智能地选择UTXO)
        let inputs = []
        utxos.forEach(utxo => {
            inputs.push(utxo)
        });
        newTx.from(inputs)

        //将收款地址对应的P2PKH输出添加到transaction的输出端
        let output = BSV.Transaction.Output({
            satoshis: value,
            script: BSV.Script.fromAddress(receiverAddresss)
        })
        newTx.addOutput(output)

        newTx.change(address) //将自己的地址设置为找零地址

        newTx.sign(priKey) //用私钥给transaction签署

        //生成16进制的transaction原数据,并输出,你可以用其他服务商来广播transaction
        let rawTx = newTx.toBuffer().toString('hex')
        console.log('RawTx:')
        console.log(rawTx)

        //用MatterCloud服务商广播transaction
        await matterAPI.sendRawTx(rawTx).then(res => {

            console.log('发送transaction成功:')
            console.log(res) //输出广播transaction的结果,包含txid

        }).catch(e => {
            console.error(e)
        })
    })
}

main()

 

如果你的钱包地址上已经有币,就可以转账了。

注意修改代码中的几个变量:

  • MatterCloudAPIKey。这是之前在MatterCloud免费获得的API Key。以后无需修改。
  • priKeyHex。这是你自己的钱包私钥,也就是刚刚生成的那个。以后很少修改。
  • receiverAddresss。本次转账的目标地址,每次转账时注意修改。
  • value。本次转账的金额,以Sat为单位,每次转账也应该修改。

 

用node命令运行脚本:

node .\send-money.js

如果发送成功,则输出如下

RawTx:
0100000002616f4ed2d6f9ad733e0e79fc12ea25e5022b99ce028edc7fdce7c3cbebf3a482010000008b483045022100faf05e98a313f9272af265e4685ad101ff670d0a34f82b1fe880d3275f32f948022046b3e6ed50de5ef5847f1d96a2b48fe9ae5aaa5d4667bb43724092acbed45e594141048da20227dc514bc19ba554caa81d373fe2714828fed99e6dec0ca05503da6e2ea1f631deb355502b77d3ce4cde5584e3810fd7d25777878d1b3a1dc6a89bd76bffffffff631540441b4dd04f7dc970b0059cdbd76a008186d675d050c1e737c254a53366010000008a473044022028dfe3e8243513847995cb97060b9eab0042fb718382ebc71bb52fb7055de77502204aaf50c30daefd46da76291bed5bf5288ac6fbc172afd8c0898e46419069159a4141048da20227dc514bc19ba554caa81d373fe2714828fed99e6dec0ca05503da6e2ea1f631deb355502b77d3ce4cde5584e3810fd7d25777878d1b3a1dc6a89bd76bffffffff02e8030000000000001976a914a1a18aa70fe9c31c041c23eb6ee57f18c7cda25888aceb250000000000001976a9149b1bc88717b3d068d55a12519f4fd7fcc31f5ab588ac00000000
发送transaction成功:
{ txid: '7467a9782d56230d3eefd857fbc3b57a6bf77a5e5034c2ce679ba334ae803d69' }

 

最后得到的txid,就是transaction的hash,可以用来在区块链浏览器上查到刚刚发送的transaction。

 

回顾

log里输出的rawTx是16进制表示的transaction原数据。可以用https://whatsonchain.com/decode解码tx。如果广播不成功,还可以用https://whatsonchain.com/broadcast直接广播transaction原数据。

 

本案例里用到了两个库。

其中,bsv库用来处理比特币的数据结构、底层协议相关的东西,如生成私钥、地址,组装和签署transaction。

MatterCloud是一个数据服务商,让我们可以通过远程API查询链上数据,或者广播transaction。我们可以把MatterCloud换成其他数据服务商(区块链浏览器也会提供数据服务),如

https://developers.whatsonchain.com

https://metasv.com/

 

附录

工程地址 https://github.com/fairwood/SimplestWallet

  • 1
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
<p> <span style="font-size:14px;color:#337FE5;">【为什么学爬虫?】</span> </p> <p> <span style="font-size:14px;">       1、爬虫入手容易,但是深入较难,如何写出高效率爬虫,如何写出灵活性高可扩展爬虫都是一项技术活。另外在爬虫过程中,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要数据,这门课程,你都能学到!</span> </p> <p> <span style="font-size:14px;">       2、如果是作为一个其他行业开发者,比如app开发,web开发,学习爬虫能让你加强对技术认知,能够开发出更加安全软件网站</span> </p> <p> <br /> </p> <span style="font-size:14px;color:#337FE5;">【课程设计】</span> <p class="ql-long-10663260"> <span> </span> </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 一个完整爬虫程序,无论大小,总体来说可以分成三个步骤,分别是: </p> <ol> <li class="" style="font-size:11pt;color:#494949;"> 网络请求:模拟浏览器行为从网上抓取数据。 </li> <li class="" style="font-size:11pt;color:#494949;"> 数据解析:将请求下来数据进行过滤,提取我们想要数据。 </li> <li class="" style="font-size:11pt;color:#494949;"> 数据存储:将提取到数据存储到硬盘或者内存中。比如mysql数据库或者redis等。 </li> </ol> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 那么本课程也是按照这几个步骤循序渐进进行讲解,带领学生完整掌握每个步骤技术。另外,因为爬虫多样性,在爬取过程中可能会发生被反爬、效率低下等。因此我们又增加了两个章节来提高爬虫程序灵活性,分别是: </p> <ol> <li class="" style="font-size:11pt;color:#494949;"> 爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。 </li> <li class="" style="font-size:11pt;color:#494949;"> Scrapy分布式爬虫:Scrapy框架、Scrapy-redis组件、分布式爬虫等。 </li> </ol> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 通过爬虫进阶知识点我们能应付大量反爬网站,而Scrapy框架作为一个专业爬虫框架,使可以快速提高我们编写爬虫程序效率速度。另外如果一台机器不能满足你需求,我们可以分布式爬虫让多台机器帮助你快速爬取数据。 </p> <p style="font-size:11pt;color:#494949;">   </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 从基础爬虫到商业化应爬虫,本套课程满足您所有需求! </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> <br /> </p> <p> <br /> </p> <p> <span style="font-size:14px;background-color:#FFFFFF;color:#337FE5;">【课程服务】</span> </p> <p> <span style="font-size:14px;">专属付费社群+定期答疑</span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <span style="font-size:16px;"><br /> </span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <span style="font-size:16px;"></span> </p>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值