Java对接(BSC)币安链 | BNB与BEP20的开发实践(二)BNB转账、BEP20转账、链上交易监控

上一节我们主要是环境搭建,主要是为了能够快速得去开发,有些地方只是简单的介绍,比如ETH 、web3j等等这些。

这一节我们来用代码来实现BNB转账、BEP20转账、链上交易监控

话不多说,我们直接用代码实现吧

1. BNB转账

    /**
     *  BNB转账
     * @param toAddress 接收地址地址
     * @param amount 金额
     * @return
     */
    @Override
    public String transBscBnbJson(String toAddress, String amount) throws Exception {
        Web3j web3j = Web3j.build(new HttpService(tronServiceConfig.getBscUrl()));
        EthGetTransactionCount ethGetTransactionCount = web3j.ethGetTransactionCount(tronServiceConfig.getBscFromAddress(), DefaultBlockParameterName.LATEST).sendAsync().get();
        BigInteger nonce = ethGetTransactionCount.getTransactionCount();
        BigInteger gasPrice = web3j.ethGasPrice().send().getGasPrice();
        BigInteger gasLimit = BigInteger.valueOf(60000);

        BigInteger functionAmount = Convert.toWei(new BigDecimal(amount), Convert.Unit.ETHER).toBigInteger();
        RawTransaction rawTransaction = RawTransaction.createEtherTransaction(nonce, gasPrice, gasLimit, toAddress, functionAmount);
        // 私钥
        Credentials credentials = Credentials.create(tronServiceConfig.getBscFromPrivateKey());
        //进行签名操作
        byte[] signMessage = TransactionEncoder.signMessage(rawTransaction, credentials);
        String hexValues = Numeric.toHexString(signMessage);
        //发起交易
        EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(hexValues).sendAsync().get();
        String hash = ethSendTransaction.getTransactionHash();
        if (hash != null) {
            //执行业务
            log.info("BNB转账执行成功:" + hash);
        }
        return hash;
    }

   

2. BEP20转账

   /**
 *  BEP20转账
 * @param toAddress 接受地址地址
 * @param amount 金额
 * @return
 */
@Override
public String transBscJson(String toAddress, String amount) {
    BigInteger gasLimit = BigInteger.valueOf(60000);
    try {
        BigInteger gasPrice = web3j.ethGasPrice().send().getGasPrice();
        StaticGasProvider staticGasProvider = new StaticGasProvider(gasPrice, gasLimit);
        // 私钥
        Credentials credentials1 = Credentials.create(MarketConstruct.BOCT_STAKE_CONTRACT_OWER_PRIVATE_KEY);
        // load合约
        BEP2E bep2e = BEP2E.load(MarketConstruct.BOCT_CONTRACT_ADDRESS, web3j, credentials1, staticGasProvider);
        // 转账
        BigInteger pow = BigInteger.valueOf(10L).pow(18);
        BigInteger multiply = new BigDecimal(amount).multiply(new BigDecimal(pow.toString())).toBigInteger();
        TransactionReceipt send = bep2e.transfer(toAddress, multiply).send();
        String transactionHash = send.getTransactionHash();
        if (StrUtil.isEmpty(transactionHash)) {
            log.info("error_");
            return "error_error";
        }
        return transactionHash;
    } catch (Exception ex) {
        log.info("error_", ex);
        return "error_" + ex.getMessage();
    }
}

   

当我们转账成功后,需要进行账户余额查询

BNB与BEP20余额查询

