用Java数据结构代码实现一个简单的10个区块的区块链
时间: 2023-08-03 08:05:48 浏览: 39
好的,以下是使用Java实现一个简单的10个区块的区块链的代码:
```
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Date;
public class Block {
private int index;
private Date timestamp;
private String data;
private String previousHash;
private String hash;
public Block(int index, Date timestamp, String data, String previousHash) {
this.index = index;
this.timestamp = timestamp;
this.data = data;
this.previousHash = previousHash;
this.hash = calculateHash();
}
public String calculateHash() {
String dataToHash = Integer.toString(index) + previousHash + Long.toString(timestamp.getTime()) + data;
MessageDigest digest;
String encoded = null;
try {
digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(dataToHash.getBytes("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);
}
encoded = hexString.toString();
} catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
e.printStackTrace();
}
return encoded;
}
public int getIndex() {
return index;
}
public Date getTimestamp() {
return timestamp;
}
public String getData() {
return data;
}
public String getPreviousHash() {
return previousHash;
}
public String getHash() {
return hash;
}
}
public class BlockChain {
private ArrayList<Block> blocks;
public BlockChain() {
this.blocks = new ArrayList<Block>();
this.blocks.add(createGenesisBlock());
}
private Block createGenesisBlock() {
return new Block(0, new Date(), "Genesis Block", "0");
}
public void addBlock(Block block) {
block.previousHash = blocks.get(blocks.size() - 1).getHash();
block.hash = block.calculateHash();
blocks.add(block);
}
public Block getLatestBlock() {
return blocks.get(blocks.size() - 1);
}
public boolean isChainValid() {
for (int i = 1; i < blocks.size(); i++) {
Block currentBlock = blocks.get(i);
Block previousBlock = blocks.get(i - 1);
if (!currentBlock.getHash().equals(currentBlock.calculateHash())) {
return false;
}
if (!previousBlock.getHash().equals(currentBlock.getPreviousHash())) {
return false;
}
}
return true;
}
}
public class Main {
public static void main(String[] args) {
BlockChain blockchain = new BlockChain();
blockchain.addBlock(new Block(1, new Date(), "Transaction Data 1", ""));
blockchain.addBlock(new Block(2, new Date(), "Transaction Data 2", ""));
blockchain.addBlock(new Block(3, new Date(), "Transaction Data 3", ""));
blockchain.addBlock(new Block(4, new Date(), "Transaction Data 4", ""));
blockchain.addBlock(new Block(5, new Date(), "Transaction Data 5", ""));
blockchain.addBlock(new Block(6, new Date(), "Transaction Data 6", ""));
blockchain.addBlock(new Block(7, new Date(), "Transaction Data 7", ""));
blockchain.addBlock(new Block(8, new Date(), "Transaction Data 8", ""));
blockchain.addBlock(new Block(9, new Date(), "Transaction Data 9", ""));
blockchain.addBlock(new Block(10, new Date(), "Transaction Data 10", ""));
System.out.println("Is the blockchain valid? " + blockchain.isChainValid());
}
}
```
在这个代码中,我们首先定义了一个Block类来表示一个区块。该类包括区块的索引、时间戳、数据、前一个区块的哈希值和自身的哈希值,以及计算哈希值的方法。
然后,我们定义了一个BlockChain类来表示整个区块链。该类包括一个ArrayList来存储所有的区块,以及添加区块、获取最新区块和验证区块链等方法。
在主函数中,我们创建一个新的区块链,并添加了10个区块。最后,我们打印出区块链的有效性。
需要注意的是,这只是一个最简单的区块链实现。在实际应用中,还需要考虑更多的问题,例如如何防止双重支付、如何保证区块链的安全性等。