一个用 Rust 实现的完整区块链项目,包含工作量证明(PoW)、交易系统、数字签名、账户管理等核心功能,用于学习区块链原理。
- ✅ 工作量证明(PoW) - 可配置难度的挖矿机制
- ✅ 交易系统 - 完整的交易验证和交易池
- ✅ 数字签名 - Ed25519 签名验证
- ✅ 账户管理 - 余额管理和转账功能
- ✅ Coinbase 交易 - 矿工挖矿奖励机制
- ✅ 链验证 - 完整性验证和防篡改检测
- ✅ 防重放 - 交易哈希去重机制
- ✅ 交易历史 - 地址交易记录查询
- ✅ 数据持久化 - JSON 序列化存储
cargo runcargo build --release用户发起交易 → 私钥签名 → 加入交易池 → 验证(签名+余额+金额)
↓
矿工打包交易 → 挖矿(PoW)→ 新区块 → 更新余额 → 加入链
index: 区块高度timestamp: 创建时间戳transactions: 交易列表prev_hash: 前一个区块的哈希nonce: 工作量证明的随机数hash: 当前区块的哈希miner: 矿工地址
from: 发送方地址(公钥十六进制)to: 接收方地址amount: 转账金额fee: 手续费timestamp: 时间戳(防重放)signature: Ed25519 数字签名hash: 交易哈希
通过不断尝试不同的 nonce 值,找到满足难度要求的哈希(前导零数量)。
创建区块链时可指定难度:
let blockchain = BlockChain::new(2); // 难度为 2(需要 2 个前导零)- 矿工挖矿的奖励机制
- 特殊标记:
from = "coinbase" - 凭空增发新币,不扣任何账户
- 跳过签名验证
- 放在区块第一笔交易
mini-blockchain/
├── src/
│ ├── main.rs # 主程序和演示代码
│ ├── block.rs # 区块结构和挖矿逻辑
│ ├── blockchain.rs # 区块链核心逻辑
│ ├── transaction.rs # 交易和签名验证
│ └── account.rs # 账户和余额管理
├── Cargo.toml # 项目配置
├── README.md # 说明文档
└── coinbase.md # Coinbase 交易说明
- Rust - 编程语言
- sha2 - SHA-256 哈希算法
- hex - 十六进制编码
- ed25519-dalek - Ed25519 数字签名
- serde - 序列化/反序列化
- rand - 随机数生成
use mini_blockchain::blockchain::BlockChain;
use ed25519_dalek::SigningKey;
use rand::rngs::OsRng;
fn main() {
// 1. 创建区块链
let mut bc = BlockChain::new(2);
// 2. 生成账户密钥对
let alice_key = SigningKey::generate(&mut OsRng);
let bob_key = SigningKey::generate(&mut OsRng);
let miner_key = SigningKey::generate(&mut OsRng);
// 3. 获取地址(公钥十六进制)
let alice_addr = hex::encode(alice_key.verifying_key().as_bytes());
let bob_addr = hex::encode(bob_key.verifying_key().as_bytes());
let miner_addr = hex::encode(miner_key.verifying_key().as_bytes());
// 4. 初始化账户余额
bc.accounts.set_balance(&alice_addr, 100000);
bc.accounts.set_balance(&bob_addr, 50000);
// 5. 发起交易
let tx = Transaction::new(&alice_key, &bob_addr, 10000);
bc.add_transaction(tx).unwrap();
// 6. 挖矿打包交易
bc.mine_pending_transactions(&miner_addr);
// 7. 验证链完整性
assert!(bc.is_valid());
// 8. 查询交易历史
let history = bc.get_transaction_history(&alice_addr);
for tx in history {
println!("from: {} -> to: {}, amount: {}",
&tx.from[..16], &tx.to[..16], tx.amount);
}
}new(difficulty)- 创建新区块链add_transaction(tx)- 添加交易到交易池(验证签名和余额)mine_pending_transactions(miner)- 挖矿打包交易is_valid()- 验证链的完整性get_transaction_history(address)- 查询地址的交易记录save2file(path)- 保存到文件load_from_file(path)- 从文件加载
new(signing_key, to, amount)- 创建并签名交易verify_signature()- 验证交易签名calculate_hash(...)- 计算交易哈希
set_balance(address, balance)- 设置账户余额get_balance(address)- 获取账户余额transfer(from, to, amount, fee, miner)- 执行转账has_sufficient_balance(address, amount)- 检查余额是否足够
A complete blockchain implementation in Rust with Proof of Work (PoW), transaction system, digital signatures, and account management for learning blockchain principles.
- ✅ Proof of Work (PoW) - Configurable difficulty mining mechanism
- ✅ Transaction System - Complete transaction validation and mempool
- ✅ Digital Signatures - Ed25519 signature verification
- ✅ Account Management - Balance management and transfer functionality
- ✅ Coinbase Transactions - Miner reward mechanism
- ✅ Chain Validation - Integrity verification and tamper detection
- ✅ Replay Protection - Transaction hash deduplication
- ✅ Transaction History - Address transaction record queries
- ✅ Data Persistence - JSON serialization storage
cargo runcargo build --releaseUser initiates transaction → Sign with private key → Add to mempool → Validate (signature + balance + amount)
↓
Miner packages transactions → Mine (PoW) → New block → Update balances → Add to chain
index: Block heighttimestamp: Creation timestamptransactions: List of transactionsprev_hash: Hash of previous blocknonce: Random number for proof of workhash: Hash of current blockminer: Miner address
from: Sender address (public key in hex)to: Recipient addressamount: Transfer amountfee: Transaction feetimestamp: Timestamp (replay protection)signature: Ed25519 digital signaturehash: Transaction hash
Continuously tries different nonce values to find a hash that meets the difficulty requirement (number of leading zeros).
Specify difficulty when creating the blockchain:
let blockchain = BlockChain::new(2); // Difficulty 2 (requires 2 leading zeros)- Miner reward mechanism for mining
- Special marker:
from = "coinbase" - Creates new coins from nothing, doesn't deduct from any account
- Skips signature verification
- Placed as the first transaction in a block
mini-blockchain/
├── src/
│ ├── main.rs # Main program and demo code
│ ├── block.rs # Block structure and mining logic
│ ├── blockchain.rs # Blockchain core logic
│ ├── transaction.rs # Transaction and signature verification
│ └── account.rs # Account and balance management
├── Cargo.toml # Project configuration
├── README.md # Documentation
└── coinbase.md # Coinbase transaction explanation
- Rust - Programming language
- sha2 - SHA-256 hashing algorithm
- hex - Hexadecimal encoding
- ed25519-dalek - Ed25519 digital signatures
- serde - Serialization/deserialization
- rand - Random number generation
use mini_blockchain::blockchain::BlockChain;
use ed25519_dalek::SigningKey;
use rand::rngs::OsRng;
fn main() {
// 1. Create blockchain
let mut bc = BlockChain::new(2);
// 2. Generate account key pairs
let alice_key = SigningKey::generate(&mut OsRng);
let bob_key = SigningKey::generate(&mut OsRng);
let miner_key = SigningKey::generate(&mut OsRng);
// 3. Get addresses (public key in hex)
let alice_addr = hex::encode(alice_key.verifying_key().as_bytes());
let bob_addr = hex::encode(bob_key.verifying_key().as_bytes());
let miner_addr = hex::encode(miner_key.verifying_key().as_bytes());
// 4. Initialize account balances
bc.accounts.set_balance(&alice_addr, 100000);
bc.accounts.set_balance(&bob_addr, 50000);
// 5. Initiate transaction
let tx = Transaction::new(&alice_key, &bob_addr, 10000);
bc.add_transaction(tx).unwrap();
// 6. Mine and package transactions
bc.mine_pending_transactions(&miner_addr);
// 7. Verify chain integrity
assert!(bc.is_valid());
// 8. Query transaction history
let history = bc.get_transaction_history(&alice_addr);
for tx in history {
println!("from: {} -> to: {}, amount: {}",
&tx.from[..16], &tx.to[..16], tx.amount);
}
}new(difficulty)- Create new blockchainadd_transaction(tx)- Add transaction to mempool (validates signature and balance)mine_pending_transactions(miner)- Mine and package transactionsis_valid()- Verify chain integrityget_transaction_history(address)- Query transaction records for an addresssave2file(path)- Save to fileload_from_file(path)- Load from file
new(signing_key, to, amount)- Create and sign transactionverify_signature()- Verify transaction signaturecalculate_hash(...)- Calculate transaction hash
set_balance(address, balance)- Set account balanceget_balance(address)- Get account balancetransfer(from, to, amount, fee, miner)- Execute transferhas_sufficient_balance(address, amount)- Check if balance is sufficient