主页 > imtoken浏览器可以下载 > 多次阅读《比特币:一种点对点的电子现金系统》后的感悟

多次阅读《比特币:一种点对点的电子现金系统》后的感悟

imtoken浏览器可以下载 2023-01-17 00:56:41

概括:

完全点对点版本的电子现金应该允许在线交易直接从一方转移到另一方,而无需通过第三方金融机构。 数字签名为点对点电子现金提供了部分解决方案,但如果仍然需要可信任的第三方来防止双重支付,那么电子现金的大部分优势将丧失。 散列并添加到不断增长的基于散列的工作量证明链中,为每笔交易添加时间戳。 最长链不仅用来证明链上一系列交易的消息,还用来表明它是由最大的CPU资源池构建的。 只要大部分 CPU 资源掌握在不合作攻击网络的节点手中,它们就会产生最长的链并超过攻击者。 网络本身只需要最少的结构。 消息在尽力而为的基础上传播,节点可以随时离开和加入网络,接受最长的工作量证明链作为他们离开时发生的事情的证明。

1 简介

互联网上的交易几乎完全依赖金融机构作为可信赖的第三方来处理电子支付。 虽然这样的系统对于绝大多数交易都非常有效,但它具有基于信任的模型的固有缺点。 完全不可逆的交易是不现实的,因此金融机构无法避免争议调解。 争议调解的费用增加了交易成本,限制了最小实际交易规模并切断了小额临时交易的可能性,而更大的惩罚是丧失了为不可逆服务提供不可逆支付的能力。 当存在可逆性的可能性时,就会广泛传播对信任的需求。 商家必须对他们的客户保持警惕,与他们讨价还价以获得比他们需要的更多信息。 一定比例的欺诈被认为是不可避免的。 这些成本和支付的不确定性可以通过使用实物现金来解决,但没有任何机制可以在没有可信第三方的情况下通过通信渠道完成交易。

真正需要的是一种基于密码证明而非信任的电子支付系统,允许任何两方自愿直接与对方进行交易,而无需可信任的第三方。 计算上不可逆的交易保护卖家免受欺诈,并通过易于实施的托管机制保护买家。 在本文中,我们通过使用点对点分布式时间戳服务器生成可计算证明的时间顺序交易来解决双重支出问题。

计算上不可逆的交易将保护卖家免受欺诈,并且可以轻松实施定期托管机制来保护买家。 本文针对使用点对点分布式时间戳服务器生成交易时间计算证明的双重开销问题提出了解决方案。 只要诚实节点共同控制的 CPU 能力比任何合作的攻击者节点组都多,系统就是安全的。 只要诚实节点的集合比任何一组协作攻击节点控制更多的 CPU 资源,系统就是安全的。

2笔交易

我们将电子货币定义为数字签名链。 货币的所有者通过对先前交易的哈希和下一个所有者的公钥进行数字签名并将此信息添加到货币的末尾,将货币传递给下一个所有者。 收款人可以验证签名以验证链的所有权。

[图片上传失败...(image-6bf050-1562507194560)]

这里的问题是收款人无法确认没有任何所有者多次使用令牌。 一个常见的解决方案是引入一个受信任的中央机构或铸币厂来检测每笔交易的双重支出。 每次交易后,必须将代币返还给铸币厂以发行新代币,只有铸币厂直接发行的代币才被认为没有双重支出。 这个方案的问题是整个货币系统的命运取决于发行代币的公司,因为每笔交易都必须经过它们(这些铸币厂就像银行)。

我们需要一种方法让收款人知道以前的所有者没有签署较早的交易。 为此,最旧的交易是有效的,因此我们不需要在以后的关系中进行双花尝试。 确认交易存在的唯一方法是了解所有交易。 在基于铸币厂的模型中,铸币厂知道所有交易并决定哪一个先来。 为了在没有受信任方的情况下实现这一点,交易必须完全公开,我们需要一个让参与者就单一交易历史达成一致的系统。 收款人需要确认对于每笔交易,大多数节点都同意这是第一笔交易。

3 时间戳服务器

本文中介绍的解决方案从时间戳服务器开始。 时间戳服务器的工作原理是在块上为事物的哈希加上时间戳,并广泛传播哈希,就像报纸或博客一样。 时间戳证明此时数据显然应该存在,以便将数据转换为哈希。 每个时间戳的hash都包含了之前的时间戳信息,这样就形成了一条链,每一个新加入的时间戳都会加强之前的时间戳。

[图片上传失败...(image-95e65a-1562507194560)]

4 工作证明

为了在点对点的基础上实现分布式时间戳服务器,我们需要使用工作量证明系统,例如 Adam Back 的 Hashcash,而不是报纸或网络日志。 工作量证明在哈希时需要扫描哈希值。 例如,当使用 SHA-256 时,哈希值从 0 位开始。 所需的平均工作量随着 0 位的数量呈指数增长,这可以通过执行单个散列来验证。

在我们的时间戳网络中,我们通过仅在找到需要 0 位哈希的块时才向块添加随机数来实现工作量证明。 一旦 CPU 的努力使其满足工作量证明条件,则在不重做该工作的情况下不能对块进行任何更改。 因为跟在这个块后面的块都链接到它,所以改变这个块的操作需要改变跟在它后面的所有块。

[图片上传失败...(image-d5496a-1562507194559)]

