前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >区块链基础:钱包设计

区块链基础:钱包设计

作者头像
程裕强
发布2022-05-06 19:52:27
1.3K0
发布2022-05-06 19:52:27
举报

1、钱包设计

代码语言:javascript
复制
package com.blockchain.model;

import java.util.Map;
import com.blockchain.security.CryptoUtil;
import com.blockchain.security.RSACoder;

/**
 * 钱包:公钥、私钥、钱包地址
 */
public class Wallet {

    /**
     * 公钥
     */
    private String publicKey;
    /**
     * 私钥
     */
    private String privateKey;
    /**
     * 钱包地址
     */
    private String address=null;

    /**
     * 隐藏无参构造器
     */
    private Wallet() {}

    /**
     * 只包含公钥的钱包,用来给其他节点使用,其他节点在转账时需要用到
     * @param publicKey
     */
    public Wallet(String publicKey) {
        this.publicKey = publicKey;
        this.address= CryptoUtil.md5(hashPubKey(publicKey));
    }
    /**
     * 该构造器仅供静态方法createWallet()使用
     * @param publicKey
     * @param privateKey
     */
    private Wallet(String publicKey, String privateKey) {
        this.publicKey = publicKey;
        this.privateKey = privateKey;
        this.address= CryptoUtil.md5(hashPubKey(publicKey));
    }

    /**
     * 生成一个新钱包,也就是生成新的密钥对
     * @return
     */
    public static Wallet createWallet() {
        Map<String, Object> initKey;
        try {
            // 本地生成公私钥对
            initKey = RSACoder.initKey();
            String publicKey = RSACoder.getPublicKey(initKey);
            String privateKey = RSACoder.getPrivateKey(initKey);
            return new Wallet(publicKey, privateKey);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public void setAddress(String address) {
        this.address = address;
    }
    /**
     * 获取钱包地址:由公钥生成钱包地址
     * @return
     */
    public String getAddress() {
        //单例模式,不需要重复计算地址
        if(null==address){
            String publicKeyHash = hashPubKey(publicKey);
            return CryptoUtil.md5(publicKeyHash);
        }else{
            return address;
        }
    }
    /**
     * 静态方法:根据指定钱包公钥生成钱包地址
     * @param publicKey
     * @return
     */
    public static String getAddress(String publicKey) {
        String publicKeyHash = hashPubKey(publicKey);
        return CryptoUtil.md5(publicKeyHash);
    }

    public String getPublicKey() {
        return publicKey;
    }

    public void setPublicKey(String publicKey) {
        this.publicKey = publicKey;
    }

    public String getPrivateKey() {
        return privateKey;
    }

    public void setPrivateKey(String privateKey) {
        this.privateKey = privateKey;
    }

    /**
     * 获取钱包公钥hash
     * 
     * @return
     */
    public String getHashPubKey() {
        return CryptoUtil.sha256(publicKey);
    }

    /**
     * 生成钱包公钥hash
     * 
     * @param publicKey
     * @return
     */
    public static String hashPubKey(String publicKey) {
        return CryptoUtil.sha256(publicKey);
    }

}

2、测试代码

代码语言:javascript
复制
package com.blockchian.model;

import org.junit.Before;
import org.junit.Test;
import com.blockchain.model.Wallet;

public class WalletTest {
    @Before
    public void setUp() throws Exception {
    }

    @Test
    public void testWallet() throws Exception {
        Wallet wallet=Wallet.createWallet();
        System.out.println("钱包地址:\n"+wallet.getAddress());
        System.out.println("钱包公钥:\n"+wallet.getPublicKey());
        System.out.println("钱包私钥:\n"+wallet.getPrivateKey());
    }
}

测试结果

代码语言:javascript
复制
钱包地址:
a2e2b8849c1d874d14884e914a8a0c20
钱包公钥:
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCA0ojSpUpztE4RzvzcYJYnLjYR5XHVkwxdAWeY
bYsZqaEJDLVDDGcaS0LCfVACbvswfHikm8XBML0umVTCAof6gHToAqrNziOuAzjP3Quu25iD13er
wOgoxT7DTNF99GZaFo2dgOS+IYFwqlyZ6yW9QKbAUm1a3PyGI6ZqxFjedwIDAQAB

钱包私钥:
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAIDSiNKlSnO0ThHO/NxglicuNhHl
cdWTDF0BZ5htixmpoQkMtUMMZxpLQsJ9UAJu+zB8eKSbxcEwvS6ZVMICh/qAdOgCqs3OI64DOM/d
C67bmIPXd6vA6CjFPsNM0X30ZloWjZ2A5L4hgXCqXJnrJb1ApsBSbVrc/IYjpmrEWN53AgMBAAEC
gYBB1dbQ+GJdUXdYiJUXt1Dlgytk6ALOKJF38qDT+J/PJK7E5ja4pl0GxhG/PbWnGLrM47/wOB/P
hK4aY4g6gnqlIgx8L4gGlXtoGtOIuHC8tm+JAff2/puXZl7AGGBJggS2Z7WiUjcKoTxxj86Youc9
Ur7P8dH4b7hU/raMqmS96QJBANTa9Sv/ps/SEubFdy6UYSbWUxVH3Ff7DooiUmEuycMY9LM4XfAs
mxbR+oKOa/FePWVMVh55wwFP1STigZbrNLsCQQCa7x34Vgjf5e3Te14nhL1MWRU1OkRB8rR7f3My
fKIPZQLI+2xHwLLbjE2ydn+3yYfl1sCRgduM4XK/QJBgg391AkEA0YKPjfY+QBJ7blBxJhUAp1SQ
RMMNvD+uKQLtaSC/kVwwB3P06qFNKiIWXIlI8DQdZGbF4YtiCRmGJ58XhPAQXwJANN/yHHRQJwkz
Nv9dTKNSbyHfyQCPluobiiIe0FYUgKh6YNjdRUeQQrkJMySZxcEzbc7yfTYSFWxDWt3P6AA4mQJB
AK+Av4QFUhkGu/cOJPmKgPSn8OPEX9UKNxxnHv0Pusq+SEc971p0caV4zlw3nF07opAJANGy7Fge
iVbGq2iBlBQ=
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-03-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、钱包设计
  • 2、测试代码
相关产品与服务
腾讯云服务器利旧
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档