主页 > imtoken官网下载2.0安卓 > 【基础知识】了解区块链的结构及其设计原理

【基础知识】了解区块链的结构及其设计原理

imtoken官网下载2.0安卓 2023-01-18 21:00:39

国内已经有很多关于区块链、比特币等的新闻和文章,但大多只是简单描述“区块链是一种去中心化的分布式账本”等概念,而在去中心化的过程中,对加密货币大做文章等等。

相对于国外对区块链技术原理、技术改进和内部逻辑的讨论,国内新闻媒体、大佬以及所谓的三点区块链集团等,大多集中在绿皮上。关于面向训练的讨论的深入讨论文章很少。

回顾近年来区块链的飞速发展,我总在想:如果我是中本聪,为什么会首先想到提出区块链的概念?我为什么要引入哈希函数并创建比特币?为什么会想到使用 PoW 共识模型和方法?最后,如何将以上概念结合起来形成区块链的逻辑?

下面的文字就是基于上面的逻辑。

需要提醒的是,下面的文字需要对经济学和数学有一定的理解和兴趣。对于区块链这样一个复杂有趣的新事物,只用生动的语言和简单的例子来说明,虽然可以达到普通读者简单易懂的作用,但要真正了解原理和实现肯定是不够的不了解其背后原理的区块链机制。

输入下面的文字。

一、集中式系统

对于电子现金系统,常见的交易场景如下:

A现在要买一台电脑,向商家B支付10000元。

1.A账户里有1.5万元;

2.A通过互联网将自己账户中的10000元汇给B;

3.B确认A发送的“电子现金”真实无误后,再将计算机发送给A;

4. 最终A的账户里只剩下5000元,B的账户又多了10000元。

如果是线下交易,A和B之间“一手付款,一手发货”,B可以轻松验证钱的真伪,但对于上述电子现金交易,最明显的一个问题是:(1)B无法确认A的电子现金是否真实,即A的账户是否有足够的1万元支付;(2)A的账户支付给B的10000是否已经支付为了解决这个问题,现实中往往会引入可信的第三方(通常是政府、银行等)作为中介,此时的交易场景如下:

1.A将1.5万元现金存入银行账户,银行将在A的电子账户中添加/“发行”1.5万元电子现金;

2.A通知银行将其账户中的10000电子现金汇给B;

3.银行确认A发送的电子现金真实无误,支付给B;

区块链哈希值交易记录查询

3. p>

4.B确认付款,将电脑交给A;

5.A账户只剩5000元电子现金,B账户增加10000元电子现金;

6.如果A账户的电子现金余额不足1万元,银行会提示A支付失败;如果A已经向C支付了10000元,银行会提示A存款不足。

可以看出,第三方银行解决了交易验证和双花问题。

那么问题是:

二、银行总账和区块链总账

银行的实践可以为我们提供一个基本的思路。通过学习银行的做法,了解银行解决上述问题的根本原因,从而设计出既能去中心化又能解决上述问题的系统。那么银行是如何解决上述问题的呢?

一般来说,银行本身对每一笔交易都有一个“总账”,其中记录了每个人的交易记录(收入+支出)、余额、时间等基本信息。 “确认”一笔收入时,盖上对应的“时间戳”,以“+”处理交易;每一次“确认”一笔支出,都打上相应的“时间戳”,交易“+”处理。 -》处理。因此,每个人的账户余额都是按时间顺序加减的最终结果。

上述A与B交易场景中,当A需要向B支付10000元电子现金时,银行从“总账”中取出A的账簿进行比对,如果账户余额足够支付10000元在考虑A的账簿中所有“确认”的交易后,认为交易正确并支付给B,B银行收到电子通知后会通知

现金 B 已成功收到账户,B 可以放心地将其交付给 A。

银行的做法有几个重要的逻辑:

1.有一个总账,记录每个人的账本,供查询和对账;

区块链哈希值交易记录查询

2.只有银行才有权记录这个总账(银行是有公信力的机构);

3. 每个人的账本都详细记录了每一笔交易,对应的时间戳,余额等信息;

4. 只有当交易被“确认”时,它才会被用作收入/费用记录在分类帐中。