/**
     * <b>功能描述:</b>查询BNB余额<br>
     * <b>修订记录:</b><br>
     */
    public BigDecimal queryBNBBalance(String address) throws Exception {
        DefaultBlockParameter defaultBlockParameter = new DefaultBlockParameterNumber(web3b.ethBlockNumber().send().getBlockNumber());
        EthGetBalance balance = web3b.ethGetBalance(address, defaultBlockParameter).send();
        BigDecimal bigDecimal = new BigDecimal(balance.getBalance());
        BigInteger pow = BigInteger.valueOf(10L).pow(18);
        return bigDecimal.divide(new BigDecimal(pow), 4, RoundingMode.HALF_UP);
    }

    /**
     * <b>功能描述:</b>查询BEP20余额<br>
     * <b>修订记录:</b><br>
     * <li>20240309&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;创建方法</li><br>
     */
    public BigDecimal queryBEP2EBBalance(String contractAddr, String address) throws Exception {
        try {
            BigInteger gasPrice = web3b.ethGasPrice().send().getGasPrice();
            TransactionManager transactionManager = new ReadonlyTransactionManager(web3b, address);
            StaticGasProvider staticGasProvider = new StaticGasProvider(gasPrice, BigInteger.valueOf(4700000));
            BEP2E bep2e = BEP2E.load(contractAddr, web3b, transactionManager, staticGasProvider);
            BigInteger balance = bep2e.balanceOf(address).send();
            BigDecimal bigDecimal = new BigDecimal(balance);
            BigInteger pow = BigInteger.valueOf(10L).pow(18);
            return bigDecimal.divide(new BigDecimal(pow), 4, RoundingMode.HALF_UP);
        } catch (Exception ex) {
            return BigDecimal.ZERO;
        }
    }

3.链上交易监控

和之前TRON TRC20同样的艰辛,BNB的监控逻辑和业务包括web3j的支持,以及RPC接口的稳定性,简直是折腾了一个够。

最终的最好的解决办法:自建一个区块链节点,可惜本人没有那么大的财力,去长期购买大容量的服务器支持,只能做了一个服务接口,服务不稳定时,自动重启连接。效果还过得去吧。目前为止,没有丢块现象了。

假如是自建区块链节点,又不是JAVA语言开发,那就不会出现问题

废话不多说,首先还是查找链上最大的交易块。

Request<?, EthBlockNumber> request = web3j.ethBlockNumber();
BigInteger blockNumber = request.send().getBlockNumber();
/**
     * <b>功能描述:</b>创建开始与结束区块, 重放这段时间内的交易,防止遗漏<br>
     * <b>修订记录:</b><br>
     */
    public void startReplayListen_BiAn(Web3j web3j, BigInteger startBlockNum) {
        //创建开始与结束区块, 重放这段时间内的交易,防止遗漏
        DefaultBlockParameter startBlock = new DefaultBlockParameterNumber(startBlockNum);
        web3j.replayPastTransactionsFlowable(startBlock, DefaultBlockParameterName.LATEST).subscribe(tx -> {
            String fromAddress = tx.getFrom();
            String toAddress = tx.getTo();
            // 发现了指定地址上的交易
            BigInteger blockNumber = tx.getBlockNumber();
            KeyValue keyValueNum = keyValueMapper.selectByKey(MarketConstruct.BOCT_STAKE_CONTRACT_ADDRESS);
            if (keyValueNum.getValue().equalsIgnoreCase(toAddress)) {
                String transactionHash = tx.getHash();
                String timestamp = "";
                try {
                    DefaultBlockParameter defaultBlockParameter = DefaultBlockParameter.valueOf(blockNumber);
                    EthBlock ethBlock = web3j.ethGetBlockByNumber(defaultBlockParameter, false).send();
                    timestamp = String.valueOf(ethBlock.getBlock().getTimestamp());
                    Long timestamp1 = Long.parseLong(timestamp) * 1000L;
                    BigDecimal amount = new BigDecimal(new BigInteger(tx.getInput().substring(12), 16)).divide(BigDecimal.valueOf(1000000000000000000.0), 18, BigDecimal.ROUND_HALF_EVEN);
                    checkBlock(transactionHash, tx.getBlockNumber(), fromAddress, amount, timestamp1.toString(), 1L, BigInteger.valueOf(1L), BigInteger.valueOf(1L));
                } catch (IOException e) {
                    log.error("Block timestamp get failure,block number is {}", blockNumber);
                    log.error("Block timestamp get failure,{}", e.getMessage());
                }
            }
        }, error -> log.error("   ### replayPastTransactionsFlowable  error= ", error));
    }

