比特币:一种点对点的电子现金系统
中本聪
2008年10月31日
摘要
一个完全的点对点版本的电子现金系统将允许在线支付直接从一方发送到另一方,无需通过金融机构。数字签名提供了解决方案的一部分,但是如果仍然需要信任的第三方来防止双重支付,则主要优势将会丧失。我们提出了一种使用点对点网络解决双重支付问题的方案。该网络通过将交易的时间戳哈希成一个不断变化的哈希工作证明锁链,形成一个不可更改的记录。最长的锁链不仅作为事件发生顺序的证明,而且证明它来自最大的CPU算力池。只要大多数CPU算力被不合作攻击网络的节点控制,它们就会生成最长的锁链并超越攻击者。网络本身需要最小的结构。信息以最大努力广播,节点可以自由加入和离开网络,接受最长的工作证明锁链作为他们离开时发生的事情的证明。
1. 引言
互联网上的商业几乎完全依赖于金融机构作为可信的第三方来处理电子支付。尽管该系统对大多数交易运作良好,但仍然存在基于信任模型的固有弱点。完全不可逆转的交易实际上是不可能的,因为金融机构无法避免调解争议。调解成本增加了交易成本,限制了最低实际交易规模,并剥夺了小额偶发交易的可能性,此外还有无法进行不可逆转的支付的损失。由于存在交易的可逆性,信任需求得到传播。商家必须谨慎对待他们的客户,对他们需求更多信息。一定比例的欺诈被接受为不可避免的。通过使用纸币可避免这一类成本和支付不确定性,但是没有机制可以在没有可信任方的通信渠道上进行支付。
所需的是使用加密证明而不是信任的电子支付系统,允许任意两方直接进行交易而无需可信任的第三方。计算上不可逆转的交易可以保护卖方免受欺诈,而常规的第三方担保机制可以很容易地实施以保护买方。在本文中,我们提出一种使用点对点分布式时间戳服务器解决双重支付问题的方案。只要诚实节点共同控制的CPU算力多于任何合作攻击节点组,该系统就是安全的。
2. 交易
我们将电子硬币定义为一系列数字签名。每个所有者通过将上一次交易的哈希和下一位所有者的公钥的数字签名添加到硬币的末端来将硬币转移给下一个所有者。收款方可以验证这些签名以验证所有权链。
当然,问题在于收款方无法验证所有者是否曾经双重支付硬币。常见的解决方案是引入一个受信任的中央机构或铸币处,以检查每笔交易是否存在双重支付。每笔交易之后,硬币必须退还给铸币处以发行新硬币,只有直接由铸币处发行的硬币才得到信任不会被双重支付。这种解决方案的问题在于整个货币系统的命运取决于运行铸币处的公司,每笔交易都必须经过他们,就像银行一样。
我们需要找到一种方式让收款方知道之前所有者没有签署任何早期交易。在我们的情况下,最早的交易是最重要的,因此我们不关心后来尝试双重支付。确认交易不存在的唯一方法是知道所有交易。在基于铸币处的模型中,铸币处知道所有交易并决定哪个最先到达。为了在没有信任的第三方的情况下实现这一点,交易必须公开宣布,参与者需要一套能够对链的接收顺序达成一致的系统。收款方需要证明,在每笔交易发生时,大多数节点都同意该交易是最早接收的。
3. 时间戳服务器
我们提出的解决方案始于一个时间戳服务器。时间戳服务器通过对要进行时间戳的一块条目进行哈希,并广泛发布哈希,例如在报纸或Usenet帖子中,来工作。时间戳证明了该数据必须在那个时间存在,显然,为了进入哈希中。每个时间戳都包括前一个时间戳在其哈希中,形成一个链,每个额外时间戳都会加强之前的时间戳。
4. 工作证明
为了在点对点基础上实现一个分布式的时间戳服务器,我们将需要使用类似于Adam Back的Hashcash的工作证明系统,而不是报纸或Usenet帖子。工作证明涉及扫描一个具有要求以多少零位开始哈希值的值,如使用SHA-256时进行哈希。所需的平均工作量与所需的零位数成指数关系,并可以通过执行单个哈希来验证。
对于我们的时间戳网络,我们通过在块中增加一个nonce来实现工作证明,直到找到一个给该块的哈希值提供所需零位的价值。一旦CPU工作已经花费使其满足工作证明,该块就不能更改而不进行工作的重做。由于稍后的块将被链接在它之后,所以改变该块的工作将包括对它之后的所有块重做的工作。
工作证明还解决了决定多数决策中的表示问题。如果多数基于一IP地址一票,那么任何能够分配多个IP地址的人都可以破坏它。工作证明本质上是一CPU一票。多数决策由最长的链表示,其中投入最大工作证明工作量的链被视为正确的。如果大多数CPU算力由诚实节点控制,那么诚实链将增长最快,并超过任何竞争的链。要修改过去的块,攻击者必须重做该块和其后的所有块的工作,并准备赶上并超过诚实节点的工作。我们将在稍后展示,慢一步的攻击者赶上的概率会随着后续块的增加而呈指数级下降。
为了抵消硬件速度的增加和随时间变化对运行节点的兴趣的差异,工作证明难度由移动平均数决定,以实现每小时生成的平均块数目标。如果生成得太快,难度将增加。
5. 网络
运行网络的步骤如下:
- 新交易广播到所有节点。
- 每个节点将新交易汇总到一个块中。
- 每个节点都在努力为其块找到具有困难的工作证明。
- 当一个节点找到一个工作证明时,它会将块广播到所有节点。
- 如果块中的所有交易都有效且尚未被使用,则节点仅接受该块。
- 节点表达对块的接受,通过继续创建链中的下一个块,使用接受块的哈希作为先前哈希。
节点始终认为最长的链是正确的,并继续努力扩展它。如果两个节点同时广播不同版本的下一个块,则某些节点可能会先收到其中一个。在这种情况下,他们将进行第一个接收的工作,但保存另一个分支,以防其最终变得更长。当下一个工作证明被发现并且一个分支变得更长时,纠结就会被打破;那些一直在工作另一条分支的节点将转向更长的那条。
新交易广播不一定需要到达所有节点。只要它们抵达大多数节点,它们将不久以后进入一个块。块的广播也能够容忍丢失的消息。如果一个节点没有收到一个块,它将在收到下一个块时请求该块,并意识到它错过了一个。
6. 激励
按照惯例,一个块中的第一笔交易是一个特殊的交易,开始由该块的创建者拥有的新硬币。这增加了节点支持网络的动力,并提供了一种最初将硬币流通开来的方法,因为没有中央机构发行它们。稳定增加一定数量的新硬币类似于黄金矿工消耗资源用于增加流通中的黄金。在我们的情况下,耗费的资源是CPU时间和电能。
激励也可以通过交易费来获得资金。如果交易的输出值少于其输入值,差额就是交易费,将被添加到包含该交易的区块的激励值中。一旦预定的硬币数量进入流通,激励可以完全过渡到交易费,并完全没有通货膨胀。
激励可能有助于鼓励节点保持诚实。如果一个贪婪的攻击者能够聚集比所有诚实节点更多的CPU算力,他必须在使用其来通过偷回他的支付或生成新硬币之间做出选择。他最终会发现按规则行事更有利于他,这就是通过这些规则来获得比其他所有人加起来更多的新硬币,比破坏系统和自己财富的有效性更有利的规则。
7. 回收磁盘空间
一旦一个硬币的最新交易被足够多的块深埋在下面,该交易之前的交易就可以被丢弃以节省磁盘空间。为了在不破坏区块哈希的情况下实现这一点,交易在默克尔树中进行哈希处理,只有根包括在块的哈希中。旧块可以通过截掉树的分支来进行紧凑处理。则内部哈希值无需被保存。
一个没有交易的块头约为80字节。假设每10分钟生成一个块,80字节*6*24*365 = 每年4.2MB。截至2008年,计算机系统通常配备2GB RAM,并且根据摩尔定律,每年增长1.2GB,即使必须将块头存储在内存中,存储空间也不是问题。
8. 简化支付验证
可以在不运行完整网络节点的情况下验证付款。用户只需保留最长工作证明链的块头副本,他可以通过查询网络节点获得,直到他确信拥有最长链,并获取将交易与其时间戳链相链接的默克尔分支。他无法自己检查交易,但通过将其链接到链中的一个位置,可以看到网络节点已接受它,并进一步确认网络已接受它。
因此,只要诚实节点控制网络,验证就是可靠的,但如果网络被攻击者击败,就会变得更加脆弱。尽管网络节点可以为自己验证交易,但简化方法可能会在攻击者继续压倒网络的情况下被欺骗。保护自己免受攻击的一种策略是接受网络节点在检测到无效块时发送警报,提示用户的软件下载完整的块和警报交易以确认不一致性。经常接收支付的企业可能仍然希望运行自己的节点以获得更独立的安全性和更快的验证。
9. 组合和拆分价值
虽然可能会单独处理硬币,但是对于每笔交易的每一分钱都要进行单独交易变得繁琐。为了允许价值分割和组合,交易包含多个输入和输出。通常会有来自较大先前交易的单个输入,或者是多个输入合并几个更小的金额,并且最多有两个输出:一个用于支付,一个将任何找零退回给发送方。
值得注意的是,这里不存在找开,其中一笔交易取决于几笔交易,而那些交易又取决于更多交易。在这里并不需要提取交易完整独立的副本的需要。
中本聪
2008年10月31日
摘要
一个完全的点对点版本的电子现金系统将允许在线支付直接从一方发送到另一方,无需通过金融机构。数字签名提供了解决方案的一部分,但是如果仍然需要信任的第三方来防止双重支付,则主要优势将会丧失。我们提出了一种使用点对点网络解决双重支付问题的方案。该网络通过将交易的时间戳哈希成一个不断变化的哈希工作证明锁链,形成一个不可更改的记录。最长的锁链不仅作为事件发生顺序的证明,而且证明它来自最大的CPU算力池。只要大多数CPU算力被不合作攻击网络的节点控制,它们就会生成最长的锁链并超越攻击者。网络本身需要最小的结构。信息以最大努力广播,节点可以自由加入和离开网络,接受最长的工作证明锁链作为他们离开时发生的事情的证明。
1. 引言
互联网上的商业几乎完全依赖于金融机构作为可信的第三方来处理电子支付。尽管该系统对大多数交易运作良好,但仍然存在基于信任模型的固有弱点。完全不可逆转的交易实际上是不可能的,因为金融机构无法避免调解争议。调解成本增加了交易成本,限制了最低实际交易规模,并剥夺了小额偶发交易的可能性,此外还有无法进行不可逆转的支付的损失。由于存在交易的可逆性,信任需求得到传播。商家必须谨慎对待他们的客户,对他们需求更多信息。一定比例的欺诈被接受为不可避免的。通过使用纸币可避免这一类成本和支付不确定性,但是没有机制可以在没有可信任方的通信渠道上进行支付。
所需的是使用加密证明而不是信任的电子支付系统,允许任意两方直接进行交易而无需可信任的第三方。计算上不可逆转的交易可以保护卖方免受欺诈,而常规的第三方担保机制可以很容易地实施以保护买方。在本文中,我们提出一种使用点对点分布式时间戳服务器解决双重支付问题的方案。只要诚实节点共同控制的CPU算力多于任何合作攻击节点组,该系统就是安全的。
2. 交易
我们将电子硬币定义为一系列数字签名。每个所有者通过将上一次交易的哈希和下一位所有者的公钥的数字签名添加到硬币的末端来将硬币转移给下一个所有者。收款方可以验证这些签名以验证所有权链。
当然,问题在于收款方无法验证所有者是否曾经双重支付硬币。常见的解决方案是引入一个受信任的中央机构或铸币处,以检查每笔交易是否存在双重支付。每笔交易之后,硬币必须退还给铸币处以发行新硬币,只有直接由铸币处发行的硬币才得到信任不会被双重支付。这种解决方案的问题在于整个货币系统的命运取决于运行铸币处的公司,每笔交易都必须经过他们,就像银行一样。
我们需要找到一种方式让收款方知道之前所有者没有签署任何早期交易。在我们的情况下,最早的交易是最重要的,因此我们不关心后来尝试双重支付。确认交易不存在的唯一方法是知道所有交易。在基于铸币处的模型中,铸币处知道所有交易并决定哪个最先到达。为了在没有信任的第三方的情况下实现这一点,交易必须公开宣布,参与者需要一套能够对链的接收顺序达成一致的系统。收款方需要证明,在每笔交易发生时,大多数节点都同意该交易是最早接收的。
3. 时间戳服务器
我们提出的解决方案始于一个时间戳服务器。时间戳服务器通过对要进行时间戳的一块条目进行哈希,并广泛发布哈希,例如在报纸或Usenet帖子中,来工作。时间戳证明了该数据必须在那个时间存在,显然,为了进入哈希中。每个时间戳都包括前一个时间戳在其哈希中,形成一个链,每个额外时间戳都会加强之前的时间戳。
4. 工作证明
为了在点对点基础上实现一个分布式的时间戳服务器,我们将需要使用类似于Adam Back的Hashcash的工作证明系统,而不是报纸或Usenet帖子。工作证明涉及扫描一个具有要求以多少零位开始哈希值的值,如使用SHA-256时进行哈希。所需的平均工作量与所需的零位数成指数关系,并可以通过执行单个哈希来验证。
对于我们的时间戳网络,我们通过在块中增加一个nonce来实现工作证明,直到找到一个给该块的哈希值提供所需零位的价值。一旦CPU工作已经花费使其满足工作证明,该块就不能更改而不进行工作的重做。由于稍后的块将被链接在它之后,所以改变该块的工作将包括对它之后的所有块重做的工作。
工作证明还解决了决定多数决策中的表示问题。如果多数基于一IP地址一票,那么任何能够分配多个IP地址的人都可以破坏它。工作证明本质上是一CPU一票。多数决策由最长的链表示,其中投入最大工作证明工作量的链被视为正确的。如果大多数CPU算力由诚实节点控制,那么诚实链将增长最快,并超过任何竞争的链。要修改过去的块,攻击者必须重做该块和其后的所有块的工作,并准备赶上并超过诚实节点的工作。我们将在稍后展示,慢一步的攻击者赶上的概率会随着后续块的增加而呈指数级下降。
为了抵消硬件速度的增加和随时间变化对运行节点的兴趣的差异,工作证明难度由移动平均数决定,以实现每小时生成的平均块数目标。如果生成得太快,难度将增加。
5. 网络
运行网络的步骤如下:
- 新交易广播到所有节点。
- 每个节点将新交易汇总到一个块中。
- 每个节点都在努力为其块找到具有困难的工作证明。
- 当一个节点找到一个工作证明时,它会将块广播到所有节点。
- 如果块中的所有交易都有效且尚未被使用,则节点仅接受该块。
- 节点表达对块的接受,通过继续创建链中的下一个块,使用接受块的哈希作为先前哈希。
节点始终认为最长的链是正确的,并继续努力扩展它。如果两个节点同时广播不同版本的下一个块,则某些节点可能会先收到其中一个。在这种情况下,他们将进行第一个接收的工作,但保存另一个分支,以防其最终变得更长。当下一个工作证明被发现并且一个分支变得更长时,纠结就会被打破;那些一直在工作另一条分支的节点将转向更长的那条。
新交易广播不一定需要到达所有节点。只要它们抵达大多数节点,它们将不久以后进入一个块。块的广播也能够容忍丢失的消息。如果一个节点没有收到一个块,它将在收到下一个块时请求该块,并意识到它错过了一个。
6. 激励
按照惯例,一个块中的第一笔交易是一个特殊的交易,开始由该块的创建者拥有的新硬币。这增加了节点支持网络的动力,并提供了一种最初将硬币流通开来的方法,因为没有中央机构发行它们。稳定增加一定数量的新硬币类似于黄金矿工消耗资源用于增加流通中的黄金。在我们的情况下,耗费的资源是CPU时间和电能。
激励也可以通过交易费来获得资金。如果交易的输出值少于其输入值,差额就是交易费,将被添加到包含该交易的区块的激励值中。一旦预定的硬币数量进入流通,激励可以完全过渡到交易费,并完全没有通货膨胀。
激励可能有助于鼓励节点保持诚实。如果一个贪婪的攻击者能够聚集比所有诚实节点更多的CPU算力,他必须在使用其来通过偷回他的支付或生成新硬币之间做出选择。他最终会发现按规则行事更有利于他,这就是通过这些规则来获得比其他所有人加起来更多的新硬币,比破坏系统和自己财富的有效性更有利的规则。
7. 回收磁盘空间
一旦一个硬币的最新交易被足够多的块深埋在下面,该交易之前的交易就可以被丢弃以节省磁盘空间。为了在不破坏区块哈希的情况下实现这一点,交易在默克尔树中进行哈希处理,只有根包括在块的哈希中。旧块可以通过截掉树的分支来进行紧凑处理。则内部哈希值无需被保存。
一个没有交易的块头约为80字节。假设每10分钟生成一个块,80字节*6*24*365 = 每年4.2MB。截至2008年,计算机系统通常配备2GB RAM,并且根据摩尔定律,每年增长1.2GB,即使必须将块头存储在内存中,存储空间也不是问题。
8. 简化支付验证
可以在不运行完整网络节点的情况下验证付款。用户只需保留最长工作证明链的块头副本,他可以通过查询网络节点获得,直到他确信拥有最长链,并获取将交易与其时间戳链相链接的默克尔分支。他无法自己检查交易,但通过将其链接到链中的一个位置,可以看到网络节点已接受它,并进一步确认网络已接受它。
因此,只要诚实节点控制网络,验证就是可靠的,但如果网络被攻击者击败,就会变得更加脆弱。尽管网络节点可以为自己验证交易,但简化方法可能会在攻击者继续压倒网络的情况下被欺骗。保护自己免受攻击的一种策略是接受网络节点在检测到无效块时发送警报,提示用户的软件下载完整的块和警报交易以确认不一致性。经常接收支付的企业可能仍然希望运行自己的节点以获得更独立的安全性和更快的验证。
9. 组合和拆分价值
虽然可能会单独处理硬币,但是对于每笔交易的每一分钱都要进行单独交易变得繁琐。为了允许价值分割和组合,交易包含多个输入和输出。通常会有来自较大先前交易的单个输入,或者是多个输入合并几个更小的金额,并且最多有两个输出:一个用于支付,一个将任何找零退回给发送方。
值得注意的是,这里不存在找开,其中一笔交易取决于几笔交易,而那些交易又取决于更多交易。在这里并不需要提取交易完整独立的副本的需要。
2 users upvote it!
0 answers