区块链从入门到精通(Java 实战版)

区块链从入门到精通(Java 实战版)

面向完全小白的一份“讲人话”教程,重点放在:到底是什么、有啥用、怎么用 Java 写点真正能跑的代码。

1. 区块链到底是个啥?(用大白话讲清楚)

  • 先不讲技术,先讲故事
    • 想象有一个村子,大家天天记账:谁欠谁钱,谁给谁打工,谁给谁送了鸡蛋。
    • 以前只有村长一本账本,大家必须相信村长不作弊
    • 有一天,村长和别人串通,把账改了,你根本没法证明。
    • 区块链 = 把账本复制一份给全村所有人,每一笔账都要全村人一起确认,任何人想偷偷改账,几乎不可能。
  • 用更正式一点的话:
    • 区块链(Blockchain) 是一种:
      • 分布式(大家一起维护)
      • 只能追加、很难篡改的账本系统
      • 用密码学(哈希、签名)保证数据安全和不可抵赖
      • 用共识算法保证“大家对账本内容达成一致”
  • 你可以先这么理解:
区块链 = 分布式数据库 + 只能追加 + 全网一起记账 + 自带防篡改和可追溯。

2. 几个核心概念先搞明白

2.1 区块(Block)和链(Chain)

  • 区块 = 一批交易 + 一些元数据(时间戳、前一个区块的哈希、随机数等)。
  • 链 = 区块按时间顺序一个接一个串起来
  • 串起来的关键:每个区块里都存上一个区块的哈希值。

这样一来:

  • 哪怕你只改了 10 区块里的一点点内容,它的哈希就会变;
  • 11 区块里保存的“前一个区块哈希”就对不上了;
  • 整条链后面的全都不对。
这就是“一改就全乱,修改成本极高”的来源。

2.2 哈希(Hash)

  • 哈希函数可以简单理解成:把一堆内容,压缩成一段固定长度的“指纹”
  • 特点:
    • 输入一样 → 输出一定一样;
    • 输入稍微变一点 → 输出会变得完全不一样;
    • 从输出推回输入几乎不可能(单向)。

区块链里,每个区块会算自己的哈希,也会保存上一个区块的哈希。

2.3 共识(Consensus)

有一群人一起记账,总要有个规则:

  • 哪一版账本才算“官方版本”?
  • 谁有权利记下一页账?

这套规则就叫 共识机制。常见的:

  • PoW(工作量证明,挖矿)
  • PoS(权益证明)
  • PoA(权威证明)

在本教程里,我们先写一个简化版,没有复杂共识,只是理解结构和基本逻辑

2.4 去中心化

  • 传统: 只有银行一个中心数据库,它说了算。
  • 区块链: 每个人都有完整账本副本,数据不是放在单一中心,叫去中心化(更严谨地说:分布式、多中心)。

3. 区块链能干嘛?几个真实 / 典型场景

下面用 4 个场景来感受区块链的价值,并且后面会做一些 Java 端的模拟代码:

  • 场景 1:转账 / 支付(最经典,比特币、USDT 这类)
    • 用处:全球转账,不依赖单一银行。
    • 核心:谁给谁转了多少钱,这些交易不可篡改、可公开验证。
  • 场景 2:供应链溯源(比如:一块牛肉从养殖场到你的餐桌)
    • 用处:每个环节上链,谁做了什么记录下来,不能删不能改。
    • 核心:数据全流程可追踪,企业和监管都看得到,难造假。
  • 场景 3:数字证书 / 电子合同(上链存证)
    • 用处:把重要文件的“指纹”上链,证明“某个时间,这个文件确实存在,而且此后未被篡改”。
    • 核心:链上的记录不可篡改,可公证。
  • 场景 4:游戏资产 / NFT
    • 用处:游戏里的装备、皮肤、卡牌,都可以变成“链上资产”,可证明所有权、可交易。
    • 核心:所有权归用户,不完全归游戏公司数据库说了算。

本教程的 Java 代码主要围绕:

  • 自己实现一个迷你区块链原型(重点理解结构和哈希链条);
  • 演示一个简单转账逻辑
  • 演示一个供应链溯源的例子
  • 演示一个文件上链存证(取哈希存链上)

