零基础也能动手做:用区块链搭一个简易项目

表结构守护者
2026-01-14 09:50
阅读 561

大家好,我是阿哲,一名在大厂干了三年后端开发的程序员,平时也在B站分享技术干货。最近很多粉丝私信问我:“区块链到底是什么?能自己动手试试吗?”说实话,我当初学的时候也一脸懵——白皮书看不懂、术语满天飞、连“去中心化”都绕半天。但后来我发现,只要动手做一个小项目,理解就快得多

所以今天这篇教程,不讲空泛理论,只带你从零开始搭一个最简单的区块链项目。哪怕你连“哈希”是啥都不知道,也没关系!跟着做一遍,你就入门了。


为什么我们要用代码理解区块链?

很多人以为区块链就是比特币、炒币、NFT……其实它本质上是一种数据结构 + 网络协议。你可以把它想象成一个“不可篡改的数字账本”。而这个账本的核心思想很简单:每一条记录(区块)都包含上一条的指纹,一旦有人想改旧数据,整个链条就会断裂

听起来抽象?别急,我们直接写代码!


第一步:搭建开发环境(5分钟搞定)

我们需要的工具非常轻量:

  • 安装 Node.js(推荐 LTS 版本,比如 18.x)
  • 任意代码编辑器(VS Code 最友好)
  • 终端(Mac 用 Terminal,Windows 用 PowerShell 或 Git Bash)

验证是否安装成功:

node -v  # 应该输出 v18.x.x
npm -v   # 应该输出 8.x.x 或更高

💡 避坑提示:不要一上来就装复杂的区块链框架(比如 Hyperledger、Ethereum 节点),那对新手太重了。我们先用纯 JavaScript 模拟核心逻辑。


第二步:理解三个核心概念(用生活例子解释)

1. 区块(Block)

就像一页账本。每页记录几笔交易,并且标上页码和上一页的编号。

2. 哈希(Hash)

相当于“数字指纹”。比如你输入“hello”,SHA256 算法会输出一串固定长度的乱码(如 2cf24...)。只要输入变一点,指纹就完全不同,而且无法反推原文。

3. 链式结构(Chain)

每个新区块都存着前一个区块的哈希值。这样,如果有人偷偷改第 3 页的内容,第 4 页记录的“上一页指纹”就不匹配了——系统立刻知道被篡改!


第三步:动手写一个迷你区块链(实战项目)

我们现在用 JavaScript 实现一个极简区块链,支持添加区块和验证完整性。

创建项目目录

mkdir my-blockchain
cd my-blockchain
npm init -y

编写区块类(Block.js)

// Block.js
const crypto = require('crypto');

class Block {
  constructor(index, timestamp, data, previousHash = '') {
    this.index = index;           // 区块序号
    this.timestamp = timestamp;   // 时间戳
    this.data = data;             // 存储的数据(比如交易)
    this.previousHash = previousHash; // 上一个区块的哈希
    this.hash = this.calculateHash(); // 当前区块的哈希
  }

  calculateHash() {
    return crypto
      .createHash('sha256')
      .update(this.index + this.previousHash + this.timestamp + JSON.stringify(this.data))
      .digest('hex');
  }
}

module.exports = Block;

✅ 这里用 Node.js 内置的 crypto 模块生成 SHA256 哈希,安全又简单。

编写区块链类(Blockchain.js)

// Blockchain.js
const Block = require('./Block');

class Blockchain {
  constructor() {
    this.chain = [this.createGenesisBlock()]; // 创世区块(第一个区块)
  }

  createGenesisBlock() {
    return new Block(0, "01/01/2024", "创世区块", "0");
  }

  getLatestBlock() {
    return this.chain[this.chain.length - 1];
  }

  addBlock(newBlock) {
    newBlock.previousHash = this.getLatestBlock().hash;
    newBlock.hash = newBlock.calculateHash();
    this.chain.push(newBlock);
  }

  isChainValid() {
    for (let i = 1; i < this.chain.length; i++) {
      const currentBlock = this.chain[i];
      const previousBlock = this.chain[i - 1];

      // 检查当前区块的哈希是否正确
      if (currentBlock.hash !== currentBlock.calculateHash()) {
        return false;
      }

      // 检查是否指向正确的上一个区块
      if (currentBlock.previousHash !== previousBlock.hash) {
        return false;
      }
    }
    return true;
  }
}

module.exports = Blockchain;

主程序入口(index.js)

// index.js
const Blockchain = require('./Blockchain');

let myChain = new Blockchain();

console.log("正在添加区块...");
myChain.addBlock({ data: "Alice 转给 Bob 10元" });
myChain.addBlock({ data: "Charlie 转给 David 5元" });

console.log("区块链是否有效?", myChain.isChainValid()); // 应该输出 true

// 尝试篡改数据
myChain.chain[1].data = "Alice 转给 Eve 100元";
console.log("篡改后是否有效?", myChain.isChainValid()); // 应该输出 false!

运行项目

node index.js

你应该看到类似输出:

正在添加区块...
区块链是否有效? true
篡改后是否有效? false

🎉 恭喜!你刚刚亲手实现了一个具备防篡改能力的区块链原型!


新手常见问题解答(FAQ)

问题 解答
这和真正的比特币区块链一样吗? 核心思想一致,但真实系统更复杂:有共识机制(如 PoW)、P2P 网络、交易验证等。我们这是“教学版”。
为什么创世区块的 previousHash 是 "0"? 因为它是第一个区块,没有前驱。用 "0" 表示起点,这是行业惯例。
哈希能保证 100% 安全吗? 在当前算力下,SHA256 几乎不可能碰撞(即两个不同输入产生相同哈希)。所以可信。
我能把这个部署到网上吗? 目前只是单机模拟。要变成真正分布式系统,需要加网络通信模块(比如用 WebSocket)。

下一步怎么学?我的学习路径建议

如果你做完这个小项目觉得“有点意思”,可以按以下顺序深入:

  1. 理解工作量证明(PoW)
    尝试给你的区块链加上“挖矿”机制:要求区块哈希必须以若干个 0 开头,迫使计算机反复尝试 nonce 值。这是比特币安全的基础。

  2. 加入 P2P 网络
    用 Node.js 的 net 模块或 WebSocket 让多个节点互相通信,同步链数据。

  3. 学习智能合约(可选)
    如果对应用层感兴趣,可以转向 Ethereum + Solidity。但建议先掌握底层原理。

  4. 做个小 DApp
    比如用 React 前端 + Web3.js + 本地 Ganache 测试链,做个投票或记事本应用。

📌 我的建议:不要一上来就学 Solidity 或 Truffle。先搞懂数据如何链接、如何验证、如何广播,再接触框架,你会少走 80% 的弯路。


写在最后

我当初学区块链时,花了两周才搞明白“为什么改一个区块会导致整条链失效”。后来自己写了个玩具项目,豁然开朗。技术最好的老师不是文档,而是键盘

这个教程虽然只有 50 行核心代码,但它包含了区块链最本质的逻辑。希望你能运行起来,改一改,甚至加个“挖矿”功能玩玩。

如果你喜欢这种“边做边学”的风格,欢迎来 B 站搜“阿哲的代码实验室”——我会持续更新 AIGC 和 Web3 的实战系列。下期我们试试用 Python 实现同样的逻辑,对比看看哪种语言更适合初学者。

记住:每个大神,都是从一行 console.log 开始的。现在,去敲代码吧!

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