java TRC20

2023-11-01

直接上代码!!!

创建地址(离线):

	private static SecureRandom random = new SecureRandom();
	/**具体方法
	*/
	public static Map<String, String> createAddress() {
			ECKey eCkey = new ECKey(random);
			String privateKey = ByteArray.toHexString(eCkey.getPrivKeyBytes());
			byte[] addressBytes = eCkey.getAddress();
			String hexAddress = ByteArray.toHexString(addressBytes);
			Map<String, String> addressInfo = new HashMap<>(3);
			addressInfo.put("address", toViewAddress(hexAddress));
			addressInfo.put("hexAddress", hexAddress);
			addressInfo.put("privateKey", privateKey);
			return addressInfo;
		}

	/**
	 * 转换成T开头的地址
	 * @param hexAddress
	 * @return
	 */
	public static String toViewAddress(String hexAddress) {
		return encode58Check(ByteArray.fromHexString(hexAddress));
	}


ps:这里的参数都是明文,如需加密,自己搞定。

查余额(节点):


	/**
     * 查询数量
     */
    public BigDecimal balanceOf(String address) {
        String url = tronUrl +"/wallet/triggerconstantcontract";
        JSONObject param = new JSONObject();
        param.put("owner_address", TronUtils.toHexAddress(address));
        param.put("contract_address", TronUtils.toHexAddress(contract));
        param.put("function_selector", "balanceOf(address)");
        List<Type> inputParameters = new ArrayList<>();
        inputParameters.add(new Address(TronUtils.toHexAddress(address).substring(2)));
        param.put("parameter", FunctionEncoder.encodeConstructor(inputParameters));
        String result = HttpClientUtils.postJson(url, param.toJSONString());
        if (StringUtils.isNotEmpty(result)) {
            JSONObject obj = JSONObject.parseObject(result);
            JSONArray results = obj.getJSONArray("constant_result");
            if (results != null && results.size() > 0) {
                BigInteger amount = new BigInteger(results.getString(0), 16);
                return new BigDecimal(amount).divide(decimal, 6, RoundingMode.FLOOR);
            }
        }
        return BigDecimal.ZERO;
    }
/**
     * contract address
     */
    private String contract = "xxx";

这里的address必须是hex(16进制)类型地址,

根据PrivateKey获取地址

/**
	 * 根据私钥获取地址
	 *
	 * @param privateKey
	 * @return
	 */
	public static String getAddressByPrivateKey(String privateKey) {
		byte[] privateBytes = Hex.decode(privateKey);
		ECKey ecKey = ECKey.fromPrivate(privateBytes);
		byte[] from = ecKey.getAddress();
		return toViewAddress(Hex.toHexString(from));
	}

这个没什么特殊的。直接用就好了!

通过区块高度获取Transfer信息(归集用):

/**
     * 获取特定区块的所有Info 信息
     *
     * @return
     */
    private String getTransactionInfoByBlockNum(BigInteger num) {
        String url = tronUrl + "/wallet/gettransactioninfobyblocknum";
        Map<String, Object> map = new HashMap<>();
        map.put("num", num);
        String param = JSON.toJSONString(map);
        return HttpClientUtils.postJson(url, param);
    }

查询最新区块:

/**
     * 查询最新区块
     *
     * @return
     */
    public BigInteger getNowBlock() {
        String url = tronUrl + "/wallet/getnowblock";
        String httpRequest = HttpRequest.get(url).execute().body();
        JSONObject jsonObject1 = JSONObject.parseObject(httpRequest);
        return jsonObject1.getJSONObject("block_header").getJSONObject("raw_data").getBigInteger("number");
    }

根据hash,返回Transaction状态

/**
     * 返回状态
     */
    public boolean transactionStatus(String hash) {
        JSONObject parseObject = JSON.parseObject(getTransactionById(hash));
        if (StringUtils.isEmpty(parseObject.toJSONString())) {
            return false;
        }
        String contractRet = parseObject.getJSONArray("ret").getJSONObject(0).getString("contractRet");
        return "SUCCESS".equals(contractRet);
    }
    
