一、安装钱包

请参考另一篇随笔: 入口

二、获取测试usdt(TestOmni)步骤:

1、导入地址到钱包,往该地址充值测试比特币,

2、然后往 moneyqMan7uh8FqdCA2BV5yZ8qVrc9ikLP 地址发送部分btc(testnet),即可返还部分usdt(TestOmni)

3、omni_getbalance 方法查看到账情况 或者访问测试网络浏览器查询

介绍一些常用的RPC接口命令

查看地址私钥

  1. > ./bin/omnicore-cli -rpcconnect=127.0.0.1 -rpcport=18332 -rpcuser=RPCUser -rpcpassword=RPCPassword dumpprivkey n1dnFGMxuxkDf1Ns5G2uYhaqk2ETWPuYQGbtc/usdt地址)

查看到账:

  1. > ./bin/omnicore-cli -rpcconnect=127.0.0.1 -rpcport=18332 -rpcuser=RPCUser -rpcpassword=RPCPassword getbalance

获取交易信息:

  1. > ./bin/omnicore-cli -rpcconnect=127.0.0.1 -rpcport=18332 -rpcuser=RPCUser -rpcpassword=RPCPassword omni_listtransactions

查看入账:

  1. > ./bin/omnicore-cli -rpcconnect=127.0.0.1 -rpcport=18332 -rpcuser=RPCUser -rpcpassword=RPCPassword omni_getbalance mhf2ibPWMoeyibR2jS3jPLZQYTJsFSoG5r 1 1 表示彩色币idusdt31,钱包客户端我选择的是2

测试网络进入QT桌面端

  1. > ./bin/omnicore-qt -testnet -server -rpcbind=127.0.0.1 -rpcport=18332 -rpcuser=RPCUser -rpcpassword=RPCPassword

获取指定地址交易列表listUnspent

  1. > ./bin/omnicore-cli -rpcconnect=127.0.0.1 -rpcport=18332 -rpcuser=RPCUser -rpcpassword=RPCPassword listunspent 0 999999 '["mhf2ibPWMoeyibR2jS3jPLZQYTJsFSoG5r"]'

发送usdt

  1. > ./bin/omnicore-cli -rpcconnect=127.0.0.1 -rpcport=18332 -rpcuser=RPCUser -rpcpassword=RPCPassword omni_sendrawtx "mhf2ibPWMoeyibR2jS3jPLZQYTJsFSoG5r" "000000000000001f000000000000000a" "msis3b45PQriomes1zCAfNJpobggP1yusr"

导入特定地址到节点:

  1. > ./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)、expresspm2

2、依赖包 | btc官方提供的库和加密包等 | usdt基于btc底层协议,所以很多api可以共用

(1)、randomstring

(2)、bitcoinjs-lib

(3)、bigi

(4)、crypto

3、部分模型准备

(1) 地址表

  1. id: { type: String, required: true },
  2. address: { type: String, required: true, default: '' }, //USDT地址
  3. testnet: { type: Boolean, required: true, default: true }, //是否为测试网络地址
  4. privateKey: { type: String, required: true, default: '' }, //USDT地址私钥
  5. privateKeySalt: { type: String, required: true, default: '' }, //USDT地址加密盐
  6. hash: { type: String, required: true, default: '' }, //防篡改hash
  7. used: { type: Boolean, required: true, default: true }, //是否已被使用
  8. watch: { type: Boolean, required: true, default: false }, //是否已经添加到bitcoind监控列表
  9. invalid: { type: Boolean, required: true, default: false }, //是否已经失效

(2) 交易表

  1. id: { type: String, required: true },
  2. txid: { type: String, required: true }, // 交易编号
  3. fee: { type: Number }, // 手续费
  4. sendingaddress: { type: String, required: true, default: '' }, // 发送方
  5. referenceaddress: { type: String, required: true, default: '' }, // 接收方
  6. ismine: { type: Boolean }, // 订单是否涉及钱包中的地址
  7. version: { type: Number }, // 版本
  8. type_int: { type: Number }, // 交易类型为数字
  9. type: { type: String, default: '' }, // 交易类型为字符串
  10. propertyid: { type: Number, required: true }, //要发送的令牌的标识符 如 31对应的是usdt
  11. divisible: { type: Boolean }, //令牌是否可以分割
  12. amount: { type: Number, required: true }, // 充值数量
  13. valid: { type: Boolean }, // 交易是否有效
  14. blockhash: { type: String }, // 相应块的hash
  15. blocktime: { type: Number }, // 最后处理的块的时间戳
  16. positioninblock: { type: Number }, // 块内交易的位置
  17. block: { type: Number }, // 当前块高度
  18. confirmations: { type: Number, default: 0 }, // 当前确认数

3、部分代码块