全网的监控代码基本清一色的是下方代码方法:

web3j.ethLogFlowable(ethFilter).subscribe(logs -> {
     // ......
     }, error -> log.error("contractExtract subscribe in error", error));

可惜运行大概一个小时之后,就无法正常使用,web3j内部错误,github上寻求了各种方法,包括改web3j版本,将web3j的监控改为websocket都无法完美实现,也是通过研究和大量的调试,才找到了最好办法。

假如有大神可完美,那就不吝赐教000

目前市面上Java开发虽然也是主流,但是可以使用其他开发语言实现区块链功能,那就改变下,比如Go。

本人只是为了业务代码工程只停留在Java一个项目内才死脑筋JAVA开发的,其实还是还做了一套Go的监控代码,那用起来是非常舒心。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/447092.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

后端八股笔记-----mysql

Mysql 聚合查询————可以用增加一个实例表解决 多表查询————可以优化sql语句进行查询 &#x1f446; 显示Using index condition的话 说明是有优化的空间 &#x1f446;唯一索引指的是类似主键这种数据内容唯一的属性 &#x1f446;图中的最后一个sql的索引…

Math类 --Java学习笔记

Math 代表数学&#xff0c;是一个工具类&#xff0c;里面提供的都是对数据进行操作的一些静态方法 Math提供的常用方法

Kafka的分区机制

Kafka的分区机制是其核心功能之一&#xff0c;旨在提高可扩展性和并行处理能力。下面概述了Kafka分区的基本概念和工作原理&#xff1a; Kafka分区基本概念 分区&#xff08;Partition&#xff09;&#xff1a;Kafka中的主题&#xff08;Topic&#xff09;可以细分为多个分区…

OD_2024_C卷_200分_7、5G网络建设【JAVA】【最小生成树】

