qidao123.com技术社区-IT企服评测·应用市场

 找回密码
 立即注册

Spring Boot+Blockchain:区块链入门Demo

[复制链接]
发表于 2025-3-26 03:28:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
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)
    1. package com.example.blockchain;
    2. import java.nio.charset.StandardCharsets;
    3. import java.security.MessageDigest;
    4. import java.security.NoSuchAlgorithmException;
    5. import java.util.Date;
    6. public class Block {
    7.     private int index;
    8.     private long timestamp;
    9.     private String data;
    10.     private String previousHash;
    11.     private String hash;
    12.     public Block(int index, String data, String previousHash) {
    13.         this.index = index;
    14.         this.timestamp = new Date().getTime();
    15.         this.data = data;
    16.         this.previousHash = previousHash;
    17.         this.hash = calculateHash();
    18.     }
    19.     public String calculateHash() {
    20.         String input = index + timestamp + data + previousHash;
    21.         return applySha256(input);
    22.     }
    23.     public static String applySha256(String input) {
    24.         try {
    25.             MessageDigest digest = MessageDigest.getInstance("SHA-256");
    26.             byte[] hash = digest.digest(input.getBytes(StandardCharsets.UTF_8));
    27.             StringBuilder hexString = new StringBuilder();
    28.             for (byte b : hash) {
    29.                 hexString.append(String.format("%02x", b));
    30.             }
    31.             return hexString.toString();
    32.         } catch (NoSuchAlgorithmException e) {
    33.             throw new RuntimeException(e);
    34.         }
    35.     }
    36.     // Getters and setters
    37.     @Override
    38.     public String toString() {
    39.         return "Block{" +
    40.                 "index=" + index +
    41.                 ", timestamp=" + timestamp +
    42.                 ", data='" + data + '\'' +
    43.                 ", previousHash='" + previousHash + '\'' +
    44.                 ", hash='" + hash + '\'' +
    45.                 '}';
    46.     }
    47. }
    复制代码
    4.2 创建Blockchain类

    接下来,我们需要创建一个Blockchain类来管理区块链。该类包含一个ArrayList来存储区块,并提供添加新块和验证区块链的方法。
    1. package com.example.blockchain;
    2. import java.util.ArrayList;
    3. import java.util.List;
    4. public class Blockchain {
    5.     private List<Block> chain;
    6.     public Blockchain() {
    7.         chain = new ArrayList<>();
    8.         // Add the genesis block
    9.         chain.add(createGenesisBlock());
    10.     }
    11.     private Block createGenesisBlock() {
    12.         return new Block(0, "Genesis Block", "0");
    13.     }
    14.     public Block getLatestBlock() {
    15.         return chain.get(chain.size() - 1);
    16.     }
    17.     public void addBlock(Block newBlock) {
    18.         newBlock.setPreviousHash(getLatestBlock().getHash());
    19.         newBlock.setHash(newBlock.calculateHash());
    20.         chain.add(newBlock);
    21.     }
    22.     public boolean isChainValid() {
    23.         for (int i = 1; i < chain.size(); i++) {
    24.             Block currentBlock = chain.get(i);
    25.             Block previousBlock = chain.get(i - 1);
    26.             if (!currentBlock.getHash().equals(currentBlock.calculateHash())) {
    27.                 return false;
    28.             }
    29.             if (!currentBlock.getPreviousHash().equals(previousBlock.getHash())) {
    30.                 return false;
    31.             }
    32.         }
    33.         return true;
    34.     }
    35.     // Getters and setters
    36.     @Override
    37.     public String toString() {
    38.         StringBuilder blockchainString = new StringBuilder();
    39.         for (Block block : chain) {
    40.             blockchainString.append(block.toString()).append("\n");
    41.         }
    42.         return blockchainString.toString();
    43.     }
    44. }
    复制代码
    4.3 创建Controller类

    为了使我们的区块链Demo可通过HTTP接口进行交互,我们需要创建一个Controller类。该类提供了添加新块和检察区块链的方法。
    1. package com.example.blockchain;
    2. import org.springframework.web.bind.annotation.*;
    3. @RestController
    4. @RequestMapping("/blockchain")
    5. public class BlockchainController {
    6.     private Blockchain blockchain;
    7.     public BlockchainController() {
    8.         blockchain = new Blockchain();
    9.     }
    10.     @PostMapping("/addBlock")
    11.     public String addBlock(@RequestBody String data) {
    12.         Block newBlock = new Block(blockchain.getLatestBlock().getIndex() + 1, data, blockchain.getLatestBlock().getHash());
    13.         blockchain.addBlock(newBlock);
    14.         return "Block added: " + newBlock.toString();
    15.     }
    16.     @GetMapping("/getBlockchain")
    17.     public String getBlockchain() {
    18.         return blockchain.toString();
    19.     }
    20.     @GetMapping("/isValid")
    21.     public String isValid() {
    22.         return "Blockchain is valid: " + blockchain.isChainValid();
    23.     }
    24. }
    复制代码
    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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|qidao123.com技术社区-IT企服评测▪应用市场 ( 浙ICP备20004199|浙ICP备20004199号 )|网站地图

GMT+8, 2025-8-11 12:14 , Processed in 0.076083 second(s), 31 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表