主页 > 钱包imtoken > 知道什么是区块链吗?

知道什么是区块链吗?

钱包imtoken 2023-01-18 13:57:13

本文是使用知乎在 VSCode 上创建并发布的,作者 shenhao

区块链技术:不同节点共同参与的分布式数据库,是一个开放的公共账本。由数据包组成一个区块,中间有一个加密的哈希值计算(密码技术),将不同时间段的交易信息链接起来,形成区块链。

第 1 章密码学和加密货币概述1.1 密码哈希函数

加密哈希函数

H(·)

特征:

安全哈希算法 256(简称 SHA-25)6)

MD(Merkle-Damgard)变换:为固定长度的输入建立一个哈希函数,然后通过一个通用的方法,可以将接受固定长度输入的哈希函数转换为接受任意长度输入的哈希函数。这种转换成为 MD 变换。

压缩函数:可用于固定长度、抗冲突的哈希函数。

MD变换的具体算法:例如压缩函数将长度为m的输入值代入,产生长度为n更短的输出值。散列函数的输入(可以是任意大小)被分成长度为 mn 的块。MD 变换的工作原理如下:将每个块和前一个块的输出代入压缩函数。注意输入长度变成(mn)+n=m,正好是压缩函数的输入长度。对于第一个块,之前不存在的块,我们需要选择一个初始向量。每次调用散列函数时都会再次使用此数字,实际上您可以直接在标准文档中找到它。最后一个块的输出就是您返回的内容。

安全散列算法:SHA-256 函数利用压缩函数将 768 位输入压缩为 256 位输出,块大小为 512 位。我们可以通过下图了解SHA-256的工作过程。

1.2 哈希指针和数据结构

哈希指针:指向数据存储位置的指针以及该位置数据的哈希值。

一个普通的指针可以告诉你数据存放在哪里,而哈希指针不仅可以告诉你数据存放在哪里,还可以给你一个方法来验证数据是否被篡改(即通过哈希值,可以简单的理解为文件的MD5码用于验证文件是否被篡改)

区块链(blockchain):我们通过散列指针构建一个链表,我们称这种数据结构为区块链。

区块链硬分叉如何实现的

在一个普通的链表中有一系列块,每个块都有数据和指向前一个块的指针。在区块链中,前一个块指针被一个哈希指针代替。因此,每个块不仅告诉我们前一个块的数据存储在哪里,而且还包含该值的摘要,使我们能够验证该值没有改变。我们存储链表的头部,也称为创世块,它是一个普通的哈希指针,指向最近使用的数据块。

1.3 数字签名

数字签名方案由以下三种算法组成:

因此,数字签名具有以下两个特点:

1.4 公钥是身份

也就是说,从数字签名模式中获取公共验证密钥 (pk),并将其等同于个人或系统参与者的身份。

公钥和私钥系统有助于引入去中心化身份管理的概念。用户可以注册任意数量的随机身份,理论上没有人可以通过查看pk来发现用户的真实身份。同时,这些身份在比特币语言中称为公钥地址或哈希值。

1.5 两种简单的加密货币第2章比特币是如何去中心化的

实现去中心化的五个主要问题:

2.1 分布式共识

分布式共识协议:在有n个节点的系统中,每个节点都有一个输入值,其中一些是错误的,甚至是恶意的。

分布式共识协议具有以下两个属性:

技术上需要解决的问题:

比特币共识算法算法(简化版)

简化假设:可以任意选择一个节点,这些节点都不会受到女巫攻击的影响。

区块链硬分叉如何实现的

女巫(节点):由恶意黑客创建的不同节点,这些节点看起来像是身份不同的人,但实际上是由一个人在幕后控制的。新交易被广播到所有节点。每个节点将新事务放入一个块中。在每一轮,一个随机节点可以广播它的区块。其他节点可以选择接受该块,前提是该块中的交易是有效的(具有真实签名)。节点可以将上述区块的哈希值放入自己的区块中,以表示对新区块的认可。如何解决双花问题?

一笔交易获得的确认越多,它就越有可能被纳入长期共识链。诚实的节点总是选择延伸最长的共识链。随着长链越来越长,双花的短链追上长链的概率越来越小。当只有少数恶意节点时,这个结论尤其正确。因为短链要追赶,这些恶意节点需要不断的选择。

事实证明,成功的双花攻击的概率随着确认次数的增加呈指数下降。因此,如果您感兴趣的交易已收到 k 个确认,则双花攻击交易被包含在长期共识链中的概率随着 k 呈指数下降。

在比特币生态系统中,最常见的方法是等待 6 次确认。并不是说数字 6 有什么特别的含义,只是在等待多长时间和确认自己感兴趣的交易是否包含在长期共识链之间取得了很好的平衡。

