主页 > 下载imtoken官网苹果版 > 比特币——点对点电子现金系统

比特币——点对点电子现金系统

下载imtoken官网苹果版 2023-02-05 07:57:42

比特币——点对点电子现金系统

摘要:纯点对点电子现金需要允许人们直接在网络上进行支付,而无需通过任务金融机构。数字签名提供了部分解决方案,但主要问题是我们仍然需要一个受信任的第三方来防止双重支出。在本文中,我们提出了一种点对点网络解决方案来处理双花问题。网络对时间戳和交易进行哈希处理,并将它们放入一个不断增长的、基于工作量证明的链中,除非重新计算工作量,否则任何记录都不能被修改。最长的链不仅是所有事件的见证者,也证明了它拥有最大的 CPU 计算能力。只要网络中的大多数 CPU 能力不合作攻击网络,它们就会生成最长的链并跑赢攻击者。网络本身会将结构保持在最低限度。消息通过广播传递,但不保证传递,只会在N次内尽可能尝试。节点可以随时进入和退出网络,并且会接受它们不在时产生的最长链。

1. 简介

互联网上几乎所有的商业模式都需要金融机构作为受信任的第三方来处理电子支付。尽管该系统运行良好并处理了绝大多数交易,但它仍然具有固有的弱信任模型。完全不可逆的交易不可能真正存在,因为金融机构无法避免调解纠纷。这种中介的成本增加了交易的成本,限制了实际的最小交易规模,扼杀了可能的小额支付,而这种可逆的交易也造成了很多损失。由于交易逆转的可能性,对信任的需求不断扩大。商家必须小心对待他们的客户,不断“烦人”他们有更多的信息,以防止客户购买他们没有的东西' 不想要(然后客户发起“撤销”交易,将其退回 - 这将花费商家)。一定比例的欺诈是不可避免的。这种损失可以通过使用实际现金的线下支付来解决,但目前网络通信中还没有不需要第三方的支付机制。

我们真正需要的是一个电子支付系统,它不是基于信任,而是基于密码学,允许两个愿意的人直接进行支付,而不是通过第三方。基于计算的虚拟交易保护卖家免受欺诈,而普通交易凭证机制保护买家。在本文中,我们提出了双花问题的解决方案,对所有交易使用点对点分布式时间戳服务器来生成其订单的可计算证明。

2. 事务

我们将电子货币定义为一系列电子签名。如果币的拥有者想要转移货币(转账),他需要对之前的交易和下一个拥有者的公钥进行哈希运算,并将结果添加到货币的末尾。收件人可以通过确认货币所有权来验证签名。

这个时候,问题就来了。收款人虽然可以确认货币是否为付款人所有,但无法确认付款人是否将货币转给了两个人!这就是双花问题,也称为双花问题。常见的解决办法是找一个第三方中心机构,把用户的交易流在自己的机构里,这样就可以通过检查每笔交易来防止双花问题。每次交易后,必须将币退回铸币局,然后再发行新币,新币由铸币局直接发行,无需担心双花。这种解决方案的问题在于,我们将整个货币体系的命运掌握在运营铸币厂的公司手中,每笔交易都必须经过他们,

我们需要一种方法来允许收款人确认,而无需前任所有者签署之前的交易。为此,第一笔交易是最重要的,因此无需担心后续交易的双花。确保交易丢失的唯一方法是拥有所有交易历史记录。在铸币厂基础模型中,铸币厂需要知道所有交易并能够决定哪个交易先到达。为了实现不需要承担信任的机构,必须公开公布交易历史。收款人需要证明在这个时间点收到了每笔交易,大多数节点承认它实际上是第一个到达的。

3. 时间戳服务器

