区块链钱包开发 - USDT - 三、实战(nodejs版本)

一、安装钱包
请参考另一篇随笔: 入口
二、获取测试usdt(TestOmni)步骤:
1、导入地址到钱包,往该地址充值测试比特币,
2、然后往 moneyqMan7uh8FqdCA2BV5yZ8qVrc9ikLP 地址发送部分btc(testnet),即可返还部分usdt(TestOmni)
3、omni_getbalance 方法查看到账情况 或者访问测试网络浏览器查询
介绍一些常用的RPC接口命令:
查看地址私钥
> ./bin/omnicore-cli -rpcconnect=127.0.0.1 -rpcport=18332 -rpcuser=RPCUser -rpcpassword=RPCPassword dumpprivkey n1dnFGMxuxkDf1Ns5G2uYhaqk2ETWPuYQG(btc/usdt地址)
查看到账:
> ./bin/omnicore-cli -rpcconnect=127.0.0.1 -rpcport=18332 -rpcuser=RPCUser -rpcpassword=RPCPassword getbalance
获取交易信息:
> ./bin/omnicore-cli -rpcconnect=127.0.0.1 -rpcport=18332 -rpcuser=RPCUser -rpcpassword=RPCPassword omni_listtransactions
查看入账:
> ./bin/omnicore-cli -rpcconnect=127.0.0.1 -rpcport=18332 -rpcuser=RPCUser -rpcpassword=RPCPassword omni_getbalance mhf2ibPWMoeyibR2jS3jPLZQYTJsFSoG5r 1 (1: 表示彩色币id,usdt为31,钱包客户端我选择的是2)
测试网络进入QT桌面端
> ./bin/omnicore-qt -testnet -server -rpcbind=127.0.0.1 -rpcport=18332 -rpcuser=RPCUser -rpcpassword=RPCPassword
获取指定地址交易列表listUnspent
> ./bin/omnicore-cli -rpcconnect=127.0.0.1 -rpcport=18332 -rpcuser=RPCUser -rpcpassword=RPCPassword listunspent 0 999999 '["mhf2ibPWMoeyibR2jS3jPLZQYTJsFSoG5r"]'
发送usdt
> ./bin/omnicore-cli -rpcconnect=127.0.0.1 -rpcport=18332 -rpcuser=RPCUser -rpcpassword=RPCPassword omni_sendrawtx "mhf2ibPWMoeyibR2jS3jPLZQYTJsFSoG5r" "000000000000001f000000000000000a" "msis3b45PQriomes1zCAfNJpobggP1yusr"
导入特定地址到节点:
> ./bin/omnicore-cli -rpcconnect=127.0.0.1 -rpcport=18332 -rpcuser=RPCUser -rpcpassword=RPCPassword importprivkey cVKMjDVaWevxmRCrNXjTPpz77SSjWvQWp1eCj5zKBpEcaASK7Gib '' false
'cVKMjDVaWevxmRCrNXjTPpz77SSjWvQWp1eCj5zKBpEcaASK7Gib': 地址账户
false:表示是否全节点扫描
如果(btc/usdt)要通过api查询余额,rescan需要设置为true
共享一个地址:
usdt测试网络地址(有测试币):n1dnFGMxuxkDf1Ns5G2uYhaqk2ETWPuYQG
私钥:cVZT8qHGs5g1qyVYmFgfUyz7CcRS7LX84xjgdNS8DdRbtJ5uXtYU
三、开发
这里主要介绍利用nodejs生成USDT地址,新建USDT转账交易等;
1、环境安装
(1)、8.x 以上版本nodejs、mongodb
(2)、express、pm2
2、依赖包 | btc官方提供的库和加密包等 | usdt基于btc底层协议,所以很多api可以共用
(1)、randomstring
(2)、bitcoinjs-lib
(3)、bigi
(4)、crypto
3、部分模型准备
(1) 地址表
id: { type: String, required: true },
address: { type: String, required: true, default: '' }, //USDT地址
testnet: { type: Boolean, required: true, default: true }, //是否为测试网络地址
privateKey: { type: String, required: true, default: '' }, //USDT地址私钥
privateKeySalt: { type: String, required: true, default: '' }, //USDT地址加密盐
hash: { type: String, required: true, default: '' }, //防篡改hash
used: { type: Boolean, required: true, default: true }, //是否已被使用
watch: { type: Boolean, required: true, default: false }, //是否已经添加到bitcoind监控列表
invalid: { type: Boolean, required: true, default: false }, //是否已经失效
(2) 交易表
id: { type: String, required: true },
txid: { type: String, required: true }, // 交易编号
fee: { type: Number }, // 手续费
sendingaddress: { type: String, required: true, default: '' }, // 发送方
referenceaddress: { type: String, required: true, default: '' }, // 接收方
ismine: { type: Boolean }, // 订单是否涉及钱包中的地址
version: { type: Number }, // 版本
type_int: { type: Number }, // 交易类型为数字
type: { type: String, default: '' }, // 交易类型为字符串
propertyid: { type: Number, required: true }, //要发送的令牌的标识符 如 31对应的是usdt
divisible: { type: Boolean }, //令牌是否可以分割
amount: { type: Number, required: true }, // 充值数量
valid: { type: Boolean }, // 交易是否有效
blockhash: { type: String }, // 相应块的hash
blocktime: { type: Number }, // 最后处理的块的时间戳
positioninblock: { type: Number }, // 块内交易的位置
block: { type: Number }, // 当前块高度
confirmations: { type: Number, default: 0 }, // 当前确认数
3、部分代码块
(1)、生成usdt钱包地址
function createAddress(){
try {
let string = random.randomString(1048) //创建随机值
let hash = bitcoin.crypto.sha256(string) //sha256加密,创建对应哈希
let d = bigi.fromBuffer(hash)
let keyPair = new bitcoin.ECPair(d, null, { network: network }) //创建新私钥
let privateKey = keyPair.toWIF()
let publicAddress = keyPair.getAddress()
let obj = {
id: unique.uuid(),
address: publicAddress,
testnet: appConfig.usdt.testnet,
privateKey: privateKey,
}
let addr = new Address(obj)
addr.encryptPrivateKey() //私钥加密
addr.createHash() //指定盐加密
importAddrToNet(publicAddress).then(function(data) { // 添加到对应网络节点
return addr.save() //保存地址到数据库
}).then(function(d) {
return res.json({
data: {
address: publicAddress //最后返回地址
}
})
}).catch(function(e) {
ws.log('importAddrToNet error', e)
})
} catch (e) {
ws.error(`catch importAddrToNet error ${e}`)
}
}
(2)、生成交易
usdt作为btc的一种彩色币,他的每次交易的原理,其实是生成btc交易,把usdt交易相关粘附在该笔交易上
所以usdt转账需要提供少额的btc作为手续费, 一般是需要提供专门手续费地址账号。
* @param {*} id omni_id usdt:31
* @param {*} sender_address 转出金额的临时地址
* @param {*} sender_privatekey 转出临时地址的私钥
* @param {*} value 转账金额
* @param {*} receiver_address 接收地址
* @param {*} fee 手续费
const createTransaction = (sender_address, value, id) => {
try {
isBalanceEnough(sender_address, value, id).then(e => { //验证发送方余额
if (e) {
return listUnspentForFee(sender_address, fee) //获取手续费地址账号的未花费交易unspentList
} else {
ws.log('余额不足')
return reject(`余额不足,${e}`)
}
}).then(async (sender_tx) => {
if (!tx.length) {
ws.log('等待上笔交易确认后再尝试..')
return resolve('等待上笔交易确认后再尝试..')
}
const _payload = await omniHelper.createpayloadSimplesend(id, parseFloat(value).toString()) //创建Usdt交易
await omniHelper.createRawtransaction(sender_tx, {}) // 创建交易
const opreturn = await omniHelper.createRawtx_opreturn(create, _payload) // //usdt交易附加到BTC交易上
const reference = await omniHelper.createRawtx_reference(opreturn, receiver_address) //设置归总地址
const data = await omniHelper.createRawtx_change(reference, sender_tx, sender_address, fee) //填写手续费及找零地址
const sign = await omniHelper.signRawtransaction(data, sender_tx, [sender_privatekey]) //获取原生交易hex
const result = await omniHelper.sendRawtransaction(sign.hex) //广播交易
return await isOnOmni(result) //验证结果
}).then(data => {
resolve(data)
}).catch(e => {
reject(e)
})
} catch (error) {
ws.error(error)
}
}
总结
本篇随笔主要提供一种方案;
退圈已久,需要探讨的可以留言或者私信,希望这些总结可以给到你们帮助;
参考: 优化的js api库
区块链钱包开发 - USDT - 三、实战(nodejs版本)的更多相关文章
- 区块链钱包开发 - USDT - 一、Omni本地钱包安装
背景 Tether(USDT)中文又叫泰达币,是一种加密货币,是Tether公司推出的基于稳定价值货币美元(USD)的代币Tether USD,也是目前数字货币中最稳定的币,USDT目前发行了两种代币 ...
- 区块链钱包开发 - USDT - 二、创建交易错误以及解决方法
这里总结了开发中一些常见报错和解决方案 1. 提示:createRawtx_change "Amount is not a number" 解决:参数中 tx 的 amout 需要 ...
- NEO区块链-DAPP开发直通车-第零篇
什么是DAPP DAPP 是以太坊发明的词汇 Decentralized Application. 目前基于区块链技术开发的应用程序广泛的接受使用了这一名称. NEL将为开发DAPP提供全面的服务 ...
- 《区块链DAPP开发入门、代码实现、场景应用》笔记5——区块链福利彩票的设计
笔者一直强调,一定要利用区块链的特点来解决行业存在的问题,并且该问题最好用区块链解决或者说只能用区块链解决.彩票行业就是个例子. 在讲解代码之前,首先讲解一下业务设计,如图6.15所示. 图6.15 ...
- 《区块链DAPP开发入门、代码实现、场景应用》笔记4——Ethereum Wallet中部署合约
账号创建完成之后,账号余额是0,但是部署合约是需要消耗GAS的,因此需要获取一定的以太币才能够继续本次实现.在测试网中获取以太币可以通过挖矿的方式,在开发菜单中可以选择打开挖矿模式,但是这需要将Syn ...
- 《区块链DAPP开发入门、代码实现、场景应用》笔记3——Ethereum Wallet的安装
以太坊官方网站可以下载最新版本的Ethereum Wallet,用户无需选择,浏览器会根据访问者操作系统版本自动展现合适的版本,点击DOWNLOAD按钮下载即可安装,如图2.9所示,其下载网址: ht ...
- 安装比特币区块链钱包API(Blockchain Wallet用户发送和接收比特币的简单API)
区块链钱包API提供了一个简单的界面,商家可以用它以编程方式与钱包进行交互. 安装:要使用此API,您需要运行负责管理区块链钱包的小型本地服务. 您的应用程序通过HTTP API调用在本地与此服务进行 ...
- 比原链CTO James | Go语言成为区块链主流开发语言的四点理由
11月24日,比原链CTO James参加了Go中国举办的Gopher Meetup杭州站活动,与来自阿里.网易的技术专家带来Kubernetes.区块链.日志采集.云原生等话题的分享.James向大 ...
- iFace安全专家揭秘:存放在区块链钱包中的比特币,其实已经早就不属于你……
自MoreToken钱包跑路之后,2019年3月以来陆续多个钱包.交易所跑路,造成了大量用户账户被盗,仅MoreToken钱包用户损失总价值就达12.2亿人民币,用户损失惨重.为什么这么多钱包.交易所 ...
随机推荐
- 使用Rancher在K8S上部署高性能PHP应用程序
介 绍 PHP是网络上最流行的编程语言之一,许多被广泛使用的内容管理系统都使用它开发,如WordPress和Drupal,并为现代服务器端框架(如Laravel和Symfony)提供核心代码. 尽管P ...
- flask 源码专题(九):flask扩展点
1. 信号(源码) 信号,是在flask框架中为我们预留的钩子,让我们可以进行一些自定义操作. pip3 install blinker 2. 根据flask项目的请求流程来进行设置扩展点 中间件 # ...
- java 基本语法(十三) 数组(六)数组的常见异常
1.数组角标越界异常:ArrayIndexOutOfBoundsException int[] arr = new int[]{1,2,3,4,5}; // for(int i = 0;i <= ...
- POJ 1050 To the Max 最详细的解题报告
题目来源:To the Max 题目大意:给定一个N*N的矩阵,求该矩阵中的某一个矩形,该矩形内各元素之和最大,即最大子矩阵问题. 解题方法:最大子序列之和的扩展 解题步骤: 1.定义一个N*N的矩阵 ...
- Python 100个样例代码【爆肝整理 建议收藏】
本教程包括 62 个基础样例,12 个核心样例,26 个习惯用法.如果觉得还不错,欢迎转发.留言. 一. Python 基础 62 例 1 十转二 将十进制转换为二进制: >>> b ...
- 搭建jmeter+influxdb+grafana压测实时监控平台(超详细,小白适用)
1.前言 在使用jmeter做性能测试的时候,监控系统性能的时候,无论是使用插件还是报告生成,都没法实现实时监控.使用JMeter+Influxdb+Grafana可以实现实时监控. 本次环境搭建各软 ...
- 数据库-SQL查询语言(一)
SQL数据定义 DDL sql的DDL不仅能定义一组关系,还能定义每个关系的信息,包括: 每个关系的模式 每个属性的取值类型 完整性约束 每个关系的维护的索引集合 每个关系的安全性和权限信息 每个关系 ...
- 在ASP.NET中,<%= %>和<%# %>有什么区别
asp.net中<%#%>出现在repeater gridview等控件中.用以绑定控件的datasource asp.net中<%%>的意思是 上运行c#或者vb代码,比如: ...
- 小特跨境电商ERP桌面版 1.不止包括进销存 还能算毛利
经过近几年跨境电商ERP的开发,加上对跨境电商行业的业务积累,开发出一套适合中小跨境电商公司使用的ERP软件.欢迎选购.支持目前流行的各大电商平台,如速卖通.敦煌网.亚马逊.Shopee.Wish等. ...
- python3的字符串常用方法
find()# 方法 find()# 范围查找子串,返回索引值,找不到返回-1 # 语法 s.find(substring, start=0, end=len(string)) # 参数 # subs ...