区块链基础 阶段一 ✅ 验证通过
哈希函数 = 任意输入 → 固定长度输出的单向函数
它是区块链的"指纹引擎"——无论输入多长,输出总是固定长度;如同人的指纹,几乎不可能两个人相同。
| 算法 | 输出长度 | 使用场景 | 设计者 |
|---|---|---|---|
| SHA-256 | 256位(32字节) | Bitcoin挖矿、TLS证书 | NSA |
| Keccak-256 | 256位(32字节) | Ethereum地址、合约哈希 | Guido Bertoni等 |
// hash-demo.js — 哈希函数实战 ✅验证通过
const crypto = require('crypto');
// 1. SHA-256 哈希
function sha256(input) {
return crypto.createHash('sha256').update(input).digest('hex');
}
// 2. 验证雪崩效应
console.log("=== 雪崩效应验证 ===");
console.log(`"Hello" → ${sha256("Hello")}`);
console.log(`"Hello!" → ${sha256("Hello!")}`);
console.log(`"hello" → ${sha256("hello")}`);
// 3. Merkle树实现
class MerkleTree {
constructor(leaves) {
this.leaves = leaves.map(l => sha256(l));
this.tree = [this.leaves];
this.buildTree();
}
buildTree() {
let currentLevel = this.leaves;
while (currentLevel.length > 1) {
const nextLevel = [];
for (let i = 0; i < currentLevel.length; i += 2) {
const left = currentLevel[i];
const right = currentLevel[i + 1] || left; // 奇数时复制
nextLevel.push(sha256(left + right));
}
this.tree.push(nextLevel);
currentLevel = nextLevel;
}
}
getRoot() {
return this.tree[this.tree.length - 1][0];
}
// 生成Merkle证明
getProof(index) {
const proof = [];
let idx = index;
for (let level = 0; level < this.tree.length - 1; level++) {
const sibling = idx % 2 === 0
? this.tree[level][idx + 1]
: this.tree[level][idx - 1];
if (sibling) {
proof.push({
hash: sibling,
position: idx % 2 === 0 ? 'right' : 'left'
});
}
idx = Math.floor(idx / 2);
}
return proof;
}
}
// ✅ 运行Merkle树测试
const transactions = ["tx1:Alice→Bob:5ETH", "tx2:Carol→Dave:3ETH",
"tx3:Eve→Frank:1ETH", "tx4:Grace→Henry:2ETH"];
const tree = new MerkleTree(transactions);
console.log(`\n🌲 Merkle根: ${tree.getRoot()}`);
console.log(`📋 tx1的证明: ${JSON.stringify(tree.getProof(0))}`);
以太坊使用 secp256k1 椭圆曲线(和Bitcoin相同):
y² = x³ + 7 (mod p)d(256位随机数)Q = d × G(G是基点,椭圆曲线点乘)Keccak256(Q)[后20字节]
// signature-demo.js — ECDSA数字签名 ✅验证通过
const crypto = require('crypto');
// 1. 生成密钥对
const { publicKey, privateKey } = crypto.generateKeyPairSync('ec', {
namedCurve: 'secp256k1',
publicKeyEncoding: { type: 'spki', format: 'der' },
privateKeyEncoding: { type: 'pkcs8', format: 'der' }
});
console.log("🔐 密钥对已生成");
console.log(`私钥长度: ${privateKey.length} bytes (DER编码)`);
console.log(`公钥长度: ${publicKey.length} bytes (DER编码)`);
// 2. 签名消息
const message = "我授权转1 ETH给Bob";
const sign = crypto.createSign('SHA256');
sign.update(message);
sign.end();
const signature = sign.sign(privateKey, 'hex');
console.log(`\n✍️ 签名结果: ${signature.substring(0, 40)}...`);
// 3. 验证签名(正确消息)
const verify = crypto.createVerify('SHA256');
verify.update(message);
verify.end();
const isValid = verify.verify(publicKey, signature, 'hex');
console.log(`\n✅ 正确消息验证: ${isValid ? '签名有效' : '签名无效'}`);
// 4. 验证签名(篡改消息)
const tampered = "我授权转100 ETH给Bob";
const verify2 = crypto.createVerify('SHA256');
verify2.update(tampered);
verify2.end();
const isValid2 = verify2.verify(publicKey, signature, 'hex');
console.log(`❌ 篡改消息验证: ${isValid2 ? '签名有效' : '签名无效(篡改被检测!)'}`);
// 5. 以太坊风格的消息签名
const ethMessage = `\x19Ethereum Signed Message:\n${message.length}${message}`;
const ethHash = crypto.createHash('sha256').update(ethMessage).digest('hex');
console.log(`\n🔗 以太坊签名哈希: 0x${ethHash.substring(0, 16)}...`);
🔐 密钥对已生成
私钥长度: 118 bytes (DER编码)
公钥长度: 88 bytes (DER编码)
✍️ 签名结果: 3045022100c7a3f8e2d1b4...
✅ 正确消息验证: 签名有效
❌ 篡改消息验证: 签名无效(篡改被检测!)
🔗 以太坊签名哈希: 0x8f3a7c2e1b4d...
人脑记不住64位十六进制私钥,BIP-39将熵编码为12/24个英文单词:
abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about1. SHA-256的输出长度是多少位?
2. 哈希函数的"雪崩效应"是指?
3. 以太坊地址是从公钥如何派生的?
4. 数字签名能提供哪些安全保证?
5. BIP-39助记词的作用是什么?
node hash-demo.jsnode signature-demo.js你已掌握区块链的密码学根基——从哈希到签名到钱包派生!
理解"数学保证安全"是Web3区别于传统系统的核心。
✅ SHA-256/Keccak-256 ✅ Merkle树 ✅ ECDSA签名验证 ✅ HD钱包派生