区块链钱包“BTC,TRX,ETH”地址生成、助记词导入、keyStron文件生成等功能

这篇具有很好参考价值的文章主要介绍了区块链钱包“BTC,TRX,ETH”地址生成、助记词导入、keyStron文件生成等功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

#最近闲着没事做,然后看听到说什么BTC疯涨,这类的小道消息。

         哦豁~,这一下就让我觉得非常好奇,说,他们这些东西是怎样在链上存在的呢,然后他们那个一串串的地址又是啥,imtoken钱包又是怎么实现的呢。

        根据以上疑问,我自己去研究,自己去做一个钱包可以不?PS:主要是这个问题简单点,那些什么在链上存在的我没研究透。

好的鸣人不说暗话,我们开始!

eth链的助记词能导入tron链吗,区块链,web3钱包,区块链,java,web3
        

二、理解区块钱包

        首先我们得知道传说中的imtoken,web3等钱包是什么东西,它实际上就是一个以地址为核心的一个软件

ps:当然现在他们也有很多其他的功能,比如说新闻啊,杂七杂八的,我们暂时把他当作银行卡包用

从而得知,我们需要做一个银行卡包,那么它里面都有些啥内容呢?
        卡包最主要的就是银行卡啊,那么钱包的内容是啥呢?   ok !    钱包的内容就是一个区块地址

三、钱包地址

问:钱包地址是啥呢?

答:“钱包地址是一串16位进制的字符串”

        “我都没接触过,区块是啥我都不清楚,我怎么做啊!“

        “这东西肯定很难,又是什么16进制,什么的,肯定还有很多算法,算了不看了”

..............................................?

           好的,其实很简单,你想想,区块这东西听着很深奥,那么是不是已经有大佬帮我们开路了呢?然后java语言的生态在全世界来说是不是很广说白了就是调包调用API),肯定有现成的包给你用的。

四、具体实现

问:好的,那我们用java怎么去做。

答:看下面

首先我们得引用几个包

第一个:tron 也就是 trx需要用的核心包

GitHub:tron.tronprotocol

//org.tron.cli 包 在git上可以下得到,所以在本地引用即可

<dependency>
    <groupId>org.tron.cli</groupId>
    <artifactId>core</artifactId>
    <version>4.7.0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/src/main/java/lib/wallet-cli.jar</systemPath>
</dependency>

第二个:web3J 主网包 ETH

//宝宝我用的是5.0.0 方法更全面,对比之前的4.8   4.0这些去掉了很多方法,然而优化了很多地方,具体可以去看看

<dependency>
    <groupId>org.web3j</groupId>
    <artifactId>core</artifactId>
    <version>5.0.0</version>
</dependency>

第三个:bitcoinj 主网包 就是BTC的工具包

//我这里用的是0.14.7 这个包里面方法很全面,阅读源码看起来也很清晰。而且推荐使用的也是这个

<dependency>
    <groupId>org.bitcoinj</groupId>
    <artifactId>bitcoinj-core</artifactId>
    <version>0.14.7</version>
    <exclusions>
        <exclusion>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
        </exclusion>
    </exclusions>
</dependency>

好的以上就是具体需要用到的核心包,接下来看代码实现

1.具体代码实现

1.1公共方法

        下面是一些算法,就是16进制转字符串啊,这些东西,我们在生成钱包后返回的是一个10进制byte[]数组,所以我们需要转换成相应16进制的字符串,

PS:下面代码复制过去没用,你需要去下载我的完整项目才行,最下面的GIT地址

   /**
     * 十六进制字符串转换为字节数组
     * @param s 16进制的字符串,我们的私钥就是一个16进制的字符串
     * @return byte[]
     */
    public static byte[] hexStringToByteArray(String s) {
        int len = s.length();
        byte[] data = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
            data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                    + Character.digit(s.charAt(i + 1), 16));
        }
        return data;
    }

    /**
     * 创建一个指定长度的 byte[]
     * @param length 长度
     * @return byte[]
     */
    public static byte[] generateRandomBytes(int length) {
        byte[] bytes = new byte[length];
        new SecureRandom().nextBytes(bytes);
        return bytes;
    }

    /**
     * byte[]数组转换成十六进制字符串,我们私钥刚创建出来是一个byte数组,
     * 然后需要转换成16进制字符串才能正常使用
     * @param bytes bytes
     * @return String
     */
    public static String bytesToHex(byte[] bytes) {
        StringBuilder hexString = new StringBuilder();
        for (byte b : bytes) {
            String hex = Integer.toHexString(0xff & b);
            if (hex.length() == 1) {
                hexString.append('0');
            }
            hexString.append(hex);
        }
        return hexString.toString();
    }
