用Java程序实现一个简单的区块链

用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类创建区块链的简单示例。在该示例中,首先创建三个块,然后检查整个区块链的有效性。然后修改第三个块的数据,重新计算它的哈希值。

再次检查整个区块链的有效性。

版权声明:区块链数字货币交易平台 发表于 2023-03-30 8:47:09。
转载请注明:用Java程序实现一个简单的区块链 | 零零洞洞

暂无评论

暂无评论...