主页 > imtoken官网苹果版 > 区块链钱包开发-USDT-3.实战(nodejs版)
区块链钱包开发-USDT-3.实战(nodejs版)
1.安装钱包
请参考另一篇文章:入门
2、获取测试usdt(TestOmni)的步骤:
1.导入地址到钱包,充值地址测试比特币,
2.然后发送一部分btc(testnet)到moneyqMan7uh8FqdCA2BV5yZ8qVrc9ikLP地址,然后返回一部分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
3.开发这里主要介绍使用nodejs生成USDT地址,创建新的USDT转账交易等; 一、环境安装
(1)、8.x以上版本nodejs、mongodb
(2)、快递、pm2
2.依赖包| btc提供的官方库和加密包 | usdt是基于btc的底层协议,所以可以共享很多api
(1)、随机字符串
(2)、bitcoinjs-lib
(3)、比吉
(4)、加密货币
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.部分代码块(一),生成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交易。
所以usdt转账需要提供少量的btc作为手续费如何注册usdt钱包地址,一般需要有专门的手续费地址账号。
* @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库