Java实现Tron(波场)区块链的开发实践(二)交易监控与转账

这篇具有很好参考价值的文章主要介绍了Java实现Tron(波场)区块链的开发实践(二)交易监控与转账。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上一节我们具体讲到Java实现Tron波场链的开发部署:通过trident源码编译组件,使用RPC的方式链接Tron波场链,并进行了代码实现,还有如何创建离线钱包。

这一节我们通过部署好的项目环境,具体如何使用代码来实现波场链的交易监控和交易转账.

1. 所有的开端就是获取链的接通(ApiWrapper)


private ApiWrapper getApiWrapper(String hexPrivateKey) {
        //配置是否是测试链还是正式链
        if (tronServiceConfig.getTronDomainOnline()) {
            // 正式环境需要到Tron申请一个apiKey进行使用
            // APIKEY获取往后会讲如何获取
            return ApiWrapper.ofMainnet(hexPrivateKey, tronServiceConfig.getApiKey());
        } else {
            // 测试环境不需要apikey
            return new ApiWrapper("grpc.nile.trongrid.io:50051", "grpc.nile.trongrid.io:50061", hexPrivateKey);
        }
    }

2. 查看Trc20(如USDT)余额


    /**
     * TRC20余额
     * @param address 我的钱包地址
     * @return 余额
     */
    public BigDecimal getTrc20Balance(String address) {
        ApiWrapper client = getApiWrapper(tronServiceConfig.getHexPrivateKey());
        // Trc20合约地址
        Contract contract = client.getContract(tronServiceConfig.getTrc20Address());
        Trc20Contract token = new Trc20Contract(contract, address, client);
        BigInteger balanceOf = token.balanceOf(address);
        BigDecimal divisor = new BigDecimal(tronServiceConfig.getTrc20Decimals());
        BigDecimal divide = new BigDecimal(balanceOf).divide(divisor, 4, RoundingMode.HALF_UP);
        client.close();
        return divide;
    }

3. 查看Trx余额

 /**
     * TRx余额
     * @param address
     * @return
     */
    @Override
    public BigDecimal getTRxBalance(String address) {
        ApiWrapper wrapper = getApiWrapper(tronServiceConfig.getHexPrivateKey());
        Long balance = wrapper.getAccountBalance(address);
        BigDecimal divisor = new BigDecimal(tronServiceConfig.getTrc20Decimals());
        BigDecimal divide = new BigDecimal(balance).divide(divisor, 4, RoundingMode.HALF_UP);
        wrapper.close();
        return divide;
    }

4. Trc20转账实现

/**
     * TRC20 转账
     * @param fromAddress
     * @param toAddress
     * @param amount
     * @return
     */
    @Override
    public String transTrc20(String fromAddress, String toAddress, String amount) {
        try {
            ApiWrapper client = getApiWrapper(tronServiceConfig.getHexPrivateKey());
            // 获取合约地址信息
            Contract contract = client.getContract(tronServiceConfig.getTrc20Address());
            Trc20Contract token = new Trc20Contract(contract, fromAddress, client);
            String transfer;
            // 获取转账账户的TRX余额
            BigInteger trc20Value = token.balanceOf(fromAddress);
            // 获取想要转账的数额
            BigInteger sunAmountValue = Convert.toSun(amount, Convert.Unit.TRX).toBigInteger();
            // 进行比较
            if (trc20Value.compareTo(sunAmountValue) >= 0) {
                log.info("开始转账.........");
                // 设置最大矿工费用
                long feeLimit = Convert.toSun("100", Convert.Unit.TRX).longValue();
                //转账
                transfer = token.transfer(toAddress, sunAmountValue.longValue(), 0, "转账", feeLimit);
            } else {
                return "error_error";
            }
            if (StrUtil.isEmpty(transfer)) {
                return "error_error";
            }
            log.info("交易ID:{}", transfer);
            client.close();
            return transfer;
        } catch (Exception ex) {
            String message = ex.getMessage();
            return "error_" + message;
        }
    }

5. TRX转账

/**
     * TRX转账
     * @param fromAddress 输入地址
     * @param toAddress 转账地址
     * @param amount 金额
     * @return
     */
    @Override
    public String transferTRX(String fromAddress, String toAddress, int amount) {
        ApiWrapper wrapper = getApiWrapper(tronServiceConfig.getHexPrivateKey());
        try {
            BigDecimal divisor = new BigDecimal(tronServiceConfig.getTrc20Decimals());
            Long rechangeAmount = new BigDecimal(String.valueOf(amount)).multiply(divisor).longValue();
            // 创建交易
            Response.TransactionExtention transaction = wrapper.transfer(fromAddress, toAddress, rechangeAmount);
            log.info("transaction:{}", transaction);
            log.info("transaction.Txid:{}", transaction.getTxid());
            // 签名交易
            Chain.Transaction signTransaction = wrapper.signTransaction(transaction);
            log.info("signTransaction:{}", signTransaction);
            // 计算交易所需要的宽带
            long byteSize = wrapper.estimateBandwidth(signTransaction);
            log.info("byteSize:{}", byteSize);
            // 广播交易
            String hashTx = wrapper.broadcastTransaction(signTransaction);
            log.info("hashTRX:{}", hashTx);
            return hashTx;
        } catch (Exception e) {
            log.error("TransactionService#transfer error: {}", e.getMessage());
        }
        wrapper.close();
        return null;
    }