1.2常量

        首先我们还是要有一些概念的,BIP44_ZERO_PATH  是啥,他是一个路径(看注释)

        PS:常量解释看注释

    /**
     * 主网路径  m44'/60'/0'/0/0 主流钱包一般用的都是这个
     * ps:其余的钱包可能有自定义路径或者是  m44'/60'/0'/0
     *    我们已主网路径为例子
     */
    public static final ImmutableList<ChildNumber> BIP44_ZERO_PATH = ImmutableList.of(new ChildNumber(44, true), new ChildNumber(60, true),
            ChildNumber.ZERO_HARDENED, ChildNumber.ZERO, ChildNumber.ZERO);

    public static final String TRX = "TRX";
    public static final String ETH = "ETH";
    public static final String BTC = "BTC";

    /**
     * 默认密码(创建钱包的时候用)
     */
    public static final String PASSWORD = "123456";

    /**
     * keyStore 文件路径;
     * ps:keyStore 是钱包中的一个重要节点,备份可以使用(当然助记词也可以)
     */
    public static final String KEYSTORE_PATH = System.getProperty("user.dir")+"/keyStore";
1.3trx相关方法
/**
     * 创建TRX钱包
     * 这个没有keysTRON
     * 不过可以试一下熵值创建,然后吧这些信息保存起来
     * key,address等信息存起来自己定义一个keyStrone
     * @return module
     */
    public WalletModule createWallet(){
        WalletModule module = new WalletModule();
        byte[] entropy = WalletInitMethod.generateRandomBytes(16);//其实这个你就可以保存起来,因为是生成助记词很重要的一个熵,没办法逆推算,写入到keyStron种
        String mnemonic = MnemonicUtils.generateMnemonic(entropy);
        byte[] seed = MnemonicUtils.generateSeed(mnemonic, "");
        // 从种子生成私钥
        ECKey ecKey = ECKey.fromPrivate(seed);

        // 获取公钥和地址
        byte[] publicKeyBytes = ecKey.getPubKey();
        String address = Base58.encode(ecKey.getAddress());
        module.setAddress(address);
        module.setPublicKey(WalletInitMethod.bytesToHex(publicKeyBytes));
        module.setPrivateKey(WalletInitMethod.bytesToHex(ecKey.getPrivateKey()));
        module.setMnemonic(Arrays.asList(mnemonic.split(" ")));
        return module;
    }

    /**
     * 其实就是省了创建助记词的步骤,
     * @param mnemonic 助记词,A B C D 这种隔空格二的形式
     * @return
     */
    public WalletModule createWalletByMnemonic(String mnemonic){
        WalletModule module = new WalletModule();
        byte[] seed = MnemonicUtils.generateSeed(mnemonic, "");
        // 从种子生成私钥
        ECKey ecKey = ECKey.fromPrivate(seed);

        // 获取公钥和地址
        byte[] publicKeyBytes = ecKey.getPubKey();
        String address = Base58.encode(ecKey.getAddress());
        module.setAddress(address);
        module.setPublicKey(WalletInitMethod.bytesToHex(publicKeyBytes));
        module.setPrivateKey(WalletInitMethod.bytesToHex(ecKey.getPrivateKey()));
        module.setMnemonic(Arrays.asList(mnemonic.split(" ")));
        return module;
    }

    /**
     * 根据私钥生成钱包,因为没有原始熵的原因,所以就没有生成助记词
     * @param privateKey 私钥 16进制的
     * @return WalletModule
     */
    public WalletModule createWalletByPrivateKey(String privateKey){
        WalletModule module = new WalletModule();

        // 将私钥转换为字节数组
        byte[] privateKeyBytes = WalletInitMethod.hexStringToByteArray(privateKey);
        // 使用私钥生成 ECKey 对象
        ECKey ecKey = ECKey.fromPrivate(privateKeyBytes);

        // 获取公钥和地址
        byte[] publicKeyBytes = ecKey.getPubKey();
        String address = Base58.encode(ecKey.getAddress());

        module.setAddress(address);
        module.setPublicKey(WalletInitMethod.bytesToHex(publicKeyBytes));
        module.setPrivateKey(WalletInitMethod.bytesToHex(ecKey.getPrivateKey()));
        return module;
    }
