• Index

#### 区块链原理

Last updated: ... / Reads: 9194434 Edit

### 哈希算法

``````h=H(x)
``````

``````H("morning") = c7c3169c21f1d92e9577871831d067c8
H("bitcoin") = cd5b1e4947e304476c788cd474fb579a
``````

``````H("???????") = c7c3169c21f1d92e9577871831d067c8
H("???????") = cd5b1e4947e304476c788cd474fb579a
``````

### 哈希碰撞

``````H("data-123456") = a76b1fb579a02a476c789d9115d4b201
H("data-ABCDEF") = a76b1fb579a02a476c789d9115d4b201
``````

``````H("hello-1") = 970db54ab8a93b7173cb48f55e67fd2c
H("hello-2") = 8284353b768977f05ac600baad8d3d17
``````

### 常用哈希算法

MD5128 bit16 bytes
RipeMD160160 bits20 bytes
SHA-1160 bits20 bytes
SHA-256256 bits32 bytes
SHA-512512 bits64 bytes

SHA-256的理论碰撞概率是：尝试2的130次方的随机输入，有99.8%的概率碰撞。注意2130是一个非常大的数字，大约是1361万亿亿亿亿。以现有的计算机的计算能力，是不可能在短期内破解的。

``````const
bitcoin = require('bitcoinjs-lib'),
createHash = require('create-hash');
----
function standardHash(name, data) {
let h = createHash(name);
return h.update(data).digest();
}

function hash160(data) {
let h1 = standardHash('sha256', data);
let h2 = standardHash('ripemd160', h1);
return h2;
}

function hash256(data) {
let h1 = standardHash('sha256', data);
let h2 = standardHash('sha256', h1);
return h2;
}

let s = 'bitcoin is awesome';
console.log('ripemd160 = ' + standardHash('ripemd160', s).toString('hex'));
console.log('  hash160 = ' + hash160(s).toString('hex'));
console.log('   sha256 = ' + standardHash('sha256', s).toString('hex'));
console.log('  hash256 = ' + hash256(s).toString('hex'));
``````

### Merkle Hash

Merkle Hash是把一系列数据的哈希根据一个简单算法变成一个汇总的哈希。

``````a1 = dhash(tx1)
a2 = dhash(tx2)
a3 = dhash(tx3)
a4 = dhash(tx4)
``````

``````       ┌───────────────┐               ┌───────────────┐
│b1=dhash(a1+a2)│               │b2=dhash(a3+a4)│
└───────────────┘               └───────────────┘
▲                               ▲
┌───────┴───────┐               ┌───────┴───────┐
│               │               │               │
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│a1=dhash(tx1)│ │a2=dhash(tx2)│ │a3=dhash(tx3)│ │a4=dhash(tx4)│
└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘
``````

``````                     ┌───────────────────┐
│merkle=dhash(b1+b2)│
└───────────────────┘
▲
┌───────────────┴───────────────┐
│                               │
┌───────────────┐               ┌───────────────┐
│b1=dhash(a1+a2)│               │b2=dhash(a3+a4)│
└───────────────┘               └───────────────┘
▲                               ▲
┌───────┴───────┐               ┌───────┴───────┐
│               │               │               │
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│a1=dhash(tx1)│ │a2=dhash(tx2)│ │a3=dhash(tx3)│ │a4=dhash(tx4)│
└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘
``````

``````                     ┌───────────────────┐
│merkle=dhash(b1+b2)│
└───────────────────┘
▲
┌───────────────┴───────────────┐
│                               │
┌───────────────┐               ┌───────────────┐
│b1=dhash(a1+a2)│               │b2=dhash(a3+a3)│
└───────────────┘               └───────────────┘
▲                               ▲
┌───────┴───────┐               ┌───────┴───────┐
│               │               │               │
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌ ─ ─ ─ ─ ─ ─ ┐
│a1=dhash(tx1)│ │a2=dhash(tx2)│ │a3=dhash(tx3)│
└─────────────┘ └─────────────┘ └─────────────┘ └ ─ ─ ─ ─ ─ ─ ┘
``````

``````                  ┌─────────┐
│ merkle  │
└─────────┘
▲
┌───────────┴───────────┐
│                       │
┌───┐                   ┌───┐
│c1 │                   │c2 │
└───┘                   └───┘
▲                       ▲
┌─────┴─────┐           ┌─────┴─────┐
│           │           │           │
┌───┐       ┌───┐       ┌───┐       ┌ ─ ┐
│b1 │       │b2 │       │b3 │        b3
└───┘       └───┘       └───┘       └ ─ ┘
▲           ▲           ▲
┌──┴──┐     ┌──┴──┐     ┌──┴──┐
│     │     │     │     │     │
┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌ ─ ┐
│a1 │ │a2 │ │a3 │ │a4 │ │a5 │  a5
└───┘ └───┘ └───┘ └───┘ └───┘ └ ─ ┘
``````

• Index