参考上述银行的做法可以看出,要解决“去中心化”问题,核心是要有“总账”,并满足以下条件:

(1)公开透明(在中心化的情况下,因为银行保证你账本的真实性,所以不需要公开透明;但是没有银行的时候,只有允许账本要公开透明,卖家能知道买家账户有没有账户吗?足够的钱支付;)

(2)每个人都可以核对核对(中心化的情况下,银行保证你的账本是真实的;但是没有银行的时候),只有允许别人查询核对账,能否保证买家账簿的真实性,否则买家可能会虚报账簿)

(3)记账权公平安全(记账权是指谁有权修改账簿。在中心化的情况下,银行只会将账簿记录在您的账簿中)存款后,只有银行有权记账,但没有银行时,谁有权记账?要保证修改账簿的权利是公平安全的,否则任何人都可以随意篡改自己的账本,比如在账本上加+1亿)

( 4)所有确认交易的记录(确认交易是为了避免“双重交易”。如果一笔交易没有确认但被记录,会导致账户余额不匹配。例如,A账簿包含1.5万元,需要向B支付1万元,订单已经下达但后续交易被取消,如果此时账户还在记录,A账簿只有0.50000元,这是错误的。在中心化的情况下,银行取消交易后会调整账本,但没有银行时,谁有权调整?)

想象如果现实生活中有一个“满足以上四个条件的总账”,此时A和B的交易场景会如下:

1.A的电子账户中有1.50,000个电子现金,信息记录在“总账”中,可供大家查询;

2. A 买了一台电脑,通知网络他账户里的 10,000 电子现金发送给 B;

3.B查询“总账”,验证A的钱没有问题,确认收货;

4.A的账户里只剩下5000元10000元电子现金,B账户又增加了10000元电子现金; 10000元之前已经付给C了,B也会核实并拒绝A。

可以看出,如果这样的账本真的存在,那么第三方的公信力机构似乎就没有存在的价值了,于是我们解决了Q1的问题:确实有一个去中心化的电子现金系统,使双方能够进行直接的点对点货币交易。

三、哈希函数和公共账本的安全性

区块链哈希值交易记录查询

但是实现上面的逻辑并不简单,上面的分析说明我们还有进一步的问题是的:

让我们一一来看。首先,谁有权记账?由于我们要设计的系统是去中心化的,显然我们不能把记账的权力交给第三方,考虑到公平正义,把记账的权力交给某个人显然也不容易。在此前提下,一个简单的推导是:

每个人都可以记账,任何账户都需要得到绝大多数人的确认和验证,并且只有在大多数人同意的前提下才能被认为是真实有效的(即共识)。

这种方法的公平性是显而易见的。每个人都可以记账,但这需要绝大多数人的同意,以及绝大多数人的确认和核实。如果大家不同意,交易将不会被确认并记录在账本上;如果大家都同意,就会被确认并记录下来。

先把技术原理放在一边,如果能做到,那么问题Q2、Q3、Q5就解决了。首先,每个人都有记账的权利,这就解决了Q2。第二,因为记账需要大多数人的同意,所以不会有记账人为了自己的利益而修改记录的行为,因为这样的行为会被大家否定,所以Q3就解决了;最终保证每一笔交易都是真实有效的。 ,因为每一笔交易都需要大家的确认和验证,所以Q5就解决了。

在这个前提下,如何解决问题Q4,即如何保证历史记录不被篡改?

为了保证历史记录不被篡改,有几个容易想到的思路:

第一个想法是我们可以在历史记录中添加一个复杂的“密码锁”,任何想要修改账本历史的人都需要解锁这个锁。这个想法的前提是锁不会阻止人们查询和验证历史记录,也不会阻止人们添加新的交易记录(即新记账)。但是,这把锁的钥匙和密码谁来保管?

第二种思路是,每当有人对历史记录进行改动,哪怕是一点点改动,都会引起很大的变化,会被人发现并拒绝。

第三种思路,修改史料的成本是巨大的,而且随着时间的推移,对于普通人来说实在是太大了区块链哈希值交易记录查询,无法承受。这种思路的缺陷在于,你永远不知道富人有多富有。

可能需要一些数学思维来理解下面的内容。

