用Java程序实现一个简单的区块链
要实现一个简单的区块链,可以使用Java编程语言来完成。下面是一个简单的实现例子,它包含了区块链的基本功能:
import java.util.ArrayList;
import java.util.Date;
public class Block {
public String hash;
public String previousHash;
private String data;
private long timeStamp;
public Block(String data, String previousHash) {
this.data=data;
this.previousHash=previousHash;
this.timeStamp=new Date().getTime();
this.hash=calculateHash();
}
public String calculateHash() {
String calculatedHash=StringUtil.applySha256(previousHash + Long.toString(timeStamp) + data);
return calculatedHash;
}
}
public class Blockchain {
private ArrayListBlock blockchain=new ArrayListBlock();
private int difficulty=5;
public void addBlock(Block newBlock) {
newBlock.previousHash=blockchain.get(blockchain.size() - 1).hash;
newBlock.hash=newBlock.calculateHash();
blockchain.add(newBlock);
}
public boolean isChainValid() {
Block currentBlock;
Block previousBlock;
String hashTarget=new String(new char[difficulty]).replace(\'\\0\', \'0\');
for (int i=1; i blockchain.size(); i++) {
currentBlock=blockchain.get(i);
previousBlock=blockchain.get(i - 1);
if (!currentBlock.hash.equals(currentBlock.calculateHash())) {
return false;
}
if (!previousBlock.hash.equals(currentBlock.previousHash)) {
return false;
}
if (!currentBlock.hash.substring(0, difficulty).equals(hashTarget)) {
return false;
}
}
return true;
}
}
public class StringUtil {
public static String applySha256(String input) {
try {
MessageDigest digest=MessageDigest.getInstance(\'SHA-256\');
byte[] hash=digest.digest(input.getBytes(StandardCharsets.UTF_8));
StringBuilder hexString=new StringBuilder();
for (byte b : hash) {
String hex=Integer.toHexString(0xff b);
if (hex.length()==1) {
hexString.append(\'0\');
}
hexString.append(hex);
}
return hexString.toString();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
}
public class Main {
public static void main(String[] args) {
Blockchain blockchain=new Blockchain();
blockchain.addBlock(new Block(\'Block 1\', \'0\'));
blockchain.addBlock(new Block(\'Block 2\', blockchain.blockchain.get(blockchain.blockchain.size() - 1).hash));
blockchain.addBlock(new Block(\'Block 3\', blockchain.blockchain.get(blockchain.blockchain.size() - 1).hash));
System.out.println(\'Is blockchain valid? \' + blockchain.isChainValid());
blockchain.blockchain.get(2).data=\'Block 3 modified\';
blockchain.blockchain.get(2).hash=blockchain.blockchain.get(2).calculateHash();
System.out.println(\'Is blockchain valid? \' + blockchain.isChainValid());
}
}
这里实现了两个类,一个是Block类,代表一个区块,另一个是Blockchain类,代表整个区块链。
Block类有四个属性:hash、previousHash、data和timeStamp。Hash属性存储这个块的SHA256值,previousHash属性存储前一个块的Hash值。
数据属性保存块的数据,时间戳属性保存块的时间戳。这个类还有一个calculateHash()方法来计算这个块的SHA256哈希值。
Blockchain类维护一个ArrayList类型的区块链数组,用于保存整个区块链。这个类还有一个难度属性,用来设置区块链的难度。
Blockchain类还有一个addBlock()方法,用于向区块链添加一个新块。添加新块时,需要设置前一块的哈希值,并计算当前块的哈希值。
Blockchain类也有一个isChainValid()方法来检查整个区块链的有效性。这个方法将遍历整个区块链,检查每个块的哈希值是否正确。
并检查每个块的前一块的散列值是否与前一块的散列值相同。此外,该方法还会检查每个块的哈希值是否满足区块链的难度要求。
StringUtil类提供了一个静态方法applySha256(),用于计算字符串的Sha256哈希值。
Main类提供了一个如何使用Blockchain类创建区块链的简单示例。在该示例中,首先创建三个块,然后检查整个区块链的有效性。然后修改第三个块的数据,重新计算它的哈希值。
再次检查整个区块链的有效性。