摘要:一种纯点对点的电子现金,在支付时,应该能够不经过中介,直接从一方发送到另一方。数字部分有这个能力,但还是需要一个可信的第三方,避免重复消费。本文提出了一种点对点的通信网络,实现了无中介的电子现金系统,解决了重复消费的问题。在这个网络上,基于hash算法的工作原理,设计了一个算法来证明工作量。该事务被计算以获得网络时间戳,该时间戳被添加到持续增长的链表中。无法更改添加到此链接列表的数据。最长的链不仅作为时间序列的证明,也代表了最大的CPU计算能力。只要加入网络的大部分CPU的计算能力不协同攻击网络,它们就会生成最长链表。网络本身只需要最小的结构来记录哈希链表。事务可以尽可能地广播,加入网络的节点可以在必要时离开和重新加入,并接受最长链表作为其离开期间事件的证明。
目前,互联网上的商业活动基本上依靠金融机构作为可信的中介进行支付。尽管这种方法在许多情况下足够有效,但由于基本信任模型的脆弱性,一些事务仍然会受到伤害。在这种模式下,纯粹的不可逆交易是不存在的,因为金融机构会基于法律等因素进行调解。调解费用增加了交易成本,限制了最低实际交易金额,防止了小微临时交易的可能。更重要的是,它失去了为不可逆服务提供不可逆支付的能力。因为反向交易的可能性,对信任的要求被进一步放大。因此,企业必须警惕他们的客户,并向他们索取比他们需要的更多的信息。在这种模式下,具有一定概率的欺诈被认为是不可避免的。
电子支付系统需要基于算法的证明,而不是中介的信任背书,以允许任何两方直接交易。不可逆交易可以保护卖家免受欺诈,简单的第三方数据托管可以保护买家。这里提出的重复消费问题的解决方案是基于点对点网络,使用分布式时间服务器,通过引入能够证明工作量足够大的算法,为事务定义时间顺序。只要遵守规则的节点的CPU能力大于联合起来攻击系统的节点的CPU能力,系统就是安全的。
在这里,电子货币是一连串的数字签名。大家在转账的时候,都要签上一笔交易的哈希值和下一个主人的公钥,把签名加到链尾。收款人可以通过检查链末端的签名来验证货币的所有权。
对于收款方来说,这里只有一个问题:无法核实付款方是否多次消费过这种货币。常见的做法是找一个信得过的中介,确认是否有重复消费的钱。每次交易后,钱又回到中介那里,只有中介出的钱才可信(不消费多次)。这种方案的问题在于,所有的货币都依赖于这个中间人,任何交易都必须经过他们的确认,就像银行一样。
这里有一个方法,让收款人确认付款人之前没有消费过这种货币。只要证明当前交易是最早的,就可以认为是有效的。不言而喻,不需要在意未来是否有多次消费的可能,只要能获得所有交易即可。在中间人模式中,中间人知道所有的交易,并决定交易的顺序。为了在没有中间人的情况下达到这种效果,交易必须公开宣布和广播。这里定义了一个网络,这样所有的参与者都可以接收所有的交易,并根据他们接收到的交易信息同意一个单一的交易历史序列。收款人需要并且能够简单地证明大多数节点同意该交易是最新的。
服务时间戳时间戳服务器是这里的关键点。服务器通过哈希算法从一个块中的信息生成一个时间戳,并广泛发布这个时间戳,就像在报纸或电子公告板上发布信息一样。时间戳证明了其对应数据的存在,每个时间戳引用之前的时间戳,这样就形成了一个链,每个新输入的时间戳进一步证明了其之前的时间戳。
工作负载证明为了在点对点基础设施上实现分布式时间戳服务,我们需要使用一种类似于Adam Back的hashed cash的工作负载证明方法。这里使用的工作负载是通过找到一个值,将其附加到块信息商,并计算其汇总结果(如SHA-256)来证明的。与原始值相比,获得的值只有前缀0(位为0)。此工作负载的复杂性与所需的零的数量有关,但验证缺失的零可能很简单(可以通过一个哈希来验证)。
在这个网络中,一旦CPU通过工作负载证明算法获得响应结果,并将这个块添加到链表中,这个块就不能被改变,除非重做工作。后续块链接到该块。如果要更改此块,必须对所有后续块进行同样的操作。
工作量证明同时解决了大部分投票决策的问题。如果根据投票的IP地址数量来决定,当一个投票者有许多IP地址时,公平性将被颠覆。这里的工作负载证明其实是一个CPU一票。大多数人的决策结果都是用最长的链条来表示的,因为这个链条代表了最大的工作量输入。如果大部分CPU计算能力由可信节点控制,那么可信链长度将增长最快,并超过其他竞争链长度。要修改过去的一个块,攻击者必须投入计算能力重新计算这个块和所有后续的块,还要超越和赶上可信节点的工作。后面我们会证明,后面的攻击者赶上工作量的可能性会随着块数的增加而呈指数级下降。
考虑到硬件计算速度的提高和网络中运行节点数量的变化,工作量认证的难度要随着每小时块数的增加而调整。如果增加太快,难度要加大。
网络运行该网络的步骤如下:
新事务被广播到所有节点。每个节点的新手机都很容易拿到块。每个节点为该块计算一个工作负载证书。如果一个节点找到这个工作负载证书,它将把它广播给所有节点。如果该块中的所有事务都有效且未使用,则该节点将接受该块。节点A基于块A创建下一个块,以表明它接受该块。下一个块将使用a的哈希值。节点总是认为最长的链是正确的,并总是试图扩展它。如果两个节点同时广播下一个块的不同版本,一些节点可能首先接受其中的一个。此时,他们在先前接受的块上工作,但是应该保留另一个分支以防止它变得更长。该分支机构的选择将在收到下一份工作量证书时确认。长的应该保留,其他的应该丢弃。
新的贸易广播不需要到达所有的节点,只要到达足够多的节点,他们很快就能进入一个街区。块也允许消息丢失。如果一个节点没有收到一个块,它可以通过请求下一个块来弥补丢失的部分。
激励这里约定的是一个街区的第一笔交易是特殊奖励,即创建者拥有一个新的货币。因为没有中央权威机构来发行它们,所以这种激励机制鼓励每个节点实现货币的初始投放。保持一定的货币量稳定增长,类似于金矿开采者开发矿产,将黄金投入流通,这里消耗的就是CPU时间和电量。
激励也可以来自交易费。如果交易的进场金额是流出金额左右,那是因为这一块交易的手续费提高了。一旦预设数量的货币投入流通,激励将完全来自手续费。
激励将鼓励节点保持诚实。如果攻击者能够组织所有诚实节点的CPU计算能力,他有两个选择:一是通过欺诈取消支付动作,二是生成新的硬币。他很容易发现遵守规则更有利,这可以让他获得比他的攻击系统可以节省更多的新硬币。
回收磁盘空间如果一种货币的交易次数过多,可以在最后一次交易中丢弃以前的交易,以节省存储空间。我们使用Merkle树来管理块事务的哈希值,以避免打乱块的哈希值。旧块可以从树的分支上切下,分支内部的hash不再需要存储。
没有事务的块标题大约是80字节。假设每10分钟生成一个新块,一年生成的块所占空间为80 * 6 * 24 * 365=4.2MB,目前(2008年)计算机系统普遍配置2GB内存,而摩尔定理预测每年增长1.2GB,所以即使这些块的头全部存储在内存中也不是问题。
简化支付验证。验证支付不需要所有节点都参与。用户只需要保留工作量证明链中最长的块头,就可以从网络中获取这个信息,直到确认是最长的一个,并获取Merk branch将事务链接到一个带时间戳的特定块。检查事务在链中的位置以确认网络节点是否接受它,如果在它之后添加了块,则进一步确认网络已经接受了该事务。
这样,只要诚实的节点控制着网络,验证就是可靠的。但是如果网络被攻击者控制,那就非常脆弱。因为网络节点可以自己验证交易,只要攻击者能够继续控制网络,交易者就可以简单地通过伪造交易进行欺骗。防止这种情况的一种策略是,当网络节点检测到无效块时,它们将接受报警,提示用户的软件下载完整的块,并提醒它们确认事务的不一致性。经常收到付款的企业可能仍然希望运行自己的节点,以实现更独立的安全性和更快的验证。
合并和拆分虽然每种货币都可以单独处理,但在一次交易中为每种货币转移资金是不明智的。为了允许组合或拆分,事务包含多个输入和输出。通常,输入由一个大面额货币或几个小面额货币组成,而输出由一个给收款人和一个找零(返回给付款人)组成。
需要注意的是,一个事务可能依赖其他几个事务,以此类推,还会依赖更多的其他事务,这不是问题。在我们的工作中,我们不需要交易历史的完整副本。
隐私的传统银行模式,通过限制关联方和可信第三方对信息的访问,实现了一定程度的隐私。要求公开宣布所有的交易都放弃了这个方案,但是仍然可以通过保持公钥匿名来维护隐私。公众可以看到有人在给别人送钱,但没有任何信息将交易与任何人联系起来。这类似于证券交易所发布的信息。在证券交易所,个人交易的时间和规模是公开的,但当事人并不知道。
您还可以添加另一层保护,并且可以为每个事务生成一个新的密钥对,以避免与特定的所有者相关联。但是必要的连接将仍然存在,这将仍然标识这些事务来自同一个所有者。如果必要的所有者信息被泄露,这些协会将暴露其所有相关交易。
这里考虑一个场景:攻击者视图生成另一个比可信链更长的链。即使攻击者意识到了这一点,也无法任意修改系统数据,比如凭空发钱或者获取部署在自己身上的钱。节点不会接受无效事务,可信节点不会接受包含其信息的块。攻击者智能地修改他们自己的交易,并追回最近花掉的钱。
供应链和可信链之间的竞争可以描述为二项随机游走。成功事件中,可信链添加一个块,前导1;失败事件中,攻击链增加一个格挡,差距减少1。
攻击者赶上给定缺口的概率类似于赌徒的破产问题。假设一个拥有无限信用的赌徒从亏损开始,可能会进行无限次尝试以达到收支平衡。我们可以计算他盈亏平衡的概率,也就是攻击者赶上诚信链的概率,如下:
P=可信节点生成下一个块的概率。
Q=攻击者生成下一个块的概率
Qz=攻击者从Z街区追上的概率
假设pq,攻击者追上的概率随着块数的增加呈指数下降。
考虑下一个事务的接收者需要等待多长时间才能完全证明发送者不能更改该事务。如果付款人是攻击者,他肯定是想让收款人相信他已经付款,过一段时间再把交易收款人发给自己。当收款人收到报警时,付款人希望为时已晚。
接收方生成一个新的密钥对,并在签名前不久将公钥提供给发送方。这可以防止发送方提前准备一个块。一旦事务被发送,攻击者必须开始处理其新版本的事务。
接收方等待事务添加到一个块中,z个块连接在它后面。他不知道攻击者的确切进度,但他可以假设城市街区的平均时间是可以预期的,攻击者的潜在进度符合泊松分布:
为了得到攻击者的成功概率,需要累加由指定点的概率引导的Z个块的概率:
简化如下:
c代码如下:
#包含数学. h
double attacker success probability(double q,int z)
{
双p=1.0-q;
双=z *(q/p);
双和=1.0;
int i,k;
for(k=0;k=z;k)
{
双泊松=exp(-);
for(I=1;I=k;我)
泊松*=/I;
sum -=泊松* (1 – pow(q/p,z-k));
}
返回总和;
}
运行结果如下:
//可以看出,随着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
结论我们提出了一个不依赖于中间信任机构的电子交易系统。由数字签名制成的硬币的通常框架提供了所有权,但如果没有办法防止重复支出,它是不完整的。为了解决这个问题,我们提出了一个用工作证书记录交易公共历史的对等网络。如果诚实的节点被攻击者改变,控制大部分CPU能力在计算上将很快变得不切实际。该网络因其非结构化的简单性而健壮。这些节点同时工作,很少协调。它们不需要被识别,因为消息不会被发送到任何特定的地方,而只是在尽最大努力的基础上被传递。节点可以随意离开和重新加入网络,并接受工作链的证明作为它们离开时发生了什么的证明。他们用CPU的力量投票,表示接受有效块的延期,拒绝处理无效块。任何必要的规则和激励措施都可以通过这种共识机制来实施。
附录