数学家为世界做出了巨大的贡献,他们发明的“哈希函数”将在这个系统中发挥巨大的作用。我们先简单介绍一下哈希函数:

散列函数,又称散列函数,将任意长度的输入转换为固定长度的输出,输出称为散列值。简单来说,就是将任意长度的消息压缩成固定长度的消息摘要的功能。举一个熟悉的例子,就像之前的中文阅读题目一样,请用10个词来概括要阅读的文章,其中10个词是定长输出,在数学上称为哈希值;这要求阅读的文章是任意长度的输入。将这篇任意长度的文章转化为一个固定的 10 字散列值,我们称之为散列函数,或者散列函数。

在数学上,一个良好表征的散列函数(HASH 函数,通常记为 h(x))必须具有以下特征:

1.任意大小对于数据分组,h(x)函数可以产生一个固定长度的输出

区块链哈希值交易记录查询

2. 对于任何给定的参数键,哈希值 h(key) 都比较容易计算

3. 单向性:指其运算方向的不可逆性,即只能从输入推导出输出,而不能从输出推算输入。即:如果自变量key1已知,h(key1)=h1可以计算;但是如果因变量h1已知,则推导出对应的自变量key1在计算上是不可行的(“Computationally infeasible” ”定义如下)。

4. 碰撞约束。碰撞约束可分为弱防碰撞和强防碰撞。所谓弱防碰撞是指给定的自变量 key1 ,如果要找到另一个与 key1 不同的自变量 key2 ,使得 h(key1)=h(key2),计算不可行;所谓强防碰撞是指找到任意参数(key1,key2)使得h(key1)=h(key2),计算不可行) .

上面所说的“Computationally Infeasible”并不是指“完全不可能”,而是“非常困难”,或者“不可能在有限的时间内计算出来”。

小知识(可以忽略):

常用的HASH函数有MD系列和SHA系列两大系列。其中,MD系列主要包括MD2、MD4、MD5,但是这样的HASH函数已经被证明是不够安全的(山东大学教授王晓云成功破解了MD2和MD5算法在有限的时间内)。 , 384 和 512 都是指其输出的位长。目前大部分应用场景推荐使用SHA256以上的算法。目前,以超级计算机的计算能力,产生比特币SHA256哈希算法的哈希冲突大约需要2^48。年。

假设将某笔交易的历史记录设为自变量key1,哈希函数的上述性质告诉我们,很难找到另一条不等于key1的交易记录key2,使得h( key1)=h(key2)。这也意味着:

(1)key1的任何改变,哪怕是一点点,都会使ha的hash值/输出值与原来的输出值h(key1);完全不相等或者相差很大;这意味着交易记录稍有变化,哈希值的变化就足以引起人们的注意。

(2)如果后一个hash函数的输入是基于前一个hash函数的输出,那么,如果要修改任意时间点的历史,之前所有的历史记录时间点必须和其对应的hash值进行修改,找到对应的hash碰撞,hash函数的性质告诉我们,这在计算上是相当难以实现的。也就是说,如果hash的自变量哈希函数不是交易记录key1,而是交易记录的哈希函数h(key1),即自变量x1 = h(key1),因变量y = h (x) = h[h(key1)]。此时如果有人试图将交易记录key1改为key2,但又不想让别人发现,那么y = h[h(key< @1)] 需要保持不变,即使y = h[h(key1)] = h[h(key2)])。根据前面hash函数的性质4 "碰撞约束aint":如果要找到另一个与x1不同的自变量x2,使h(x1)=h(x2))在计算上是不可行的。

基于以上内容,很容易想到,如果这个属性能应用到我们前面提到的就完美了。如果某个时间点的交易记录可以被散列,并且散列的输出是该交易记录在之后某个时间点的散列的输入,即h(x2) = h(h (x1)),那么不同时间点的交易记录会被hash紧密联系起来,任何变化不仅会改变自己的hash,还会改变跟随其中一个交易记录的所有hash参数,并且根据散列函数的性质,要找到另一个使后面的散列不变的数字在计算上是不可行的。随着时间的推移无法篡改。

四、推断区块链结构

因此,我们可以推导出区块链结构的初步框架:

1. 新增交易记录后,新账本记录为Bn,那么Bn至少需要包含以下内容:

