钱包开发 - USDT - 三nodejs版本
Posted maplechain
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了钱包开发 - USDT - 三nodejs版本相关的知识,希望对你有一定的参考价值。
一、USDT
USDT(泰达币)是Tether公司推出的基于稳定价值货币美元(USD)的代币Tether USD (官方钱包已关闭注册,很坑)
USDT与同数量的美元是等值的,在交易平台上可以互相赎买,看成与比特币类似的代币,人们能够通过钱包转移、贮存和消费,是一种保值代币。说白了,USDT就是基于比特币omni协议的一种代币,是一种彩色币,地址就是BTC地址,交易生成时,是把特定信息黏贴到比特币的协议中进行处理。
关于omni协议
omni协议其实是一种通信协议,它以比特币网络为基础,在比特币网络上搭建Omni Layer共识网络,依靠这个在比特币网络外部的omni层实现智能合约,用户货币和分散式点对点交换等功能。通过omni协议实现基于比特币网络的代币发行,这些代币不需要依赖于比特币网络无关的外部关系,可以直接通过比特币网络进行交易,这点和ERC20代币其实很相似...More
上面说到tether没法提供钱包,所以本地开发的话,首先就需要安装钱包客户端,类似btc客户端。
二、钱包环境准备
提供各种版本下载
地址一
地址二
安装或解压
我用到的是压缩版本,解压后,进入对应目录
cd omnicore-0.3.0
开启测试环境的钱包客户端(正式环境去掉-testnet)(一般端口固定,用户密码固定)(usdt代币ID为31)
> ./bin/omnicore-qt -testnet -server -rpcbind=127.0.0.1 -rpcport=18332 -rpcuser=RPCUser -rpcpassword=RPCPassword
windows用户(详细步骤google)
官网下载安装 进入qt目录 命令行:
1.开启客户端
> omnicore-qt.exe -testnet -server -rpcbind=127.0.0.1 -rpcport=18332 -rpcuser=RPCuser -rpcpassword=RPCpasswd -datadir=“f:somewhere”
如果安装了其他节点 需要指定data目录
> datadir=“f:xxx”
指定钱包文件
> -wallet= “”
同步可能需要挺长时间,耐心等待即可..
获取测试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
‘‘: 地址账户
false:表示是否全节点扫描
如果(btc/usdt)要通过api查询余额,rescan需要设置为true
共享一个地址:
usdt测试网络地址:n1dnFGMxuxkDf1Ns5G2uYhaqk2ETWPuYQG
私钥:cVZT8qHGs5g1qyVYmFgfUyz7CcRS7LX84xjgdNS8DdRbtJ5uXtYU
三、开发
这里主要介绍利用nodejs生成USDT地址,新建USDT转账交易等;
1、环境安装
(1)、8.x 以上版本nodejs、mongodb
(2)、express、pm2、winston
2、依赖包
(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)、地址生成
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作为手续费。所以一般会提供专门手续费地址账号。
* @param * id omni_id usdt:31
* @param * sender_address 转出金额的临时地址
* @param * sender_privatekey 转出临时地址的私钥
* @param * value 转账金额
* @param * receiver_address 接收地址
* @param * fee 手续费
isBalanceEnough(sender_address, value, id).then(e => //验证发送方余额
if (e)
return listUnspentForFee(sender_address, fee) //获取手续费地址账号的未花费交易unspentList
else
ws.log('余额不足')
).then(tx =>
sender_tx = tx
if (!tx.length)
ws.log('等待上笔交易确认后再尝试..')
return omniHelper.createpayloadSimplesend(id, parseFloat(value).toString()) //创建Usdt交易
).then(payload =>
_payload = payload
return omniHelper.createRawtransaction(sender_tx, )
).then(create =>
return omniHelper.createRawtx_opreturn(create, _payload) //usdt交易附加到BTC交易上
).then(opreturn =>
return omniHelper.createRawtx_reference(opreturn, receiver_address) //设置归总地址
).then(reference =>
return omniHelper.createRawtx_change(reference, sender_tx, sender_address, fee) //填写手续费及找零地址
).then(data =>
return omniHelper.signRawtransaction(data, sender_tx, [sender_privatekey]) //获取原生交易hex
).then(sign =>
return omniHelper.sendRawtransaction(sign.hex) //广播交易
).then(result =>
return isOnOmni(result) //验证结果
).then(data =>
resolve(data)
).catch(e =>
reject(e)
)
以上是关于钱包开发 - USDT - 三nodejs版本的主要内容,如果未能解决你的问题,请参考以下文章