Spring Boot+Blockchain:区块链入门Demo
2024-07-10 15:56 阅读(283)

1. 引言

区块链技术近年来迅速发展,其去中心化、不可篡改和透明性等特点吸引了众多开发者和企业的关注。为了便于理解和应用区块链技术,本文将介绍如何使用Spring Boot集成区块链,构建一个简单的区块链Demo。


2. 项目准备

2.1 环境要求

在开始之前,我们需要确保系统中安装了以下工具:


JDK 11或以上版本


Maven 3.6或以上版本


IDE(如IntelliJ IDEA或Eclipse)


2.2 创建Spring Boot项目

我们将使用Spring Initializr创建一个新的Spring Boot项目。具体步骤如下:


打开 Spring Initializr


选择以下选项:


Project: Maven Project


Language: Java


Spring Boot: 2.5.0


Project Metadata:


Group: com.example


Artifact: blockchain-demo


Name: blockchain-demo


Description: Demo project for Spring Boot with Blockchain


Package name: com.example.blockchain


Packaging: Jar


Java: 11


添加以下依赖:


Spring Web


点击“Generate”按钮,下载生成的项目文件,并将其导入到IDE中。


3. 区块链基础知识

在实现区块链之前,我们需要了解一些基本概念:


3.1 区块(Block)

区块是区块链的基本组成单位,每个区块包含以下信息:


区块头(Block Header):包括区块的元数据,如版本号、时间戳、前一个区块的哈希等。


区块体(Block Body):包含实际交易数据。


3.2 链(Chain)

链是由多个区块按照时间顺序链接而成的,确保每个区块都是唯一且不可篡改的。


3.3 哈希(Hash)

哈希函数是一种将任意长度的输入转换为固定长度输出的函数。区块链使用哈希函数确保数据的完整性和安全性。


4. 实现区块链Demo

4.1 创建Block类

首先,我们需要创建一个Block类来表示区块。区块类包含以下属性:


5. 总结

本文介绍了如何使用SpringBoot集成区块链技术,构建一个简单的区块链Demo。我们从项目创建、区块链基础知识、实现区块链代码,到最后通过HTTP接口进行交互,逐步完成了一个完整的区块链应用。希望本文能为读者提供一个清晰的入门指南,帮助大家更好地理解和应用区块链技术。


索引(index)


时间戳(timestamp)


交易数据(data)


前一个区块的哈希(previousHash)


当前区块的哈希(hash)

 
package com.example.blockchain;
 
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Date;
 
public class Block {
 
    private int index;
    private long timestamp;
    private String data;
    private String previousHash;
    private String hash;
 
    public Block(int index, String data, String previousHash) {
        this.index = index;
        this.timestamp = new Date().getTime();
        this.data = data;
        this.previousHash = previousHash;
        this.hash = calculateHash();
    }
 
    public String calculateHash() {
        String input = index + timestamp + data + previousHash;
        return applySha256(input);
    }
 
    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) {
                hexString.append(String.format("%02x", b));
            }
            return hexString.toString();
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
    }
 
    // Getters and setters
 
    @Override
    public String toString() {
        return "Block{" +
                "index=" + index +
                ", timestamp=" + timestamp +
                ", data='" + data + '\'' +
                ", previousHash='" + previousHash + '\'' +
                ", hash='" + hash + '\'' +
                '}';
    }
}

4.2 创建Blockchain类

接下来,我们需要创建一个Blockchain类来管理区块链。该类包含一个ArrayList来存储区块,并提供添加新块和验证区块链的方法。

 
package com.example.blockchain;
 
import java.util.ArrayList;
import java.util.List;
 
public class Blockchain {
 
    private List<Block> chain;
 
    public Blockchain() {
        chain = new ArrayList<>();
        // Add the genesis block
        chain.add(createGenesisBlock());
    }
 
    private Block createGenesisBlock() {
        return new Block(0, "Genesis Block", "0");
    }
 
    public Block getLatestBlock() {
        return chain.get(chain.size() - 1);
    }
 
    public void addBlock(Block newBlock) {
        newBlock.setPreviousHash(getLatestBlock().getHash());
        newBlock.setHash(newBlock.calculateHash());
        chain.add(newBlock);
    }
 
    public boolean isChainValid() {
        for (int i = 1; i < chain.size(); i++) {
            Block currentBlock = chain.get(i);
            Block previousBlock = chain.get(i - 1);
 
            if (!currentBlock.getHash().equals(currentBlock.calculateHash())) {
                return false;
            }
            if (!currentBlock.getPreviousHash().equals(previousBlock.getHash())) {
                return false;
            }
        }
        return true;
    }
 
    // Getters and setters
 
    @Override
    public String toString() {
        StringBuilder blockchainString = new StringBuilder();
        for (Block block : chain) {
            blockchainString.append(block.toString()).append("\n");
        }
        return blockchainString.toString();
    }
}

4.3 创建Controller类

为了使我们的区块链Demo可通过HTTP接口进行交互,我们需要创建一个Controller类。该类提供了添加新块和查看区块链的方法。

 
package com.example.blockchain;
 
import org.springframework.web.bind.annotation.*;
 
@RestController
@RequestMapping("/blockchain")
public class BlockchainController {
 
    private Blockchain blockchain;
 
    public BlockchainController() {
        blockchain = new Blockchain();
    }
 
    @PostMapping("/addBlock")
    public String addBlock(@RequestBody String data) {
        Block newBlock = new Block(blockchain.getLatestBlock().getIndex() + 1, data, blockchain.getLatestBlock().getHash());
        blockchain.addBlock(newBlock);
        return "Block added: " + newBlock.toString();
    }
 
    @GetMapping("/getBlockchain")
    public String getBlockchain() {
        return blockchain.toString();
    }
 
    @GetMapping("/isValid")
    public String isValid() {
        return "Blockchain is valid: " + blockchain.isChainValid();
    }
}

4.4 启动应用程序

到此为止,我们已经完成了区块链Demo的所有代码。接下来,我们需要运行Spring Boot应用程序。


在项目根目录下,运行以下命令:


mvn spring-boot:run


应用程序启动后,可以使用以下HTTP请求与区块链交互:


添加新块:POST http://localhost:8080/blockchain/addBlock


查看区块链:GET http://localhost:8080/blockchain/getBlockchain


验证区块链:GET http://localhost:8080/blockchain/isValid


                       

https://blog.csdn.net/weixin_53391173/article/details/140177959