Tron波场区块链 | 使用Java将Tron钱包助记词转私钥 全网独门一份

如何使用Java将Tron钱包助记词转换为私钥?

本来想着这个问题挺简单,可是查了半天,不是,不止半天查了好长时间,看了半天官网文档,全网Java就没有实现的。

咋办。。。咋办呢?

好巧,官网我看到了一个Tronweb的东东。

呦呵。。。再细细的看下,找到一个接口。

fromMnemonic

但是咱们这个Tronweb是前端项目啊,先不管了,我们来先看是否能实现,然后看看Js的实现是否能转换为Java语言。

创建完Vue项目,我们来导入TronWeb

npm install tronweb

写一个简单的vue来实现,我在想:Tron可以离线创建私钥、地址以及助记词。它的生成也是加密解密的关系,那么这里我们使用tronweb其实并不需要实例化,只要引入它的组件包,包含加解密应该就行了,那么代码其实很简单。

// 导入
import Tronweb from "tronweb";
// 直接调用接口查看
Tronweb.fromMnemonic(this.zjc)

写web我们就必须要可视化,那么我们写一个简单的页面。

输入助记词,点击解析后,我们看等到了私钥、公钥还有地址信息。

那么让我们来分析一下他的实现:

import {ethersHDNodeWallet, Mnemonic} from './ethersUtils'
const account =  ethersHDNodeWallet.fromMnemonic(Mnemonic.fromPhrase(mnemonic, null, wordlist), path);
    const result = {
        mnemonic: account.mnemonic,
        privateKey: account.privateKey,
        publicKey: account.signingKey.publicKey,
        address: pkToAddress(account.privateKey.replace(/^0x/, ''))
    }

看到实际的实现是ethersHDNodeWallet、Mnemonic俩个类。然后我们再看下ethersUtils那的实现。

import {
    Mnemonic,
    HDNodeWallet as ethersHDNodeWallet
} from 'ethers';

​​​​​​​看到ethers,这里我们就可以知道了。

哦,原来Tron波场链其实也是以太坊的分支链,那么按照理论上来说Tron的加解密方式其实也是ETH的加密方式。

看到了这里,我们这里转到Java。

先理解下ETH创建离线地址的过程:

1.生成一个随机的助记词

2.使用助记词生成一串种子

3.进行路径(BIP30)加密后产出地址等信息。

那么现在我们已经有了助记词,是不是直接用当前的助记词来生成种子,就可以产出私钥、地址等了呢?

publicstatic void main(String[] args) {
    String mnemonic = "program repair next claw rival slight spider tennis begin cute daring fancy";
    //使用助记词生成钱包种子
    List<String> mnemonics = Splitter.on(" ").splitToList(mnemonic);
    System.out.println(mnemonics.get(0));
    byte[] seed = MnemonicCode.toSeed(mnemonics, "");

    DeterministicKey masterPrivateKey = HDKeyDerivation.createMasterPrivateKey(seed);
    DeterministicHierarchy deterministicHierarchy = new DeterministicHierarchy(masterPrivateKey);
    DeterministicKey deterministicKey = deterministicHierarchy
            .deriveChild(BIP44_ETH_ACCOUNT_ZERO_PATH, false, true, new ChildNumber(0));
    byte[] bytes = deterministicKey.getPrivKeyBytes();
    ECKeyPair keyPair = ECKeyPair.create(bytes);
    System.out.println("0x" + keyPair.getPrivateKey().toString(16));
}

​​​​​​​运行程序后,结果是错的。

那么到底是哪里错了呢?

再看看代码前面的TronWeb接口:

图片