1.4eth相关方法
    /**
     * 生成一个ETH钱包(主网)
     * 包含生成keyStore
     *
     * @return WalletModule
     * @throws CipherException e
     * @throws IOException     e
     */
    public WalletModule createWallet() throws CipherException, IOException {
        WalletModule module = new WalletModule();
        Bip39Wallet walletEthereum = WalletInitMethod.createWalletEthereum();
        String mnemonic = walletEthereum.getMnemonic();
        Credentials credentials = WalletUtils.loadBip39Credentials(Constants.PASSWORD, mnemonic);
        ECKeyPair ecKeyPair = credentials.getEcKeyPair();
        module.setMnemonic(Arrays.asList(walletEthereum.getMnemonic().split(",")));
        module.setKeyStoreFileName(walletEthereum.getFilename());
        module.setPublicKey(ecKeyPair.getPublicKey().toString(16));
        module.setPrivateKey(ecKeyPair.getPrivateKey().toString(16));
        module.setAddress(credentials.getAddress());
        return module;
    }

    /**
     * 这里传 A B C D这样的助记词,懒得做验证再处理了
     * 当然这里没有keyStore
     *
     * @param mnemonic 助记词
     * @return WalletModule
     */
    public static WalletModule createWalletByMnemonic(String mnemonic) {
        WalletModule module = new WalletModule();
        Credentials credentials = WalletUtils.loadBip39Credentials(Constants.PASSWORD, mnemonic);
        ECKeyPair ecKeyPair = credentials.getEcKeyPair();
        module.setPublicKey(ecKeyPair.getPublicKey().toString(16));
        module.setPrivateKey(ecKeyPair.getPrivateKey().toString(16));
        module.setAddress(credentials.getAddress());
        return module;
    }

    /**
     * 根据私钥生成一个ETH钱包
     *
     * @param privateKey 私钥(16进制的私钥哦)
     * @return WalletModule
     */
    public static WalletModule createWalletByPrivateKey(String privateKey) {
        WalletModule module = new WalletModule();
        Credentials credentials = Credentials.create(privateKey);
        ECKeyPair ecKeyPair = credentials.getEcKeyPair();
        module.setPublicKey(ecKeyPair.getPublicKey().toString(16));
        module.setPrivateKey(ecKeyPair.getPrivateKey().toString(16));
        module.setAddress(credentials.getAddress());
        return module;
    }

    /**
     * 根绝keyStore 生成一个钱包
     *
     * @param password  这个注意,密码一定得正确 要不然就是 Invalid password provided
     * @param file_Path keyStore 文件路径
     * @return WalletModule
     * @throws CipherException e
     * @throws IOException     e
     */
    public static WalletModule createWalletByKeyStore(String password, String file_Path) throws CipherException, IOException {
        WalletModule module = new WalletModule();
        //用loadCredentials 方法就行
        Credentials credentials = WalletUtils.loadCredentials(password, file_Path);
        ECKeyPair ecKeyPair = credentials.getEcKeyPair();
        module.setPublicKey(ecKeyPair.getPublicKey().toString(16));
        module.setPrivateKey(ecKeyPair.getPrivateKey().toString(16));
        module.setAddress(credentials.getAddress());
        return module;
    }

