区块链基础:钱包设计

1、钱包设计

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、测试代码

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());
    }
}

测试结果

钱包地址:
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=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值