ブロックチェーンは、各ブロックをリンク リストに保存するように単純に抽象化できます。新しいブロックが追加されるたびに、そのブロックはリンク リストの最後に配置され、ブロック間の情報の転送を通じて一意のハッシュが形成されます。ブロック チェーンのデータは改ざんされていません。
ブロックの実現
ブロックの基本的なプロパティは次のとおりです。
現在のブロックのハッシュ値
前のブロックのハッシュ値
現在のブロックのデータ値
現在のブロックのタイムスタンプ
このうち、前ブロックのハッシュ(最初のブロックの場合は0)、現在のブロックのデータ値、現在のタイムスタンプを暗号化することで、現在のブロックに属する固有のハッシュ値を生成することができる。
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 = System.currentTimeMillis();
this.hash = calculateHash();
}
//通过sha256散列算法生成hash值
public String calculateHash() {
String calculatedhash =
StringUtil.applySha256(previousHash
+Long.toString(timeStamp)
+data);
return calculatedhash;
}
}
sha256 ハッシュ アルゴリズム
SHA256 を選択した理由は、そのサイズがちょうど良いためであり、重複するハッシュ値が生成される可能性が非常に低い一方で、大きい場合は 256 ビットのサイズが適切です。
public class StringUtil {
public static String applySha256(String input){
try {
//指定使用的加密算法为SHA-256
MessageDigest digest = MessageDigest.getInstance("SHA-256");
//计算当前输入数据的散列值
byte[] hash = digest.digest(input.getBytes(StandardCharsets.UTF_8));
StringBuffer hexString = new StringBuffer();
for (int i = 0 ; i < hash.length; i++) {
//将散列值转换成十六进制的字符串形式
String hex = Integer.toHexString(0xff&hash[i]);
if (hex.length()==1) hexString.append('0');
hexString.append(hex);
}
return hexString.toString();
}catch (Exception e){
throw new RuntimeException(e);
}
}
}
テスト
リンクされたリストを作成してブロックを保存し、ブロックチェーンを形成します。
public class NoobChain {
public static ArrayList<Block> blockchain = new ArrayList<Block>();
public static void main(String[] args) {
//将每一个块添加到区块链中
//传入块的信息:当前块的数据信息、上一块的hash值
blockchain.add(new Block("The first block", "0"));
blockchain.add(new Block("The second block", blockchain.get(blockchain.size() - 1).hash));
blockchain.add(new Block("The third block", blockchain.get(blockchain.size() - 1).hash));
//将区块链用整齐的格式打印出来
String blockchainJson = new GsonBuilder().setPrettyPrinting().create().toJson(blockchain);
System.out.println(blockchainJson);
}
}
ブロックチェーンの整合性をチェックする
ブロックチェーンの整合性のチェックは、現在のブロックと前のブロックのハッシュが正しいかどうかを検証することによって行われます。ブロックチェーンの各ノードは生成後に変更できないため、あるブロックのハッシュ値が変化すると、そのブロックのデータなどが改ざんされたことになり、ブロックチェーンは完成しません。
//判断区块链是否有效
public static Boolean isChainValid() {
Block currentBlock;
Block previousBlock;
//通过检查哈希值来判断是否是一个有效的区块链
for (int i = 1; i < blockchain.size(); i++) {
currentBlock = blockchain.get(i);
previousBlock = blockchain.get(i - 1);
//比较块中的注册hash和再次计算的hash值是否相同
if (!currentBlock.hash.equals(currentBlock.calculateHash())) {
System.out.println("Current Hashes not equal");
return false;
}
//比较前一个块的hash值和当前块的previousHash值是否相同
if (!previousBlock.hash.equals(currentBlock.previousHash)) {
System.out.println("Previous Hashes not equal");
return false;
}
}
return true;
}
ブロックチェーン内のブロックが変更されると、ハッシュも変更され、この関数は false を返し、ブロックチェーンが無効であることを示します。
この記事は次の内容を参照しています: Java 開発ブロックチェーンに必要なコードは 150 行だけです
JavaのソースコードはGitHubに保存されています