比特币:一个去中间机构的电子现金系统



摘要:一个纯粹的点对点电子现金,支付时应该可以直接从交易一方发给另外一方,而不需要经过中间机构。数字签名部分具备了此能力,但是仍然需要一个受信任的第三方来避免重复消费。这里提出一个基于点对点的通网络来实现去中间机构的电子现金系统,并解决重复消费的问题。在这个网络上,基于散列算法的工作原理,设计了一个足以证明工作量的算法,对交易进行运算得到一个网络时间戳,并将之加入一个持续增加的链表,加入这个链表上的数据不能被改变。最长的链不仅仅作为时间序列的证明,也代表了最大的CPU算力。只要加入网络的大部分CPU算力不协同攻击网络,他们就会生成最长的链表。这个网络自身只需要最小的结构记录哈希后的链表。交易消息可尽可能的广播出去,加入网络的节点可以离开并在需要时重新加入,并接受最长的链表作为他们离开期间发生事件的证明。

  1. 介绍

当前,互联网上的商业行为基本完全依赖于金融机构作为可信任的中间人来进行支付。尽管这种方式在很多情况下工作的足够好,但是因为信任基础模型的脆弱,仍然有一些交易受到了伤害。在这个模式下,纯粹的不可逆交易并不存在,因为金融机构会基于法律等因素进行调解。调解的开支增加了交易成本,限制了最小实际交易的额度,并阻止了小微临时交易的可能性,更重要的是失去了对不可逆服务提供不可逆支付的能力。因为逆向交易的可能,进一步放大了对信任的要求。商家因此必须对其客户保持警惕,要向其客户索要超出他们需要的更多信息。在这种模型下,一定概率的欺诈被认为是不可避免的。

电子支付系统需要一个基于算法证明而非中间机构的信任背书,来允许任意交易双方可以直接交易。不可逆的交易可保护卖家免受欺诈,基于简单的第三方数据托管就可以保护到买方。这里提出的解决重复消费问题的方案,基于点对点网络,使用分布式时间服务器,通过引入可足够证明工作量的算法,来为交易定义时序。只要遵守规则的节点CPU算力大于联合起来攻击系统的节点CPU算力,系统就是安全的。

  1. 交易

这里将电子货币为一个数字签名的链。每个所有人在将货币转移时,都要对上一次交易的散列值与下一个所有人的公钥进行签名,并将签名添加到链的末尾。收款方可以通过检查链末尾的签名来验证货币的拥有关系。

对于收款方而言,这里仅存在一个问题:就是无法验证付款方是否多次消费此货币。一个通常的做法是找一个受信任的中间人来确认货币是否存在重复消费,每次交易后,货币都回到中间人那,只有来自中间人的货币是可以信任的(没有被多次消费)。这个方案的问题是所有的货币依赖这个中间人,任何交易都必须经过他们的确认,与银行一样。

这里为收款方提供一个方法,以确认在此之前,付款方并没有消费此货币。只要证明当前交易是最早的,就可以认为是有效的,不用关心之后是否存在多次消费的可能,只要能够获得所有交易,这一点不证自明。在中间人模型中,中间人知道所有的交易并决定交易的先后顺序。为了在没有中间人的情形下达成此效果,交易就必须公开声明并广播出去,这里定义了一个网络,让所有参与者能收到所有交易,并基于其收到的交易信息,同意一个单一的交易历史顺序。收款方需要并可以简单证明大部分节点同意这个交易是最新的。

  1. 时间戳服务

时间戳服务器是这里的重点。时间戳服务器通过散列算法将一个块中的信息生成一个时间戳,并广泛发布这个时间戳,就像在报纸或电子公告牌发布信息一样。时间戳证明了其对应的数据存在,每一个时间戳都引用之前的时间戳,这样就形成了一个链,每个新进入的时间戳,都进一步加强证明了其之前的时间戳。

  1. 工作量证明

为了在点对点的基础设施上实现分布式时间戳服务,我们需要使用一个类似于Adam Back的哈希现金的工作量证明方法。这里使用的工作量证明是通过寻找一个值,将这个值附加到块信息商,计算其摘要结果(如SHA-256),获得的值与原先值相比只是增加了为0的前缀(bit为0)。这个工作量的复杂度与要求的0的数量相关,但是验证缺可以很简单(通过一次hash就可验证)。