1.5btc相关方法
    /**
     * 创建BTC钱包
     * @return WalletModule
     */
    public WalletModule createWallet(){
        WalletModule module = new WalletModule();
        try {
            List<String> list = WalletInitMethod.createMnemonic();
            byte[] seed = MnemonicCode.INSTANCE.toEntropy(list);
            DeterministicSeed deterministicSeed = new DeterministicSeed(list,seed,null,new Date().getTime());
            Wallet wallet = Wallet.fromSeed(NetworkParameters.fromID("org.bitcoin.production"), deterministicSeed);//主网,你也可以选择测试网
            module.setAddress(wallet.currentReceiveAddress().toString());
            wallet.getIssuedReceiveKeys();
            //ps:这里为什么要做一个这样的处理,是因为BitcoinJ 库会从比特币网络中下载区块并同步交易历史,
            // 这个过程可能需要一些时间,特别是在刚开始使用钱包时,或者你可以添加一个监听器addChangeEventListener 也行
            while (wallet.getIssuedReceiveKeys().isEmpty()){
                Thread.sleep(2000);//直接等待五秒
            }
            ECKey ecKey  = wallet.getIssuedReceiveKeys().get(0);
            module.setMnemonic(list);
            module.setPrivateKey(ecKey.getPrivateKeyAsHex());
            module.setPublicKey(ecKey.getPublicKeyAsHex());
        } catch (MnemonicException.MnemonicWordException | MnemonicException.MnemonicChecksumException |
                 MnemonicException.MnemonicLengthException | InterruptedException e) {
            throw new RuntimeException(e);
        }
        return module;
    }

    /**
     * 这个就是把助记词传过来就行
     * @param mnemonic mnemonic
     * @return WalletModule
     */
    public WalletModule createWalletByMnemonic(List<String> mnemonic){
        WalletModule module = new WalletModule();
        try {
            List<String> list = mnemonic;
            byte[] seed = MnemonicCode.INSTANCE.toEntropy(list);
            DeterministicSeed deterministicSeed = new DeterministicSeed(list,seed,null,new Date().getTime());
            Wallet wallet = Wallet.fromSeed(NetworkParameters.fromID("org.bitcoin.production"), deterministicSeed);//主网,你也可以选择测试网
            module.setAddress(wallet.currentReceiveAddress().toString());
            wallet.getIssuedReceiveKeys();
            //ps:这里为什么要做一个这样的处理,是因为BitcoinJ 库会从比特币网络中下载区块并同步交易历史,
            // 这个过程可能需要一些时间,特别是在刚开始使用钱包时,或者你可以添加一个监听器addChangeEventListener 也行
            while (wallet.getIssuedReceiveKeys().isEmpty()){
                Thread.sleep(2000);//直接等待五秒
            }
            ECKey ecKey  = wallet.getIssuedReceiveKeys().get(0);
            module.setMnemonic(list);
            module.setPrivateKey(ecKey.getPrivateKeyAsHex());
            module.setPublicKey(ecKey.getPublicKeyAsHex());
        } catch (MnemonicException.MnemonicWordException | MnemonicException.MnemonicChecksumException |
                 MnemonicException.MnemonicLengthException | InterruptedException e) {
            throw new RuntimeException(e);
        }
        return module;
    }



    /**
     * 根据私钥生成助记地址
     * @param privateKey privateKey
     * @return WalletModule
     */
    public WalletModule createWalletByPrivate(String privateKey){
        WalletModule module = new WalletModule();
        byte[] bytes = hexStringToByteArray(privateKey);
        ECKey ecKey = ECKey.fromPrivate(bytes);
        MainNetParams mainNetParams = MainNetParams.get();
        String address = ecKey.toAddress(mainNetParams).toString();
        module.setAddress(address);
        module.setPrivateKey(ecKey.getPrivateKeyAsHex());
        module.setPublicKey(ecKey.getPublicKeyAsHex());
        return module;
    }

五.实现的结果

eth链的助记词能导入tron链吗,区块链,web3钱包,区块链,java,web3

eth链的助记词能导入tron链吗,区块链,web3钱包,区块链,java,web3

这是生成的keyStron:

{
  "address": "ab2d749ae5ceb1de1dfc41a7b875627982b8fcef",
  "id": "473b287f-fe5a-41e4-aa97-4a91b76156dc",
  "version": 3,
  "crypto": {
    "cipher": "aes-128-ctr",
    "ciphertext": "30e30fb4584ab5f85b105e7b5a5d60f45ecedbe347e768d09de8bb75c0018be5",
    "cipherparams": {
      "iv": "ebc6f4d1d84886c39ed3b89be4774580"
    },
    "kdf": "scrypt",
    "kdfparams": {
      "dklen": 32,
      "n": 4096,
      "p": 6,
      "r": 8,
      "salt": "72177e219fabf5555ac21f989fc9e25e10b4a2136d9498443970efdd8e69b176"
    },
    "mac": "e58af76dac43694732ab53905c2d8e9b0b8760d23f4921ccd55d287f67130f1c"
  }
}

PS:本来想写一个test类的,但是我太懒了,所以用main方法代替了,对了源码我放在git上了,你们需要的就去下载,打包就能用,

6重要信息!!

不过你们去下载的要给我点击Star啊! 要不然我做鬼都托梦来骂你!

我的git地址

:GitHub - lxxGOd/BTC-ETH-TRX-

最后:我哥哥镇楼

eth链的助记词能导入tron链吗,区块链,web3钱包,区块链,java,web3文章来源地址https://www.toymoban.com/news/detail-851241.html