package odjava;import java.util.Scanner;public class 七_5G网络建设 {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt(); // 基站数量&#xff08;节点数&#xff09;int m sc.nextInt(); // 基站对数量&#xff08;边数&…

【Docker】在 Ubuntu20.04 上配置 Docker 开发环境

【Docker】在 Ubuntu20.04 上配置 Docker 开发环境 1 安装 Docker2 加入 Docker 用户组 1 安装 Docker 参考文档: Link 卸载以避免冲突 for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done设…

linux中新添加一块硬盘之后,系统起不来

问题&#xff1a; 在添加磁盘之后&#xff0c;重新开机时&#xff0c;却发现无法进入系统中 原因&#xff1a; 是因为添加了新的磁盘之后&#xff0c;系统将空硬盘当作系统盘启动&#xff0c;所以无法启动系统 解决方案&#xff1a; 进入到bios&#xff0c;将系统盘的优先级…

【大厂AI课学习笔记NO.71】AI算力芯片GPU/TPU等

AI算力芯片的发展历程 人工智能&#xff08;AI&#xff09;算力芯片的发展历程紧密地跟随着AI技术的发展脚步。从早期的基于传统中央处理器&#xff08;CPU&#xff09;的计算&#xff0c;到图形处理器&#xff08;GPU&#xff09;的广泛应用&#xff0c;再到专门为AI设计的处…

01_electron入门

由于毕业论文可能需要用 electron&#xff0c;所以 Linux 驱动学习慢了下来。 一、安装 node.js 进入 node.js 官网&#xff1a;Node.js (nodejs.org) 咱们就是用稳定版&#xff0c;安装包除了安装路径自己选择外&#xff0c;一直点 Next。 安装完成后需要配置环境&#xff0c…

C++容器适配器stack、queue、priority_queue

文章目录 C容器适配器stack、queue、priority_queue1、stack1.1、stack的介绍1.2、stack的使用1.3、stack的模拟实现 2、queue2.1、queue的介绍2.2、queue的使用2.3、queue的模拟实现 3、priority_queue3.1、priority_queue的介绍3.2、priority_queue的使用3.3、仿函数3.4、pri…

Vue3+ts(day02:CompositionAPI、setup)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学&#xff0c;可以点心心支持一下哈&#xff08;笔记是根据b站上学习的尚硅谷的前端视频【张天禹老师】&#xff0c;记录一下学习笔记&#xff0c;用于自己复盘&#xff0c;有需要学…

Linux——信号

目录 什么是信号 Linux下的信号 信号的记录 信号处理的常见方式 产生信号 使用组合键产生信号&#xff08;包含core dump&#xff09; 使用系统调用向进程发送信号 由软件条件产生信号 由硬件异常产生信号 阻塞信号 内核表示 sigset_t 信号集操作函数 sigpendin…

基于粒子群(PSO)的PID控制器matlab仿真

算法实现简介 利用粒子群算法对 PID 控制器的参数进行优化设计&#xff0c;其过程如图 所示。 图中&#xff0c;粒子群算法与 Simulink 模型之间连接的桥梁是粒子&#xff08;即 PID 控制器参数&#xff09;和该粒子对应的适 应值&#xff08;即控制系统的性能指标&#xff09…

商家转账到零钱场景申请哪一个

商家转账到零钱是什么&#xff1f; 商家转账到零钱功能是指商家可以通过支付平台将资金直接转账到用户的零钱账户中。在这种情况下&#xff0c;商家不需要用户提供银行账户信息&#xff0c;而是使用支付平台的转账功能将资金直接转移到用户的零钱账户中。 商家转账到零钱的使…

什么是脚本语言?——跟老吕学Python编程

什么是脚本语言&#xff1f;——跟老吕学Python编程 脚本语言脚本语言概述脚本语言定义脚本语言简介脚本语言特点 脚本语言特点脚本语言优点脚本语言缺点 脚本语言应用和发展脚本语言应用脚本语言发展情况 脚本语言分类工作控制语言和ShellGUI脚本应用程序定制的脚本语言WEB编程…

储能系统--户用储能美洲市场(三)

2、美洲市场 2.1、美国户储发展驱动力 &#xff08;1&#xff09;电网老化带来配储需求&#xff0c;户用光储成家庭第二用电保障 美国大部分电网建于20世纪60和70年代&#xff0c;超70%以上的输电系统已经超过了25年&#xff0c;在高负荷运转或者外部环境承压时&#xff0c;…

深入理解MVC和MVVM:构建现代Web应用的利器

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

C语言笔记:类型、运算符与表达式

类型与变量 概念 类型是定义变量的&#xff0c;什么是类型&#xff0c;例如张三是一个人&#xff0c;张三就是变量而人就是类型&#xff0c;什么是变量就是用来存储数据的&#xff0c;为什么变量会分为很多类型&#xff0c;因为存储的数据类型不同&#xff0c;需要不容的类型来…

LVS集群(Linux Virtual server)

集群概念lvs模型lvs调度算法lvs实现lvs高可用性&#xff0c;负载均衡 1 集群和分布式 系统性能扩展方式&#xff1a; Scale UP&#xff1a;垂直扩展&#xff0c;向上扩展,增强&#xff0c;性能更强的计算机运行同样的服务 升级单机的硬件设备Scale Out&#xff1a;水平扩展…

C++的一些基础语法

前言&#xff1a; 本篇将结束c的一些基础的语法&#xff0c;方便在以后的博客中出现&#xff0c;后续的一些语法将在涉及到其它的内容需要用到的时候具体展开介绍&#xff1b;其次&#xff0c;我们需要知道c是建立在c的基础上的&#xff0c;所以c的大部分语法都能用在c上。 1.…

妇女节:打开AI视界,成就“她力量”

根据国内招聘平台猎聘发布的《2024女性人才数据洞察报告》&#xff0c;从2023年3月到2024年2月&#xff0c;女性在AIGC领域的求职人次同比增长了190.49%。随着人工智能时代的降临&#xff0c;女性正以前所未有的姿态&#xff0c;在技术的助力下&#xff0c;蜕变成为新生的力量。…