【区块链】usdt充值 离线签名 离线生成地址

这篇具有很好参考价值的文章主要介绍了【区块链】usdt充值 离线签名 离线生成地址。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

📖导读

前两天老同事找到我诉苦:川哥,前段时间产品不知道抽什么风想搞个USDT充值,说什么要与时俱进,与国际接轨。。。。。我tm都研究了两周了都没搞清楚这玩意到底是干嘛的,网上代码不是不全就是缺jar包的,现在搞得我都想rm -rf /*了。。

好家伙,兄弟别冲动啊。。我心想这都什么年代了,币圈起起伏伏竟然还有人觉得区块链是个多么高大上的东西,而且还只是做个支付就叫与时俱进了?不过竟然是前前前同事找我帮忙了,我还是帮助了他并且整理了一下涉及到的关键知识点并且打包好了相关代码,全文干货,建议收藏~

本章只针对TRX(波场)链的USDT充值

注:波场转账消耗费用较低,是目前代币转账用途中比较流行的链。

⚠️⚠️⚠️ 本章提供的内容仅供学习参考,不建议应用于任何商业用途!

❓什么是区块链

简单赘述一下最基本的概念:

  1. 什么是区块链?

简单来说就是串联的分布式账本,每个账本记录的都是一笔笔转账信息,这个账本我们称之为区块。

  1. 分布式是什么意思?

分布式就是可以在世界各地的机器上部署节点,这些机器的基本作用就是记账,打包区块。

  1. 那么多机器怎么保证安全性呢?

假如部署的节点有1000个,如果你想要给自己的账户加钱,你起码要在同一时间篡改一半以上的机器才能让大家都认为你有这么多钱,这个难度不用我多说吧,几乎不可能同时黑那么多服务器。这也就是共识机制,少数服从多数,要大家都觉得你有这么多钱你才有这么多钱。

  1. 主链是什么

主链就是创世链,如BTC,ETH,EOS,TRX它们都有自己的主链,大部分小币是没有自己的主链的,这些小币大多是跑在某一个链下的虚拟货币,我们称之为代币,而本章涉及的USDT转账使用的就是TRX链。

  1. 智能合约是什么

说白了就是跑在区块链上的一串代码,如转账功能就是一个典型的实现。你可能还好奇,刚刚还是账本,现在怎么成代码了,这里说一下,区块链是个抽象的概念,账本在这里只是为了方便大家理解,这里不展开叙述。

  1. 什么是web3.0

说简单点就是可自主开发的智能合约,使之可以在区块链上运行,任何人都可以在区块链上发布一个自己的智能合约。web3.0的概念不同于任何中心化的平台。不管是淘宝、拼多多、WX、ZFB等等你手机上的任何app,他们都拥有自己的数据库,这个数据库他们有绝对的权利作增删改查,但是web3.0不一样,他同样具备共识机制,也就是说,没有任何人可以拥有篡改数据的权限,这也是为什么大家都在说区块链可以帮助我们解决信任问题。

🌲区块链的应用

恕我直言,时至今日,区块链最实际最落地的应用依旧是区块链金融领域,说简单点,炒B。。。

不管是web3.0/元宇宙/溯源/NFT。。。都没有真正普及到被大众熟知并应用,就像二维码那样。不过也不必心急,时代在进步,很多高校都已经开设了面向教师和学生的相关课程,相信不久后区块链就能真正走入每个人的生活。

这里不做过多讨论,本章就手把手教你通过区块链转账实现一个充值功能。

⚙️运行原理

我们的目的是让我们中心化的系统感知到区块链的转账,那么我们的需求就明了了,我们要知道某个账户向我们自己的账户转了一笔钱就行,我们刚刚说了区块链本身就是一个个账本,只要我们不断的扫描最新的区块中有没有向我们账户中转账的记录就可以了。同时我们要保证扫描过的区块不会被重复扫描,即便发生重复扫描,我们也要保证幂等性,流程图如下:

usdt地址能改吗,区块链,区块链

如何扫描最新的区块?

我们有两种扫描的方式,第一种我们自己成为一个节点,去扫描我们自己部署的节点,不过这种方式对机器性能/网络/磁盘要求都比较高,因为会不断的同步整个区块链数据。所以我们采用第二种方案,官方为我们提供了针对TRX链相关的接口,我们直接通过接口的方式来进行操作。

如何知道是某个用户向我转账?

首先,我们并不知道转账的目标用户向我们转账的地址是什么,我们也不可能让用户告诉我们你的转账地址是什么,这样做对用户来说无形之中提高了成本,主流的方案是,给用户提供一个终身唯一的转账充值地址,只要这个地址发生充值,我就知道是哪个用户,相当于在我们的数据库中维护了uid=address的关系。竟然每个用户都对应一个地址,也就是说我们会有很多个账户来接受不同用户的转账,我们还需要将这些USDT做归集。

⭕️波场环境

主网

  • 浏览器: https://tronscan.org
  • http API: https://api.trongrid.io
  • usdt合约地址: TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t

测试网

Nile测试网,Nile测试网用于测试TRON新特性,代码版本一般会领先于主网。本章代码使用该环境。

  • 水龙头: http://nileex.io/join/getJoinPage(可以向账户中转入一部分B,只有测试环境有哟)
  • 浏览器: https://nile.tronscan.org
  • http API: https://api.nileex.io
  • usdt合约地址: TXLAQ63Xg1NAzckPwKHvzw7CSEmLMEqcdj

主网就是线上版本,虽说Nile领先主网版本,但是就本章功能而言在主网完全不受影响。

🐎代码实现

区块扫描

扫描第27485294个区块

curl -X POST  https://api.nileex.io/wallet/getblockbynum -d '{"num":27485294}'

大家可以自己请求一下,数据过长,就不贴出来了,下面是对其中每个字段的释意,其中我们重点关注transactions下的数据,这里的就是交易数据

  • blockID 区块hash

  • block_header 区块头信息,包含区块号,版本号,见证者等块信息

  • transactions 交易数据,重点关注这里等数据

  • transactions.ret.contractRet 交易状态,SUCCESS为成功

  • transactions.ret.signature 签名

  • transactions.ret.txID 交易ID

  • transactions.ret.raw_data.contract 调用的合约

    • parameter.value.data 注意这里数据

      ‘41’+(下标 32-72) 这串字符是收款人的地址,我们只需要判断该地址值是否为本平台地址即可

      倒数非0是转账数量16进制,转为10进制则是本次转账的数量

    • parameter.value.owner_address 转账人的地址

    • parameter.value.contract_address 合约地址,这个地址一定要是usdt的合约地址,一定要优先判断是不是usdt合约

注意:不管是合约地址还是转账地址,均为Hex编码地址,如想与Raw地址互转则使用以下代码

System.out.println(AddressUtil.toViewAddress("41ea51342dabbb928ae1e576bd39eff8aaf070a8c6"));
System.out.println(AddressUtil.toHexAddress("TXLAQ63Xg1NAzckPwKHvzw7CSEmLMEqcdj"));

我们根据区块号扫描出了这一个块中所有的转账信息,区块号是+1递增的,我们只需要不停的去扫描有没有最新的区块号,如果有正常的返回信息则表示该区块已被确认完成,我们递增继续扫描即可。

离线生成地址

我们为了知道是哪个用户向我们转账,我们需要给每个用户都提供一个单独的转账地址,也就是说我们生成的地址数=要充值的用户数。

对于区块链来说,一个地址就等于一个账户。官方有为我们提供地址的生成,但是由于安全性,正式链中这个api是关闭的,因此我们只能使用离线的方式来生成地址,代码如下

Map<String, String> address = AddressUtil.createAddress();
System.out.println(JSON.toJSONString(address));

结果如下

{
    "privateKey": "f3f2ee18336d1100b3af4001a7d1e3f20eb927468308cc2b5ef31398b03c6f0d",
    "address": "TXNDJs3YqnvqwxLWJUMEipAAdcavdFVeez",
    "hexAddress": "41eab476ff352d00eb38fb8a85c78c854365faf80b"
}
  • privateKey 私钥,千万千万千万不要泄露,有了这串字符别人可以随意转走这个账户中的$
  • address Raw地址,转账地址
  • hexAddress Hex地址,转账地址

账户归集

什么是账户归集呢?

现在我们生成了n多个地址,里面的¥是分散的,我肯定不可能到每个账户里都操作一次,因此我们需要将这些¥放到到一个大账户中才能方便使用,怎么操作呢?转账!转账到一个账户里就行了,这个操作我们称之为归集。

调用智能合约
curl --request POST \
     --url https://api.nileex.io/wallet/triggersmartcontract \
     --header 'Accept: application/json' \
     --header 'Content-Type: application/json' \
     --data '
{
     "owner_address": "41D1E7A6BC354106CB410E65FF8B181C600FF14292",
     "contract_address": "41ea51342dabbb928ae1e576bd39eff8aaf070a8c6",
     "function_selector": "transfer(address,uint256)",
     "fee_limit": 10000000,
     "parameter": "000000000000000000000041eab476ff352d00eb38fb8a85c78c854365faf80b00000000000000000000000000000000000000000000000000000000000186a0"
}
'
  • owner_address 要转账的地址

  • contract_address 合约地址

  • function_selector 转账用的function

  • fee_limit 可接受消耗最大手续费,手续费是TRX

  • parameter 要转账的目标对象和转账的数量,拼接代码如下

    String addressParam = addZero("41eab476ff352d00eb38fb8a85c78c854365faf80b", 64);
    String amountParam = addZero(Long.toString(100000, 16), 64);
    System.out.println(addressParam + amountParam);
    
离线签名

官方有为我们提供签名的接口,同样因为安全性的原因该接口在主网被关闭,可参考以下代码进行离线签名

JSONObject transaction = TransactionUtil.getTransaction("调用智能合约返回的json数据");
System.out.println(transaction.toJSONString());
广播交易

将离线签名的数据广播,这时会真正触发转账动作

curl --request POST \
     --url https://api.nileex.io/wallet/broadcasttransaction \
     --header 'Accept: application/json' \
     --header 'Content-Type: application/json' \
     --data '
     离线签名后的全量数据,这里不贴出来了
'

响应数据中的txid就是我们本次交易的ID,可以在区块链浏览器中查看该笔转账的区块确认状态

注意:转账是需要消耗TRX作为手续费的,建议归集拥有一定条件再归集,如余额大于多少或者一天归集一次,根据实际业务情况判断。

新生成的地址需要往里面转入少量TRX才可以进行转账

获取账户余额

USDT在TRX链中属于一个代币,假如想知道某个账户的余额我们可以通过接口来查询。

curl --request POST \
     --url https://api.nileex.io/wallet/triggersmartcontract \
     --header 'Accept: application/json' \
     --header 'Content-Type: application/json' \
     --data '
{
     "owner_address": "41D1E7A6BC354106CB410E65FF8B181C600FF14292",
     "contract_address": "41ea51342dabbb928ae1e576bd39eff8aaf070a8c6",
     "function_selector": "balanceOf(address)",
     "parameter": "000000000000000000000000eab476ff352d00eb38fb8a85c78c854365faf80b"
}
'
  • owner_address 本账户地址

  • contract_address USDT合约地址

  • function_selector 余额查询方法

  • parameter为要获取的目标余额账户的地址,取值如下

    String addressParam = addZero(hexAddress.substring(2), 64);
    

响应数据中constant_result为16进制余额

注意:USDT和TRX小数位精度均为6,在进行通许时需要进行10^6转换

⚠️仓库地址

以上所有工具类均已上传至github: https://github.com/BlackCores/tron_test

使用参考: Test.java

✊上正式链

上正式链需要进行以下准备

  1. 将请求地址改为https://api.trongrid.io

  2. 将usdt合约地址改为TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t

  3. 准备API TOKEN

    自行申请 https://www.trongrid.io/dashboard

    每次请求需要带上header:TRON-PRO-API-KEY

👋结语

很多人听到区块链第一反应是,炒B,抱负,这仅仅只是区块链的一个应用,我们更应该去思考它能带来的价值,以及如何能够让区块链真正的造福我们,或许在不久的将来,它能像二维码一样走进我们每一个人的生活。文章来源地址https://www.toymoban.com/news/detail-784504.html

到了这里,关于【区块链】usdt充值 离线签名 离线生成地址的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • .NET Core 离线生成 Tron 波场私钥和地址笔记

    波场(Tron)钱包设置多签 波场(Tron)网页版(本地)钱包开源 波场(Tron)项目常用工具分享 波场(Tron)离线签名、广播交易笔记 波场(Tron)离线生成私钥和地址笔记

    2023年04月13日
    浏览(58)
  • GO语言-生成区块链账户地址

    持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情 为了收款方便,用户需要对外公布一个地址,这个地址其实是公钥经过一系列变化得来的。比如:比特币公钥到地址的变化过程,一个公钥经过SHA256+RIPEMD160两次叠加运算得到公钥

    2024年01月23日
    浏览(45)
  • TRC20地址监听php,USDT-TRC20 PHP开发包

    1、开发包概述 开发包适用于为PHP应用快速增加对Tron/USDT-TRC20数字资产的支持能力, 即支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的 轻量级部署场景。 支持Tron区块链原生Trx交易 支持Tron智能合约以及TRC20代币,例如USDT-TRC20等 支持交易的离线签名

    2024年02月11日
    浏览(53)
  • 区块链当中Bitcoin的Segwit地址生成原理

     Segwit地址又称隔离见证地址。在Bitcoin Blockchain上,经常可以看到类似 bc1qmy63mjadtw8nhzl69ukdepwzsyvv4yex5qlmkd 这样的以 bc 开头的地址,这种地址就是隔离见证地址。 Segwit地址有好几种,一种是以 3 开头的隔离见证兼容地址(Nested Segwit Address),从该地址上无法区分到底是多签地址

    2024年01月23日
    浏览(38)
  • 一张图看懂 USDT三种类型地址 Omni、ERC20、TRC20的区别

    USDT 是当前实用最广泛,市值最高的稳定币,它是中心化的公司Tether发行的。在今年的4月17日之前,市场上存在着2种不同类型的USDT。4月17日又多了一种波场TRC20协议发行的USDT,它们各自有什么区别呢?哪个转账最快到账?哪种最安全?手续费最低? USDT三种链类型Omni、ERC20、

    2024年02月03日
    浏览(49)
  • 手把手教你使用Java生成助记词、私钥、地址|Java区块链钱包生成助记词、地址

    在spring boot 项目中的 pom.xml文件中加入需要的依赖 可见恢复的地址和我们生成地址一样。

    2024年02月11日
    浏览(51)
  • 【区块链实战】Solidity 智能合约如何给账户充值

    目录 一、实战场景 二、知识点 智能合约 智能合约函数 智能合约充值 payable 智能合约部署地址 智能合约的运行 合约 this 对象 三、菜鸟实战 四、运行结果 Solidity 智能合约如何给账户充值 1、充值金额 2、充值并查看结果

    2024年02月09日
    浏览(49)
  • 【区块链 | 智能合约】Ethereum源代码 - 智能合约地址生成算法

    当提交智能合约部署后,会返回智能合约的地址。智能合约地址的生成逻辑在eth.api.go的submitTransaction函数中:

    2024年02月13日
    浏览(49)
  • 区块链钱包“BTC,TRX,ETH”地址生成、助记词导入、keyStron文件生成等功能

    #最近闲着没事做,然后看听到说什么BTC疯涨,这类的小道消息。          哦豁~,这一下就让我觉得非常好奇,说,他们这些东西是怎样在链上存在的呢,然后他们那个一串串的地址又是啥,imtoken钱包又是怎么实现的呢。         根据以上疑问,我自己去研究,自己

    2024年04月14日
    浏览(48)
  • 区块链系统:签名

            签名算法是使用私钥签名,公钥验证的方法,对一个消息的真伪进行确认。如果一个人持有私钥,他就可以使用私钥对任意的消息进行签名,即通过私钥 sk 对消息 message 进行签名,得到 signature :          签名的目的是为了证明,该消息确实是由持有私钥 s

    2024年02月06日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包