到了这里,关于区块链钱包“BTC,TRX,ETH”地址生成、助记词导入、keyStron文件生成等功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 你还在怕忘记网盘密码?商鼎云助记词登录保障你的安全

    大家对网盘都不陌生,我们日常会用它来备份文件、存放电影。但是你知道吗?在某搜索引擎下输入网盘密码,最先出来的竟然是「网盘密码怎么样 破解 」、「网盘密码 忘了 怎么打开」。 同样的问题我们输入云存储密码,却发现相对于网盘用户,使用云存储的用户大部分

    2023年04月08日
    浏览(40)
  • flutter创建/导入区块链钱包,获取余额

    作为区块链行业小白刚接触区块链钱包几天,来开发钱包还是需要付出很多努力的.下面记录一下flutter框架下创建/导入区块链钱包,并获取余额 一、创建钱包: 钱包的创建分为三个步骤: 1、生成助记词 (1)、创建助记词: 需要用到bip39插件 (2)、创建方式: 2、助记词生成私钥 (1)、生

    2024年02月06日
    浏览(33)
  • 区块链系统探索之路:钱包地址的实现

    在区块链,特别是比特币网络,一个非常关键的组件是钱包。它主要用来实现“价值转移”,既然要转移,那就必须要有转移人和接收人,在转移过程中,我们必须确保转移的发送必须由资产的所有者发起,这就是私钥的作用,一笔交易要生效必须由资产的所有人使用它的私钥

    2024年02月07日
    浏览(32)
  • java语言分析区块链钱包生成的原理

    java语言分析区块链钱包生成的原理: 一、区块链钱包实现的技术原理用大概就是: 钱包助记词生成了种子,种子发芽结果,果实就是私钥,私钥推导出了公钥,公钥数据的节选部分成了钱包地址。同时钱包提供了Key Store,他也是私钥加密后的文件为了配合正常的密码使用,

    2024年01月17日
    浏览(33)
  • BTC交易费激增,LTC活跃地址数飙升! BRC-20爆火背后,区块链网络经历了什么?

    BRC-20 代币和 Ordinals 协议的日益普及推动了对比特币区块空间的需求,比特币区块链的费用已飙升至两年来的高点。 BRC-20代币标准在 Ordinals 协议上运行。Ordinals 允许用户通过将对数字艺术的引用写入基于比特币的小型交易中,来将数据嵌入比特币区块链。Ordinals最初实现了在

    2024年02月15日
    浏览(42)
  • 前端Vue项目调用页面web3.js:连接metaMask钱包,(查询钱包ETH余额,查询代币余额,ETH转账,代币转账,代币授权,查询授权数量,计算价格)等功能

    这里分享下相关文档 1.web3.js中文文档 https://learnblockchain.cn/docs/web3.js/getting-started.html 2.metamask官方文档:https://docs.metamask.io/ 第一种方法:连接钱包 源码: 第二种方法: 连接钱包 安装依赖直接可以使用 源码: 其他功能: 1、在 mounted 中自动检测浏览器是否安装MetaMask钱包 2、查询

    2024年02月11日
    浏览(40)
  • DApp创建本地钱包并实现签名转账(BSC,Polygon,ETH)

    安装ether.js 引入ether.js:的三种方法 es3: es5/es6 javascript/typescript es6 这里默认为你已经了解 地址、密码、私钥、助记词、Keystore 之间的关系,所以不再过多介绍,只列出他们之间的关联: 使用到的ethers的Wallet类: createRandom 返回一个带有随机私钥的新钱包,由加密安全的熵源生成。如

    2024年02月09日
    浏览(31)
  • GO语言-生成区块链账户地址

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

    2024年01月23日
    浏览(36)
  • Eth以太坊系币种表现不佳,这轮牛市还值得持有吗?投资比特币还是以太坊好呢?btc未来会涨到多少

    最近eth以及相关的l2表现的不是很好,许多人对arb,对op,甚至对eth都没有信心了,问我能不能换仓,我说说我的体会 区块链欧意平台:by3.top 区块链bi安平台:by4.top 2021年,eth就是舞台上最靓的仔,是场下所有人眼里最集中的焦点,喜欢上了那种受万千瞩目的样子了。所以这

    2024年04月12日
    浏览(33)
  • 区块链当中Bitcoin的Segwit地址生成原理

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

    2024年01月23日
    浏览(31)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包