工作量证明机制还解决了大多数决策中的确定性表示问题。 如果多数是基于一个 IP 地址、一票,那么拥有多个 IP 的任何人都可能造成破坏。 工作量证明更根本上是对一个 CPU 的投票。 在最大和最长的链上投入最多的工作代表了大多数决策。 如果大部分 CPU 由诚实节点控制,那么真正的链将增长最快并超越其他竞争链。 为了攻击一个过去的区块,攻击者需要重做这个区块和所有后续区块的工作量比特币线下现金交易,以赶上并超过诚实节点的工作量。 稍后我们将证明,随着后续块的增加,较慢的攻击者追上诚实节点的概率呈指数下降。

为了补偿硬件速度随时间的增加和运行节点的不同兴趣,工作量证明难度由每小时块数的变化平均值决定。 如果出块速度过快,工作量证明的难度就会增加。

5 网络

运行网络的步骤如下:

1 向所有节点广播新交易

2 每个节点将新交易添加到区块中。

3 每个节点都执行复杂的工作负载以找到它的块。

4 当一个节点找到工作量证明时,它会将区块广播给所有其他节点。

5 只有当区块中的所有交易都有效且未被消费时,节点才接受该区块。

6 个节点通过使用已接受块的哈希值作为先前的哈希值来同意该块 - 继续在链上工作以产生下一个块。

节点始终认为最长的链是正确的,并将继续努力扩展最长的链。 如果两个节点同时广播不同版本的下一个块,一些节点将选择最先收到的一个或另一个。 在这种情况下,他们在第一个收到的块上工作,同时保存另一个分支以防它变长。 当发现下一个工作负载时,此链接将断开,其中一个分支会更长,而在另一个分支上工作的节点将切换到更长的分支。

新交易的广播不一定需要到达所有节点。 只要他们通知了足够多的节点,他们就会在区块增长之前开始在区块上工作。 块广播也可以容忍信息丢失。 如果一个节点没有收到一个块,它会在收到下一个块并发现缺少一个块时请求它。

6 动机

在激励设计时,一个区块的第一笔交易是一个特殊的交易,它产生一个属于区块创建者的新代币。 这使得节点更有动力支持网络,因为没有中央机构来发行代币,而且它还提供了一种初始分配代币的方式。 新代币数量的稳步增长,就像矿工消耗资源,让更多的黄金进入流通。 在比特币中,花费的是 CPU 时间和电力。

激励也可以在交易费用中提供,如果交易输出的价值低于它投入的价值比特币线下现金交易,差额就是增加包含该交易的区块的激励的交易费用。 一旦进入流通的代币达到指定价值,激励就可以完全转化为交易费用,而不会产生任何通货膨胀。

激励可以帮助保持节点的诚实。 如果一个贪婪的攻击者拥有比所有诚实诚实的人更多的 CPU 资源,他需要在通过改变交易来欺骗他人和生产新的代币之间做出选择。 他应该发现遵守规则比攻击系统和他个人财富的有效性更有利可图,这比其他人给他带来更多的新代币。

7 回收磁盘空间

一旦在令牌中的最新交易之前有足够的块,就可以丢弃之前的交易以节省磁盘空间。 为了在不破坏区块哈希的情况下实现磁盘回收,比特币使用默克尔树(Merkle tree)对交易进行哈希处理。 在 Merkle 树中,块哈希只包含树节点的根。 可以通过修剪树来压缩旧块。 不再需要存储内部散列。

[图片上传失败...(image-d5ba2d-1562507194559)]

一个没有任何交易的区块头大约占 80 个字节。 假设每10分钟出一个块,一年大约需要80624*365字节=4.2MB。 在 2008 年,计算机系统通常包含 2GB 的 RAM,根据摩尔定律每年增长 1.2GB,因此即使块头都存储在内存中,存储也不是问题。

8 简化支付验证

可以在不运行所有网络节点的情况下验证支付的有效性。 用户只需备份最长工作量证明链的区块头即可。 可以通过不断查询网络节点,直到确定是最长链,得到区块头,同时得到带有时间戳的区块上的交易。 关联的 Merkle 树的分支。 用户无法自行验证交易,但可以将交易链接到链上,看到网络节点已经接受了交易,并将其加入区块进一步证明网络已经认可了交易。

[图片上传失败...(image-550c53-1562507194559)]

在上述方式中,只要诚实节点控制网络,验证是可靠的,但如果网络攻击者控制更多权力,则网络不堪一击。 如果网络节点可以自己验证交易,那么只要攻击者继续控制网络,简化的验证方法就可以被攻击者伪造的交易所欺骗。 一种对策是接受来自网络节点的警告。 当网络节点检测到无效块时,它会提示用户软件下载所有块并警告交易以确认不一致。 经常收到付款的企业可能仍希望运行自己的节点以获得更独立的安全性和更快的验证。

9 价值组合与分割

虽然硬币可以单独处理,但要制作

为转移中的每个点进行单独的交易。 要允许拆分和组合值,

交易包含多个输入和输出。通常会有一个输入

从一个较大的先前交易或多个输入中合并较小的金额,最多两个

输出:一个用于付款,一个用于将零钱(如果有)退还给发件人。

需要注意的是,当一个事务依赖多个事务时,fanout

事务依赖比较多,这里不是问题,不需要提取

完成交易历史的独立副本。

注:本文翻译自比特币白皮书