关于技术探索与实践的一些经验:从零开始写一个区块链小应用

乐观锁玩家
2025-12-12 17:28
阅读 379

作者:一位工作5年的后端开发,喜欢把复杂的东西讲简单
字数:约3864字


为什么我要写这篇教程?

你好!我是老李,一名干了5年后端开发的工程师。这几年带过不少新人,也辅导过很多零基础的朋友入门编程。我发现大家最头疼的不是“学不会”,而是“不知道从哪开始”——尤其是面对像 JavaScript、前端、区块链、产品 这些看起来高大上的词时,容易被吓退。

其实,技术没那么可怕。我当初学的时候,也是从一行 console.log("Hello World") 开始的。今天这篇教程,就是想带你用最轻松的方式,亲手做一个超简单的区块链应用,顺便搞懂这几个关键词之间的关系。

别担心,我们不讲复杂的密码学,也不谈金融炒作。我们就聚焦一件事:用 JavaScript 写一个能在浏览器里跑的微型区块链,并理解它和前端、产品的联系

准备好了吗?咱们出发!


第一步:环境准备 —— 装好你的“工具箱”

我们要做的这个小项目,只需要两个东西:

  1. 一个代码编辑器(推荐 VS Code)
  2. 一个现代浏览器(比如 Chrome)

安装步骤(超简单)

  1. 下载 VS Code
    访问 https://code.visualstudio.com/,点击“Download”安装。

  2. 打开终端(或命令行)

    • Windows:按 Win + R,输入 cmd 回车
    • Mac:打开“终端”应用
    • Linux:打开终端
  3. 新建一个项目文件夹

mkdir my-blockchain-app
cd my-blockchain-app
  1. 创建两个文件
touch index.html app.js

💡 小贴士:如果你用的是 Windows 且 touch 命令无效,可以直接在 VS Code 里右键新建这两个文件。

现在你的文件夹结构应该是:

my-blockchain-app/
├── index.html
└── app.js

搞定!这就是我们的开发环境——干净、轻量、零配置。


第二步:核心概念 —— 用大白话讲清楚四个关键词

在动手之前,我们先花5分钟搞懂这四个词到底是什么意思,以及它们怎么连在一起。

关键词 是什么? 用来做什么? 举个生活中的例子
JavaScript 一种编程语言 让网页“动起来” 就像给玩具车装上马达,让它能跑
前端 网页的“脸面” 用户看到和操作的部分 就像餐厅的菜单和服务员
区块链 一种数据结构 安全、不可篡改地记录信息 就像一本公共账本,每页都盖章防改
产品 解决用户问题的方案 把技术变成有用的东西 就像你点的“牛肉面”——不是面粉、肉、水,而是一碗完整的面

我当初学的时候...

我一开始以为“区块链”必须用 Python 或 Go 写,还得搭服务器。后来才发现,用 JavaScript 在浏览器里也能模拟区块链的核心逻辑!虽然不能上主网,但足够理解原理。

而且,一旦你把区块链逻辑写成函数,前端就能调用它,做成一个产品(比如“我的第一条区块链消息”),用户点一下按钮就能体验。

这就是技术探索的乐趣:用简单工具,验证复杂想法


第三步:实战项目 —— 用 JavaScript 写一个微型区块链

我们现在要做的,是一个能在网页上显示、添加、验证区块链的小应用。

Step 1:定义“区块”结构

每个区块包含:

  • 索引(第几个)
  • 时间戳
  • 数据(比如一条消息)
  • 前一个区块的哈希值
  • 自己的哈希值

app.js 中写下:

// 计算哈希值(简化版,实际要用 SHA256)
function calculateHash(index, timestamp, data, previousHash) {
  return btoa(index + timestamp + data + previousHash); // btoa 是浏览器内置的 base64 编码
}

// 区块类
class Block {
  constructor(index, timestamp, data, previousHash = "") {
    this.index = index;
    this.timestamp = timestamp;
    this.data = data;
    this.previousHash = previousHash;
    this.hash = calculateHash(index, timestamp, data, previousHash);
  }
}

📌 注意:这里用 btoa 只是为了演示。真实区块链会用更安全的哈希算法(如 SHA256),但我们零基础先理解结构。

Step 2:定义“区块链”本身

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 = calculateHash(
      newBlock.index,
      newBlock.timestamp,
      newBlock.data,
      newBlock.previousHash
    );
    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];

      // 检查当前区块的 hash 是否正确
      if (currentBlock.hash !== calculateHash(
        currentBlock.index,
        currentBlock.timestamp,
        currentBlock.data,
        currentBlock.previousHash
      )) {
        return false;
      }

      // 检查 previousHash 是否匹配
      if (currentBlock.previousHash !== previousBlock.hash) {
        return false;
      }
    }
    return true;
  }
}

Step 3:连接前端(HTML)

index.html 中写:

<!DOCTYPE html>
<html lang="zh">
<head>
  <meta charset="UTF-8" />
  <title>我的第一个区块链</title>
  <style>
    body { font-family: Arial, sans-serif; padding: 20px; }
    button { margin: 10px 0; padding: 8px 16px; }
    #output { background: #f5f5f5; padding: 10px; margin-top: 10px; }
  </style>