哦哦哦。。。原来的path是BIP44(m/44'/195'/0'/0/0),那么我们把这个Path参数修改下,看是否可行?

之前试了好几次,都没有达到最终正确的生成。

快要绝望的时候,我直接按了一下IDEA的快捷键俩下SHIFT+SHIFT,有了新的机会!

图片

这不是我要找的工具类吗?打开类看了它的内部实现,其实还不能完全适用,但是逻辑咱们清楚了,我们就来实现吧

public static final int HARDENED_BIT = 0x80000000;

public static void main(String[] args) throws MnemonicException.MnemonicLengthException {
    String mnemonic = "program repair next claw rival slight spider tennis begin cute daring fancy";
    byte[] seed = MnemonicUtils.generateSeed(mnemonic, "");
    Bip32ECKeyPair masterKeypair = Bip32ECKeyPair.generateKeyPair(seed);
    // m/44'/195'/0'/0/0
    final int[] path = {44 | HARDENED_BIT, 195 | HARDENED_BIT, 0 | HARDENED_BIT, 0, 0};
    Bip32ECKeyPair bip44Keypair = Bip32ECKeyPair.deriveKeyPair(masterKeypair, path);
    Credentials credentials = Credentials.create(bip44Keypair);
    String privateKey = credentials.getEcKeyPair().getPrivateKey().toString(16);
    System.out.println(privateKey);

    KeyPair keyPair = new KeyPair(privateKey);
    String base58CheckAddress = keyPair.toBase58CheckAddress();
    String publicKey = keyPair.toPublicKey();
    System.out.println(publicKey);
    System.out.println(base58CheckAddress);
}

​​​​​​​运行结果正确,完美。

解决这个问题其实花了好长时间,查百度、Google还有官网接口文档,部署开发Web前端的解决方案,试图找到门路。

写到这里,可以能帮到其他开发人员。

假如还是没有办法实现,关注我,联系我,帮您解决。

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

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

相关文章

瑞吉外卖实战学习--5、新增员工功能

新增员工功能 效果图1、开发流程2、页面发送ajax请求,将新增员工的信息以json的形式提交给服务器2.1、在填写信息的时候会发现身份校验比较麻烦,可以在validate中将全局的校验方式去掉,方便填写2.3、看到接口未employee2.4、前端代码分析3、服务器接收到提交的数据并调用ser…

Kotlin 中的类和构造方法

Kotlin 中的类与接口和 Java 中的类与接口还是有区别的。例如&#xff0c;Koltin 中的接口可以包含属性声明&#xff0c;与 Java 不同的是。Kotlin 的声明默认是 final 和 public 的。此外&#xff0c;嵌套的类默认并不是内部类&#xff1a;它们并没有包含对其它外部类的隐式引…

【系统架构师】-第18章-安全架构设计

(1)信息泄露&#xff1a;信息被泄露或透露给某个非授权的实体。 (2)破坏信息的完整性&#xff1a;数据被非授权地进行增删、修改或破坏而受到损失。 (3)拒绝服务&#xff1a;对信息或其他资源的合法访问被无条件地阻止。 (4)非法使用(非授权访问):某一资源被某个非授权的人或…

第十五届蓝桥杯模拟考试II_物联网设计

反思&#xff1a; 本次模拟让我惊醒&#xff0c;写这个作品如同搭积木&#xff0c;在拼接的时候都要仔细检查这个积木是否出bug,确保没有问题再将其拼接到之前搭好的大模块之中&#xff0c;因为就是这样的题目我在处理过程中就遇到了BUG&#xff0c;原因竟出在输入模式要上拉&…

二十四种设计模式与六大设计原则(二):【门面模式、适配器模式、模板方法模式、建造者模式、桥梁模式、命令模式】的定义、举例说明、核心思想、适用场景和优缺点

接上次博客&#xff1a;二十四种设计模式与六大设计原则&#xff08;一&#xff09;&#xff1a;【策略模式、代理模式、单例模式、多例模式、工厂方法模式、抽象工厂模式】的定义、举例说明、核心思想、适用场景和优缺点-CSDN博客 目录 门面模式【Facade Pattern】 定义 举…

Arthas线上排查问题流程

入门文档&#xff1a;trace | arthas 1、jar下载和启动 连接curl -O https://arthas.aliyun.com/arthas-boot.jar【wget https://arthas.aliyun.com/arthas-boot.jar】 。.../jdk/bin/java -jar arthas-boot.jar 22336【最好在这个目录启动,port可选】 选择进程序号 enter回车…

二分(二段性)

本文用于记录个人算法竞赛学习&#xff0c;仅供参考 一.二分算法 二分算法一般用于具有二段性的问题&#xff0c;数据不一定具有单调性&#xff0c;所以单调可二分&#xff0c;可二分不一定就要单调。 二.整数二分 1. 模板一&#xff1a;将区间[l, r]划分为[l, mid] 和 [mid…

学生价,leetcode会员购买分析

最近想要购买leetcode会员&#xff0c;但不知道买啥好&#xff0c;打算用python可视化数据进行一个简单的分析 具体数据如下 curve 1: 首两月79元每月&#xff0c;后续连续包月59curve 2: 90天199curve 3: 365天365&#xff08;学生认证&#xff09; 这么看&#xff0c;数据…

FA模型切换Stage模型组件切换之ServiceAbility切换DataAbility切换

ServiceAbility切换 FA模型中的ServiceAbility对应Stage模型中的ServiceExtensionAbility。Stage模型下的ServiceExtensionAbility为系统API&#xff0c;只有系统应用才可以创建。因此&#xff0c;FA模型的ServiceAbility的切换&#xff0c;对于系统应用和三方应用策略有所不同…

AI制作一键生成模特换装照,电商蓝海副业供不应求

在电子商务领域&#xff0c;产品展示和模特试穿照片是至关重要的。在传统流程中&#xff0c;创建一张精美的商品主图通常需要摄影师在摄影棚里进行白底拍摄&#xff0c;接着设计师会进行图像设计处理。 公 重 号&#xff1a;老A程序站 对于更复杂且高端的商品展示&#xff0c…

测试小萌新都看得懂的使用JMeter进行压测

前言 需要先搭配好JMeter的环境并运行 准备一个被测试接口 对其进行压力测试 搭配JMeter的运行环境 1.安装jdk jdk安装过程会提供两次安装&#xff0c;第一次是安装jre&#xff0c;第二次是安装java。 我在D盘提前新建了2个文件夹&#xff0c;jre文件夹用于jre安装&#xff…

PS从入门到精通视频各类教程整理全集,包含素材、作业等(3)复发

PS从入门到精通视频各类教程整理全集&#xff0c;包含素材、作业等 最新PS以及插件合集&#xff0c;可在我以往文章中找到 由于阿里云盘有分享次受限制和文件大小限制&#xff0c;今天先分享到这里&#xff0c;后续持续更新 中级教程 https://www.alipan.com/s/unii5YxtM8B 提…

【初阶数据结构】——牛客:OR36 链表的回文结构

文章目录 1. 题目介绍2. 思路分析3. 代码实现 1. 题目介绍 链接: link 这道题呢是让我们判断一个链表是否是回文结构。但是题目要求设计一个时间复杂度为O(n)&#xff0c;额外空间复杂度为O(1)的算法。 所以如果我们想把链表的值存到一个数组中再去判断就不可行了。 2. 思路…

时序数据预处理

时序数据预处理 对于数据科学来说&#xff0c;凡事“预”则立&#xff0c;不“预”则废。数据的质量直接决定数据挖掘的结果。本文旨在一站式的梳理时序数据的预处理步骤。 数据预处理的目的是将脏数据变成我们想要的干净的数据&#xff0c;这里的干净指的是&#xff1a; 准确…

WeekPaper:GraphTranslator将知识图谱与大模型对齐

GraphTranslator: 将图模型与大型语言模型对齐&#xff0c;用于开放式任务。 将基于图的结构和信息与大型语言模型的能力整合在一起&#xff0c;以提高在涉及复杂和多样数据的任务中的性能。其目标是利用图模型和大型语言模型的优势&#xff0c;解决需要处理和理解结构化和非结…

JavaScript动态渲染页面爬取——Pyppeteer爬取实战

Pyppeteer爬取实战 爬取目标 电影网站https://spa2.scrape.center/ 任 务 通过Selenium遍历列表页&#xff0c;获取每部电影的详情页URL通过Selenium根据上一步获取的详情页URL爬取每部电影的详情页从详情页中提取每部电影的名称、类别、分数、简介、封面等内容。 爬取列表页…

ssm009毕业生就业信息统计系统+vue

毕业生就业信息统计系统 摘 要 随着移动应用技术的发展&#xff0c;越来越多的学生借助于移动手机、电脑完成生活中的事务&#xff0c;许多的行业也更加重视与互联网的结合&#xff0c;以提高快捷、高效、安全&#xff0c;可以帮助更多有需求的人。针对传统毕业生就业信息统计…

Spring官方真的不建议使用属性进行依赖注入吗?

使用Spring进行依赖注入时&#xff0c;很多大佬都推荐使用构造方法注入&#xff0c;而非使用在属性上添加 Autowired 注入&#xff0c;而且还说这是Spring官方说的&#xff0c;真的是这样吗&#xff1f; 使用Spring进行依赖主要的方式有很多&#xff0c;主流的使用方式有两种&a…

2核4G云服务器能支持多少人访问?并发数测试

腾讯云轻量应用服务器2核4G5M配置性能测评&#xff0c;腾讯云轻量2核4G5M带宽服务器支持多少人在线访问&#xff1f;并发数10&#xff0c;支持每天5000IP人数访问&#xff0c;腾讯云百科txybk.com整理2核4G服务器支持多少人同时在线&#xff1f;并发数测试、CPU性能、内存性能、…

PID算法控制5840-31ZY编码器直流减速电机旋转特定角度(一)

模块分析 在本工程中&#xff0c;使用stm32做主控芯片输出PWM波&#xff0c;TB6112做电源驱动带动5840-31ZY编码器直流减速电机旋转特定角度 有如下模块 TB6112驱动模块 TB6112是性能优于常见L298N的一款电机驱动芯片&#xff0c;体积更小效率更高发热少 其接线如图&#x…