这个网络中,一旦有CPU通过工作量证明算法获得响应结果,并将这个块加入链表,这个块就不能被改变,除非重做这个工作。随后的块都链接在这个块上,如果想改变这个块,就必须对随后的所有块都做同样的工作。

工作量证明同时解决了多数投票决策的问题,如果决策基于投票的IP地址数量,当一个投票人有很多IP时,公平性就被颠覆了,这里的工作量证明实际是一个CPU一票。多数人的决策结果由最长的链来表达,因为这个链代表了最大的工作量投入。如果大多数CPU算力由可信的节点控制,那么可信的链长度就增长得最快,并且超过其他的竞争链长度。要想修改过去的一个块,攻击者必须投入算力来重新计算这个块以及其后的所有块,并且还要超过和追上可信节点的工作。后面,我们会证明一个后来的攻击者追上工作量的可能性,会随着块的增加而指数级降低。

考虑到持续增强的硬件计算速度和网络内运行节点数量的变化,工作量证明的难度要跟随每小时块增加的数量来调整,如果增加的太快,难度就应该提升。

  1. 网络

运行这个网络的步骤如下:

  1. 新的交易被广播到所有节点
  2. 每个节点手机新交易到一个块
  3. 每个节点为这个块,计算一个较困哪的工作量证明
  4. 如果一个节点发现了此工作量证明,他就广播到所有节点
  5. 如果这个块中的所有交易是有效的并没有被用过,节点就接受这个块A
  6. 节点基于块A创建下一个块来表示接受此块。下一个块将使用A的哈希值

节点总是认为最长的链是正确的,并总是尝试延展他。如果两个节点同时广播不同版本的下一个块,一些节点可能先接受其中一个,这个时候他们在先接受到的块上工作,但是应该保留其他一个分支,以防止他变得更加长。这个分支的选择,将在收到下一个工作量证明时来确认,长的一个是应该保留的,其他的应该被废弃。

新的交易广播不需要到达所有的节点,只要送达足够的节点,他们不久就能进入一个块。块广播也允许丢失消息。如果一个节点没有收到块,他可以通过请求下一个块,就可以补齐丢失的部分。

  1. 激励

这里约定,一个块中的第一笔交易是一个特殊的奖励,即创建者拥有一个新币。因为没有中央权威机构去发行他们,这个激励机制来鼓励各个节点来实现货币的首发。保持一定数额货币的稳定增加,类似于金矿工人开发矿产,并将黄金投入流通一样,在这里就是消耗的CPU时间和电力。

激励还可以来自于交易手续费。如果交易的进入金额大约流出金额,就是因为增加了这个块中承载交易的手续费。一旦预先设定数量的货币投入流通,激励将完全来自于手续费。

激励将鼓励节点保持诚实。如果一个攻击者可以组织多余所有诚实节点的CPU算力,他有两个选择,一是通过欺诈来取消其做出的支付动作,另外一个是生成新的币。他能够很容易发现按照规则更有利,这个规则能让他获得的新币多于其攻击系统能省掉的。

  1. 回收磁盘空间

如果一个币经过太多次交易,在最后一笔交易时,可以将其之前的交易丢弃以节省存储空间。我们使用Merkle树来管理块的交易的hash值,以避免打乱块的hash值。旧的块可以从树的分支切除,分支内部的hash不用继续存放。

一个不含交易的块头大约80字节,假设每10分钟生成一个新块,那么一年生成的块所占用的空间为80 * 6 * 24 * 365 = 4.2MB,当前(2008年)计算机系统一般配置为2GB内存,而摩尔定理预测每年有1.2GB的增长,所以即使将这些块的头部全部存储在内存,也不是一个问题。

  1. 简化支付验证

验证支付并不需要所有节点参与。用户只需要保留最长的经过工作量证明链的块头,这些信息他可以从网络获得直到他确认是最长的一条,并获得Merk分支,将交易链接到特定含时间戳的块。通过检查交易在链上的位置,来确认网络节点是否接受,如果有块在其之后增加进来,则进一步确认网络已经接受此交易。