为了解决这个问题,我们首先需要一个时间戳服务器。时间戳服务器通过随机散列块中的一组数据来添加时间戳。同时,广播这个哈希值。就像报纸或世界新闻机构中的文章一样。显然,时间戳可以确认特定的数据一定存在于特定的时间,因为只有此时数据存在,才能得到对应的随机哈希值。每个时间戳都应该将前一个时间戳合并到它的随机哈希值中,每个后续时间戳都应该加强前一个时间戳,从而形成一条链。

4. PoW(工作证明)

为了在点对点的基础上实现分布式时间戳服务,我们需要使用类似于 Adam Back 的 HashCash 的工作量证明(PoW)系统,而像报纸一样工作显然是不够的。工作量证明需要在散列时扫描到特定的散列值,例如在 SHA-256 下,散列值以一定数量的 0 开头。随着 0 数量的增加,所需的工作量呈指数增长,但只需要一次哈希运算即可验证结果。

对于我们的时间戳网络,我们向区块添加一个随机数,并使区块的哈希值包含所需数量的 0。只要 CPU 消耗的工作量能够满足工作量证明机制,那么除非所有工作都重做,否则无法更改块。并且区块是一一相连的,改变一个区块中的信息也需要重新完成所有后续区块的工作量。

同时,工作量证明机制也解决了谁是多数代表的问题。如果大多数由一个 IP 地址一票决定,那么可以分配大量 IP 地址的节点将破坏公平性。工作量证明机制的本质是一个 CPU 一票。大多数由最长的链表示,因为最长的链具有最大的工作量。如果大部分 CPU 能力是诚实节点,那么最诚实的链将增长得更快,并超过任何竞争链。要修改过去的区块,攻击者必须重做该区块及其之后的所有区块的工作量证明,并且还需要赶上并超过诚实节点所做的工作。稍后我们将展示,如果较慢的攻击者试图赶上后续区块,其成功率将呈指数级下降。

另一个问题是硬件的计算速度在快速提升,节点参与网络的程度不同。为了解决这个问题,工作量证明的难度将使用移动平均目标法来确定,即难度目标是使得每小时的出块率是预定的平均值。如果块生成得太快,难度就会增加。

5. 网络

比特币网络的操作步骤:

新交易被广播到所有节点。每个节点将新事务添加到块中。每个节点都为自己的块做工作量证明。当一个节点完成工作量证明时,它会将证明广播给所有节点。当交易都在区块中并且没有被花费时,这个区块将被节点接受。节点通过创建链中的下一个块来表达他们对块的接受,使用接受块的哈希作为新块的前一个哈希。价值

节点总是将最长的链作为正确的链,并继续延伸最长的链。如果两个节点同时广播下一个块的两个不同版本,一些节点可能先接收一个块或先接收另一个块。此时,他们将处理最先出现的块,同时将另一个块保存到分支。当下一个工作量证明到来时,一个分支会变长,此时节点会切换到更长的分支。

新交易的广播不必广播到所有节点。只要到达许多节点,就会很快进入一个块。块广播也容忍消息的丢失。如果一个节点没有收到一个块,那么当一个新的块来的时候,它会意识到一个块已经丢失并且会请求这个块。

6. 奖励

按照惯例比特币最小交易金额,区块中的第一笔交易是针对区块创建者拥有的新比特币的特殊交易。这给了节点更多的动力来支持网络,并为货币发行和流通提供了一种方式,没有一个中心节点拥有发行货币的权力。不断增加的新硬币数量就像淘金者消耗资源以增加流通中的黄金。在我们的例子中,消耗是 CPU 时间和功率。

这种激励也可以通过交易费用来实现。如果一笔交易的输出值小于它的输入值,差额就是交易费用,它被添加到包含该交易的区块的激励价值中。一旦预定数量的硬币在流通,这种激励可以完全转变为交易费用,完全不受通货膨胀的影响。