(1)Bn对应发生的时间,即“时间戳”,记为tn

(2)中包含的所有交易记录,记为TXn

区块链哈希值交易记录查询

(3)前一个账本的哈希值,记为B(n-1).

所以:Bn=H(tn, TXn, B(n-1)),

其中 H(x) 是散列函数,它对参数 x 进行散列。所以 Bn 是三个参数 tn、TXn 和 B(n-1)散列在一起的结果。

2. 由于一个账本可以包含很多交易记录,为了让这么多交易记录成为一个自变量,从而简化哈希函数中交易记录的输入,我们可以对交易记录进行哈希处理,即散列多条交易记录TX1、TX2、TX3......成为一个输入值。

验证和记录交易的一种聪明方法是使用“默克尔树”。 Merkle Tree,也称为哈希树,本质上是一棵存储哈希值的二叉树。由下图可以看出,Merkle Tree的每个叶子节点都是每个交易信息的hash值,将相邻的两个hash值向上hash,直到顶部只剩下一个节点,称为Merkle根。以 Merkle 树的形式存储数据的好处是,可以用一个小分支来验证部分数据,而无需审查所有数据,提高了效率。

可以看出,通过上面的方法,我们将账本中包含的许多交易通过连续的散列转换成一个变量,即默克尔根。我们只需要使用 Merkle 根作为账本中的一个变量来包含所有交易。

即:Bn=H(tn, Merkle-n, B(n-1)),

其中,Merlke-n=H(TXn),所以Bn是三个自变量tn、Merlke-n、B(n-1)哈希在一起的结果。

此时,我们可以暂时回顾一下当前的进度。我们之前提出了五个问题:

--> 通过借鉴银行的实践,我们提出解决去中心化问题,核心是要有一个公开透明、所有人都可以查询和核对的系统,记账权公平安全,以及记录所有已确认交易记录的“总账”。

--> 在去中心化的情况下区块链哈希值交易记录查询,我们提出每个人都可以记账,任何一个账户都需要得到绝大多数人的确认和验证,只有满足以下条件才能被认为是真实有效的(即共识)大多数人都同意。

--> 利用哈希函数的性质,账本Bn=H(tn, Merkle-n, B(n-1)),新账本Bn和旧账本B(n- < @1)通过hash函数的紧密连接,即使是对历史记录稍加修改,都会导致新账本Bn的价值发生巨大变化,久而久之,篡改账本的成本就会增加。因此,在计算上可以认为账本被篡改的可能性较小。

3. 基于上一个问题的讨论,我们决定账本的权力不能委托给单一的第三方,第二是每个人都可以记账。但是,即使每个人都有记账的权利,我们还是要解决谁来记账的问题,否则,如果每个人只有权利而没有义务去记账,最终的结果就是没有人记账。陷入“三和尚无水可饮”的困境。

比特币区块链的做法是引入“竞争机制”。在前述函数Bn=H(tn, Merkle-n, B(n-1))中,引入了一个随机数nounce,即Bn=H(tn, Merkle-n, B(n-< @1),nounce),让大家“公平”地找到这个随机数,使得Bn小于“目标哈希值”(后面会解释,可以暂时理解为一个常数,也就是找到这个随机数,使得函数 Bn 的值小于某个数)。谁先找到这个随机数,谁就获得了订书的权利。由于找到这个随机数的唯一数学方法是通过穷举,谁计算速度最快的会是第一个。能找到这个随机数并获得记账权(所以,从某种意义上说,这种记账权并不完全“公平”,所以会有诸如 Proof 的其他方法比如Stake)。计算速度考验的是电脑的计算能力,计算能力是成本密集型的​​。为了补偿使用成本g 算力,这个账本会凭空生成一个“代币”——虚拟货币“比特币”(Bitcoin)——发行给获得了记账权的人,叫“旷工”,旷工叫“ “挖矿”通过消耗算力,找到随机数,获得记账权,获得比特币,通过算力进行挖矿的过程称为工作量证明(PoW)。

在此基础上,我们进一步修改账本的哈希函数:

Bn=H(tn, Merkle-n, B(n-1), nounce),

其中,Merlke-n=H(TXn),nounce是一个随机数。缺席者需要找到通知,以便 Bn