本教程旨在帮助您了解如何进行区块链编程.你可以在这里查看part 1
在第二部分,我们会完成下面的目标:
- 创建一个简单的钱包
- 使用我们创建的区块链发送已签署的交易信息
- 感觉更酷.
最终我们会自己生产出一种加密货币!
需要说明的是,这部分不会很枯燥,但是内容相比于第一部分是比较长的.
继续上一篇教程,我们做出了一个基本的可验证的区块链系统,但是目前我们的区块链只存储一些无用的信息(String 对象).今天,我们将要重构代码,使其存储真正的交易数据(而且每个块会存储多笔交易数据),且允许创造自己的一种加密货币.我将其称之为”NoobCoin”(直译:菜鸟币).
- 阅读这篇文章之前,你应该先阅读它的第一部分
- 添加bounceycastle和gson依赖.
Preparing a Wallet
在加密货币中,资金的所有权作为交易在区块链上进行转移,每个参与者都有一个地址(此处为参与者的公钥)进行资金的支出和收入.在钱包最基本的功能中,只能进行参与者地址的存储.更多的,钱包应该还能重新发起一笔交易.
现在,让我们新建一个钱包 类 去持有 公钥和私钥
package noobchain;
import java.security.*;
public class Wallet {
public PrivateKey privateKey;
public PublicKey publicKey;
}
什么公钥和私钥?
在我们的’noobcoin’系统中, 公钥就是我们交易用的地址.我们告诉别人我们的公钥来进行交易的收付款.使用私钥进行交易的签名.这样除了我们自己以外, 没有人可以使用我们的’noobcoin’.谨记,我们不能将私钥告诉别人,同时,我们也需要将公钥和交易一起发送出去,以便让别人进行校验,证明交易数据没有被篡改.
首先,我们需要生成一对密钥.我们使用Elliptic-curve cryptography算法去生成它们.
让我们在Wallet
类中新增加一个generateKeyPair()
方法,并在构造函数中调用它.
package noobchain;
import java.security.*;
public class Wallet {
public PrivateKey privateKey;
public PublicKey publicKey;
public Wallet(){
generateKeyPair();
}
public void generateKeyPair() {
try {
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("ECDSA","BC");
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
ECGenParameterSpec ecSpec = new ECGenParameterSpec("prime192v1");
// Initialize the key generator and generate a KeyPair
keyGen.initialize(ecSpec, random); //256 bytes provides an acceptable security level
KeyPair keyPair = keyGen.generateKeyPair();
// Set the public and private keys from the keyPair
privateKey = keyPair.getPrivate();
publicKey = keyPair.getPublic();
}catch(Exception e) {
throw new RuntimeException(e);
}
}
}