</head>
<body>
  <h1>欢迎来到区块链世界!</h1>
  <input type="text" id="message" placeholder="输入你想存入区块链的消息" />
  <button onclick="addMessage()">添加到区块链</button>
  <button onclick="showChain()">显示区块链</button>
  <button onclick="verifyChain()">验证区块链</button>

  <div id="output"></div>

  <script src="app.js"></script>
  <script>
    // 初始化区块链
    const myCoin = new Blockchain();

    function addMessage() {
      const msg = document.getElementById("message").value;
      if (!msg) {
        alert("请输入消息!");
        return;
      }
      const newBlock = new Block(
        myCoin.chain.length,
        new Date().toLocaleString(),
        msg
      );
      myCoin.addBlock(newBlock);
      document.getElementById("message").value = "";
      alert("已添加到区块链!");
    }

    function showChain() {
      let output = "<h3>区块链内容:</h3><pre>";
      myCoin.chain.forEach(block => {
        output += JSON.stringify(block, null, 2) + "\n\n";
      });
      output += "</pre>";
      document.getElementById("output").innerHTML = output;
    }

    function verifyChain() {
      const isValid = myCoin.isChainValid();
      document.getElementById("output").innerHTML = 
        `<h3>验证结果:</h3><p>区块链${isValid ? "有效 ✅" : "已被篡改 ❌"}</p>`;
    }
  </script>
</body>
</html>

Step 4:运行看看!

  1. 在 VS Code 中右键 index.html → “Open with Live Server”(如果没有,先安装 Live Server 插件)
  2. 浏览器会自动打开页面
  3. 输入“Hello Blockchain!”,点击“添加到区块链”
  4. 点击“显示区块链”,你会看到类似这样的输出:
{
  "index": 1,
  "timestamp": "4/10/2024, 3:45:30 PM",
  "data": "Hello Blockchain!",
  "previousHash": "MDAxLzAxL...(一串编码)",
  "hash": "MTE0LzEwL...(另一串编码)"
}
  1. 点击“验证区块链” → 显示“有效 ✅”

🎉 恭喜!你刚刚亲手实现了一个微型区块链产品!


第四步:常见问题解答(新手避坑指南)

Q1:为什么不用真正的 SHA256?

A:因为浏览器原生不支持 SHA256(需要引入库)。我们用 btoa 是为了快速理解逻辑。等你熟悉后,可以用 crypto-js 库替换:

# 先安装(如果用 Node.js)
npm install crypto-js

但在纯前端,可以这样引入 CDN:

<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>

然后替换 calculateHash 函数:

function calculateHash(index, timestamp, data, previousHash) {
  return CryptoJS.SHA256(index + timestamp + data + previousHash).toString();
}

Q2:这个区块链能上链吗?

A:不能。这只是模拟。真实的区块链(如 Ethereum)需要共识机制、P2P 网络、Gas 费用等。但这个练习能帮你理解“区块如何链接”“哈希如何防篡改”等核心思想。

Q3:前端和后端在这里分别做什么?

  • 前端:负责界面、用户交互、调用 JavaScript 区块链逻辑
  • 后端(本例没有):如果要做多人共享的区块链,就需要服务器存储和同步数据

我当初学的时候,总以为“区块链=去中心化=不需要服务器”。其实,很多 DApp(去中心化应用)仍然有前端+智能合约+后端辅助服务

Q4:这和“产品”有什么关系?

想象一下:你把这个小工具包装成“数字遗嘱”——用户输入一句话,永久记录在自己的浏览器区块链里。这就是一个最小可行产品(MVP)

技术是手段,解决用户需求才是目的。这也是为什么程序员也要懂一点产品思维。


第五步:学习建议 —— 下一步怎么走?

你已经迈出了重要一步!接下来,我建议按这个路径深入:

📚 学习路线图

阶段 目标 推荐资源
巩固 JavaScript 理解异步、Promise、模块化 《JavaScript 高级程序设计》第4版
深入前端 学 React/Vue,做动态界面 freeCodeCamp.org 免费课程
了解真实区块链 学 Ethereum + Solidity CryptoZombies.io(互动游戏式教学)
产品思维 学如何定义用户需求 《精益创业》《用户体验要素》

🔧 实践建议

  1. 每天写代码:哪怕只有 20 分钟
  2. 做小项目:比如“区块链日记本”“投票系统”
  3. 不要怕抄:初期模仿优秀代码是最快的学习方式
  4. 加入社区:GitHub、V2EX、掘金,多问多看

⚠️ 避坑提醒

  • 别一上来就啃白皮书(除非你数学很强)
  • 别追求“完美代码”,先跑起来再说
  • 别孤立学习——找人一起做项目,进步飞快

最后的话

技术探索就像搭积木:JavaScript 是你的手,前端是展示台,区块链是新奇的积木块,而产品是你最终搭出来的城堡。

我当初学的时候,也觉得区块链遥不可及。但当我用几十行 JS 代码让它“活”在浏览器里时,那种成就感至今难忘。

希望这篇教程,也能点燃你的兴趣。

记住:所有高手,都曾是菜鸟。唯一的区别是,他们动手了。

现在,回到你的编辑器,敲下第一行代码吧!

作者:老李(5年后端开发)
原创不易,欢迎转发,但请保留署名。
如果你觉得有帮助,不妨在评论区留下你的第一条“区块链消息” 😄

评论 0

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