这种激励有助于节点保持诚实。如果一个贪婪的攻击者拥有比所有诚实节点更多的 CPU 能力,他会选择使用这些资源来窃取他的付款以欺骗他人,或者使用这些资源来生成新币。他会发现遵守规则比破坏系统和他自己财富的有效性更有利可图,因为这些规则帮助他获得比其他人加起来更多的新硬币。

7. 磁盘空间回收

一旦硬币中的最新交易被埋在足够多的区块下,以前的交易就可以被丢弃以节省磁盘空间。为了在不破坏块散列的情况下促进这一点,交易在 Merkle 树 [7][2][5] 中进行散列,只有根包含在块的散列中。旧块可以通过砍伐树枝来压实。不需要存储内部哈希。

一个没有交易的区块头大约是 80 字节。假设每 10 分钟生成一个块,那么每年 80 字节 * 6 * 24 * 365 = 4.2MB。2008 年,计算机系统通常有 2GB 的内存,摩尔定律预测当前每年增长 1.2GB,因此存储不应该成为问题,即使块头必须保存在内存中。

8. 简单支付验证 (SPV)

无需运行完整的网络节点即可验证付款。用户只需要保留最长链的区块头的副本,通过查询网络节点比特币最小交易金额,直到他们确信他们拥有最长的链,并且可以将交易链接到时间戳打开的区块的 Merkle 分支。节点无法自行检查交易,但通过将交易链接到链中的某处,它可以看到网络节点已接受交易,并在进一步确认网络已接受交易后将其添加到块中。

因此,只要诚实节点控制网络,验证就可靠,但如果网络被攻击者控制,验证就容易受到攻击。虽然网络节点可以自己验证交易,但只要攻击者继续控制网络,简化的方法就可以被攻击者的伪造交易所欺骗。防止这种情况的一种策略是在网络节点检测到无效块时接收来自网络节点的警报,提示用户的软件下载完整的块,并提醒交易确认不一致。经常收到付款的企业可能仍希望运行自己的节点以获得更独立的安全性和更快的验证。

9. 货币组合和拆分

虽然可以单独处理硬币,但为每一分钱的转账执行单独的交易会很笨拙。为了允许值被拆分和组合,交易包含多个输入和输出。通常,一个较大的先前交易的单个输入,或多个较小金额的输入的组合,最多有两个输出:一个用于支付,一个用于向发送者找回(如果有的话)。

需要注意的是,当一个事务依赖多个事务,而多个事务又依赖于更多事务时,这里就不是问题了。无需提取交易历史的完整独立副本。

10. 隐私

传统银行模式通过限制相关方和受信任的第三方访问信息来实现一定程度的隐私。公开宣布所有交易的需要排除了这种方法,但仍然可以通过在另一个地方中断信息流来维护隐私:保持公钥匿名。公众可以看到有人正在向其他人转账,但没有任何信息将这笔交易与任何人联系起来。这类似于证券交易所发布的信息级别,其中个别交易(即“磁带”)的时间和规模是公开的,但不涉及各方是谁。

作为额外的防火墙,每个交易都应该使用一个新的密钥对来防止它们链接到公共所有者。对于多输入交易,一些链接仍然是不可避免的,这必然表明它们的输入属于同一所有者。风险在于,如果密钥的所有者被泄露,该链接可能会泄露属于同一所有者的其他交易。

11. 计算

让我们考虑一个攻击者试图比诚实链更快地生成替代链的场景。即使攻击者实现了这一点,它也不会将系统暴露于任意更改,例如无中生有地创造价值,或从攻击者那里拿钱。节点不会接受无效的支付交易,诚实节点也不会接受包含它们的区块。攻击者只能尝试更改他的一项交易以取回他最近花费的钱。

诚实链和攻击链之间的竞争可以描述为一个二项分布事件。成功事件是诚实链扩展了一个区块,增加了+1,失败事件是攻击者的链扩展了一个区块,减少了-1。