/**
     * 通过HASH获取Transaction信息
     *
     * @param hash
     * @return
     */
    public String getTransactionById(String hash) {
        String url = tronUrl + "/walletsolidity/gettransactionbyid";
        Map<String, Object> map = new HashMap<>();
        map.put("value", hash);
        String param = JSON.toJSONString(map);
        return HttpClientUtils.postJson(url, param);
    }

重点!!!

/**
     * 
     *
     * @throws Throwable
     */
    public String sendTrc20(String privateKey, String toAddress, BigDecimal amount) throws Throwable {
        String ownerAddress = TronUtils.getAddressByPrivateKey(privateKey);
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("contract_address", contract);
        jsonObject.put("function_selector", "transfer(address,uint256)");
        List<Type> inputParameters = new ArrayList<>();
        inputParameters.add(new Address(TronUtils.toHexAddress(toAddress).substring(2)));
        inputParameters.add(new Uint256(amount.multiply(decimal).toBigInteger()));
        String parameter = FunctionEncoder.encodeConstructor(inputParameters);
        jsonObject.put("parameter", parameter);
        jsonObject.put("owner_address", ownerAddress);
        jsonObject.put("call_value", 0);
        jsonObject.put("fee_limit", 50000000L);
        jsonObject.put("visible", true);
        String trans1 = HttpClientUtils.postJson(tronUrl + "/wallet/triggersmartcontract", jsonObject.toString());
        JSONObject result = JSONObject.parseObject(trans1);
        if (result.containsKey("Error")) {
            throw new DfzgRuntimeException(WestError.WEST_TIMEOUT);
        }
        JSONObject tx = result.getJSONObject("transaction");
        //填写备注
        tx.getJSONObject("raw_data").put("data", Hex.toHexString("备注信息".getBytes()));
        String txid = TronUtils.signAndBroadcast(tronUrl, privateKey, tx);
        if (txid != null) {
            return txid;
        }
        return null;
    }

有个需要注意的,不了解波场链机制的朋友,可以先在TronLink上转账模拟一下。波场链Transfer是需要能量和带宽的,如果需要归集的话,是需要给被归集的地址支付一些Trx的,不然不能Deal。

TRX Transfer

/**
     * TRX Transfer
     */
    public String sendTrx(BigDecimal amount,String toAddress,String note) throws Throwable {
        String url = tronUrl + "/wallet/createtransaction";
        JSONObject param = new JSONObject();
        String privateKey = "私钥";
        param.put("owner_address", TronUtils.getAddressByPrivateKey(privateKey));
        param.put("to_address",toAddress);
        param.put("amount",amount.multiply(decimal).toBigInteger());
        param.put("visible", true);
        String result = HttpClientUtils.postJson(url, param.toJSONString());
        if(StringUtils.isNotEmpty(result)){
            JSONObject transaction = JSONObject.parseObject(result);
            String error = transaction.getString("Error");
            if(!StringUtil.isEmpty(error) && error.contains("balance is not sufficient")){
                throw new DfzgRuntimeException(WestError.WEST_NO_MONEY);
            }else {
                transaction.getJSONObject("raw_data").put("data", Hex.toHexString(note.getBytes()));
                return TronUtils.signAndBroadcast(tronUrl, privateKey, transaction);
            }
        }
        throw new DfzgRuntimeException(WestError.WEST_TIMEOUT);
    }

TRX查询余额

/**
     * 查询TRX额度
     */
    public BigDecimal balanceOf(String address) {
        String url = tronUrl + "/wallet/getaccount";
        JSONObject param = new JSONObject();
        param.put("address", TronUtils.toHexAddress(address));
        String result = HttpClientUtils.postJson(url, param.toJSONString());
        BigInteger balance = BigInteger.ZERO;
        if (!StringUtils.isEmpty(result)) {
            JSONObject obj = JSONObject.parseObject(result);
            BigInteger b = obj.getBigInteger("balance");
            if(b != null){
                balance = b;
            }
        }
        return new BigDecimal(balance).divide(decimal,6, RoundingMode.FLOOR);
    }