6. 交易监控

之所以交易监控放在最后,是因为本人在交易监控上做了很多很多的尝试,最后找到了JAVA实现自认为是最好的实例。

-- 交易监控说白话就是在链接波场链的同时,监控波场链上的交易信息,再把这些交易信息检索和反编码,获取到真实TRX和TRC20所需交易。

-- 不管怎么做,首先的想法就是要获取当前交易到的区块,或者自己想要从哪个区块高度进行开始交易监控

-- 不变的是,监控一定以及肯定的是将监控到最后一个块的交易,也就是链上最后一笔交易

// 获取目前最高交易块
Long number = wrapper.getNowBlock().getBlockHeader().getRawData().getNumber();

-- 为了避免程序抖动或者检索交易错误,我采取交易块区间式的检索 -- 

    也就是一次监控,监控的事一个块区间而不是一个最新块。

// BLOCKS_20 后退区间高度数
Response.BlockListExtention blockByLimitNext = wrapper.getBlockByLimitNext(endNum - BLOCKS_20, endNum);
// 区间块列表
List<Response.BlockExtention> blockList = blockByLimitNext.getBlockList();
for (Response.BlockExtention blockExtention : blockList) {
    Long trc20_target_block_number = blockExtention.getBlockHeader().getRawData().getNumber();
    RedissonUtils.setBucket("EXCHANGE_LISTENER:TRC20", DateUtil.formatDateTime(new Date()) + " 区块高度:" + current_sync_block_number + " 扫描高度:" + trc20_target_block_number);
    // 处理块信息
    switchDataTransaction(blockExtention);
}
/**
     * 检索块信息,获取交易信息
     * @param blockExtention
     * @throws Throwable
     */
    public void switchDataTransaction(Response.BlockExtention blockExtention) throws Throwable {
        List<Response.TransactionExtention> transactionsList = blockExtention.getTransactionsList();
        for (Response.TransactionExtention transactionExtention : transactionsList) {
            List<Chain.Transaction.Contract> contractList = transactionExtention.getTransaction().getRawData().getContractList();
            for (Chain.Transaction.Contract contract : contractList) {
                Class a = Class.forName("org.tron.trident.proto.Contract$" + contract.getType());
                Message unpack = contract.getParameter().unpack(a);
                // TriggerSmartContract是合约, 按照不同的交易类型检索
                if (unpack instanceof Contract.TriggerSmartContract) {
                    // 合约地址
                    Contract.TriggerSmartContract contractStr = (Contract.TriggerSmartContract) unpack;
                    ByteString contractAddress = contractStr.getContractAddress();
                    String hex = ApiWrapper.toHex(contractAddress);
                    String contractAddressStr = TronUtils.toViewAddress(hex);
                    // 判断是否是自己需要监控的合约地址
                    if (tronServiceConfig.getTrc20Address().equalsIgnoreCase(contractAddressStr)) {
                        ByteString ownerAddress = contractStr.getOwnerAddress();
                        String hex2 = ApiWrapper.toHex(ownerAddress);
                        String fromAddress = TronUtils.toViewAddress(hex2);
                        ByteString data = contractStr.getData();
                        String hex1 = ApiWrapper.toHex(data);
                        // 交易类型是转账
                        String transferFunction = Hex.toHexString(new Keccak.Digest256().digest("transfer(address,uint256)".getBytes())).substring(0, 8);
                        String funcId = hex1.substring(0, 8);
                        if (!transferFunction.equals(funcId)) {
                            continue;
                        }
                        String toAddress = hex1.substring(32, 72);
                        String amount = hex1.substring(72, 136);
                        try {
                            Address address = (Address) TypeDecoder.instantiateType("address", toAddress);
                            // 地址
                            NumericType amountType = (NumericType) TypeDecoder.instantiateType("uint256", amount);
                            // 金额
                            BigDecimal trc20Decimals = new BigDecimal(tronServiceConfig.getTrc20Decimals());
                            BigDecimal amountee = new BigDecimal(amountType.getValue()).divide(trc20Decimals, 6, RoundingMode.FLOOR);

                            byte[] byteArray = transactionExtention.getTransaction().getRawData().toByteArray();
                            byte[] bytes = Hash.sha256(byteArray);
                            String txId = Hex.toHexString(bytes);
                            // 后续处理
                            // trc20.exchangeService.triggerSmartContract(address.getValue(), amountee, txId);
                        } catch (Exception e) {
                            log.error("TRON监控报错", e);
                            continue;
                        }
                    }
                }
            }
        }
    }

