钱包开发 - 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)、expresspm2winston

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)
})

原文地址:https://www.cnblogs.com/mapleChain/p/11527696.html

时间: 2024-11-09 03:08:36

钱包开发 - USDT - 三、nodejs版本的相关文章

钱包开发 - USDT - 一、Omni本地钱包安装

1.win 官网下载安装 进入qt目录 命令行: 1.开始客户端 > omnicore-qt.exe -testnet -server -rpcbind=127.0.0.1 -rpcport=18332 -rpcuser=RPCuser -rpcpassword=RPCpasswd -datadir="f:xxx" 如果安装了其他节点 需要指定data目录 > -datadir="f:xxx" 指定钱包文件 > -wallet= "&qu

基于NodeJS的全栈式开发(基于NodeJS的前后端分离)

也谈基于NodeJS的全栈式开发(基于NodeJS的前后端分离) 前言 为了解决传统Web开发模式带来的各种问题,我们进行了许多尝试,但由于前/后端的物理鸿沟,尝试的方案都大同小异.痛定思痛,今天我们重新思考了“前后端”的定义,引入前端同学都熟悉的NodeJS,试图探索一条全新的前后端分离模式. 随着不同终端(Pad/Mobile/PC)的兴起,对开发人员的要求越来越高,纯浏览器端的响应式已经不能满足用户体验的高要求,我们往往需要针对不同的终端开发定制的版本.为了提升开发效率,前后端分离的需求越

分成确定性钱包开发的代码实现(HD钱包服务)

HD Wallets的全称是Hierachical Deterministic Wallets, 对应中文是 分层确定性钱包. 这种钱包能够使用一组助记词来管理所有的账户的所有币种,在比特币的BIP32提案中提出,通过种子来生成主私钥,然后派生海量的子私钥和地址.种子很长,为了方便记录,转换为一组单词记录,这是BIP39提出的. 生成钱包地址的基本流程:1 生成一组助记词 2 助记词转化成种子(通过PBKDF2) 3 种子生成根私钥(通过HMAC-SHA512) 4 通过根私钥生成子私钥 本文的

Android深度探索HAL与驱动开发 第三章

Android深度探索HAL与驱动开发 第三章 Git使用入门 读书笔记 Git是对源代码进行管理的软件. 一.安装Git # apt-get install git # apt-get install git-doc git-emall git-gui gitk 用以下命令控制Git: # apt-get install git-core # apt-get install git-doc git-svn git-email git-gui gitk 二.查看Git文档 查看git-check

使用nvm来管理nodejs版本

nvm 是 Mac 下的 node 管理工具,有点类似管理 Ruby 的 rvm,如果是需要管理 Windows 下的 node,官方推荐是使用 nvmw 或 nvm-windows .nvm主要用来在不同的nodejs版本中切换,以便当node出新版本时,可以使用一些新的特性 nvm安装 git clone https://github.com/creationix/nvm.git ~/.nvm 然后打开 ~/.bashrc , 在其中添加: source ~/.nvm/nvm.sh 重新ss

游戏开发(三)——WIN32 黑白棋(三)——游戏画面的现实

整个游戏分3部分介绍. 1.棋局的现实 2.AI的现实 3.游戏画面的现实 提供一下完整项目下载 这是第三部分:画面的显示 这部分其实就比较简单的,说白了就是api的堆砌. 主要了解下windows的消息机制,以及怎么画图 主要是分别封装了下对棋盘,棋子,以及当前轮到谁,当前比分是多少,就是游戏画面上不同的部分的绘制. void DrawReversiBoard(); void DrawReversiPieces(EnumReversiPiecesType type, int row_y, in

Wince6.0应用开发:三、小技巧揭秘

在Wince6.0的应用开发过程中,掌握一些使用的小技巧,必定会事半功倍 那么,你做好心里准备了吗?3.2.1. 技巧一:我会告诉你你为Wince开发的程序可以在你的电脑上运行!                     这个技巧的用途有两个 1.测试程序能否达到预期效果 还记得我们上一篇帖子在模拟上用的小程序吗? 我们现在PC上运行一下 2.捕捉在Wince上不显示的异常 有时候,在Wince上运行应用程序,即使出错了也不会抛出异常,当这个时候我们只需要在电脑上运行程序便会捕捉到程序的异常,这对

QT开发(三十八)——Model/View框架编程

QT开发(三十八)--Model/View框架编程 一.自定义模型 1.自定义只读模型 QAbstractItemModel为自定义模型提供了一个足够灵活的接口,能够支持数据源的层次结构,能够对数据进行增删改操作,还能够支持拖放.QT提供了 QAbstarctListModel和QAbstractTableModel两个类来简化非层次数据模型的开发,适合于结合列表和表格使用. 自定义模型需要考虑模型管理的的数据结构适合的视图的显示方式.如果模型的数据仅仅用于列表或表格的显示,那么可以使用QAbs

QT开发(三十一)——NotePad实例开发

QT开发(三十一)--NotePad实例开发 一.界面开发 NotePad使用主窗口作为顶层窗口组件,使用QMainWindow作为基类,QMainWindow内部封装了菜单栏.工具栏.中央组件.停靠组件.状态栏等.QMainWindow内置了布局管理器,基本的组件布局如下: 使用二阶构造模式构建NotePad界面. MainWindow::MainWindow() {     resize(800, 600); }   MainWindow::~MainWindow() {   }   Mai