攻击者弥补给定赤字的概率类似于赌徒破产问题。假设一个拥有无限信用额度的赌徒开始亏损,并且可能有无数次尝试收支平衡。我们可以计算他达到盈亏平衡的概率,或者攻击者追上诚实链的概率,如[8]所示:

根据我们的假设,p > q,随着攻击者必须跟上的块数量的增加,概率呈指数下降。在他的劣势下,如果他一开始就没有走运,他的机会就很渺茫。

现在,我们考虑新交易的接收者需要等待多长时间才能充分确定发送者不能更改交易。假设发送方是一个攻击者,他想让接收方相信他支付了他一段时间,然后在一段时间后把钱还给了自己。发生这种情况时,接收者会收到警报,但发送者希望为时已晚。

接收方生成一个新的密钥对,并在签名前不久将公钥提供给发送方。这可以防止发送者通过不断地处理它来提前准备区块链,直到他有幸提前完成,然后在那一刻执行交易。一旦交易被发送,不诚实的发送者就会开始秘密地在包含他交易的另一个版本的平行链上工作。

接收者一直等到交易被添加到一个块中,之后 z 块被链接起来。他不知道攻击者的确切进度,但假设诚实块使用每个块的平均预期时间,攻击者的潜在进度将是具有预期值的泊松分布:

\(\lambda=z\frac{q}{p}\)

为了得到攻击者现在仍然可以赶上的概率,我们将他可能取得的每个可能进展的泊松密度乘以他将从该点赶上的概率:

为了得到攻击者现在仍然可以赶上的概率,我们将他可以赶上的概率乘以泊松密度......

转换成C代码...

#include 
double AttackerSuccessProbability(double q, int z)
{
	 double p = 1.0 - q;
	 double lambda = z * (q / p);
	 double sum = 1.0;
	 int i, k;
	 for (k = 0; k <= z; k++)
	 {
		 double poisson = exp(-lambda);
		 for (i = 1; i <= k; i++)
				 poisson *= lambda / i;
		 sum -= poisson * (1 - pow(q / p, z - k));
	 }
	 return sum; 
}

运行一些结果,我们可以看到概率随着 z 索引的增加而减小。

q=0.1
z=0    P=1.0000000
z=1    P=0.2045873
z=2    P=0.0509779
z=3    P=0.0131722
z=4    P=0.0034552
z=5    P=0.0009137
z=6    P=0.0002428
z=7    P=0.0000647
z=8    P=0.0000173
z=9    P=0.0000046
z=10   P=0.0000012
q=0.3
z=0    P=1.0000000
z=5    P=0.1773523
z=10   P=0.0416605
z=15   P=0.0101008
z=20   P=0.0024804
z=25   P=0.0006132
z=30   P=0.0001522
z=35   P=0.0000379
z=40   P=0.0000095
z=45   P=0.0000024
z=50   P=0.0000006

求解P小于0.1%...

P < 0.001
q=0.10   z=5
q=0.15   z=8
q=0.20   z=11
q=0.25   z=15
q=0.30   z=24
q=0.35   z=41
q=0.40   z=89
q=0.45   z=340

12. 结论

我们提出了一个不依赖信托的电子交易系统。我们从创建货币数字签名的一般框架开始,它提供了对所有权的强大控制,但如果没有防止双重支出的手段,它是不完整的。为了解决这个问题,我们提出了一个点对点网络,它使用工作量证明来记录交易的公共历史,如果诚实节点控制大部分 CPU 能力,攻击者就很难改变其计算历史. 网络的非结构化简单性是稳健的。节点在几乎没有协调的情况下同时工作。它们不需要被识别,因为消息不会被路由到任何特定位置,它只需要以尽可能最好的方式传递。节点可以随意离开和重新加入网络,接受工作量证明链作为他们离开时发生的事情的证明。他们以 CPU 的能力投票,通过扩展有效块来表示接受,并通过拒绝工作来拒绝无效块。在这种共识机制下,任何必要的规则和激励措施都可以执行。

引用