监控通知定时循环任务发起,注意循环任务的发起

下一节:Tron波场链水龙头、web3、apikey如何获取文章来源地址https://www.toymoban.com/news/detail-838842.html

到了这里,关于Java实现Tron(波场)区块链的开发实践(二)交易监控与转账的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【论文复现】基于区块链的分布式光伏就地消纳交易模式研究(Matlab代码实现)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 2.1 最优价格曲线 2.2 用户1 的需求响应

    2024年02月05日
    浏览(37)
  • TRON波场基本知识

    Tron 是什么?         波场 Tron 是一个去中心化的区块链网络,于 2018 年 5 月正式上线主网,其原生代币为 TRX。         与以太坊和比特币等基于 PoW 挖矿不同,Tron 采用 DPoS 机制 ,用户通过投票选出 27 名验证人来维护 Tron 网络的安全,验证链上交易并创建区块,这些验

    2024年02月01日
    浏览(31)
  • 对比传统交易模式与基于区块链的交易模式

    随着科技的不断进步,交易模式也在持续革新。传统交易模式与基于区块链的交易模式,作为两种截然不同的交易方式,各有其特点与影响。本文将对这两种交易模式进行详尽的对比,从多个维度揭示它们之间的差异。 传统交易模式通常依赖于中央机构或第三方来进行交易验

    2024年04月27日
    浏览(31)
  • 简易区块链的搭建(3)——交易

    1. UTXO账户模型 产生背景: 为了解决第一类双花问题(一笔钱花两次) 原理介绍: 我们先来介绍传统的金融模式,你有10元存款,想转给我3元,银行会怎么操作? 很显然,他会将你的账户减3元,将我的账户加3元。 这种交易模式记录的是 交易结果 而UTXO账户模型记录的是

    2024年04月09日
    浏览(57)
  • 手动自己写了一个波场(Tron)本地网页版钱包

    最近由于项目需要,需要给每个用户分配一个充币地址,考虑到钱包安全性和方便管理,于是自己动手写了一个本地网页版的钱包,附上源代码跟大家交流下。 Github 源码地址 钱包和项目是分离的,项目通过鉴权访问钱包的接口,主要实现了以下功能: 1、可以导入助记词、

    2023年04月15日
    浏览(31)
  • .NET Core 离线生成 Tron 波场私钥和地址笔记

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

    2023年04月13日
    浏览(38)
  • 携手ChainGPT 人工智能基础设施 波场TRON革新 Web3 版图

    近日,波场TRON与 Web3 人工智能基础设施服务商 ChainGPT 正式达成合作。通过本次合作,双方将进一步推动人工智能和区块链技术的融合,在实现优势互补的同时,真正惠及日常生活。 作为一站式的加密AI中心,ChainGPT 的人工智能工具需要进行大量计算,能耗高,而波场TRON采用的创新型代

    2024年02月05日
    浏览(41)
  • Java基于区块链的物联网数据交易+46193(免费领源码)可做计算机毕业设计JAVA、PHP、爬虫、APP、小程序、C#、C++、python、数据可视化、大数据、全套文案

    SSM基于区块链的物联网数据交易 系    院 XXXX 学科门类 XXX 专    业  XXX 班级 XXX 学    号 XXX 姓    名 XXX 指导教师 XXX 教师职称 XXX 2022 年 12 月 4 日         物联网技术作为继互联网技术后新一代的通信信息集成应用的典范,其巨大的应用前景受到了学术界和政商界

    2024年02月04日
    浏览(33)
  • java 实现区块链的密码学

    java 实现区块链的密码学今天分享,首先区块链行业相关的密码学有几个思路,比如对称加解密、非对称加解密、数字签名算法、散列hash相关的SHA-256加解密、Merkle树相关算法等等。今天我们主要采用java语言分享非对称加密和数字签名。 1、相关jar等配置,配置JDK1.8版本加上下

    2024年02月11日
    浏览(37)
  • SSM基于区块链的物联网数据交易 计算机毕设源码46193

                                                             摘  要 物联网技术作为继互联网技术后新一代的通信信息集成应用的典范,其巨大的应用前景受到了学术界和政商界的广泛关注。物联网技术在一些传统行业已经有了很深入的应用,例如,其在商品生产信息溯

    2024年02月21日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包