(1)、生成usdt钱包地址

  1. function createAddress(){
  2. try {
  3. let string = random.randomString(1048) //创建随机值
  4. let hash = bitcoin.crypto.sha256(string) //sha256加密,创建对应哈希
  5. let d = bigi.fromBuffer(hash)
  6. let keyPair = new bitcoin.ECPair(d, null, { network: network }) //创建新私钥
  7. let privateKey = keyPair.toWIF()
  8. let publicAddress = keyPair.getAddress()
  9. let obj = {
  10. id: unique.uuid(),
  11. address: publicAddress,
  12. testnet: appConfig.usdt.testnet,
  13. privateKey: privateKey,
  14. }
  15. let addr = new Address(obj)
  16. addr.encryptPrivateKey() //私钥加密
  17. addr.createHash() //指定盐加密
  18. importAddrToNet(publicAddress).then(function(data) { // 添加到对应网络节点
  19. return addr.save() //保存地址到数据库
  20. }).then(function(d) {
  21. return res.json({
  22. data: {
  23. address: publicAddress //最后返回地址
  24. }
  25. })
  26. }).catch(function(e) {
  27. ws.log('importAddrToNet error', e)
  28. })
  29. } catch (e) {
  30. ws.error(`catch importAddrToNet error ${e}`)
  31. }
  32. }

(2)、生成交易

usdt作为btc的一种彩色币,他的每次交易的原理,其实是生成btc交易,把usdt交易相关粘附在该笔交易上

所以usdt转账需要提供少额的btc作为手续费, 一般是需要提供专门手续费地址账号。

  1. * @param {*} id omni_id usdt:31
  2. * @param {*} sender_address 转出金额的临时地址
  3. * @param {*} sender_privatekey 转出临时地址的私钥
  4. * @param {*} value 转账金额
  5. * @param {*} receiver_address 接收地址
  6. * @param {*} fee 手续费
  7. const createTransaction = (sender_address, value, id) => {
  8. try {
  9. isBalanceEnough(sender_address, value, id).then(e => { //验证发送方余额
  10. if (e) {
  11. return listUnspentForFee(sender_address, fee) //获取手续费地址账号的未花费交易unspentList
  12. } else {
  13. ws.log('余额不足')
  14. return reject(`余额不足,${e}`)
  15. }
  16. }).then(async (sender_tx) => {
  17. if (!tx.length) {
  18. ws.log('等待上笔交易确认后再尝试..')
  19. return resolve('等待上笔交易确认后再尝试..')
  20. }
  21. const _payload = await omniHelper.createpayloadSimplesend(id, parseFloat(value).toString()) //创建Usdt交易
  22. await omniHelper.createRawtransaction(sender_tx, {}) // 创建交易
  23. const opreturn = await omniHelper.createRawtx_opreturn(create, _payload) // //usdt交易附加到BTC交易上
  24. const reference = await omniHelper.createRawtx_reference(opreturn, receiver_address) //设置归总地址
  25. const data = await omniHelper.createRawtx_change(reference, sender_tx, sender_address, fee) //填写手续费及找零地址
  26. const sign = await omniHelper.signRawtransaction(data, sender_tx, [sender_privatekey]) //获取原生交易hex
  27. const result = await omniHelper.sendRawtransaction(sign.hex) //广播交易
  28. return await isOnOmni(result) //验证结果
  29. }).then(data => {
  30. resolve(data)
  31. }).catch(e => {
  32. reject(e)
  33. })
  34. } catch (error) {
  35. ws.error(error)
  36. }
  37. }

总结

本篇随笔主要提供一种方案;

退圈已久,需要探讨的可以留言或者私信,希望这些总结可以给到你们帮助;

参考: 优化的js api库

