主页 > imtoken钱包苹果版用不了 > 如果你看完有收获,可以邀请作者在支付宝上喝咖啡

如果你看完有收获,可以邀请作者在支付宝上喝咖啡

imtoken钱包苹果版用不了 2023-02-03 06:22:03

区块链是一个不断增长的全网总账,每个完整的节点都有一条完整的区块链,并且该节点始终信任最长的区块链,而假区块链需要拥有全网51%以上的算力.

区块链的一个重要特点是不可篡改。为什么区块链是不可变的?我们先来看看区块链的结构。

区块链是由区块组成的有序列表,每个区块记录一系列交易,每个区块都指向前一个区块,从而形成一条链:

blockchain

如果我们观察某个区块,我们可以看到每个区块都有一个唯一的哈希标识,称为区块哈希,同时该区块通过记录前一个区块的哈希指向前一个区块:

block

每个区块也有一个默克尔哈希,用于保证区块内所有交易记录不可篡改。

区块链中的主要数据是一系列交易。第一笔交易通常是Coinbase交易,是矿工的挖矿奖励,后续交易是用户交易。

区块链的不变性由哈希算法保证。

哈希算法

让我们简单介绍一下什么是哈希算法。

哈希算法,又称哈希算法,是一种单向函数,可以将任意长度的输入数据转换为固定长度的输出:

h=H(x)

比如对morning和bitcoin这两个输入做某种hash运算,结果是一个定长的数字:

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

bitp区块链能做吗

我们通常用十六进制表示哈希输出。

因为哈希算法是单向函数,所以要设计一个安全的哈希算法,它必须满足:输出可以很容易地从输入中计算出来,但是,反过来bitp区块链能做吗,输入不能从输出中取反,只有暴力筋疲力尽。

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

如果要根据以上结果逆向输入,只能用电脑暴力破解。

哈希冲突

安全的哈希算法还需要满足另一个条件:低碰撞率。

碰撞的意思是如果两个输入数据不同,但恰好计算出相同的hash值,那么我们就说发生了碰撞:

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

p>

由于输入数据的长度不固定,输入数据是无限集,输出数据长度固定,所以输出数据是有限集。将无限集中的每个元素映射到有限集中,一定会有一些不同的输入得到相同的输出。

哈希冲突的本质是无限集映射到有限集时必然会发生冲突。我们需要计算的是碰撞的概率。显然,碰撞概率与输出集的大小有关。输出位数越多,输出集越大,碰撞率越低。

安全哈希算法还需要满足一个条件,即输出不规则。输入数据的任何一位(某个字节的某个二进制位)的变化都会导致输出完全不同,使得攻击者无法一步步猜出输入,只能靠蛮力破解:

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

哈希算法是做什么的?假设我们相信一种安全的散列算法,那么我们相信如果它们的散列相同,则两个输入是相同的。

如果输入的内容是文件的内容,并且两个文件的哈希值相同,那么文件没有被修改过。当我们从一个网站下载一个非常大的文件时,如何保证下载的文件和官网发布的原始文件完全一样,没有修改呢?哈希算法展示了它的效果:我们只需要计算下载到本地的文件的哈希值,然后与官网给出的哈希值进行比较即可。如果一致,说明下载的文件是正确的,没有被篡改过。如果不一致,则说明下载的文件一定被篡改过。

bitp区块链能做吗

大部分软件的官方下载页面也会给出文件的hash值,方便用户下载后验证文件是否被篡改:

file-md5

p>

与文件类似,如果两条数据具有相同的哈希值,则可以 100% 确定两条数据相同。比特币使用哈希算法来保证所有交易都不能被修改,即计算并记录交易的哈希值。如果交易被篡改,哈希验证将失败,表明该区块无效。

blockhash

常用的哈希算法

常用的哈希算法及其输出长度如下:

哈希腊算法输出长度(位)输出长度(字节)

MD5

128 位

16 字节

成熟的MD160

160 位

20 字节

SHA-1

bitp区块链能做吗

160 位

20 字节

SHA-256

256 位

32 字节

SHA-512

512 位

64 字节

比特币使用两种哈希算法:SHA-256 和 RipeMD160