2.2 奖励机制和工作量证明区块奖励

根据比特币的规则,创建区块的节点可以在区块中添加特殊交易。本次交易为造币交易,类似于Scrooge Coin中的造币,节点可以指定本次交易的接收地址。当然,节点通常会选择一个属于它们的地址。您可以将其视为节点在共识链上创建块的付款。

每 210,000 个区块(约 4 年),区块奖励将减半。

为什么块奖励鼓励诚实的行为?

从表面上看,这个节点无论是提出有效区块还是恶意伪造都会得到奖励。但事实并非如此!想想这个节点是如何收集奖励的?只有当区块最终包含在长期共识链中时,才会实现奖励。因为铸币交易和其他所有交易一样,只有在最终包含在共识链中时才会被其他节点接受。这是比特币奖励系统的一个关键概念。这是一个非常微妙但非常强大的设计。这种设计激励节点想方设法让其他节点扩展自己的区块。因此,如果网络中的大多数节点都遵循延伸最长分支的规则,那么这样的设计将激励所有节点遵循这个规则。这是比特币的第一个奖励机制。

手续费

比特币的第二种奖励机制称为交易费用。

任何交易的制造者都可以选择使交易输出值小于输入值。第一个创建区块并将交易放入区块链的人可以将差额作为交易费用索取。如果您是一个节点,创建一个包含 200 笔交易的区块,那么这 200 笔交易的交易费用将支付到您放入区块的地址。这些交易费用现在完全是自愿的,但我们可以预见,随着区块奖励的逐步分配,交易费用将变得越来越重要,几乎是必要的,因为用户需要通过交易费用来保证合理的服务质量。

待解决的问题(解决方案:工作量证明) 挖矿和工作量证明

核心理念:我们将节点的随机选择改为根据某个节点占用某种资源的比例来选择节点。我们希望这个资源不能被任何人垄断。例如,如果资源是计算能力,我们称之为工作量证明系统。或者这个资源可以是某个硬币的所有权,我们称之为权益证明系统。

比特币使用哈希函数谜题来证明工作量证明。任何提出并创建区块的节点都想制作下一个区块,该节点必须找到一个数字,或者我们称之为临时随机数。当你把这个临时随机数,前一个区块的哈希值,和这个区块要填充的交易列表连接起来,形成一整串字符,然后用散列函数计算这整串的输出值字符区块链硬分叉如何实现的,相对于哈希函数的所有可能输出,输出值恰好落在一个小的目标范围内。

区块链硬分叉如何实现的

如果散列函数对谜题友好,解决散列谜题的唯一方法是尝试足够的随机数,直到成功。具体来说,如果这个目标区域是所有可能输出的 1%,那么您必须尝试大约 100 次才能成功。事实上,这个目标区域远小于输出范围的 1%。

使用这种散列函数难题和工作量证明方法,我们可以完全放弃节点的随机选择。这些节点在竞争哈希函数以解决难题的过程中始终相互独立。有时一个节点很幸运,只是找到了一个足够的临时随机数。然后幸运节点可以提议创建下一个块。这就是比特币系统实现完全去中心化的方式,没有人可以决定谁可以提交下一个区块。

第三章比特币运行机制3.1 比特币交易