区块链钱包开发 - USDT - 三、实战(nodejs版本)的更多相关文章

  1. 区块链钱包开发 - USDT - 一、Omni本地钱包安装

    背景 Tether(USDT)中文又叫泰达币,是一种加密货币,是Tether公司推出的基于稳定价值货币美元(USD)的代币Tether USD,也是目前数字货币中最稳定的币,USDT目前发行了两种代币 ...

  2. 区块链钱包开发 - USDT - 二、创建交易错误以及解决方法

    这里总结了开发中一些常见报错和解决方案 1. 提示:createRawtx_change "Amount is not a number" 解决:参数中 tx 的 amout 需要 ...

  3. NEO区块链-DAPP开发直通车-第零篇

    什么是DAPP DAPP 是以太坊发明的词汇 Decentralized Application. 目前基于区块链技术开发的应用程序广泛的接受使用了这一名称.   NEL将为开发DAPP提供全面的服务 ...

  4. 《区块链DAPP开发入门、代码实现、场景应用》笔记5——区块链福利彩票的设计

    笔者一直强调,一定要利用区块链的特点来解决行业存在的问题,并且该问题最好用区块链解决或者说只能用区块链解决.彩票行业就是个例子. 在讲解代码之前,首先讲解一下业务设计,如图6.15所示. 图6.15 ...

  5. 《区块链DAPP开发入门、代码实现、场景应用》笔记4——Ethereum Wallet中部署合约

    账号创建完成之后,账号余额是0,但是部署合约是需要消耗GAS的,因此需要获取一定的以太币才能够继续本次实现.在测试网中获取以太币可以通过挖矿的方式,在开发菜单中可以选择打开挖矿模式,但是这需要将Syn ...

  6. 《区块链DAPP开发入门、代码实现、场景应用》笔记3——Ethereum Wallet的安装

    以太坊官方网站可以下载最新版本的Ethereum Wallet,用户无需选择,浏览器会根据访问者操作系统版本自动展现合适的版本,点击DOWNLOAD按钮下载即可安装,如图2.9所示,其下载网址: ht ...

  7. 安装比特币区块链钱包API(Blockchain Wallet用户发送和接收比特币的简单API)

    区块链钱包API提供了一个简单的界面,商家可以用它以编程方式与钱包进行交互. 安装:要使用此API,您需要运行负责管理区块链钱包的小型本地服务. 您的应用程序通过HTTP API调用在本地与此服务进行 ...

  8. 比原链CTO James | Go语言成为区块链主流开发语言的四点理由

    11月24日,比原链CTO James参加了Go中国举办的Gopher Meetup杭州站活动,与来自阿里.网易的技术专家带来Kubernetes.区块链.日志采集.云原生等话题的分享.James向大 ...

  9. iFace安全专家揭秘:存放在区块链钱包中的比特币,其实已经早就不属于你……

    自MoreToken钱包跑路之后,2019年3月以来陆续多个钱包.交易所跑路,造成了大量用户账户被盗,仅MoreToken钱包用户损失总价值就达12.2亿人民币,用户损失惨重.为什么这么多钱包.交易所 ...

随机推荐

  1. DP没入门就入土

    写在前面 记录最近刷的DP题 以及 打死都不可能想到状态设计DP系列 汇总 洛谷 P6082 [JSOI2015]salesman 树形\(\texttt{DP}\) + 优先队列 比较容易看出来这是 ...

  2. 在react中使用到的好用的插件

    1)antd UI组件 蚂蚁金服出品的 挺好用的 还有个移动端的antd-moblie 2) moment 日期处理类库 3)prop-types 第三方库 对组件props变量进行类型检测 4)qs ...

  3. Chrome浏览器获取XPATH的方法----通过开发者工具获取

    chrome有自己的开发者工具,可以用这儿来直接获取xpath,都不用担心正确性了. 具体使用步骤如下: 1.在chrome浏览器的右上角有个选择菜单,也就是这个,点一下: 2.在列表最后面有个“更多 ...

  4. 机器学习实战基础(二十一):sklearn中的降维算法PCA和SVD(二) PCA与SVD 之 降维究竟是怎样实现

    简述 在降维过程中,我们会减少特征的数量,这意味着删除数据,数据量变少则表示模型可以获取的信息会变少,模型的表现可能会因此受影响.同时,在高维数据中,必然有一些特征是不带有有效的信息的(比如噪音),或 ...

  5. Python之爬虫(二十四) 爬虫与反爬虫大战

    爬虫与发爬虫的厮杀,一方为了拿到数据,一方为了防止爬虫拿到数据,谁是最后的赢家? 重新理解爬虫中的一些概念 爬虫:自动获取网站数据的程序反爬虫:使用技术手段防止爬虫程序爬取数据误伤:反爬虫技术将普通用 ...

  6. ASP.NET Core3.1使用Identity Server4建立Authorization Server-2

    前言 建立Web Api项目 在同一个解决方案下建立一个Web Api项目IdentityServer4.WebApi,然后修改Web Api的launchSettings.json.参考第一节,当然 ...

  7. Go的100天之旅-01初识Go

    初识Go Go简介 Go的历史 上个世纪70年代Ken Thompson和Dennis M. Ritchie合作发明了UNIX操作系统同时Dennis M. Ritchie发明了C语言. 2007年的 ...

  8. less : 写一个display:flex的mixin

    和scss一样,less也是一个好用的css预处理语言,语法也很相近. 而我们在使用display:flex的时候,很容易苦恼于里面的设置的单词很难记(尤其是对我这种英语很差的人来说). 所以我们可以 ...

  9. 宽度优先搜索--------迷宫的最短路径问题(dfs)

    宽度优先搜索运用了队列(queue)在unility头文件中 源代码 #include<iostream>#include<cstdio>#include<queue&g ...

  10. logrotate nginx日志切割

    1.安装 centos: yum -y install logrotate ubuntu: apt-get install -y logrotate 2. 配置文件 /etc/logrotate.co ...