4. 用 Java 写一个“迷你区块链”

本节我们先不管网络、挖矿、节点,只在一台电脑上用 Java 把区块链的基本结构实现出来。

4.1 准备环境

  • JDK 8+(推荐用 8、11 或以上版本均可)。
  • 一个 IDE:IntelliJ IDEA / Eclipse / VS Code 任意。
  • 新建一个普通的 Java 项目即可(不强制使用 Maven/Gradle,本示例用最简单的方式)。

4.2 实现一个简单的 Block

核心字段可以这么设计:

  • index:区块高度(第几个区块,从 0 或 1 开始)。
  • timestamp:时间戳。
  • data:区块里保存的数据(可以先用字符串,后面再扩展为交易列表)。
  • previousHash:上一个区块的哈希。
  • hash:当前区块的哈希。
4.2.1 Java 代码示例:Block.java

import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.time.Instant; ​ /** * 一个极简的区块类,用来演示区块链结构。 */ public class Block { ​    private int index;              // 区块高度    private long timestamp;         // 时间戳    private String data;            // 区块保存的数据(这里用简单字符串,方便演示)    private String previousHash;    // 上一个区块的哈希    private String hash;            // 当前区块的哈希 ​    public Block(int index, long timestamp, String data, String previousHash) {        this.index = index;        this.timestamp = timestamp;        this.data = data;        this.previousHash = previousHash;        this.hash = calculateHash();   // 创建区块时就计算好自己的哈希   } ​    /**     * 使用 SHA-256 计算区块的哈希值     */    public String calculateHash() {        try {            String text = index + "|" + timestamp + "|" + data + "|" + previousHash;            MessageDigest digest = MessageDigest.getInstance("SHA-256");            byte[] hashBytes = digest.digest(text.getBytes(StandardCharsets.UTF_8));            return bytesToHex(hashBytes);       } catch (NoSuchAlgorithmException e) {            throw new RuntimeException("无法找到 SHA-256 算法", e);       }   } ​    private String bytesToHex(byte[] bytes) {        StringBuilder sb = new StringBuilder();        for (byte b : bytes) {            String hex = Integer.toHexString(0xff & b);            if (hex.length() == 1) {                sb.append('0');           }            sb.append(hex);       }        return sb.toString();   } ​    // 一些 getter,方便后面使用    public int getIndex() {        return index;   } ​    public long getTimestamp() {        return timestamp;   } ​    public String getData() {        return data;   } ​    public String getPreviousHash() {        return previousHash;   } ​    public String getHash() {        return hash;   } ​    @Override    public String toString() {        return "Block{" +                "index=" + index +                ", timestamp=" + Instant.ofEpochMilli(timestamp) +                ", + data + '\'' +                ", + previousHash + '\'' +                ", + hash + '\'' +                '}';   } }

4.3 实现一个简单的 Blockchain

我们需要:

  • 一个 List<Block> 保存整条链;
  • 创建创世区块(第一个区块);
  • 添加新区块的方法;
  • 校验整条链是否有效的方法。
4.3.1 Java 代码示例:Blockchain.java

import java.time.Instant; import java.util.ArrayList; import java.util.List; ​ /** * 极简区块链实现(单机版) */ public class Blockchain { ​    private final List<Block> chain = new ArrayList<>(); ​    public Blockchain() {        // 创建创世区块(手工指定 previousHash 为 "0")        Block genesisBlock = new Block(                0,                Instant.now().toEpochMilli(),                "创世区块",                "0"       );        chain.add(genesisBlock);   } ​    /**     * 获取最新的区块     */    public Block getLatestBlock() {        return chain.get(chain.size() - 1);   } ​    /**     * 添加一个新区块     */    public void addBlock(String data) {        Block latest = getLatestBlock();        Block newBlock = new Block(                latest.getIndex() + 1,    

Read more

数据结构:⼆叉树(1)

数据结构:⼆叉树(1)

目录 前言  树部分知识: 一.树的概念和结构 二.树的一些相关术语和定义  三.树的实现结构(了解部分) 四、树的应用场景 二叉树部分知识讲解: 一.二叉树概念与结构 二.特殊二叉树类型 1.满二叉树 2.完全二叉树 3.性质补充 三、⼆叉树存储结构 顺序结构: 编辑应用: 链式结构: 四、堆的概念与结构 1.实现顺序结构⼆叉树: 2.堆的概念与结构 (重点) 3.堆的实现 五、堆的实现代码部分 1.堆的初始化:(本次实现选取大堆为例) 2.堆的销毁: 3.堆的插入数据 : 4.堆打印值 : 六、

By Ne0inhk
21届智能车雁过留痕备战指南|龙邱科技STC+神眼摄像头处理 高效搜线算法思路分享

21届智能车雁过留痕备战指南|龙邱科技STC+神眼摄像头处理 高效搜线算法思路分享

今年STC单片机首次增设摄像头组别,相信不少备战的同学想要知道这颗新U是否能够快速上手并能够像传统摄像头组别一样,高效完成图像处理,提高车模控制系统上限。 其中最突出的痛点的是:有同学搭建完核心算法组合后,可能感觉到略微卡顿或系统延迟,影响车模调试上限,我们第一次搭建完经过测试单帧处理耗时高达20多ms,这导致车辆运行稳定性和反应速度受限、甚至可能有冲出赛道的情况发生,导致调试陷入瓶颈,提速困难,短时间内难以找到有效突破方向。 针对这一高频痛点,我们结合备战同学的实际调试场景,经过反复测试、迭代优化,整理出一套实用性极强的帧率优化思路,实测验证有效,优化后单帧处理耗时可稳定降至9-11ms,彻底解决卡顿难题,这里将图像处理和以西优化思路分享给大家,希望能够帮助到更多的同学! 实测数据对比,直观呈现优化效果 图像处理方案单帧采集+处理耗时未优化(采集+处理)20ms-25ms(能感觉到慢,上限较低)优化后(采集+处理)9ms-11ms(流畅稳定,提高了上限) 同学们遇到的卡顿问题,核心症结主要集中在两点:一是内存资源不足,二是算法计算耗时过长。在拆解具体优化方法前,我

By Ne0inhk
详解常见排序

详解常见排序

目录 编辑 插入排序 希尔排序(缩小增量排序) 选择排序 冒泡排序 堆排序 快速排序 hoare版  挖坑法 前后指针法 非递归版 归并排序 递归版 非递归版 计数排序 声明:以下排序代码由Java实现!!! 插入排序 步骤: 1.我们可以认为数组的第一个元素已经被排好序,因此只需考虑对后面的元素进行插入排序; 2.取下一个位置的元素val,让它和它之前的元素进行比较,顺序为从右向左; 3.如果该元素大于val,则将该元素移动到该元素所处位置的下一个位置; 4.重复步骤3,知道找到已排好序的序列中小于等于val的元素; 5.将值val放到该位置的下一个位置,如果已排好序的所有元素的值都大于val,则将val存放到数组下标为0的位置; 6.重复2~5步骤。 动画演示: 代码如下: public static void insertSort(int[] array){ for(

By Ne0inhk
【保姆级】TrendRadar本地部署:告别算法推荐,打造个人专属AI热点情报局

【保姆级】TrendRadar本地部署:告别算法推荐,打造个人专属AI热点情报局

【保姆级】TrendRadar本地部署:告别算法推荐,打造个人专属AI热点情报局 摘要 本文基于 TrendRadar 项目,详细拆解如何通过 Docker 本地部署一套个人专属的 AI 热点情报系统。涵盖从环境准备、Docker 镜像拉取、局域网访问配置、飞书推送修复到 Cherry Studio MCP 服务对接的全流程。通过 Nvidia 免费模型 API,实现零成本的深度热点分析与趋势追踪。 关键词: TrendRadar, Docker部署, AI热点分析, MCP服务, Cherry Studio 1. 背景与需求:为什么我们需要 TrendRadar? 在这个大数据算法横行的时代,我们每天被头条、抖音等平台“投喂”大量信息,不仅容易陷入信息茧房,还浪费了大量时间筛选有效资讯。 我的核心需求很简单: 1. 拒绝算法绑架:需要一个个人定制化的新闻推送服务。 2.

By Ne0inhk