在每笔交易中,都有一个输入值和一个输出值。输入值可以看成是要消耗的币(这些币是之前交易创造的),输出值可以看成是本次交易创造的币。铸造新币时,只创造新币,不消耗旧币(就像Scrooge币中的铸币一样,只有输出,没有输入)。每笔交易都有一个唯一的 ID。每个事务中可能有多个输出,输出的索引从 0 开始,所以我们称第一个输出为“输出 0”。例如下图中,在交易 ID=2 的输出中,17.0 -> Bob 被替换为 2[0] 并且 8.0 -> Alice 被替换为 2[1] . 当然,整个交易都是经过 Alice 授权的(即交易'

地址转移:在这个例子中,爱丽丝为什么要将硬币转移给自己?事实上,比特币就像 Scrooge Coin 中描述的货币。一笔交易输出的币要么在另一笔交易中被完全消耗掉,要么都没有被消耗掉,不会出现只消耗一部分币的情况。Alice 只需要付给 Bob 17 个币,但 Alice 在之前的交易中实际上收到了 25 个币,而为了花掉所有这些币,她必须将 8 个币转给自己。这 8 个币可以转移到另一个地址(不同于交易 1 中获得 25 个币的地址),但前提是该地址为 Alice 拥有,这称为地址转移。

验证:当新交易添加到账本时,其有效性是否易于验证?在此示例中,我们要检查 Alice 引用的交易输出,以确认她确实有 25 个硬币尚未使用。因为我们使用的是哈希指针,所以验证速度很快。为了确认这 25 个币没有被花掉,我们只需要从 Alice 引用的交易开始,继续检查直到账本上记录的最新交易——而不是从创建账本时的交易开始。此外,这种方法不需要添加额外的数据结构(当然,正如我们将看到的,添加新的数据结构将进一步提高速度)。

资金合并:与Scroogecoin一样,比特币交易可以有很多输入和输出,资金很容易分离和合并。假设 Bob 在两次不同的交易中收到了 17 个币和 2 个币,现在他想把这两个币合并起来消费,这很简单,他只需要发起一笔交易,交易有两个 Input 和一个 output,地址为输出是他自己的地址,所以 Bob 将两个交易合二为一。

共同支付:同样,共同支付很容易做到。如果 Carol 和 Bob 想一起给 David 付款,他们可以发起一个同样有两个输入和一个输出的交易,唯一的区别是两个输入指的是“最后一个交易”的输出地址不同,因此,这个交易需要两个签名: 卡罗尔和鲍勃的。

3.2 比特币脚本

交易的输入包括脚本(而不是签名)。为了确认一笔交易正确地获得了上一笔交易的资金输出,我们将交易的输入脚本和上一笔交易的输出脚本连接起来。这个链式脚本必须成功执行才能获得资金。这两个脚本,一个是输出脚本(scriptPubKey),另一个是输入脚本(scriptSig)。输出脚本只指定一个公钥(或公钥哈希的地址),输入脚本指定与公钥对应的签名。下图是两个脚本组合的例子。

图像-20210927221909172

: 发起人的签名。

:接收方提供的公钥。提供交易员的身份信息。

:发件人指定的公钥的哈希值。在最后一笔交易结束后指定您的帐户。

区块链硬分叉如何实现的

为了确认当前交易是否正确获得了上一笔交易输出的资金,我们将两个脚本链接起来,将上一笔交易的输出脚本(图中虚线下方)添加到当前交易的输入脚本中(虚线上方)之后,形成一个新的脚本。警告

有一个“?” 其中,用作标识符 - 我们稍后将检查它是否与当前交易提供的公钥的哈希匹配。执行脚本

image-20210927222548774

首先,我们复制指令 OP_DUP。这一步只是复制栈顶的公钥,放到栈顶;下一条指令是OP_HASH160,它获取栈顶的数据并计算其哈希值,然后将结果栈到栈顶。当指令执行时,我们将栈顶的公钥替换为公钥的哈希值。

接下来,我们需要在栈顶推入更多的数据:这个交易的发送者指定的公钥的哈希值

,以及对应的私钥,这样就可以完成签名并获得资金。此时,栈顶有两个值,一个是发送方指定的公钥的哈希值

(上一笔交易的输出脚本),另一个是接收方想要获取资金时提交的公钥的hash

(当前交易的输入脚本)。

这时候我们会执行EQUALVERIFY命令,用来检查栈顶的两个值是否相等。如果它们不相等,则会抛出失败信号并停止脚本执行。但是现在我们假设它是相等的,这意味着接收者正在使用正确的公钥。该指令删除栈顶的两条数据。此时,堆栈上还剩下两条数据:公钥和签名。

我们已经验证了接收方使用的公钥确实是交易中指定的那个,但是现在我们必须验证签名的真实性。在这种情况下,请使用 OP_CHECKSIG 命令。在这里我们可以看到比特币的脚本语言简单但功能强大。只需“OP_CHECKSIG”它就可以做一件很复杂的事情:从堆栈中取出两个值,然后用公钥验证整个交易的签名是否真实。

但是这里的签名到底是什么?签名函数的输入是什么?事实上,在比特币中,我们只能签署一件事——整个交易。因此,CHECKSIG 指令从堆栈中取出两条数据(公钥和签名),并验证签名对于整个交易(使用相应公钥发起的交易)是否有效。现在我们已经完成了所有的指令,堆栈上没有任何东西了。假设没有遇到错误,此脚本的输出为“真”,表示交易有效。

智能合约:与需要法律或仲裁保护的普通合约不同,智能合约是比特币系统中可以通过技术手段强制执行的合约。3.3 比特币网络

比特币网络是一个点对点网络,它遵循现有点对点网络的许多概念。在比特币网络中,所有节点都是平等的。没有等级,也没有特殊的节点,或者所谓的主节点。它运行在具有随机拓扑的 TCP 网络上,其中每个节点都连接到其他随机节点。也可以随时添加新节点。

随着新节点的加入和旧节点的随时离开,比特币网络实际上一直在变化。节点显式离开网络时没有强制规则,只要一个节点3小时没有音频,就会被其他节点慢慢遗忘。通过这种方式,网络可以非常温和地处理节点离线问题。

区块链硬分叉如何实现的

那么节点如何加入网络呢?

当您启动一个新节点时,首先向您认识的节点发送一条简单的消息。这个节点就是你的种子节点,当然,找到种子节点有不同的方法。然后你会问你的种子节点是否知道任何其他节点?链接到一个新节点后,可以多次重复这个过程,最后可以选择连接哪些节点。至此,你成为比特币网络中一个完全合格的节点。这些步骤中有很多随机性,理想情况下,您可以连接到一些随机的节点组。为了作为网络节点加入网络,您只需要首先知道如何链接到其中一个节点。

那么加入网络有什么好处呢?

当然是维护区块链。当我们发起交易时,我们希望整个网络都知道它。这是通过“洪水”算法(有时我们称之为“八卦”协议)完成的。如果 Alice 想向 Bob 转账,她的客户端发起一笔交易,然后将该交易传达给连接到她的客户端节点的所有其他节点,这些节点将执行一系列检查以决定是否接受并重新广播该交易。交易。如果验证通过,这些节点会将交易信息传播到与其相连的其他节点。节点收到交易信息后,会将交易放入交易池中,但需要注意的是,交易池中的交易并没有被打包进区块链。如果节点接收到的交易已经存在于交易池中,则不会再次传播。通过这种方式,可以确保泛洪协议将自动终止,而不是允许交易在网络上反复传播并且永不停止。由于每笔交易都有唯一的哈希值,节点可以很容易地查询一笔交易是否在自己的交易池中。

当节点收到新的交易信息时,如何验证?

3.4 软分叉和硬分叉

当比特币在 2009 年首次问世时,它的协议有许多固有的硬性限制,那是因为当时没有人想到它会发展成为一种主要的国际货币。例如每个区块的平均时间、区块的大小、每个区块的签名数量、分割、比特币总量、区块奖励结构等。

修订协议

那么我们究竟该如何修改比特币协议并引入一些新功能呢?您可能认为它就像发布新版本然后更新所有节点一样简单。但现实非常复杂,在实践中,我们根本不能假设所有节点都会更新。网络中的某些节点可能无法获取新版本,或者可能无法及时获取新版本。绝大多数节点都更新了协议,部分节点不更新的后果是否取决于协议更新的内容。根据结果​​,协议修订可以分为两种类型:一种导致硬分叉,另一种导致软分叉。

硬分叉(新版本视为有效,旧版本视为无效)

通过修改协议引入新功能可能会使之前版本的协议失效。也就是说,运行新版本协议的节点认为有效的块将被运行旧版本协议的节点认为无效。并且由于我们不能保证每个节点都会更新协议,我们只能假设大部分节点已经升级(新节点),但有些节点还没有升级(旧节点),很快,在最长的区块链分支中包含的部分区块会被老节点认为是无效的,所以老节点会认为另一个分支(在这个分支中,所有被新节点认为有效的区块都将被排除)为最长且有效的分叉。区块链并继续扩展这个分支,直到他们更新版本。

这种变化称为硬分叉,它分裂了原始链。网络上的所有节点都将根据它们运行的​​协议版本扩展两条不同的区块链,当然这两个分叉将永远不会再次合并。那些旧节点只要不更新版本,就会被永久排除在另一条链之外,这对比特币社区来说是不可接受的。

软分叉(新版本认为有效,旧版本自然认为有效。但旧版本认为有效,新版本可能认为无效。)

另一个修订是添加新功能,使现有的验证规则更加严格。旧节点仍将接受所有块,而新节点将拒绝一些。这种变化被称为“软分叉”。这避免了由硬分叉引起的永久分裂。

如果我们引入可以产生软分叉的新版本协议会发生什么?运行新版本协议的节点将使用一些更严格的规则。现在,假设大部分节点已经更新了新版本的协议并执行了新规则(这是产生软分叉的关键,因为旧节点不会执行新规则,新节点的数量需要大到足以竞争最长的链)。在这种情况下区块链硬分叉如何实现的,老节点可能会挖出一些无效的区块——因为这些区块包含一些在新规则下无法验证的交易,那么老节点就会知道他们验证为有效的区块不会被其他人验证。老节点接受(即使他们不知道为什么),这使得老节点的矿工更新协议。还,如果新节点用自己的区块扩展了老节点的分支,那么老节点也会依次展开分支,因为新节点验证了老节点可以验证的区块。不会有硬分叉,只有很多临时的小分叉。