vikramkrishna1705-beep/BlockJS
GitHub: vikramkrishna1705-beep/BlockJS
一个生产级教学型区块链框架,用 Node.js 实现了 UTXO 模型、PoW 动态难度调整、P2P 网络和 LevelDB 持久化,帮助开发者深入理解区块链底层原理。
Stars: 0 | Forks: 0
# 🚀 BlockJS
[](https://github.com/vikramkrishna1705-beep/BlockJS/actions/workflows/test.yml)
[](https://jestjs.io/)
[](https://www.docker.com/)
[](https://opensource.org/licenses/MIT)
**BlockJS** 是一个使用 JavaScript 从头编写的、达到生产级别的教学型区块链框架。它的构建旨在展示对分布式系统、密码学和现代后端工程原理的深刻理解。
与典型的简单区块链教程不同,BlockJS 实现了真实的、行业标准机制,包括**真正的 UTXO 模型**、**动态难度调整 (DDA)**、**椭圆曲线密码学 (ECDSA)** 以及**持久化 LevelDB 存储**。
## ✨ 核心功能
* 🔐 **椭圆曲线密码学**:使用 `secp256k1`(与 Bitcoin 使用的曲线相同)生成钱包密钥对并对交易进行数字签名。
* 💸 **真正的 UTXO 财务模型**:摒弃了简单的账户余额模型,采用未花费交易输出 (UTXO) 池。交易严格根据密码学签名和可用资金验证输入。
* ⛏️ **工作量证明与 DDA**:具有动态 PoW 共识算法,可自动调高或调低挖矿难度,以确保一致且可预测的出块率。
* 🌐 **P2P WebSocket 网络**:实现了一个健壮的 Socket.io 点对点网络,用于广播交易、同步链并实时解决 mempool 冲突。
* 💾 **LevelDB 持久化**:账本和 UTXO 状态被持久化保存到磁盘,确保数据在节点重启和崩溃后依然存在。
* 🐳 **Docker Swarm / Compose**:完全容器化的环境,能够毫不费力地启动一个互联的 3 节点集群,开箱即用地模拟去中心化网络。
* 🌳 **Merkle 树**:在区块头中将交易哈希加密聚合为单个根哈希,从而实现高效验证和 SPV(简化支付验证)功能。
* 📊 **可视化区块浏览器**:内置的轻量级 Web 仪表板,用于实时监控区块链状态、mempool 和节点数据。
* 🧪 **全面的测试覆盖率**:具有健壮的 Jest 测试套件,确保数据不可变性、状态转换和密码学完整性。
## 🏗️ 架构
```
graph TD
A[Client App / Block Explorer] -->|HTTP / WebSockets| B(Express.js API)
B --> C{P2P Network Node}
C -->|Gossip Protocol| D[Other Peer Nodes]
C --> E[Mempool]
C --> F[(LevelDB Storage)]
subgraph Consensus & Mining
E --> G(Proof of Work Miner)
G -->|Validates UTXOs| H[New Block]
H -->|Broadcasts| C
end
```
- **`src/blockchain`**:管理区块生成、PoW 哈希(`SHA-256`)、链验证和共识规则。
- **`src/wallet`**:处理密钥对、交易签名和 UTXO 状态机。
- **`src/network`**:用于客户端交互的 Express HTTP API 和用于节点间通信的 Socket.io 服务器。
- **`src/utils`**:配置、密码学封装和 LevelDB 数据库适配器。
## 🚀 快速开始
### 🐳 选项 1:Docker(推荐)
使用 Docker Compose 立即启动一个全连接的 3 节点集群。
```
docker-compose up --build
```
* **节点 1**:`http://localhost:3001`(创世节点)
* **节点 2**:`http://localhost:3002`
* **节点 3**:`http://localhost:3003`
### 💻 选项 2:本地 Node.js
需要 Node.js 18+。
```
# 安装依赖
npm install
# 启动第一个 node
npm start
# 在单独的终端中,启动连接到第一个节点的第二个 node
HTTP_PORT=3001 PEERS=ws://localhost:3000 npm start
```
## 🎮 与网络交互
一旦您的节点运行起来,您就可以使用内置的可视化浏览器或 `cURL`/Postman 与 HTTP API 进行交互。
**1. 可视化区块浏览器**
打开您的浏览器并访问:
```
http://localhost:3001
```
*(如果您正在端口 3000 上运行单个本地节点,请访问 `http://localhost:3000`)*
**2. 查看区块链 (API)**
```
curl http://localhost:3001/blocks
```
**3. 创建交易**
```
curl -X POST -H "Content-Type: application/json" -d '{
"outputPublicKey": "recipient-public-key-here",
"amount": 50,
"fee": 1
}' http://localhost:3001/transact
```
**4. 挖掘区块(处理 Mempool 并奖励 Coinbase)**
```
curl http://localhost:3002/mine
```
## 🧪 测试
该框架使用 Jest 进行了严格的测试。测试套件涵盖了密码学签名验证、恶意链拒绝和难度调整边界。
```
npm run test
```
## 💡 为什么选择 BlockJS?(致面试官)
如果您正在审查这个代码库,您可能会想为什么我构建这个项目,而不是一个标准的 CRUD 应用程序。
我设计 BlockJS 是因为从头构建一个区块链会迫使开发人员面对复杂的、底层的计算机科学问题:
1. **并发与状态管理**:在没有竞态条件的情况下处理并发的 P2P 事件、mempool 同步和 UTXO 状态推导。
2. **应用密码学**:超越标准的 JWT,利用原始椭圆曲线签名和哈希算法进行无需信任的验证。
3. **去中心化共识**:设计一种架构,在这种架构中,节点必须在没有中央权威或数据库的情况下独立就“真相”达成一致。
4. **数据结构**:实现密码学链接列表和不可变账本。
BlockJS 展示了我设计复杂分布式架构、编写测试驱动整洁代码以及应对典型 Web 开发范围之外挑战的能力。
标签:GNU通用公共许可证, LevelDB, MITM代理, Node.js, P2P网络, UTXO模型, 区块链, 密码学, 手动系统调用, 数据可视化, 自定义脚本, 请求拦截