SHA-256 的理论碰撞概率为:尝试随机输入的 2 的 130 次方bitp区块链能做吗,有 9 个 9.8% 的碰撞概率。请注意,2130 是一个非常大的数字,大约是 1361 万亿万亿。以现有计算机的计算能力,短时间内不可能破解。

比特币使用两种哈希算法,一种是对数据进行两次SHA-256计算,在比特币协议中通常称为hash256或dhash。

另一种算法是先计算SHA-256,再计算RipeMD160,在比特币协议中通常称为hash160。

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'));

运行上面的代码,观察SHA-256、RipeMD160、hash256和hash160对一个字符串的结果。

区块链的不可变特性

bitp区块链能做吗

有了哈希算法的初步知识,我们来看看比特币的区块链是如何利用哈希算法来防止交易记录被篡改的。

区块本身记录的主要数据是一系列交易,所以区块链首先要保证任何交易数据都不能被修改。

默克尔哈希

在区块的头部,有一个Merkle Hash字段,记录了这个区块内所有交易的Merkle Hash:

merkle

Merkle Hash 就是将一系列数据哈希按照一个简单的算法转换成一个汇总哈希。

假设一个区块有4笔交易,我们对每笔交易数据进行dhash,得到4个哈希值a1、a2、a3和a4:

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

注意hash值也可以看成是数据,所以可以把a1和a2放在一起,a3和a4放在一起,然后计算b1和b2这两个hash值:

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

最后结合b1和b2这两个hash值,计算出最终的hash值,也就是Merkle Hash:

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

如果事务数不正好是 4 怎么办?比如只有3笔交易时,可以将第一笔交易和第二笔交易的哈希a1和a2结合起来计算b1,第三笔交易只能计算一个哈希a3。这时候直接复制a3。 ,计算b2,这样,我们也可以最终计算出Merkle Hash:

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

如果有 5 笔交易,我们可以看到 a5 被复制了一个 b3 的副本然后被复制以计算 c2。简而言之,在每一层计算中,如果有奇异数,则复制最后的数据,最后计算Merkle Hash:

bitp区块链能做吗

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

从 Merkle Hash 的计算方式可以得出结论:修改任何一笔交易哪怕是一个字节,或者交换两笔交易的顺序,都会导致 Merkle Hash 验证失败,也会导致区块本身失效。因此,Merkle Hash记录在区块头中,它的作用就是保证交易记录永远不能被修改。

区块哈希

区块本身由区块哈希标识——即区块哈希。但是,一个区块自己的区块哈希并没有记录在区块头中,而是通过计算区块头的哈希得到的:

block-hash

区块头中的Prev Hash记录了上一个区块的Block Hash,从而可以通过Prev Hash追溯上一个区块。

因为下一个区块的Prev Hash会指向当前区块,所以每个区块的Prev Hash都会指向自己的前一个区块,这些区块会串联起来形成一个区块链。

区块链的第一个区块(又名创世区块)没有前一个区块,因此其 Prev Hash 设置为 00000000...000。

如果恶意攻击者修改了区块中的交易,Merkle Hash 验证将失败。因此,他只能重新计算 Merkle Hash,然后修改区块头的 Merkle Hash。这时候我们会发现区块本身的Block Hash发生了变化,所以下一个区块的链接就断了。

modify-block

因为一个比特币区块的hash必须满足一个难度值,所以攻击者必须先重新计算这个区块的Block Hash,然后,再重新计算并伪造所有后续区块,这样整个区块链才能被修改。

在接下来的挖矿中,我们会看到修改一个区块的成本已经非常非常高了。要修改所有后续区块,攻击者必须掌握全网 51% 以上的区块。只需要算力,所以修改区块链的难度是非常非常大的,而且由于正常的区块链是不断增长的,随着时间的推移,修改同一个区块的难度会不断增加。

总结

区块链依靠安全的哈希算法来保证所有的区块数据不能被改变;

交易数据依靠Merkle Hash保证不可修改,整个区块Blocks依靠Block Hash保证区块不可修改;

工作量证明机制(挖矿)确保修改区块链太难实现。