好啦,以上这些就是我的全部内容。
希望大家用的开心~
欢迎打赏,想深入交流的可以加QQ:296563552

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java TRC20 的相关文章

  • Java new Date() 打印

    刚刚学习 Java 我知道这可能听起来很愚蠢 但我不得不问 System out print new Date 我知道参数中的任何内容都会转换为字符串 最终值是 new Date 返回对 Date 对象的引用 那么它是如何打印这个的呢 Mo
  • Java EE:如何获取我的应用程序的 URL?

    在 Java EE 中 如何动态检索应用程序的完整 URL 例如 如果 URL 是 localhost 8080 myapplication 我想要一个可以简单地将其作为字符串或其他形式返回给我的方法 我正在运行 GlassFish 作为应
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • Final字段的线程安全

    假设我有一个 JavaBeanUser这是从另一个线程更新的 如下所示 public class A private final User user public A User user this user user public void
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo
  • 如何修复 JNLP 应用程序中的“缺少代码库、权限和应用程序名称清单属性”?

    随着最近的 Java 更新 许多人都遇到了缺少 Java Web Start 应用程序的问题Codebase Permissions and Application name体现属性 尽管有资源可以帮助您完成此任务 但我找不到任何资源综合的

随机推荐

  • 总结一下m3u8格式相关问题

    1 m3u8格式解读 本小节摘自 m3u8视频文件详解 m3u8不是一种视频格式 而是一种纯文本文件 m3u8视频文件格式中 存放了视频的基本信息 和 分段视频的索引地址 将一整个视频分成了时长不同的很多小段 当播放m3u8视频时 就是按顺
  • 微信小程序发布新版本后使用时自动提示用户更新或自动更新的方法

    如图 当小程序发布新的版本后 用户如果之前访问过该小程序 通过已打开的小程序进入 未手动删除 则会弹出这个提示 提醒用户更新新的版本 用户点击确定就可以自动重启更新 点击取消则关闭弹窗 不再更新 const updateManager wx
  • 关于C++编程vs2017 error: c2228的一种可能,或称基类位于派生类之后会出现的问题

    上次C 实验编程遇到了一次error c2228的问题 百度过了也没有答案 最终调换了基类和派生类的顺序才得到解决 下面是产生异常的一段代码 以上省略基类Plane和其纯虚函数area和girth class Triangle public
  • 论文总结:基于深度学习的图像风格迁移研究

    基于深度学习的图像风格迁移研究 前言 图像风格迁移方法 基于图像迭代的图像风格迁移方法 基于模型迭代的图像风格迁移方法 卷积神经网络 生成对抗网络 CycleGAN 前言 什么是深度学习 深度学习是机器学习的一种 机器学习是研究人工智能的必
  • 【C++基础】7. 控制语句

    文章目录 1 循环 1 1 循环类型 1 2 循环控制语句 break 语句 continue 语句 goto 语句 1 3 无限循环 2 选择 switch 语句 语句 1 循环 1 1 循环类型 循环类型 描述 while 循环 当给定
  • 解决ajax请求中Session失效问题

    之前项目都是jsp页面 没有遇到ajax请求中Session失效的问题 但最近的新项目中 所用框架为Jquery bootstrap html 页面所有请求都为ajax 一番尝试后 解决方法如下 1 LoginFilter中加入ajax请求
  • centos彻底删除文件夹、文件命令(centos 新建、删除、移动、复制等命令)

    centos彻底删除文件夹 文件命令 centos 新建 删除 移动 复制等命令 centos彻底删除文件夹 文件命令 centos 新建 删除 移动 复制等命令 1 新建文件夹 mkdir 文件名 新建一个名为test的文件夹在home下
  • spring的定时任务@Scheduled简单实用

    方式一 使用注解 Component EnableScheduling 可以在启动类上注解也可以在当前文件 public class TestJob Scheduled cron 0 10 public void runfirst Syst
  • 正则表达式匹配不包含某些字符串的技巧

    经常我们会遇到想找出不包含某个字符串的文本 程序员最容易想到的是在正则表达式里使用 hede 来过滤 hede 字串 但这种写法是错误的 我们可以这样写 hede 但这样的正则表达式完全是另外一个意思 它的意思是字符串里不能包含 h e d
  • 【深度学习】 Python 和 NumPy 系列教程(廿五):Matplotlib详解:3、多子图和布局:subplot()函数

    目录 一 前言 二 实验环境 三 Matplotlib详解 1 2d绘图类型 2 3d绘图类型 3 多子图和布局 1 subplot 函数 简单示例 一 前言 Python是一种高级编程语言 由Guido van Rossum于1991年创
  • Blender安装Babylon插件

    参考链接 https doc babylonjs com extensions Exporters Blender 安装步骤图示 首先去这个网站下载此文件 https github com BabylonJS BlenderExporter
  • 区块链安全————区块链技术安全讨论

    0x00 背景介绍 区块链技术是金融科技 Fintech 领域的一项重要技术创新 作为分布式记账 Distributed Ledger Technology DLT 平台的核心技术 区块链被认为在金融 征信 物联网 经济贸易结算 资产管理等
  • 浏览器出现无法访问此页面的提示的解决办法

    部分地区与网络会出现该问题 本人查询论坛后找到的有效解决办法为 控制面板 网络和internet internet选项 连接 局域网设置 在 为LAN使用代理服务器 这一栏打上勾 点击应用退出 刷新一下就可以 下来也有可能是hosts文件里
  • Kotlin高阶函数概念

    一 高阶函数的基本概念 1 传入或者返回函数的函数 传入是函数 返回也是函数 2 函数引用最常见的方式 println 3 带有接收者Receiver的引用pdfPrinter println 二 看一下入门的例子 package net
  • 腾讯员工收入曝光,我顿悟了一个成人世界的残酷事实

    最近 一张腾讯员工的收入证明火了 收入证明上显示 这位员工的职位是腾讯 成都 某游戏客户端开发 已入职9年 而在他的税后年收入那一栏 显示着251多万元 包括工资 奖金和津贴等 平均月收入约20万 算下来 税前大概是450万 这张图在网上流
  • android壁纸显示逻辑

    所有文章仅限自己备忘 并无他用 壁纸主要分为两类 锁屏壁纸和桌面壁纸 一 壁纸服务的启动 壁纸服务WallpaperManagerService中 有一个内部类LifeCycle继承自SystemService SystemServer在启
  • 数据结构——C++中实现栈链(含完整代码)

    栈链相关代码 1 向栈顶插入元素 2 删除栈顶元素 3 判断栈是否为空 4 读取栈顶元素 0 退出程序 栈其实就是一个特殊的线性表 输入输出只能在一端 基于这一特性完成栈链的相关操作 注意事项 由于插入和删除操作只可以在一端 链表头部 所以
  • Atcoder Beginner Contest 044

    C C Tak and Cards 我一开始想的是先从小到大排个序 然后分情况 先从左往右一个数一个数枚举 如果等于ave 1 就res 如果大于ave 1 就说明1个数的没有了 然后从左到右两个数两个数枚举 如果等于ave 2 就res
  • 游戏外挂怎么做?

    文章目录 1 什么是游戏外挂 2 外挂的分类及实现原理 2 1 辅助类外挂 2 2 专用插件类外挂 2 3 通用工具 2 4 内存修改器 2 5 变速器 2 6 按键精灵 2 7 模拟器 2 8 破解版 转载自 Anti Cheat Exp
  • java TRC20

    直接上代码 创建地址 离线 private static SecureRandom random new SecureRandom 具体方法 public static Map