这样,只要诚实的节点控制网络,验证是可靠的。但如果网络被攻击者控制,就很脆弱。因为网络节点可以自己核实交易,只要攻击者能够继续控制网络,交易者通过伪造交易就可以简单的实现欺骗。防止这种情况的一种策略是,当网络节点检测到无效块时,接受它们发出的警报,提示用户的软件下载完整块,并提醒确认交易的不一致。经常收到付款的企业可能仍希望运行自己的节点,以实现更独立的安全性和更快的验证。

  1. 合并与拆分

尽管可以单独处理每一个币,但是在一个交易中为每一个币进行转账并不明智。为允许组合或拆分,交易包含多个输入和输出。通常输入有一个大面值的币或者是多个小面额的币组成,输出则由一个给到收款方的,一个是找零的(要退还给付款方)。

需要注意的是,交易可能依赖几个其他的交易,以此类推,会依赖于更多其他的交易,这并不是一个问题。我们工作中并不需要一个完整的交易历史副本。

  1. 隐私

传统的银行模式通过限制相关方和受信任的第三方对信息的访问来实现一定程度的隐私。这里要求公开宣布所有交易放弃了此方案,但隐私仍然可以通过保持公钥匿名来维持。公众可以看到有人在向他人发送金额,但没有将交易与任何人联系起来的信息。这类似于证券交易所发布的信息,在证券交易所,个人交易的时间和规模被公开,但并不告知当事人是谁。

还可以增加另外一层防护,可以为每个交易生成新的秘钥对,来避免被联系到特定的所有人。但是必须的关联还是会有,这还是会识别出这些交易来自于同一个所有人。如果必要的所有人信息泄露,这些关联会泄露所有其相关的交易。

  1. 计算

这里考虑一个场景:攻击者视图生成另外一条比可信链更长的链。即时攻击者实现这点,他也不能任意修改系统数据,例如凭空发行货币或者获得部署于自己的货币。节点不会接受无效的交易,可信的节点不会接受包含他们信息的块。攻击者智能修改自己的交易,收回最近花出去的货币。

供给链和可信链的竞争可以描述为二项式随机游走。成功的事件时可信链增加一个块,优势领先1,失败的事件是攻击链增加一个块,差距减少1.

攻击者追赶给定差距的概率类似于赌徒破产问题。假设一个拥有无限信用的赌徒从一个亏损开始,并可能进行无限次尝试以达到盈亏平衡。我们可以计算他达到收支平衡的概率,就是攻击者追到诚实链的概率,如下所示:

p = 可信节点生成下一个块的概率

q = 攻击者生成下一个块的概率

qz = 攻击者从z块追赶的概率

假设p>q,攻击者追赶上的概率,随着块数量的增加呈现指数级下降。

考虑下心交易的接受者需要等待多长时间才能充分证明发送方不能更改交易。如果付款方是攻击者,他肯定希望收款方相信他已经支付,并在过一段时间之后将交易收款方发送给自己,当收款方收到告警时,付款方希望为时已晚。

接收方生成一个新的秘钥对,并在签名前不久才将公钥提供给发送方。这可以防止发送方提前准备一个块,一旦交易被发送,攻击者必须开始处理其新的交易版本。

接收方等待交易被添加到一个块,并且在z个块被连接在其后。他不知道攻击者的确切进展,但是可假设城市区块的平均时间可预期,攻击者的潜在进度符合Poisson分布:

为了得到攻击者成功的概率,需要将指定点的概率指导z个块的概率累加:

简化如下:

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

  1. 结论

我们提出了一个不依赖中间信任机构的电子交易系统。从数字签名制成的币的通常框架,提供对所有权,但如果没有防止双重支出的方法,这是不完整的。为了解决这个问题,我们提出了一种使用工作证明记录交易公开历史的对等网络,如果诚实的节点被攻击者更改,这在计算上很快变得不切实际控制大部分CPU功率。该网络以其非结构化的简单性而健壮。节点在几乎没有协调的情况下同时工作。它们不需要被识别,因为消息是不发送到任何特定地点,只需在尽力的基础上交付。节点可以随意离开并重新加入网络,接受工作链的证明作为什么的证明他们不在的时候发生的。他们用CPU的力量投票,表示他们接受通过扩展有效块,并拒绝处理无效块他们任何必要的规则和激励措施都可以通过这种共识机制来实施。

  1. 附录

展开阅读全文

页面更新:2024-04-20

标签:中间人   攻击者   节点   工作量   概率   可信   货币   现金   机构   时间   系统   电子   信息   网络

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top