<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Untitled</title>
        <link>https://paragraph.com/@0x7775db07846dcbbe4b95284f6aa1e6c623301613</link>
        <description>undefined</description>
        <lastBuildDate>Sat, 08 Aug 2026 07:42:55 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[一文详解sol生态的崛起]]></title>
            <link>https://paragraph.com/@0x7775db07846dcbbe4b95284f6aa1e6c623301613/sol</link>
            <guid>QdYEXf8U4jM7I4MBq55G</guid>
            <pubDate>Fri, 22 Oct 2021 13:26:16 GMT</pubDate>
            <description><![CDATA[最近sol生态一路高歌猛进，币价也创下了新高，一个月内实现了翻倍，本文从背景，团队&投资人，项目特点，发展空间，个人计划进场点止盈点等多个角度对sol进行了全面的分析。 1:背景 Solana由前高通，英特尔和Dropbox工程师于2017年底创立，是一种单链委托权益证明协议，其重点是在不降低分散性或安全性的前提下提供可扩展性。Solana扩展解决方案的核心是名为“历史证明（PoH）”的分散式时钟，旨在解决分布式网络中没有单个可信赖时间源的时间问题。通过使用可验证的延迟功能，PoH允许每个节点使用SHA256计算在本地生成时间戳。这样就无需在整个网络上广播时间戳，从而提高了整体网络效率。 SOL是Solana区块链的本地令牌。Solana使用委托权益证明共识算法来激励令牌持有者验证交易。作为Solana安全设计的一部分，所有费用都将在SOL中支付并被烧掉，从而减少总供应量。这种通货紧缩的SOL机制激励了更多的代币持有者参股，从而提高了网络安全性。2:团队及投资人 Solana首席执行官兼创始人是Anatoly Yakovenko;CTO是Greg Fitzgerald;COO是R...]]></description>
            <content:encoded><![CDATA[<p>最近sol生态一路高歌猛进，币价也创下了新高，一个月内实现了翻倍，本文从背景，团队&amp;投资人，项目特点，发展空间，个人计划进场点止盈点等多个角度对sol进行了全面的分析。</p><p>1:背景</p><p>Solana由前高通，英特尔和Dropbox工程师于2017年底创立，是一种单链委托权益证明协议，其重点是在不降低分散性或安全性的前提下提供可扩展性。Solana扩展解决方案的核心是名为“历史证明（PoH）”的分散式时钟，旨在解决分布式网络中没有单个可信赖时间源的时间问题。通过使用可验证的延迟功能，PoH允许每个节点使用SHA256计算在本地生成时间戳。这样就无需在整个网络上广播时间戳，从而提高了整体网络效率。<br>SOL是Solana区块链的本地令牌。Solana使用委托权益证明共识算法来激励令牌持有者验证交易。作为Solana安全设计的一部分，所有费用都将在SOL中支付并被烧掉，从而减少总供应量。这种通货紧缩的SOL机制激励了更多的代币持有者参股，从而提高了网络安全性。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/9f079abb84a90a5415ee1e4f8b1b0f93ad61d9471a176863f6772f3c6dd0b3dd.jpg" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>2:团队及投资人</p><p>Solana首席执行官兼创始人是Anatoly Yakovenko;CTO是Greg Fitzgerald;COO是Raj Gokal。并具有创业经历和跨国大公司工作经验。目前也受到了众多资本的青睐。项目是用于安全和可扩展的去中心化应用程序和市场的web规模区块链。项目初心是支持所有快速增长和高频的区块链应用，以及让世界金融系统普惠平民百姓。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/1e9a4e871362397aa75a47bb87533ea728d2cc6d041cadd937f5b15b7c9f9d95.jpg" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>3:项目特点及市场需求</p><p>以太坊网络日益拥堵，不少技术使用了区块链拓展的主流方案-layer2和分片技术。但如果公链分片之后，可组合性是个必须要面对的问题，而sol没有分片，不必有这种顾虑和担忧。项目发展迅速，2017年发布白皮书，2018年发布主网，到今年4年的时间。sol生态发展非常迅速，sol不仅大力发展defi生态，发展出属于自已的独有生态。sol提高大力发展独有生态并通过将不同的解决方案引入其生态，大大降低了用户和开发人员进入其生态并体验其生态的门槛。通过在技术方面的突破，投资者，开发者，用户等多方的合力，促使sol在短期内实现了爆发，币价也实现了double 。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/19ad0bfb9dcf34ca2350e5b3cdb016758885e28d0df86f8ae5a129a9ea328d31.jpg" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>4:发展空间:目前市值已经越居圈内第八。最近两天也顺利破百，目前价格已经不具有投资性价比了。看表演就可以，毕竟目前市场空间比它大的项目不少，有可能10倍空间的也不少，没必要吃最后一块蛋糕。个人计划投资区间50以下。目前价格也差不多到了高峰了。适合分批止盈。</p><p>‖以上仅代表个人观点不构成投资建议。感兴趣的欢迎点赞关注，后续会继续更新。</p>]]></content:encoded>
            <author>0x7775db07846dcbbe4b95284f6aa1e6c623301613@newsletter.paragraph.com (Untitled)</author>
        </item>
        <item>
            <title><![CDATA[Filecoin白皮书 中文版 I - IPFS]]></title>
            <link>https://paragraph.com/@0x7775db07846dcbbe4b95284f6aa1e6c623301613/filecoin-i-ipfs</link>
            <guid>4oXXPAXToRdQfL0zL4XO</guid>
            <pubDate>Wed, 20 Oct 2021 14:28:03 GMT</pubDate>
            <description><![CDATA[Filecoin 一种去中心化的存储网络摘要当前互联网正处于一场革命中：集中式专有服务正在被去中心化开放服务所代替；信任式参与被可验证式计算所代替；脆弱的位置寻址被弹性的内容寻址所代替；低效率的整体式服务被点对点算法市场所代替；比特币、以太坊和其他的区块链网络已经证明了去中心化交易账本的有效性。这些公共账本处理复杂的智能合约应用程序和交易价值数百亿美金的加密资产。这些系统的参与者们形成去中心化的、没有中心管理机构或者可信任党派的网络提供了有用的支付服务，这是广泛互联网开放服务的第一个实例。IPFS通过分散的网页自身已经证明了内容寻址的有效性，它提供了全球点对点网络数十亿文件使用。它解放了孤岛数据，网络分区存活，离线工作，审查制度路线，产生了持久的数字信息。 Filecoin是一个去中心化存储网络，它让云存储变成一个算法市场。这个市场运行在有着本地协议令牌（也叫做Filecoin）的区块链。区块链中的旷工可以通过为客户提供存储来获取Filecoin,相反的，客户可以通过花费Filecoin来雇佣旷工来存储或分发数据。和比特币一样，Filecoin的旷工们为了巨大的奖励而竞争式挖区块...]]></description>
            <content:encoded><![CDATA[<p>Filecoin 一种去中心化的存储网络</p><h2 id="h-" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">摘要</h2><p>当前互联网正处于一场革命中：集中式专有服务正在被去中心化开放服务所代替；信任式参与被可验证式计算所代替；脆弱的位置寻址被弹性的内容寻址所代替；低效率的整体式服务被点对点算法市场所代替；比特币、以太坊和其他的区块链网络已经证明了去中心化交易账本的有效性。这些公共账本处理复杂的智能合约应用程序和交易价值数百亿美金的加密资产。这些系统的参与者们形成去中心化的、没有中心管理机构或者可信任党派的网络提供了有用的支付服务，这是广泛互联网开放服务的第一个实例。IPFS通过分散的网页自身已经证明了内容寻址的有效性，它提供了全球点对点网络数十亿文件使用。它解放了孤岛数据，网络分区存活，离线工作，审查制度路线，产生了持久的数字信息。</p><p>Filecoin是一个去中心化存储网络，它让云存储变成一个算法市场。这个市场运行在有着本地协议令牌（也叫做Filecoin）的区块链。区块链中的旷工可以通过为客户提供存储来获取Filecoin,相反的，客户可以通过花费Filecoin来雇佣旷工来存储或分发数据。和比特币一样，Filecoin的旷工们为了巨大的奖励而竞争式挖区块，但Filecoin的挖矿效率是与存储活跃度成比例的，这直接为客户提供了有用的服务（不像比特币的挖矿仅是为了维护区块链的共识）。这种方式给旷工们创造了强大的激励，激励他们尽可能多的聚集存储器并且把它们出租给客户们。Filecoin协议将这些聚集的资源编织成世界上任何人都能依赖的自我修复的存储网络。该网络通过复制和分散内容实现鲁棒性，同时自动检测和修复副本失败。客户可以选择复制参数来防范不同的威胁模型。该协议的云存储网络还提供了安全性，因为内容是在客户端端对端加密的，而存储提供者不能访问到解密秘钥。Filecoin的成果作为可以为任何数据提供存储基础架构的IPFS最上面的激励层。它对去中心化数据，构建和运行分布式应用程序，以及实现智能合同都非常有用。</p><p>这些工作包括以下几部分内容：</p><p>（a)介绍Filecoin网络，概述这个协议以及详细介绍几个组件。</p><p>（b)形式化去中心化存储网络（DSN)的计划与内容，然后构建Filecoin作为一个DSN。</p><p>（c)介绍一种叫“复制证明”的新型存储证明方案，它允许验证任何数据副本都存储在物理上独立的存储器中。</p><p>（d)介绍一种新型的以基于顺序复制和存储作为激励度量的有用工作共识。</p><p>（e)形成可验证市场，并构建两个市场，存储市场和检索市场，它们分别管理如何从Filecoin写入和读取数据。</p><p>（f)讨论用例，如何连接其他系统以及如何使用这个协议。</p><p>注意：Filecoin是一项正在进行的工作。正在进行积极的研究，本文的新版本将会出现在<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://filecoin.io/">https://filecoin.io</a> 如有意见和建议，请通过research@filecoin.io与我们联系</p><h2 id="h-1" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">1 介绍</h2><p>Filecoin是一种协议令牌，其区块链运行在一种叫“时空证明”的新型证明机制上，其区块被存储数据的矿工所挖。Filecoin协议通过不依赖于单个协调员的独立存储提供商组成的网络提供数据存储服务和数据检索服务。其中：(1)用户为数据存储和检索支付令牌 (2)存储矿工通过提供存储空间赚取令牌 (3)检索矿工通过提供数据服务赚取令牌</p><h3 id="h-11" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">1.1 基本组件</h3><p>Filecoin协议由四个新型组件组成</p><ol><li><p>去中心化存储网络(Decentralized Storage Network)(DSN)：我们提供一个由提供存储和检索服务的独立服务商网络的抽象（在第二节）。接着我们提出了Filecoin协议作为激励，可审计和可验证的DSN构建（在第4节）。</p></li><li><p>新型的存储证明：我们提出了两种新型存储证明方案（在第三节）：（1）“复制证明”（Proof-of-Replication）允许存储提供商证明数据已经被复制到了他自己唯一专用的物理存储设备上了。执行唯一的物理副本使验证者能够检查证明者是否不存在将多个数据副本重复拷贝到同一存储空间。（2）“时空证明”（Proof-of-Spacetime）允许存储提供商证明在指定的时间内存储了某些数据。</p></li><li><p>可验证市场：我们将存储请求和检索需求作为两个由Filecoin网络操作的去中心化可验证市场的订单进行建模（在第五节）。验证市场确保了当一个服务被正确提供的时候能执行付款。我们介绍了客户和矿工可以分别提交存储和检索订单的存储市场和检索市场。</p></li><li><p>有效的工作量证明（Proof-of-Work）：我们展示了如何基于“时空证明”来构建有效的工作量证明来应用于共识协议。旷工们不需要花费不必要的计算来挖矿，但相反的必须存储数据于网络中。</p></li></ol><h3 id="h-12" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0"><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://ipfs.netlify.app/tutorial/protocol-overview">1.2 协议概述</a></h3><ul><li><p>Filecoin协议是构建于区块链和带有原生令牌的去中心化存储网络。客户花费令牌来存储数据和检索数据，而矿工们通过提供存储和检索数据来赚取令牌。</p></li><li><p>Filecoin DSN 分别通过两个可验证市场来处理存储请求和检索请求：存储市场和检索市场。客户和矿工设定所要求服务的价格和提供服务的价格，并将其订单提交到市场。</p></li><li><p>市场由Filecoin网络来操作，该网络采用了“时空证明”和“复制证明”来确保矿工们正确存储他们承诺存储的数据。</p></li><li><p>最后，矿工们能参与到区块链新区块的锻造。矿工对下一个区块链的影响与他们在网络中当前存储使用量成正比。</p></li></ul><p>图一是使用了术语定义之后的Filecoin协议草图，伴随着一个例子如图2所示</p><br><blockquote><p>图1 Filecoin协议草图</p></blockquote><br><blockquote><p>图2 Filecoin协议例证，显示Client-Miner交互的概述。存储和检索市场分别显示在区块链的上方和下方，时间从左侧的订单匹配阶段推进到右侧的结算阶段。请注意，在进行小额支付以进行检索之前，客户必须锁定微交易的资金。</p></blockquote><h3 id="h-13" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">1.3 论文组织</h3><p>本文的其余部分安排如下：我们在第二节中介绍了对一个理论上的DNS方案的定义和需求。在第三节中我们定义和介绍我们的“复制证明”和“时空证明”协议，以及Filecoin将其用于加密地验证数据按照订单的要求被持续不断的存储。第四节描述了Filecoin DSN的具体实例，描述了数据结构，协议，以及参与者之间的交互。第5节定义和描述可验证市场的概念，还有存储市场和检索市场的实施。第6节描述了使用“时空证明”协议进行演示，并且评估矿工对网络的贡献，这对扩展区块链块和区块奖励是必要的。第7节简要介绍了Filecoin中的智能合约。在第8节中讨论了未来的工作作为结束。</p><h2 id="h-2" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">2 去中心化存储网络的定义</h2><p>我们介绍了去中心化存储网络（DSN）方案的概念。DSNs聚集了由多个独立存储提供商提供的存储，并且能自我协调的提供存储数据和检索数据服务给客户。这种协调是去中心化的、无需信任的：通过协议的协调与个体参与者能实施验证操作，系统可以获得安全性操作。DSNs可以使用不同的协调策略，包括拜占庭协议，gossip协议或者CRDTs，这取决于系统的需求。在后面，第四节，我们提供Filecoin DSN的的一个构建。</p><p><strong>定义 2.1.</strong> DSN方案(Π)是由存储提供商和客户运行的协议元组: (Put, Get, Manage)</p><ul><li><p>Put(data) → key: 客户端执行Put协议以将数据存储在唯一的标识符秘钥下。</p></li><li><p>Get(key) → data: 客户端执行Get协议来检索当前使用秘钥存储的数据。</p></li><li><p>Manage(): 网络的参与者通过管理协议来协调：控制可用的存储，审核提供商提供的服务并修复可能的故障、 管理协议由存储提供商来运行，并且经常与客户或者审计网络结合（在管理协议依赖区块链的情况下，我们认为矿工是审计人员，因为他们验证和协调存储提供商）。</p></li></ul><p>DSN方案(Π)必须保证数据的完整性和可恢复性，并且能够容忍在后面章节中所定义的管理和存储故障。</p><h3 id="h-21" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">2.1 故障容错</h3><h4 id="h-211" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">2.1.1 管理故障</h4><p>我们将管理故障定义为管理协议的参与者引起的拜占庭故障。一个DSN方案依赖于它的基础管理协议的故障容错。违反故障容错的管理故障假设可能会影响系统的活跃度和安全性。</p><p>例如，考虑一个DSN方案，其中管理协议要求拜占庭容错来审核存储提供商。在这样的协议中，网络收集到来自存储提供商的存储证明，并运行拜占庭容错对这些证明的有效性达成共识。如果在总共n个节点中，拜占庭容错最多容忍f个故障节点。那么我们的DSN可以容忍f小于n/2个故障节点。在违反了这些假设的情况下，审计上就要做出妥协。</p><h4 id="h-212" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">2.1.2 存储故障</h4><p>我们将存储故障定位为拜占庭故障，阻止了客户检索数据。例如存储矿工丢失了他们的数据，检索矿工停止了他们的服务。一个成功的Put操作的定义是(f,m),既是它的输入数据被存储在m个独立的存储提供商（总共有n个）中，并且它可以容忍最多f个拜占庭存储提供商。参数f和m取决于协议的实现。协议设计者可以固定f和m，或者留给用户自己选择。将Put(data) 扩展为Put(data,f,m)。如果有小于f个故障存储提供商，则对存储数据的Get操作是成功的。</p><p>例如，考虑一个简单的方案。它的Put协议设计为每个存储提供商存储所有的数据。在这个方案里，m=n,并且f=m-1。但总是f=m-1吗，不一定的，有些方案可能采用可擦除式设计，其中每个存储供应商存储数据的特定部分，这样使得m个存储供应商中的x个需要检索数据，在这种场景下f=m-x。</p><h3 id="h-22" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">2.2 属性</h3><p>我们描述DSN方案所必须的两个属性，然后提出Filecoin DSN所需要的其他属性。</p><h4 id="h-221" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">2.2.1 数据完整性</h4><p>该属性要求没有有限的对手A可以让客户在Get操作结束的时候接受被更改或者伪造的数据。</p><p><strong>定义 2.2.</strong> 一个DSN方案(Π)提供了数据完整性：如果有任意成功的Put操作将数据d设置在键k下，那不存在计算有限的对手A能使得客户在对键k执行Get操作结束的时候接受d‘，其中d’ 不等于d。</p><h4 id="h-222" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">2.2.2 可恢复性</h4><p>该属性满足了以下要求：考虑到我们的Π的容错假设，如果有些数据已经成功存储在Π并且存储提供商继续遵循协议，那么客户最终能够检索到数据。</p><p><strong>定义 2.3.</strong> 一个DSN方案(Π)提供了可恢复性：如果有任意成功的Put操作将数据d设置在键k下，且存在一个成功的客户Get操作通过对键K执行检索得到数据（这个定义并不保证每次Get操作都能成功，如果每次Get操作最终都能返回数据，那这个方案是公平的）。</p><h3 id="h-23" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">2.3 其他属性</h3><p>DSNs可以提供特定于其应用程序的其他属性。我们定义了Filecoin DSN所需要的三个关键属性：公开可验证性、可审查性和激励兼容性。</p><p><strong>定义 2.4.</strong> 一个DSN方案(Π)是公开可验证的：对于每个成功的Put操作，存储网络的供应商可以生成数据当前正在被存储的证明。这个存储证明必须说服任何只知道键但并不能访问键所对应的数据的有效验证者。</p><p><strong>定义 2.5.</strong> 一个DSN方案(Π)是可审查的：如果它产生了可验证的操作轨迹，并且在未来能被检查在正确的时间上数据确实被存储了。</p><p><strong>定义 2.6.</strong> 一个DSN方案(Π)是激励可兼容的：如果存储提供商由于成功提供了存储数据和检索数据的服务而获得激励，或者因为作弊而得到惩罚。所有存储提供商的优势策略是存储数据。</p><h2 id="h-3" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">3 复制证明与时空证明</h2><p>在Filecoin协议中，存储供应商必须让他们的客户相信，客户所付费的数据已经被他们存储。在实践中，存储供应商将生成”存储证明”(POS)给区块链网络（或客户自己）来验证。</p><p>在本节中，我们介绍和概述在Filecoin中所使用的“复制证明”n (PoRep)和“时空证明”(PoSt)实现方案。</p><h3 id="h-31" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">3.1 动机</h3><p>存储证明(POS)方案类似“数据持有性验证”(PDP)[2]和“可恢复性证明”(PoR)[3,4]方案。它允许一个将数据外包给服务器（既证明人P)的用户（既验证者V)可以反复检查服务器是否依然存储数据D。用户可以用比下载数据还高效的方式来验证他外包给服务器的数据的完整性。服务器通过对一组随机数据块进行采样和提交小量数据来生成拥有的概率证明作为给用户的响应协议。</p><p>PDP和PoR方案只保证了证明人在响应的时候拥有某些数据。在Filecoin中，我们需要更强大的保障能阻止作恶矿工利用不提供存储却获得奖励的三种类型攻击：女巫攻击(Sybil attack)、外包攻击(outsourcing attacks)、代攻击？（generation attacks）。</p><ul><li><p>女巫攻击：作恶矿工可能通过创建多个女巫身份假装物理存储很多副本（从中获取奖励），但实际上只存储一次。</p></li><li><p>外包攻击：依赖于可以快速从其他存储提供商获取数据，作恶矿工可能承诺能存储比他们实际物理存储容量更大的数据。</p></li><li><p>代攻击：作恶矿工可能宣称要存储大量的数据，相反的他们使用小程序有效地生成请求。如果这个小程序小于所宣称要存储的数据，则作恶矿工在Filecoin获取区块奖励的可能性增加了，因为这是和矿工当前使用量成正比的。</p></li></ul><h3 id="h-32" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">3.2 复制证明</h3><p>“复制证明”(PoRep)是一个新型的存储证明。它允许服务器（既证明人P)说服用户（既验证者V）一些数据D已被复制到它唯一的专用物理存储上了。我们的方案是一种交互式协议。当证明人P:（a）承诺存储某数据D的n个不同的副本（独立物理副本），然后（b）通过响应协议来说服验证者V，P确实已经存储了每个副本。据我们所知PoRep改善了PDP和PoR方案，阻止了女巫攻击、外包攻击、代攻击。</p><p>请注意，正式的定义，它的属性描述，和PoRep的深入研究，我们参考了[5]</p><p><strong>定义 3.1.</strong> PoRep方案使得有效的证明人P能说服验证者V，数据D的一个P专用的独立物理副本R已被存储。PoRep协议其特征是多项式时间算法的元组： (Setup, Prove, Verify)</p><ul><li><p>PoRep.Setup(1λ, D) → R, SP , SV , 其中SP和SV是P和V的特点方案的设置变量，λ是一个安全参数。PoRep.Setup用来生成副本R，并且给予P和V必要的信息来运行PoRep.Prove 和 PoRep.Verify。一些方案可能要求证明人或者是有互动的第三方去运算PoRep.Setup。</p></li><li><p>PoRep.Prove(SP , R, c) → πc，其中c是验证人V发出的随机验证， πc是证明人产生的可以访问数据D的特定副本R的证明。PoRep.Prove由P（证明人）为V（验证者）运行生成πc。</p></li><li><p>PoRep.Verify(Sv , c, πc) → {0, 1}，用来检测证明是否是正确。PoRep.Verify由V运行和说服V相信P已经存储了R。</p></li></ul><h3 id="h-33" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">3.3 时空证明</h3><p>存储证明方案允许用户请求检查存储提供商当时是否已经存储了外包数据。我们如何使用PoS方案来证明数据在一段时间内都已经被存储了？这个问题的一个自然的答案是要求用户重复（例如每分钟）对存储提供商发送请求。然而每次交互所需要的通信复杂度会成为类似Filecoin这样的系统的瓶颈，因为存储提供商被要求提交他们的证明到区块链网络。</p><p>为了回答这个问题，我们介绍了新的证明，“时空证明”，它可以让验证者检查存储提供商是否在一段时间内存储了他/她的外包数据。这对提供商的直接要求是：（1）生成顺序的存储证明（在我们的例子里是“复制证明”）来作为确定时间的一种方法 （2）组成递归执行来生成简单的证明。</p><p><strong>定义3.2.</strong> （时空证明）Post方案使得有效的证明人P能够说服一个验证者V相信P在一段时间内已经存储了一些数据D。PoSt其特征是多项式时间算法的元组： (Setup, Prove, Verify)</p><ul><li><p>PoSt.Setup(1λ,D)-&gt;Sp，Sv，其中SP和SV是P和V的特点方案的设置变量，λ是一个安全参数。PoSt.Setup用来给予P和V必要的信息来运行PoSt.Prove 和 PoSt.Prove。一些方案可能要求证明人或者是有互动的第三方去运算PoSt.Setup。</p></li><li><p>PoSt.Prove(Sp , D, c, t) → πc，其中c是验证人V发出的随机验证， πc是证明人在一段时间内可以访问数据D的的证明。PoSt.Prove由P（证明人）为V（验证者）运行生成πc。</p></li><li><p>PoSt.Verify(Sv , c, t, πc) → {0, 1}，用来检测证明是否是正确。PoSt.Verify由V运行和说服V相信P在一段时间内已经存储了R。</p></li></ul><h3 id="h-34-poreppost" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">3.4 PoRep和PoSt实际应用</h3><p>我们感兴趣的是PoRep和PoSt的应用构建，可以应用于现存系统并且不依赖于可信任的第三方或者硬件。我们给出了PoRep的一个构建（请参见基于密封的复制证明[5]),它在Setup过程中需要一个非常慢的顺序计算密封的执行来生成副本。PoRep和PoSt的协议草图在图4给出，Post的底层机制的证明步骤在图3中。</p><br><blockquote><p>图3 PoSt.Prove底层机制的插图显示了随时间推移存储存储的迭代证明</p></blockquote><br><blockquote><p>图4 复制证明和时空证明协议草图。这里CRH表示一个抗冲突的哈希x是要证明的NP语句，而w是见证。</p></blockquote><h4 id="h-341" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">3.4.1 构建加密区块</h4><p>防碰撞散列 我们使用一个防碰撞的散列函数：CRH : {0, 1}* → {0, 1}O(λ)。我们还使用了一个防碰撞散列函数MerkleCRH，它将字符串分割成多个部分，构造出二叉树并递归应用CRH，然后输出树根。</p><p>zk-SNARKs 我们的PoRep和PoSt的实际实现依赖于零知识证明的简洁的非交互式知识论（zk-SNARKs)[6,7,8]。因为zk-SNARKs是简洁的，所以证明很短并且很容易验证。更正式地，让L为NP语言，C为L的决策电路。受信任的一方进行一次设置阶段，产生两个公共密钥：证明密钥pk和验证密钥vk。证明密钥pk使任何（不可信）的证明者都能产生证明证明π，对于她选择的实例x，x∈L。非交互式证明π是零知识和知识证明。任何人都可以使用验证密钥vk验证证明π。特别是zk-SNARK的证明可公开验证：任何人都可以验证π，而不与产生π的证明者进行交互。证明π具有恒定的大小，并且可以在| x |中线性的时间内验证。</p><p>可满足电路可靠？的zk-SNARKs是多项式时间算法的元组：(KeyGen, Prove, Verify)</p><ul><li><p>KeyGen(1λ,C)→ (pk, vk)，输入安全参数λ和电路C，KeyGen产生概率样本pk和vk。这两个键作为公共参数发布，可在Lc上用于证明/验证。</p></li><li><p>Prove(pk, x, w) → π 在输入pk、输入x和NP声明w的见证时，证明人为语句x∈LC输出非交互式证明π。</p></li><li><p>Verify(vk, x, π) → {0, 1} 当输入vk，输入x和证明 π，验证者验证输出1是否满足x ∈ LC。</p></li></ul><p>我们建议感兴趣的读者参看[6，7，8]对zk-SNARK系统的正式介绍和实现。</p><p>通常而言这些系统要求KeyGen是由可信任参与方来运行。创新的可扩展计算完整性和隐私（SCIP）系统[9]展示了在假设信任的前提下，一个有希望的方向来避免这个初始化步骤。</p><h4 id="h-342" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">3.4.2 密封操作</h4><p>密封操作的作用是（1）通过要求证明人存储对于他们公钥唯一的数据D的伪随机排列副本成为物理的独立复制，使得提交存储n个副本导致了n个独立的磁盘空间（因此是副本存储大小的n倍）和（2）在PoRep.Setup的时候强制生成副本实质上会花费比预计响应请求更多的时间。有关密封操作的更正式定义，请参见[5]。上述的操作可以用SealτAES−256来实现，并且τ使得SealτAES−256需要花费比诚实的证明验证请求序列多10-100倍的时间。请注意，对τ的选择是重要的，这使得运行SealτBC比证明人随机访问R花费更多时间显得更加明显。</p><h4 id="h-343-porep" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">3.4.3 PoRep构建实践</h4><p>这节描述PoRep协议的构建并已在图4包括了一个简单协议草图。实现和优化的细节略过了。</p><p>创建副本 Setup算法通过密封算法生成一个副本并提供证明。证明人生成副本并将输出（不包括R)发送给验证者。</p><pre data-type="codeBlock" text="Setup
• inputs:
  – prover key pair (pkP ,skP )
  – prover SEAL key pkSEAL
  – data D
• outputs: replica R, Merkle root rt of R, proof πSEAL
"><code>Setup
• inputs:
  – prover <span class="hljs-keyword">key</span> pair (pkP ,skP )
  – prover SEAL <span class="hljs-keyword">key</span> pkSEAL
  – data D
• outputs: replica R, Merkle root rt <span class="hljs-keyword">of</span> R, proof πSEAL
</code></pre><p>证明存储 Prove算法生成副本的存储证明。证明人收到来自验证者的随机挑战，要求在树根为rt的Merkle树R中确认特定的叶子节点Rc。证明人生成关于从树根rt到叶子Rc的路径的知识证明。</p><pre data-type="codeBlock" text="Prove
• inputs:
  – prover Proof-of-Storage key pkPOS
  – replica R
  – random challenge c
• outputs: a proof πPOS
"><code><span class="hljs-string">Prove</span>
<span class="hljs-string">•</span> <span class="hljs-attr">inputs:</span>
  <span class="hljs-string">–</span> <span class="hljs-string">prover</span> <span class="hljs-string">Proof-of-Storage</span> <span class="hljs-string">key</span> <span class="hljs-string">pkPOS</span>
  <span class="hljs-string">–</span> <span class="hljs-string">replica</span> <span class="hljs-string">R</span>
  <span class="hljs-string">–</span> <span class="hljs-string">random</span> <span class="hljs-string">challenge</span> <span class="hljs-string">c</span>
<span class="hljs-string">•</span> <span class="hljs-attr">outputs:</span> <span class="hljs-string">a</span> <span class="hljs-string">proof</span> <span class="hljs-string">πPOS</span>
</code></pre><p>验证证明 Verify算法检查所给的源数据的哈希和副本的Merkle树根的存储证明的有效性。证明是公开可验证的：分布式系统的节点维护账本和对特定数据感兴趣的可以验证这些证明。</p><pre data-type="codeBlock" text="Verify
• inputs:
  – prover public key, pkP
  – verifier SEAL and POS keys vkSEAL, vkPOS
  – hash of data D, hD
  – Merkle root of replica R, rt
  – random challenge, c
  – tuple of proofs, (πSEAL, πPOS)
• outputs: bit b, equals 1 if proofs are valid
"><code>Verify
• inputs:
  – prover <span class="hljs-keyword">public</span> key, pkP
  – verifier SEAL <span class="hljs-keyword">and</span> POS keys vkSEAL, vkPOS
  – hash of data D, hD
  – Merkle root of replica R, rt
  – random challenge, c
  – tuple of proofs, (πSEAL, πPOS)
• outputs: bit b, equals <span class="hljs-number">1</span> <span class="hljs-keyword">if</span> proofs are valid
</code></pre><h4 id="h-344-post" class="text-xl font-header !mt-6 !mb-3 first:!mt-0 first:!mb-0">3.4.4 PoSt构建实践</h4><p>这节描述Post协议的构建并已在图4中包含了一个简单协议草图。实现和优化的细节略过了。</p><p>Setup和Verify算法和上面的PoRep构建是一样的。所以我们这里值描述Prove。</p><p>空间和空间的证明 Prove算法为副本生成“时空证明”。证明人接收到来自于验证者的随机挑战，并顺序生成”复制证明“，然后使用证明的输出作为另一个输入做指定t次迭代（见图3）。</p><pre data-type="codeBlock" text="Prove
• inputs:
  – prover PoSt key pkPOST
  – replica R
  – random challenge c
  – time parameter t
• outputs: a proof πPOST
"><code><span class="hljs-selector-tag">Prove</span>
• <span class="hljs-selector-tag">inputs</span>:
  – <span class="hljs-selector-tag">prover</span> <span class="hljs-selector-tag">PoSt</span> <span class="hljs-selector-tag">key</span> <span class="hljs-selector-tag">pkPOST</span>
  – <span class="hljs-selector-tag">replica</span> <span class="hljs-selector-tag">R</span>
  – <span class="hljs-selector-tag">random</span> <span class="hljs-selector-tag">challenge</span> <span class="hljs-selector-tag">c</span>
  – <span class="hljs-selector-tag">time</span> <span class="hljs-selector-tag">parameter</span> <span class="hljs-selector-tag">t</span>
• <span class="hljs-selector-tag">outputs</span>: <span class="hljs-selector-tag">a</span> <span class="hljs-selector-tag">proof</span> π<span class="hljs-selector-tag">POST</span>
</code></pre><h3 id="h-35-filecoin" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">3.5 在Filecoin的应用</h3><p>Filecoin协议采用”时空证明“来审核矿工提供的存储。为了在Filecoin中使用PoSt，因为没有指定的验证者，并且我们想要任何网络成员都能够验证，所以我们把方案改成了非交互式。因为我们的验证者是在public-coin模型中运行，所以我们可以从区块链中提取随机性来发出挑战。</p><hr><p>右侧导航栏快速筛选章节</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://ipfs.netlify.app/tutorial/whitepaperb.html">下部分：IPFS白皮书 中文版 II</a></p>]]></content:encoded>
            <author>0x7775db07846dcbbe4b95284f6aa1e6c623301613@newsletter.paragraph.com (Untitled)</author>
        </item>
        <item>
            <title><![CDATA[以太坊白皮书中文翻译加详解【全文汇总版-1】]]></title>
            <link>https://paragraph.com/@0x7775db07846dcbbe4b95284f6aa1e6c623301613/1-2</link>
            <guid>KsdEfuPNiulBRV9A9gll</guid>
            <pubDate>Tue, 19 Oct 2021 17:23:17 GMT</pubDate>
            <description><![CDATA[1、【标题】 标题：一个下一代的智能合约和去中心化应用平台。 首先，以太坊是next generation，下一代，那么上一代是谁，当然是Bitcoin比特币。 以太坊自称下一代，于是人们把它称为区块链2.0，而比特币就成了区块链1.0。 然后，以太坊是一个platform，是一个平台，Vitalik把以太坊定义成一个平台，而没有定义成一个application应用，或者像中本聪那样，定义成一个system系统。 平台是干嘛的，在互联网领域，平台泛指平台指进行某项工作所需要的环境或条件，也就是我们常说的，计算机硬件或软件的操作环境、运行环境，是承载各种软件或者应用的基础设施。 比如，操作系统windows是个平台，工程师在windows上面开发出各种应用，比如QQ，然后我们终端用户，也就是C端用户，在windows平台上来使用QQ。同样的，ios是苹果手机的系统平台，程序员在ios上开发出各种app，比如手机百度、手机淘宝、微信，然后我们用户在苹果手机上使用这些app。而以太坊做的，就是类似windows和ios这样的平台。 那以太坊这个平台拿来干嘛的？拿来跑smart cont...]]></description>
            <content:encoded><![CDATA[<p><strong>1、【标题】</strong></p><p>标题：一个下一代的智能合约和去中心化应用平台。</p><p>首先，以太坊是next generation，下一代，那么上一代是谁，当然是Bitcoin比特币。</p><p>以太坊自称下一代，于是人们把它称为区块链2.0，而比特币就成了区块链1.0。</p><p>然后，以太坊是一个platform，是一个平台，Vitalik把以太坊定义成一个平台，而没有定义成一个application应用，或者像中本聪那样，定义成一个system系统。</p><p>平台是干嘛的，在互联网领域，平台泛指平台指进行某项工作所需要的环境或条件，也就是我们常说的，计算机硬件或软件的操作环境、运行环境，是承载各种软件或者应用的基础设施。</p><p>比如，操作系统windows是个平台，工程师在windows上面开发出各种应用，比如QQ，然后我们终端用户，也就是C端用户，在windows平台上来使用QQ。同样的，ios是苹果手机的系统平台，程序员在ios上开发出各种app，比如手机百度、手机淘宝、微信，然后我们用户在苹果手机上使用这些app。而以太坊做的，就是类似windows和ios这样的平台。</p><p>那以太坊这个平台拿来干嘛的？拿来跑smart contract和decentralized application，即智能合约和去中心化应用。</p><p>smart contract智能合约是什么？</p><p>首先看合约是什么？</p><p>合约，即合同，《合同法》定义是，双方或多方当事人（自然人或法人）关于建立、变更、消灭民事法律关系的协议。合同有时也泛指发生一定权利、义务的协议，又称契约，如买卖合同、师徒合同、劳动合同以及工厂与车间订立的承包合同等。</p><p>也就是说，平等的合同主体经过意思表示一致，达成了某种受法律保护的权利义务关系。</p><p>合约怎么又“智能”了呢？</p><p>传统的合约关系，依靠的是国家法律强制力的保障，即当其中一方违约时，有第三方权威机构比如法院、仲裁机构，对违约方按照合约约定进行制裁和惩罚。</p><p>而“智能”，就体现在，合约无需依靠权威第三方来担保和执行，而是依据代码和程序的预先设定，在某种行为发生或者某些条件达成时，由程序或系统自动执行合约约定。</p><p>举个最简单的例子，我把房子抵押给你，向你借了一笔款，结果借款到期我不还，你要收我的房子的产权，但我就是老赖。你怎么办？传统办法是，你向法院提起诉讼，由法院来强制执行。但这时我玩起人间蒸发呢？这事儿会不会永远拖下去呢？</p><p>而智能合约智能的地方，就在于，我向你借款时，就把我的抵押物即房子所对应的产权归属预先通过程序设置好，当达到我逾期不还钱这个条件时，程序就自动把我房子的产权划到你名下，我们去房管局查房产证，就发现妈蛋这房子已经写上了你的名字，就不是我的了，这就不需要法院等第三方权威机构来介入了。</p><p>这里，我们看，执行这种智能合约，需要有先决条件，比如，第一，我的房子对应的产权要在这个系统这个平台上通过数字资产或者其他形式表现出来。第二，条件的预设，必须是双方意思表示一致的，而不是某一方单方面去预设某些条件而对方不知情。第三，我的产权对应的数字资产或其他形式的资产，上链时就必须准确无误。因为不可篡改是区块链的核心特征，要是一开始数据就错了，后面又改不了，怎么办。</p><p>decentralized application去中心化应用是什么？</p><p>decentralized application简称Dapp。我们知道app是各种应用，微信、QQ、支付宝什么的，我们电脑上、手机上各个小图标，就是各种app。这些app又称中心化应用，中心化，就是这些app是某个公司开发的，受控制与某个公司的。公司，就是中心。</p><p>那Dapp呢？举个例子秒懂！</p><p>把微信app的程序写在区块链上，开源，让全世界参与的节点共同来维护微信所有数据，腾讯对微信没有了控制权，任何人也别想对微信有控制权，微信社区完全开放、自治，微信所有数据加密后存在区块链上，整个微信社区中流通着wcc[WeChatCoin，微信币]……</p><p>之前市面上的区块链DAPP主要有游戏和挖矿等。比如2017年出现的以太猫CyptoKitties，之后又出现的蹭热度的百度莱茨狗、小米加密兔等区块链宠物游戏。</p><p>那Dapp究竟有什么用？</p><p>这不全世界最聪明的码农都还在探索嘛，别急！</p><p><strong>2、【前言】</strong></p><p>当中本聪在2009年一月第一次启动比特币区块链时，他同时引入了两个激进的未经测试的概念。</p><p>第一个是“比特币”，一种去中心化的点对点在线货币，这种货币能够维持一种价值，在什么条件下维持价值呢，在没有任何支持，本身又没有任何固有价值，又没有中心化发行方的情况下。</p><blockquote><p>就是说，比特币生产出来时本身不具备任何价值，也没有中央银行来发行它，也没有任何权威或者中心来给它背书，但它就能维持一种价值。这种价值当然不是指它的固有价值，比如黄金，它是贵金属，开采出来它就有固有价值。而这种比特币这种价值是指它的使用价值，流通价值。</p></blockquote><p>当目前为止，“比特币”作为一种现金单位，已经吸引了大量的公众注意，在哪些方面引人注意呢，在两方面都引人注意，一，在政治层面上，这种现金没有中央银行发行；二，它的价格巨幅波动。</p><p>但是，[与比特币]同样重要的是，中本聪伟大实验的另一方面：即，基于工作量证明的区块链让人们对交易顺序达成共识，这样一个概念。</p><p>作为一种应用，比特币可以被描述为一种先申请[first-to-file]系统：如果一个人有50个比特币，同时发送这50个比特币给A和B，那么只有第一笔得到确认的交易会被处理。</p><p>没有一种固有的方法来决定两笔交易哪一笔先到，这个问题阻碍了去中心化数字货币发展很多年。</p><p>中本聪的区块链是第一个可信的去中心化解决方案。</p><p>那么现在，注意力迅速开始转向比特币技术的第二部分，即区块链概念如何被用于货币之外的事情。</p><p>通常被提及的应用，包括使用区块链的链上数字资产来代表定制货币和金融工具 (&quot;颜色币&quot;)，相关物理设备(&quot;智能资产&quot;)的所有权，非同质资产例如域名 (&quot;域名币&quot;)，以及更多先进的应用例如去中心化交易所、金融衍生品、点对点赌博和区块链的链上身份和信誉系统。</p><blockquote><p>看懂木有啊？梳理一下吧。<br>以下这些，都是Vitalik说的，经常提到的应用：<br>1、区块链的链上数字资产来代表定制货币和金融工具 (&quot;颜色币&quot;)<br>这是神马玩意儿？这是指，可以和实物相联系的币被称为彩色币。比特币脚本语言允许存储少量的metadata(信息)，这段信息可以用来代表现实生活中的实物，也就是说现实生活中的实物和区块链上的彩色币联系起来。<br>大体是在比特币协定之上叠加新的协定，有点像互联网协议栈中，HTTP叠加于TCP/IP之上的方式。比如，彩色币发行者确定一个给定的交易输出 H:i(H为交易的杂凑值，i为输出序号)，代表一种特定的资产，并且发布一个所谓的“色彩定义”，就是指定该交易输出代表什么(例如H:i中的1聪 = 1盎司可由<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://link.zhihu.com/?target=http%3A//amagimetals.com">http://amagimetals.com</a>兑付的黄金)。然后用户在彩色币用户端装色彩定义档。当该“色彩定义”首次发布的时候，输出H:i是拥有该彩色的唯一交易输出。<br>彩色币这部分在白皮书下面的History的Alternative Blockchain Applications部分会再次提到。<br>2、相关物理设备(&quot;智能资产&quot;)的所有权<br>这就是智能合约里面对应的实体物理资产的产权<br>3、非同质资产例如域名 (&quot;域名币&quot;)<br>稀缺的、难以复制的、独一无二的、有唯一性的、用户享有绝对所有权的资产<br>4、去中心化交易所、金融衍生品、点对点赌博和区块链的链上身份和信誉系统</p></blockquote><p>另一个咨询到的重要领域是“智能合约”——能够根据随意预先设定的规则，自动转移数字资产的系统。</p><p>例如，一个人可能有一份存储合同长这样：“A每天可以提取X个单位的现金，B每天可以提取Y个单位的现金，A和B一起来的时候可以任意提取没有限制，并且A可以关闭B的提现权”。</p><p>这个合约符合逻辑的扩展就是去中心化自治组织 (DAOs)——长期智能合约，这个智能合约包含这个组织的所有资产，并且将组织的规章制度编成代码。</p><blockquote><p>解释一下，一个去中心化的组织(DAOs)，这个组织的一切行为都是基于数字化的，组织的所有运行规则都是按代码设置执行的，组织的所有资产也都是数字资产。它实际上是一个硬编码规则体系，而那些不是DAOs的组织，虽然也是基于区块链平台，但是决策和行为可能是由持有一定数量的代币或智能合约的“股东”来制定和执行的。<br>DAOs的一大优势在于，部署的代码和智能合约不容易被操纵或访问，这样可以最大程度地减少欺诈、作假、腐败等风险，但是如果规则需要与时俱进，或者优化升级，想要调整代码就难了，因为它的决策是通过电子方式，通过代码规则或所有成员投票来决定的。</p></blockquote><p>以太坊想要提供的是这样一个区块链，它内置成熟的图灵完备的编程语言，能够被用来创建“合约”，这种合约可以被用来对任意状态转换功能进行编码，从而允许用户创建以上所述的任意系统，以及许多其他的我们还没有想象到的系统，这些只需要写几行代码来实现这些逻辑就OK了。</p><blockquote><p>图灵，以Alan Mathison Turing阿兰·图灵（1912年6月23日－1954年6月7日）的名称命名的。阿兰·图灵是英国计算机科学家、数学家、逻辑学家、密码分析学家和理论生物学家，被视为计算机科学与人工智能之父。<br>图灵完备，如果一门编程语言或者一个指令集，可实现图灵机模型里面全部的功能，或者说能够满足任意数据按照一定顺序计算出结果；我们就可称其具有图灵完备性。以太坊是一个图灵完备的区块链系统，虚拟机可运行智能合约，理论上能够解决所有的可计算问题。</p></blockquote><p>合约可以被用来对任意状态转换功能进行编码之后，用户才可以创建出以上所述的各种系统。</p><p><strong>3、【历史】</strong></p><p>去中心化数字货币的概念，以及像财产登记之类的替代应用，已经被提出来很多年了。</p><p>1980年代和1990年代的匿名电子现金协议，很大程度依赖一种叫乔姆盲签名的密码学原语，这种匿名电子现金协议为货币提供了高度的隐私性，但是这种协议没能大规模地应用起来，因为它依赖一个中心化的媒介。</p><blockquote><p><strong>盲签名</strong><br>发布消息人先将消息盲化，让签名人对盲化的消息进行签名，最后，消息接收人对签字除去盲因子，得到签名者关于原消息的签名。盲签名就是接收人在不让签名人获取所签署消息具体内容的情况下，采取的一种特殊的数字签名技术。签名人对其所签署的消息是不可见的，即签名人不知道他所签署消息的具体内容，而签名消息也不可追踪，即当签名消息被公布后，签名人无法知道这是他哪次签署的。<br>打个简单的比方，A要寄一封信，封在信封里，但是要让B在信上签名，又不要B看见内容。怎么办？在信封里同时加入一张复写纸，于是B在信封上签名，信封里面的信上就同时印下了B的签名，这时B既没有看见信的内容，同时又在信上签了名。<br>另一点，A寄了很多信，都有B的盲签名，当公布出其中一封信时，B也不知道这是他哪次签的名。<br>[翻译注意：1、provided指的是e-cash protocols provided，不是指cryptographic primitive provided或者Chaumian blinding provided，2、mostly reliant on a cryptographic primitive known as Chaumian blinding这句话只是插入语，修饰一下anonymous e-cash protocols，真正的谓语是provided。这里网上有的翻译有点小错误]</p></blockquote><p>1998年，Wei Dai的b-money第一次提议了通过解决计算难题和去中心化共识来创造货币的思想，但是这个提议在细节上还有缺陷，即去中心化共识如何去实施。</p><p>2005年，芬尼（Hal Finney）介绍了“可重复使用的工作量证明”这一概念，即一个采用了两种方案的系统，哪两种方案？1、b-money的理念；2、亚当贝克（Adam Back）的通过有计算难度的哈希现金难题来创造加密货币的概念。但是[芬尼的这个概念]还是不够理想，因为它依赖可信的计算来支持。</p><blockquote><p>Wei Dai的b-money和亚当贝克（Adam Back）的Hashcash在比特币白皮书翻译与详解里面都有，不累述。</p></blockquote><p>因为货币是一种先申请应用，[上一篇说了，first-to-file先申请是指，假如如果一个人有50BTC，并且同时向A和B发送这50BTC，只有被首先被确认的那笔交易才会有效]，那么这种先申请应用，交易顺序通常就至关重要，去中心化货币就需要解决达成去中心共识的问题。</p><p>比特币之前的货币协议遇到的主要障碍是，尽管多年以来已经有大量的关于创造安全的拜占庭容错多方共识系统的研究，但是所有的协议都只解决了部分问题。</p><blockquote><p><strong>Byzantine-fault-tolerant拜占庭容错</strong><br>拜占庭帝国进攻敌国，敌国能抵御5支拜占庭军队，拜占庭帝国派出10支军队，这10支军队任何一支单独去进攻都毫无胜算，除非有至少6支军队（一半以上）同时进攻，才能攻下敌国。<br>10支军队分散在敌国的四周，依靠通信兵骑马相互通信来协商进攻意向及进攻时间。问题来了！他们不确定他们中是否有叛徒。叛徒可能擅自变更进攻意向或者进攻时间。在这种状态下，拜占庭将军们怎么才能保证有6支以上军队在同一时间发起进攻，从而攻下敌国？假定军队之间的通信毫无问题。<br>没有叛徒情况下：<br>假如一个将军A提出一个进攻提议（比如：明天上午9点进攻，你愿意加入吗？）由通信兵分别告诉其他的将军。<br>如果幸运，A将军收到了其他5位将军以上的同意，发起进攻。<br>如果不幸，其他将军在此时发出不同的进攻提议（比如：明天上午10点、11点进攻，你愿意加入吗？）。由于时间上的差异，不同的将军收到并认可的进攻提议可能是不一样的，这是可能出现A提议有3个支持者，B提议有4个支持者，C提议有2个支持者等等。<br>有叛徒情况下：<br>一个叛徒通信兵会向不同的将军发出不同的进攻提议（比如，通知A明天上午9点进攻， 通知B明天下午1点进攻）。<br>而一个叛徒将军也可能同意多个进攻提议（即同意明天上午9点进攻又同意明天下午1点进攻）。<br>这种发送前后不一致的进攻提议，被称为“拜占庭错误”。而能够处理拜占庭错误的这种容错性，就称为拜占庭容错，Byzantine fault tolerance，简称为BFT。<br>这些协议假设系统里所有的参与者是已知的，并且产生安全边界，什么安全边界呢，即“如果N方参与，那么系统可以容忍N/4的恶意参与者。”<br>也就是说，比特币出现之前的那些电子现金协议，都设置了一个多方参与多方共识的容错机制，即假设N个人参与进来，他们不是匿名的，而是已知的，那么系统最多可以容忍四分之一的人搞破坏。只要搞破坏的人不超过四分之一，那么这个系统还会运行良好。<br>但问题是，在一个匿名的环境里，这样的安全边界对<strong>女巫攻击</strong>是脆弱的，也就是容易受到女巫攻击，因为一个单一的攻击者可以在服务器或<strong>僵尸网络</strong>上创造上千个冒充节点，然后用这些节点来单方面控制大多数份额。<br><strong>sybil attack 女巫攻击</strong><br>在P2P网络中，因为节点可以随时加入或退出，那么为了维持网络稳定，同一份数据通常需要备份到多个分布式节点上，这叫做数据冗余机制。<br>如果网络中存在一个恶意节点，它可以通过控制多个虚假身份，然后利用这些身份控制或影响网络的其他正常节点。比如，原来需要备份到多个节点的数据被欺骗地备份到了同一个恶意节点（该恶意节点伪装成多重身份），这就是女巫攻击。<br>女巫攻击出自Flora Rhea Schreiberie在1973年的小说《女巫》（Sybil）改编的同名电影，讲的是一个化名Sybil Dorsett的女人被诊断为分离性身份认同障碍，兼具16种人格，分裂出16种身份。<br><strong>botnet 僵尸网络</strong><br>互联网上受到黑客集中控制的一群计算机，被黑客用来发起大规模的网络攻击，比如分布式拒绝服务攻击（DDoS）、发送海量垃圾邮件等，同时黑客控制的这些计算机所保存的信息也都可被黑客随意“取用”。<br>前面那句话就是说，在匿名环境下，比特币出现之前的那些电子现金协议，都是不可靠的，太脆弱。</p></blockquote><p>中本聪的创新之处在于，他的这个想法结合了两样东西，哪两样呢？1、一个非常简单的去中心化共识协议，基于节点每10分钟打包交易进入区块来创造一条持续延长的区块链；2、节点通过获取记账权来才能参与系统的工作量证明机制。</p><p>当拥有大量计算能力的节点确实有了相应的更大影响力，那么你要是想搞出比全网算力加起来还大的计算能力，就比仿照100万个节点还难。</p><blockquote><p>也就是说，当诚实节点控制了大系统多数，那这时你想搞出更大的算力来超所有诚实节点的算力，或者说超越全网算力，这个太难了，比你搞100万个假节点还难。<br>也就是，中本聪的创新之处在于，当诚实节点控制了大多数，系统就会安全。因为系统基于两点来运行，1、认可最长链；2、通过竞争工作量来获得记账权。（不明白仔细看<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://zhuanlan.zhihu.com/p/46226505">比特币白皮书翻译加详解</a>）</p></blockquote><p>尽管比特币区块链模型很简单粗糙，但是它已经被证明足够好，并且可能在未来五年成为全世界超过200种数字货币和协议的基石。</p><p><strong>3.1【比特币作为一种状态转换系统】</strong></p><p>从技术角度讲，比特币账本可以被看作一个状态转换系统，这个系统里面有一种“状态”，包含了：1、所有现存比特币的所有权状态，2、一个“状态转换函数”，这里面就包含了一种状态和一笔交易，然后可以输出为一种新的状态作为结果。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/477302cf9574b4205aa684bd1ae7d1fcbbf20e9a307a6b32006ccc95e75a3054.jpg" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><blockquote><p>上图，State是前一种状态，里面包含若干地址，中间是一个状态转换系统，也就是交易过程，在原地址上进行增减和签名， State&apos;是交易后得到的原地址新状态，因为交易后账户余额有变化了。</p></blockquote><p>例如，在标准的银行系统内，状态就是一本资产负债表，一笔交易就意味着一个请求，即把X元钱从A转给B，同时状态转换系统在A的账户减掉X元，在B的账户增加X元。</p><p>如果A的账户余额不足X元，状态转换函数就会返回错误提示。</p><p>因此，正式定义如下：</p><p>APPLY(S,TX) ­&gt; S&apos; or ERROR</p><p>这个函数的意思是，检查交易的格式是否正确（即有正确数值）、签名是否有效、随机数是否与发送者账户的随机数匹配。如是，通过；如否，返回错误。</p><p>而在银行系统内定义如下：</p><p>APPLY({ Alice: $50, Bob: $50 },&quot;send $20 from Alice to Bob&quot;) = { Alice: $30, Bob: $70 }</p><p>But:</p><p>APPLY({ Alice: $50, Bob: $50 },&quot;send $70 from Alice to Bob&quot;) = ERROR</p><p>当Alice和Bob的账上各有50美元时，如果Alice转给Bob20美元，返回结果为Alice账上有30美元，Bob账上有70美元。</p><p>但当Alice和Bob的账上各有50美元时，如果Alice转给Bob70美元，返回结果为错误。</p><p>“状态”在比特币系统中是所有已经挖出来但是没有被花费的币的集合(技术上讲，是没有花费的交易输出，unspent transaction outputs，简称UTXO) ，每一个币都有一个面值和一个所有者(由一个20字节的地址，实际上是一个密码学公钥所定义)[1]</p><blockquote><p>注释[1]：一个聪明的读者可能会注意到事实上比特币地址是椭圆曲线公钥的哈希，而非公钥本身。然而事实上从密码学术语角度把公钥哈希本身称为公钥是完全合理的。这是因为比特币密码学可以被认为是一种定制化的数字签名算法，公钥由椭圆曲线公钥的哈希组成，签名由椭圆曲线签名连接的椭圆曲线公钥组成，而验证算法包括用作为公钥提供的椭圆曲线公钥哈希来检查椭圆曲线公钥，以及之后的用椭圆曲线公钥来验证椭圆曲线签名。</p></blockquote><p>TX : Transaction（交易）</p><p>TXO : TX output（交易输出）：包含一个value值和一段脚本，该脚本规定了谁有权使用这笔交易（比如需要私钥签名）。</p><p>UTXO： Unspent TXO（未花费的交易输出）：只有对“尚未使用过”的交易签名才能是有效签名。</p><p>数字货币无法像金属货币（比如黄金）那样，仅靠物理转移即可转移所有权，即当A将一份黄金交给B后，A必然不再拥有这份黄金。</p><p>而A将一份数字货币转给（签名）B后，A仍可以把同一笔交易转给C，因为A掌握私钥，这两份签名均为有效签名，这就构成了“双花”。因此必须有一种机制来确保每笔交易只能使用一次，即只有对“尚未使用过”的交易签名才能是有效签名。</p><p>UTXO，未花费的交易输出，是比特币交易生成及验证的一个核心概念。因为所有比特币交易构成了一组链式结构，每笔交易都可以回溯到一个或多个交易的输出，而这些链条的源头实际上都是挖矿奖励，末尾则是当前未花费的交易输出。所有的未花费的输出即整个比特币网络的UTXO。</p><p>因为比特币每一笔新的交易的输入必须是某笔交易未花费的输出，每一笔输入同时也需要上一笔输出所对应的私钥进行签名，并且每个比特币的节点都会存储当前整个区块链上的UTXO，整个网络上的节点通过UTXO及签名算法来验证新交易的合法性。这样，节点不需要追溯历史就可以验证新交易的合法性。</p><p>一笔交易包含一个或多个输入，每笔输入包含一个对现有UTXO的引用和一个由关联所有者地址的私钥产生的密码学签名。而一个或多个输出，每个输出都包含一个被加入到状态里面的新的UTXO。</p><p>状态转换函数APPLY(S,TX) ­&gt; S&apos;可以就被大致定义为：</p><p>1、对每个交易输入：</p><p>i. 如果被引用的UTXO不在状态S内，返回错误；</p><p>ii. 如果签名与UTXO所有者不匹配，返回错误；</p><p>2、如果所有输入的UTXO面值总额比所有输出的面值总额小，返回错误；</p><p>3、返回状态S当所有UTXO输入被移除及所有UTXO输出被增加时，即当不存在以上错误时，返回到新状态S&apos;，S&apos;里面就已经移除了所有输入的UTXO，增加了所有输出的UTXO。</p><p>第一步的前一半防止交易发送者花不存在的币，后一半防止交易发送者花其他人的币，第二步来确保交易前后价值守恒。</p><p>为了将此应用与支付，协议如下：</p><p>假设Alice想发送11.7个币给Bob。</p><p>首先，Alice将寻找一套她已有的UTXO，总数至少要等于11.7个比特币。</p><p>事实上，Alice不可能刚好有11.7个比特币，如果假设她能得到的最小数量是6+4+2=12个币的话。</p><p>然后她用6+4+2这三笔输入来创建一笔交易，这笔交易有两个输出。</p><p>第一笔输出是11.7个币，这11.7个币在Bob的地址上，因为Bob成了这11.7个币的所有者。第二笔输出是剩下的0.3个币，“找零”，所有者还是Alice自己。</p><p><strong>3.2【挖矿】</strong></p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/e182ea3f4f350be0d69db067905a2945505e303e21961c6353423af95f706110.jpg" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>如果我们已经接入了一个可信的中心服务，这个系统可能部署起来就普普通通的，它可以轻松通过编码来实现。</p><p>但是，比特币呢我们想把它建成一个去中心化的系统，因此我们需要结合状态转换系统和共识系统这两者，以此确保每个人都认可里面的交易顺序。</p><p>比特币的去中心化共识处理，需要网络中的节点持续地尝试产生交易包，称之为“区块”，就是持续地把交易打包到区块中。</p><p>网络大约每10分钟产生一个区块，每个区块包含一个时间戳、一个随机数、一个对上一区块的引用 (例如hash值)，和一个自上一个区块开始已经发生的全部交易的清单。</p><p>如前面的图所示。</p><p>这就随时间创造了一个持续的不断延长的“区块链”，它不断的更新，以此代表最新的比特币账本状态。</p><p>范例中所表达的，检查一个区块是否有效的算法，如下：</p><p>1、检查本区块引用的前一个区块是否已经存在且有效；</p><p>2、检查本区块的时间戳晚于前一个区块的时间戳，且早于未来2小时；</p><p>3、检查本区块的工作量证明是否有效</p><p>4.、用S[0]表示前一个区块的最终状态</p><p>假设TX是本区块的交易清单，清单里一共有n笔交易。当i=0……n-1时，对所有的i进行状态转换，S[i+1] = APPLY(S[i],TX[i]) 。如果任何又一次转换返回错误，则退出转换，返回错误提示。</p><p>如果返回正确，则将S[n]视为本区块的最终状态。</p><p>本质上，区块里每一笔交易必须有一个有效的状态转换。</p><p>注意，状态不是用任何方式去编码进区块的，它纯粹是一个被验证它的节点所记住的抽象概念，从创世状态开始就只能被 (牢牢地) 计算出来，把每一笔交易按顺序加入每一个区块。</p><p>另外，要注意矿工把交易打包进区块的顺序；如果在一个区块中有两笔交易A和B，B花了一个由A创建的UTXO，那么如果A在B前面，这个区块有效，否则区块无效。</p><p>区块验证算法有趣的部分是“工作量证明”这个概念：情况是这样，对每个区块进行SHA256哈希处理，得到一个256比特的数字，这个数字必须小于一个动态调整的目标数字，写这个白皮书的时候，这个目标数字大概是2的190次方。</p><p>这样做的目的是让创建区块从计算上变得困难，从而防止女巫攻击，防止攻击者按对他们有利的方式重造区块链。</p><p>因为SHA256被设计为了一种完全不可预测的伪随机函数，创建一个有效区块的唯一办法，就是简单粗暴的不断试错，重复地增加随机数，来看是否新的hash值能匹配上，也就是新的hash值是否小于目标数值。</p><p>当前的目标数值是2的192次方，这意味着平均要尝试2的64次方这么多次，才能产生一个有效区块。通常，每过2016个区块后网络会调整这个目标数值，因此网络中的节点会平均每10分钟产生一个区块。</p><p>为了补偿矿工的计算工作，每个区块的矿工有资格拿到一笔凭空付给他们的25个比特币。</p><p>另外，如果任何一笔交易的输入比输出面值更大，那么之间的差额也就作为了给矿工的“交易费”。</p><p>顺便一提，[对矿工的补偿]这是比特币发行的唯一渠道，创世状态根本不包含比特币。</p><p>为了更好地理解挖矿的目的，让我们看看恶意攻击时会出现什么状况。</p><p>因为比特币的底层密码学被认为是很安全的，因此攻击者会攻击比特币系统中没有密码学直接保护的部分：交易顺序。</p><p>攻击者的策略很简单：</p><p>1、发送100个比特币给商家，买一些商品(特别是一些可以快速传输的数字商品)</p><p>2、等待商品寄出</p><p>3、发起另一笔交易，把那100个比特币发给他自己</p><p>4、试图让网络相信，他的给自己发出的交易是最先发出的</p><p>一旦步骤1发生，几分钟后一些矿工会打包交易进入一个区块，假设打包到270000号区块。</p><p>大约1小时后，在270000号区块后面有5个区块被加到链上，这5个区块每个间接指向步骤1那笔交易，然后确认它。</p><p>这时，商家将接受这笔支付作为最终的，即商家认可支付成功了，然后发货，我们假设卖的是数字商品，秒发货秒收货。</p><p>现在，攻击者创建另一笔交易，将这100个比特币发给自己。</p><p>如果攻击者只是简单广播这笔交易，交易将不会被处理；矿工将运行(S,TX) 函数，并且注意到这笔交易花费的UTXO已经不再状态中。</p><p>那么相反，攻击者会分叉这个区块链，开始把269999号区块作为父区块，在后面挖另一个版本的270000号区块，在此区块中用新的付给自己的这笔交易代替旧的付给商家的那笔交易。</p><p>因为区块数据不同，这就需要重做工作量证明。</p><p>另外，攻击者挖的270000号新区块的hash值也不同，因此原来的270001到270005号区块不“指向”它，所以，原来的链和攻击者的新链完全是分离的。</p><p>规则是，发生分叉时，最长链 (有最大工作量证明支持的链)被认为是真实的，所以合法的矿工会沿着270005号区块继续工作，只有攻击者孤零零的一个人在270000号区块后工作。 (此处画面感十足！)</p><p>攻击者为了将他的区块链变成最长链，他将需要拥有比除他之外的全网其余算力更大的算力来追赶(即发起 &quot;51%攻击&quot;)。</p><p><strong>3.3【默克尔树】</strong></p><p>左图：这充分表明，在默克尔树里面只要少量的节点就能证明分支的有效性。</p><p>右图：企图改变默克尔树任意部分，都将最终导致链上某部分的前后不一致。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/62caa0c3901322295a50ff3ff7a91c11d2cb646cf4aabf7af3950a842ed10d91.jpg" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>原图</p><blockquote><p>结合图梳理一下上面两句话：<br>每笔交易信息经过hash之后都自下而上串起来，那么从最顶端往下，都能追溯到最初那笔交易，也就意味着，只需要顶部少量的节点，就能往前去追溯到过去的全部交易信息，而不必再保留之前的多余信息，只保留最新的一部分就好了，从而节省硬盘空间。这也是比特币白皮书里，回收硬盘空间那部分提到的内容。<br>那么这时如果有人企图修改里面某个交易信息，比如右图红色部分，后面的节点就会验证到前后不一致，从而提示错误，不予验证通过。</p></blockquote><p>比特币一个重要的可扩展的特点是，区块存储在一个多层次的数据结构中。</p><p>一个区块的hash值只能是这个区块头的hash值，即一段大约200字节的数据，包含了时间戳、随机数、前一个区块的hash值和一个数据结构的根hash，这个根hash就叫做默克尔树，默克尔树存储着区块上所有的交易信息。</p><p>默克尔树是一种二叉树，这样构成的：1、一组在默克尔树底部的包含基础数据的大量叶节点，2、一组中间节点，每个中间节点是它两个子节点的hash值，3、一个单一的根节点，也是也是有它的两个子节点构成，代表默克尔树的“顶部”。</p><p>默克尔树的作用是，让区块里的数据可以被逐条传输：一个节点可以从一个源头只下载一个区块的区块头，从另一个源头下载相关的默克尔树的其他小部分，并且仍然可以确定所有数据是正确的。</p><p>能这样实现，原因是hash值都是向上扩散的：如果一个恶意用户试图在默克尔树的底部伪造一笔交易，这个改变将导致上面节点的调整，然后再上面节点也要调整，最终改变默克尔树的根以及这个区块的hash值，这导致协议会把这个区块记录为一个完全不同的区块（几乎肯定是无效的工作量证明）。</p><p>默克尔树协议对[比特币的]长期的稳定性来说，无疑是极其重要的。</p><p>在2014年4月，比特币网络中的“全节点”，一个“全节点”完整地存储和处理全部区块，需要15G的硬盘空间，并且按每月1G的速度增加。</p><p>现在，这样的数据量处理，台式电脑还行，但手机搞不了了。未来不久，只有商业机构和爱好者才会来参与当全节点。</p><p>一个被称为“简化支付验证” (SPV) 的协议可以让其他档次的节点也能玩耍，这些节点可以称为“轻节点”，“轻节点”只下载区块头，用区块头验证工作量证明，然后只下载跟他的交易有关的“分支”。</p><p>这就让轻节点只需要下载整个区块链的一小部分，就可以安全地确认任意一笔比特币的交易状态，以及他们自己的当前余额。</p><p><strong>3.4【其他区块链应用】</strong></p><p>把区块链思维应用到其他概念上的想法早就有了。</p><p>2005年，Nick Szabo提出了“所有权人授权的安全资产”的概念，在他的文档里，描述了“可复制的数据库技术的新进展”如何让基于区块链的系统来存储土地所有权的登记，创建一个包含房产权、违法占地和乔治亚州土地税的详细框架。</p><p>但是，不幸的是，那时并没有一个有效的可复制数据库系统，因此该协议并没有被付诸实践。</p><p>不过2009年后，随着比特币的去中心化共识被开发出来，大量的其他应用就迅速出现了：</p><p>● Namecoin，2010年被创造出来，被描述为一个去中心化的名称注册数据库。</p><p>在像Tor、Bitcoin和BitMessage这样的去中心化协议中，需要某些验证账户的方法人们才能互相交互，但是在现有的解决方案中，唯一的账户验证方式是用伪随机的hash值，如1LW79wp5ZBqaHW1jL5TCiBCrhQYtHagUWy。</p><p>理想情况下，一个人可能希望有个叫“george”的账户名称。</p><p>但是，问题是如果他用“george”这个名字注册了一个账户，然后其他人也可以通过同样的方式再注册叫“george”的账户，然后假装自己是真的“george”。</p><p>唯一的办法是用先申请原则，即第一个注册“george”的可以注册，第二个注册“george”的就不能注册了——这个问题可以用比特币共识协议完美解决。</p><p>Namecoin是最早，也是最成功的一个使用比特币理念来实施名称注册的系统。</p><p>● Colored coins，颜色币，目的是，可以提供服务，提供什么服务，让人们可以在比特币区块链上创建他们自己的数字货币，或者重要的一般意义上有单位的货币即数字令牌。</p><p>在颜色币协议里，人们可以通过对一个特定的比特币UTXO公开指定一种颜色，来“发行”一个新的货币，协议能够递归定义其他UTXO的颜色跟交易输入颜色相同 (有一些特定的规则来防止颜色混合输入)。</p><p>这就可以让用户的钱包里只含有某种颜色的UTXO，而且像通常发送比特币一样发送这些UTXO，并且通过回溯区块链来验证他们收到的任意UTXO的颜色。</p><p>● Metacoins，元币，元币的理念是，元币在比特币之上，用比特币的交易上存储元币的交易，但是有另一种不同的状态转换函数，叫APPLY&apos;。</p><p>因为元币协议不能阻止比特币区块上无效的元币交易，因此加入了一个规则，如果APPLY&apos;(S,TX)函数返回错误指令，协议将默认APPLY&apos;(S,TX) = S。</p><p>这个先进的特点没能在比特币本身部署，但正是这个特点，为创建一个任意的加密货币协议提供了简单机制，并且开发成本很低，因为复杂的挖矿和网络已经在由比特币协议处理好了。</p><p>因此，创建一个共识协议通常有两种方法：1、创建一个独立网络；2、在比特币网络上创建一个协议。</p><p>前一种方式，虽然在像Namecoin的应用上相当成功，但是实施起来很困难；每个独立的实施需要一个独立的区块链，以及创建和测试所有必要的状态转换和网络代码。</p><p>另外，我们预测，运用去中心化共识技术的一组应用都将遵循一种幂律分布，即大多数应用太小以至于不能保证区块链[的安全性]，我们也注意到，现有的大规模的去中心化应用，特别是去中心匿名组织，都需要相互交互。</p><p>另一方面讲，基于比特币的办法也有瑕疵，它没有继承比特币可以简化支付验证的特点。</p><p>简化支付验证[SPV]在比特上管用，因为它用区块链深度作为验证的代理器。从一定程度上讲，一旦一笔交易的祖先离这笔交易足够远时，即被认为这笔交易是状态的合法部分，也即一旦对应这一笔交易的很早的一笔交易来源离这笔交易足够远时，就可以认为它们是合法交易。</p><p>另一方面，基于区块链的元币协议，不能强制区块链不去包含那些在他们自身协议里面被认作为非无效的交易。</p><p>因此，一个完全安全的简化支付验证[SPV]元币协议实施，需要向后扫描全部的区块链直到比特币区块链的开头，来决定某些交易是无效的。</p><p>当前，所有基于比特币的“轻”的元币协议，都需依靠一个可信服务器提供数据，，所有基于比特币的元币协议的“轻”实施都依赖可信任的服务器提供数据，可以说这对主要目的之一是消除信任需要的密码学货币而言，只是一个次优[不是最优]的结果。</p><p><strong>3.5【脚本】</strong></p><p>即便不进行扩展，比特币协议也可以使一个“智能合约”概念的脆弱版本变得容易实现。</p><blockquote><p>即，比特币协议即便不进行扩展，也可以比较容易地实现“智能合约”。</p></blockquote><p>比特币的UTXO不仅能被一个公钥所掌握，也可以被一种更复杂的脚本所掌握，这种更复杂的脚本是用一种简单的堆栈式编程语言表达。</p><p>在这种的表达式里面，一笔花费UTXO的交易，必须提供满足脚本的数据。</p><p>事实上，即便是基础的公钥所有权机制，也是通过脚本来实现的：脚本将一种椭圆曲线签名作为输入，来验证其是否匹配交易和拥有这个UTXO的地址，如果验证成功，则返回1，如果验证不成功，则返回0。</p><p>另外，更为复杂的是，脚本存在于其他不同的使用情况。</p><blockquote><p>即，脚本用于其他不同情况则更为复杂一些。</p></blockquote><p>例如，可以创建一个这样的脚本，要求验证交易必须集齐给定三个私钥中的两个私钥的签名(&quot;多重签名&quot;)，这样的设置对于企业账户、安全储蓄账户和一些商业托管情况，都是非常有用的。</p><p>脚本还可以被用于向可计算问题的解决方案支付赏金(也就是向解决计算问题的人支付赏金)，人们甚至可以创建这样一个脚本，就像“如果你可以提供一个简化支付验证证明(SVP证明)，证明你发送了一定面值的Dogecoin狗狗币给我，那么这个比特币UTXO就是你的”，本质上这允许去中心化的跨币兑换(即不同数字货币之间的兑换)。</p><p>但是，比特币的脚本语言有一些严重限制：</p><p>● 缺乏图灵完备性——就是说，尽管比特币脚本语言支持大量的计算，但它不支持一切计算。</p><p>不支持的类型主要是循环语句。</p><p>这主要为了避免交易验证过程中出现无限循环；理论上，脚本程序员可以克服这个障碍，因为任何循环语句都可以被轻易模仿，只需多次重复if表单语句的基础代码，但这会导致脚本低效率的利用空间。</p><p>例如，实施一个代替性椭圆曲线签名算法，就可能需要256次重复乘法，而每一次都需要单独编码。</p><p>● 价值盲——UTXO脚本无法精密地控制取款额度。</p><p>例如，oracle contract预言机合约一个强大的应用案例可能是对冲合约，即A和B都发送价值1000美元的比特币给合约，30天后合约脚本发送价值1000美元的比特币给A，把剩下的发给B。</p><p>这虽然要求预言机来判定一个比特币值多少美元，但在如今完全中心化的解决方案环境里，这已经是在信任和基础设施需求方面的巨大进步了。</p><p>但是，因为UTXO是一个不可分割的整体，要实现UTXO all-or-nothing的整体性，只能通过拥有多种面值的UTXO这种低效的手段(例如，每k最多为30对应一个2^k的UTXO，) ，以及让预言机选择把哪个UTXO发给A，把哪个UTXO发给B。</p><p>● 状态缺失——UTXO要么已花，要么没花；那么包含除此两状态之外其他内部状态的多级合约或者脚本就实现不了。</p><p>这让多级期权合约、去中心化互换要约或者两级加密承诺协议(有必要用于确保计算赏金的协议)实现起来变得困难。</p><p>这意味着UTXO只能被用于创建简单的一次性合约，而不能被用来创建更复杂的“状态”合约例如去中心化组织，UTXO也让元币协议难以实现。</p><p>二元状态加上价值盲特征也使得另一种重要应用，取款限额，不可能实现。</p><p>● 区块链盲——UTXO看不到区块数据，例如随机数和前一个区块的哈希值。</p><p>这个缺陷，剥夺了脚本语言随机性的潜在价值，严重限制了赌博应用和其他类型的应用。</p><p>因此，我们看见了在加密货币上创建高级应用的三种方式：1、创建一个新的区块链，2、在比特币系统上使用脚本，3、在比特币系统上创建元币协议。</p><p>创建一个新的区块链可以无限自由地实现各种特性，但是开发时间和推进进度都是成本。</p><p>使用脚本很容易实现，并且可以标准化，但是能力有限，然后元币协议虽然也很简单，但受制于其可扩展性。</p><p>使用Ethereum以太坊，我们就可以创建一个通用框架，同时具有这三种方式的优点。</p><p><strong>4【以太坊】</strong></p><p>以太坊的目的在于，基于脚本、竞争币和链上元币协议三者概念进行整合和提高，让开发者可以创建任意的、基于共识的应用，这些应用具有由以上三种不同范本同时提供的可扩展性、标准化、特性完备、易于开发和协同等特征。</p><p>以太坊如何来实现这些的？通过建立本质上是终极抽象的基础层：即一个内置图灵完备编程语言的区块链，这个区块链可以使任何人都能编写智能合约和去中心化应用，并在此之上可以设定他们自己的关于所有权、交易方式和状态转换函数的任意规则。</p><p>域名币的基本框架写两行代码就能实现，其他协议例如货币和信誉体系等二十行代码以内也能实现。</p><p>智能合约，即包含价值且只能在满足某些条件下才能解锁的加密“箱子”，也能在我们的平台上创建，并且比比特币脚本所能提供的智能合约更为强大，因为它具备图灵完备性、价值知晓特性、区块链知晓特性以及状态。</p><p><strong>4.1【以太坊账户】</strong></p><p>在以太坊中，状态是由被称为“账户”的对象组成的，每个账户有一个20字节的地址，还有可以在账户之间直接传输价值和信息的状态转换器。</p><p>一个以太坊账户包含四个部分：</p><p>● 随机数，即一个用来确认每笔交易只能被处理一次的计算器</p><p>● 账户的当前以太币余额</p><p>● 账户的合约代码，如有的话</p><p>● 账户的存储空间(默认为空)</p><p>“以太币”是以太坊内置的主要加密燃料，用来支付交易费。</p><p>通常来讲，有两种账户类型：私钥控制的外部账户，和，合约代码控制的合约账户。</p><p>外部账户没有代码，一个人可以通过创建和签名一笔交易来从外部账户发送信息；而在合约账户内，每次合约账户接收到一条信息，代码就会被激活，允许合约账户对内部存储空间进行读取和写入，并且允许发送其他消息或者依次创建合约。</p><p><strong>4.2【消息和交易】</strong></p><p>以太坊里面的“消息”类似比特币里面的“交易”，但是有三点重要不同。</p><p>第一，一条以太坊消息既可以被外部实体创建，也可以被合约创建，而一笔比特币交易只能由外部创建。</p><p>第二，以太坊消息可以明确选择是否包含数据。</p><p>最后，以太坊消息的接收，如果是合约账户，它可以选择回应；这意味着以太坊消息也包含了函数的概念。</p><p>以太坊里面的“交易”这个术语是指，被签名的数据包，这个数据包存储了从外部账户发送的消息。</p><p>交易包含了消息接收，对发送者签名的验证，以太币的数量和待发送的数据，以及STARTGAS和GASPRICE燃料价格。</p><p>为了防止代码的指数级增加和无限循环，需要对每一笔交易设置一个执行代码所引起的计算步骤数量的限制，包括初始消息和代码执行期间引起的任何的其他消息。</p><p>STARTGAS就是这个限制，而GASPRICE是按每个计算步骤给到矿工的费用。</p><p>如果执行交易过程中“gas用完了”，那么所有的状态将恢复原状——除了已经支付的交易费，而如果交易执行停止还有剩余的gas，那么剩余的gas将返还发送者。</p><p>创建合约也有一种独立的交易类型和相应的消息类型；合约地址是基于账户随机数的哈希值和交易数据计算出来的。</p><p>消息机制的一个重要的结论是，以太坊的“一等公民”财产——即合约与外部账户在发送消息和创建其他合约等方面拥有同等效力的理念。</p><p>这可以使合约同时充当许多不同角色：例如，可以使一个去中心化组织 (这是一个合约) 的一个成员成为一个第三方托管账户 (这是另一个合约)，这个第三方托管账户为偏执地使用定制量子证明兰伯特签名的个人 (这是第三个合约)和一个自身用五把密钥来确保安全使用账户的共同签名实体 (这是第四个合约)提供第三方托管服务。</p><p>梳理一下这句话：</p><p>这可以使合约同时充当不同的角色：</p><p>1、一个去中心化组织，这是一种合约，比如叫A</p><p>2、第三方托管，这也是一种合约，叫B，</p><p>3、非要使用量子兰伯特签名的偏执狂，这也是一种合约，叫C</p><p>4、用五把密钥来共同管理账户的人或者组织，这也是一种合约，叫D</p><blockquote><p>以上句子的逻辑是，以太坊合约可以让为A里面的一个成员变成B，然后这个B为C和D提供托管或居间服务。大致是这么个意思。</p></blockquote><p>以太坊的优势在于，去中心化组织和托管合约无需关心合约每个参与方都是什么账户类型。</p><p><strong>4.3【以太坊状态转换函数】</strong></p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/4e4c4eed5ca7f3551df717f4adbd1f12b9c5204d19d2165851d677f0bfdeffb8.jpg" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>原图</p><p>以太坊状态转换函数，APPLY(S,TX) -&gt; S&apos;，可定义为如下：</p><p>1. 检查交易格式是否正确（比如有正确的数值），签名是否有效，和随机数是否与发送者账户的随机数相匹配。如否，返回错误。</p><p>2. 计算交易费为，交易费=STARTGAS * GASPRICE，并从签名中确定发送地址。从发送者的账户余额中减去交易费并增加发送者的随机数。如果余额不足，返回错误。</p><p>3. 设定初值GAS = STARTGAS，并在交易中按每字节减去一定量的gas来支付。</p><p>4. 从发送者的账户转移交易价值到接收者账户。如果接收账户还不存在，则创建该接收账户。如果接收账户是一个合约，则运行合约代码直到代码运行结束或者gas用完。</p><p>5. 如果因为发送者没有足够的钱，或者代码执行中用完了gas，而导致价值传输失败，则恢复原状，不过还是需要支付交易费，并将交易费加到矿工账户。</p><p>6. 否则，将所有剩余gas返还给发送者，将已消耗掉的gas作为交易费用发送矿工。</p><p>例如，假设合约的代码如下：</p><blockquote><p>if !<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://link.zhihu.com/?target=http%3A//contract.storage">contract.storage</a>[<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://link.zhihu.com/?target=http%3A//msg.data">msg.data</a>[0]]:<br><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://link.zhihu.com/?target=http%3A//contract.storage">contract.storage</a>[<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://link.zhihu.com/?target=http%3A//msg.data">msg.data</a>[0]] = <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://link.zhihu.com/?target=http%3A//msg.data">msg.data</a>[1]</p></blockquote><p>需要注意的是，在现实中，合约代码是用底层以太坊虚拟机（EVM）代码写成的；而为了清晰起见，上面这个合约例子是用我们的高级语言Serpent语言写成的，它可以被编译成EVM代码。</p><p>假设合约存储开始为空，一笔价值10以太币的交易，gas为2000，gas价格为0.001以太币，并且两个数据字段[ 2, &apos;CHARLIE&apos; ]。注：第一个三十二字节代表号码2，第二个代表CHARLIE。这样一笔交易发送后，</p><p>. 状态转换函数的处理过程如下：</p><p>检查交易是否有效，格式是否正确。</p><p>2. 检查交易发送者至少有2000*0.001=2个以太币。如果有，从发送者账户中减去2个以太币。</p><p>3. 初始设定gas = 2000，假设交易为170字节长，每字节的费用是5，减去850所以还剩1150 gas。</p><p>4. 从发送者账户再减去10个以太币，给合约账户增加这10个以太币。</p><p>5. 运行代码。在这个例子中，运行代码很简单：它检查索引2处的合约存储是否已使用，注意到它未被使用，然后将检查索引2处的合约存储的值设为CHARLIE。假设这消耗了187gas，于是剩余的gas为1150 - 187 = 963。</p><p>6. 向发送者的账户增加963*0.001=0.963个以太币，然后返回结果状态。</p><p>如果没有合约接收交易，那么所有的交易费仅仅等于GASPRICE乘以交易的字节长度，交易数据就与交易费用无关了。</p><p>另外，需要注意的是，合约发起的消息可以对它们产生的计算分配gas限额，如果子计算的gas用完了，它只恢复到消息发出时的状态。</p><p>因此，就像交易一样，合约可以通过对它产生的子计算设置严格的限制，来保护它们有限的计算资源。</p><p><strong>4.4【代码执行】</strong></p><p>以太坊合约里面的代码是用低级的、基于堆栈的字节码语言写的，被称之为“以太坊虚拟机代码”或“EVM代码”。</p><p>这些代码由一系列的字节构成，每一个字节代表一种操作。</p><p>通常来讲，代码执行是一个无限循环，该循环包含程序计数器（初始值为零）重复执行操作，每次操作都给程序计数器增加一，直到代码执行完毕或者检测到错误、STOP或者RETURN指令。</p><p>执行操作可以访问三种数据存储空间：</p><p>● 堆栈，一种后进先出的存储，32字节的数值可以入栈出栈</p><p>● 内存，可无限扩展的字节队列</p><p>● 合约的长期存储，一个秘钥/数值的存储，其中秘钥和数值都是32字节。与堆栈和内存在计算结束就重置不同的是，存储是长期保存的。</p><p>代码可以访问数值、发送者和接受到的消息中的数据，就像访问区块头数据一样，代码还可以返回数据的字节队列作为输出。</p><p>EVM代码的正式执行模型极其简单。</p><p>当以太坊虚拟机运行时，它的完整的计算状态可以由元组(区块状态、交易、消息、代码、内存、堆栈、程序计数器、gas)来定义，这里block_state区块状态是全局状态，包含所有账户及余额和存储。</p><p>每轮执行时，通过调用代码的pc-th（程序计数器）某个字节来发现当前指令，每个指令自行定义如何影响元组。</p><p>例如，ADD将两个元素出栈并将它们的和入栈，将gas减1并将程序计数器加1，SSTORE将顶部的两个元素出栈并将第二个元素插入到由第一个元素定义的合约存储位置，同样减少最多200的gas并将程序计数器加1。</p><p>虽然通过即时编译有很多方法来优化以太坊，但以太坊基础部署用几百行代码就可以实现。</p><p><strong>4.5【区块链和挖矿】</strong></p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/c44fa181aaed1d14966739baa22c15056dfdbbb346abc804f7f3482b80344cf0.jpg" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>原图</p><p>虽然有一些不同，但以太坊区块链在很多方面类似于比特币区块链。</p><p>以太坊和比特币主要的区别在于区块链架构。不像比特币，以太坊区块包含交易记录和最近的状态。</p><p>此外，还包含两个值，区块序号和难度值。以太坊的区块确认算法如下：</p><p>1、检查引用的前一个区块是否存在和有效。</p><p>2、检查区块的时间戳是否比引用的前一个区块的时间戳大，而且小于未来15分钟</p><p>3、检查区块序号、难度值、 交易根，叔根和gas限额（许多以太坊特有的底层概念）是否有效</p><p>4、检查区块的工作量证明是否有效</p><p>5、将S[0]赋值为上一个区块的STATE_ROOT</p><p>6、将TX赋值为区块的交易列表，一共n笔交易。对于0……n-1，进行状态转换S[i+1] = APPLY(S[i],TX[i])。如果任何一个转换返回错误，或者程序执行到此区块时所花费的gas超过了GAS限制，返回错误。</p><p>7、用S[n]给S_FINAL赋值，但向矿工支付区块奖励。</p><p>8、检查S-FINAL是否与STATE_ROOT相同。如果相同，则区块有效。否则区块无效。</p><p>这种方法第一眼看起来似乎效率很低，因为它需要存储每个区块的整个状态，但是事实上这种确认效率可以与比特币相当。</p><p>原因是状态存储在树结构中，每增加一个区块只需要改变树结构的一小部分。</p><p>因此，通常来讲，在两个相邻区块中的树结构绝大部分应该是相同的，因此一次存储数据可以用指针（子树哈希）引用两次。</p><p>一种被称为“帕特里夏树”的特别树结构被用来实现这一点，包括了对默克尔树概念的调整，这种调整不仅允许改变节点，还可以很有效率的插入和删除节点。</p><p>另外，因为所有的状态信息是最后一个区块的一部分，所以没有必要存储全部的区块历史——这一方法，如果能应用到比特币，经计算可以节省5-20倍的存储空间。</p>]]></content:encoded>
            <author>0x7775db07846dcbbe4b95284f6aa1e6c623301613@newsletter.paragraph.com (Untitled)</author>
        </item>
        <item>
            <title><![CDATA[比特币白皮书全文1]]></title>
            <link>https://paragraph.com/@0x7775db07846dcbbe4b95284f6aa1e6c623301613/1</link>
            <guid>r6vnLoBGCWNeXti7r2Zm</guid>
            <pubDate>Sun, 17 Oct 2021 16:28:13 GMT</pubDate>
            <description><![CDATA[比特币：一种点对点的电子现金系统摘要. 一个完全的点对点版本的电子现金将允许一方不通过金融机构直接在线支付给另一方。电子签名提供了部分解决方案，但是如果还需要一个可信任的第三方来防止双花，那么这个最大的好处也就没有意义。我们提出一个用点对点网络来解决双花的方案。这个网络给每笔交易打上时间戳，并进行哈希计算，放进一条基于哈希工作量证明的链，这形成了一个不可改变的记录，除非重做这些工作量。最长的链不仅是见证序列的证明，还证明了它来自最大的CPU算力池。因为大部分的算力由诚实的节点控制，他们将会产生一条比攻击者要长的链。网络本身需要极小化结构。消息被尽力广播，并且节点可以随意离开或重新加入网络，接受最长的工作量证明的链作为它离开这段时间发生事情的证明。1． 介绍 互联网上的商业几乎完全依赖信任的第三方金融机构来处理电子支付。对于大多数交易来说，这套系统工作的足够好了，但是依然受到了基于信任模型的天然缺点的困扰。完全不能撤销的交易是不可能的，因为第三方金融机构不可避免的要调解纠纷。调解的代价增加了交易的成本，限制了最小实际交易的大小，切断了临时交易的可能性，丧失了对不可撤销服务提供不可撤...]]></description>
            <content:encoded><![CDATA[<p><strong>比特币：一种点对点的电子现金系统</strong></p><blockquote><p>摘要. 一个完全的点对点版本的电子现金将允许一方不通过金融机构直接在线支付给另一方。电子签名提供了部分解决方案，但是如果还需要一个可信任的第三方来防止双花，那么这个最大的好处也就没有意义。我们提出一个用点对点网络来解决双花的方案。这个网络给每笔交易打上时间戳，并进行哈希计算，放进一条基于哈希工作量证明的链，这形成了一个不可改变的记录，除非重做这些工作量。最长的链不仅是见证序列的证明，还证明了它来自最大的CPU算力池。因为大部分的算力由诚实的节点控制，他们将会产生一条比攻击者要长的链。网络本身需要极小化结构。消息被尽力广播，并且节点可以随意离开或重新加入网络，接受最长的工作量证明的链作为它离开这段时间发生事情的证明。</p></blockquote><p><strong>1． 介绍</strong></p><p>互联网上的商业几乎完全依赖信任的第三方金融机构来处理电子支付。对于大多数交易来说，这套系统工作的足够好了，但是依然受到了基于信任模型的天然缺点的困扰。完全不能撤销的交易是不可能的，因为第三方金融机构不可避免的要调解纠纷。调解的代价增加了交易的成本，限制了最小实际交易的大小，切断了临时交易的可能性，丧失了对不可撤销服务提供不可撤销支付的可能性，这又是一个广义成本。因为撤销的可能性，信任的需要不断蔓延开来。商户必须堤防他们的客户，越来越多的他们本不该需要的信息困扰着他们。不得不接受一定比例的骗子。这些成本和支付的不确定问题可以用面对面使用现金避免，但是还没有机制存在使得通过通信信道支付而不需要信任的第三方。</p><p>需要的是一个电子支付系统，这个系统建立在密码学证明基础上而不是信任，允许任意有这个意愿的双方直接相互转账而不需要一个信任的第三方。交易从计算上不可撤销的，这将保护卖方权益防止被骗，并且常规的托管机制很容易实现来保护买方权益。在本论文里，我们提出了一个防止双花的解决方案，使用点对点分布式时间戳服务器来产生按时间排序的交易的计算证明。只要诚实节点控制的CPU的算力大于攻击者节点的算力，这个系统就是安全的。</p><p><strong>2． 交易</strong></p><p>我们把一种电子币定义成一条数字签名链。每一个所有者把币转给下一个人的时候，是通过将前一个交易的哈希和下一个所有者的公钥进行数字签名，并把这些追加在币的后面。收款人可以通过验证数字签名来确认链的所有者。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/088488eaaa287c58312c4afddb3b534cb1da15a9a53ff3b4cbb6a059ba06d0af.jpg" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>当然，问题是收款人无法验证其中的一个所有者是否同一个币花了两次（双花）。一个普遍的做法是引入一个信任的中央机关，或铸币厂，他们可以检查每一笔交易来防止双花问题。每次交易后，这个币必须返回到铸币厂，这样才能发行新币，只有直接从铸币厂发行的币才被相信是没有被双花的。这个方案的问题是，整个金钱系统的命运掌握在经营铸币厂的公司，每一笔交易都要经过他们，就像银行一样。</p><p>我们需要一种方法，这种方法让收款人知道上一个所有者没有签署任何以前的交易。我们的目的是，让最早的交易是可信的，我们不关心后面是不是有人企图进行双花。仅有的可以确认某一个交易存在的办法是要知道所有的交易。在基于铸币厂的模型中，铸币厂知道所有的交易，并且可以确定哪个交易先发生。为了在无信任第三方的情况下达到这个目的，交易必须要对公众进行通知，并且我们需要一个系统，这个系统的参与者要达成共识，这个共识就是认同同一个按收到的交易顺序排列的历史记录。收款人需要证据来说明在每一笔交易的时候，大多数节点一致认为这个交易是第一时间到达的。</p><p><strong>3． 时间戳服务器</strong></p><p>我们提出的解决方案从一个时间戳服务器开始。这个服务器工作方式是，对条目所在的区块的哈希加盖时间戳，并且广泛的公布这些哈希，比如通过报纸或新闻组邮件。显然，为了能进入这个哈希序列，时间戳证明的数据在那个时间必须存在。每一个时间戳和以前的时间戳，形成一条链，每一个追加的时间戳都是对前一个时间戳进行加强。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/7b0c61a737f8b9471f3f4593cb01bfc80193dfd89d8ec8aaa09074fa3ad818dd.jpg" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p><strong>4． 工作量证明</strong></p><p>为了基于点对点的基础实现一个分布式的时间戳服务器，我们将需要一个工作量证明的系统，这个系统和亚当&amp;middot;贝克的哈希现金类似，而不是报纸或新闻组邮件。这个工作量包含寻找一个哈希值，比如用哈希算法SHA-256，这个哈希值以若干0开头。平均工作量和开头的0的个数是指数关系，并且验证很简单，只需要执行一次单独的哈希计算。</p><p>在我们的时间戳网络里，是这样实现工作量证明的，就是不断增加区块里的一个临时的数值，直到找到一个值使得区块的哈希值满足开头0的个数的要求。一旦CPU花费算力计算满足了工作量证明的要求，这个区块链就无法修改，除非重新计算。随着后面的区块不断产生，想要改变这个区块，需要重做它后面所有区块的工作量。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/4d976d3a12a628f589f4ca1f6d901746abe7d433226c0f27dbc33029ebf5696b.jpg" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>工作量证明还解决了在多数决策法中决定展示的问题。如果大多数是基于一个IP一票，这可能会被可以支配多个IP的人破坏。工作量证明本质上也是一个IP一票。最长的链代表了大多数人的决定，这个链投入了最大的工作量。如果大多数的CPU算力由诚实节点控制，诚实的链就会增加的很快，超过任何竞争链。为了修改过去的一个块，攻击者需要重新投入算力完成这个区块和它以后所有区块的工作量，然后追上并超越诚实节点的工作量。我们后面讨论落后的攻击者追上的概率，这个概率随着后面区块的增加呈指数级减少。</p><p>硬件的速度越来越快，参与运行的节点随时间兴趣也经常变化，为了抵消这些因素的影响，工作量的难度是由每小时区块产生数量的浮动性决定的。如果区块产生的太快，难度就相应的增加。</p><p><strong>5． 网络</strong></p><p>运行这个网络的步骤如下：</p><p>1） 新交易给所有节点广播。</p><p>2） 每个节点将新交易放到一个区块。</p><p>3） 每个节点开始为这个区块寻找相应难度的工作量证明。</p><p>4） 当一个节点找到了这个工作量证明，把这个区块广播给所有节点。</p><p>5） 如果区块里所有的交易是有效的并且是没有被花费的，节点就会接受这个区块。</p><p>6） 节点把这个区块的哈希作为上一个哈希，并开始进行工作以竞争创建下一个区块。</p><p>节点总是认为最长的链是正确的，并且不断的工作去延长它。如果两个节点同时广播下一个区块，一些节点可能接受其中一个，也可能是另一个。这种情况下，他们在最先收到的区块上工作，但是也会保存另外一个分支以防它会变得更长。当下一个工作量被找到并且一个分支变得更长时，这种情况就会被打破，在另外一个分支上工作的节点将会切换到这个长的链上。</p><p>新交易广播不一定要广播到所有节点。只要他们能到达很多节点，这个交易很快就会进入下一个块。区块广播也能接受消息丢失。如果一个节点没有收到区块，当它收到下一个块时会发现自己少了一个区块，它就会请求来获得少的这个区块。</p><p><strong>6． 激励</strong></p><p>按照惯例，区块的第一个交易是一个特别的交易，这个交易会发行新币并且所有者是这个区块的创建者。这为节点支持网络引入了激励机制，并且这提供了一个初始发行货币进入流通的方式，因为没有一个中央机构去发行他们。不断增加新货币的过程类似于黄金矿工消耗资源来增加黄金的流通。在这里，消耗的事CPU的时间和电费。</p><p>激励还包括提供交易手续费。如果交易中输出值比输入值小，这个差值就是交易手续费，它被加入到这个区块激励值里。一旦预定数量的币全部进入流通，激励就全部转为交易手续费，完全没有通货膨胀。</p><p>激励有助于鼓励节点保持诚实。如果一个贪婪的攻击者掌握了比所有诚实节点还要大的算力，他将面临一个选择，是通过偷回他支付的钱来咋骗别人，还是用这个算力产生新的币。他应该会发现遵守规则更有好处，这个规则可以让他比其他人组合得到更多的新币，比破坏这个系统得到的更多，而且财产合法。</p><p><strong>7． 回收磁盘空间</strong></p><p>一旦一个币最新的交易被足够多的区块埋没，它之前的花费的交易就可以丢掉来节省空间。为了促成这个而不破坏区块的哈希，用这些交易生成一个默克尔树，仅仅根包含在区块的哈希里。那么旧区块可以通过去除树的一些分支进行压缩。有些内部的哈希就不用保存了。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/fcd1d99c24cb96ab227c49d175ecd75321c7969127f9b31d1e1c9556c8b23abd.jpg" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>一个区块头大概80字节。如果我们假设每十分钟产生一个区块，一年就是80字节*6*24*365=4.2兆字节。2008年出售的电脑典型的配置是2GB内存，根据摩尔定律预测，每年增加1.2G，即使区块头全部放在内存里，存储也不是个问题。</p><p><strong>8． 简化支付验证</strong></p><p>即使不运行全网络节点，验证支付也是可能的。用户仅需要保存最长工作量证明链的区块头的拷贝，他通过查询网络节点直到确信它有最长的链来获取区块头，并且可以得到默克尔分支，分支连接了交易和这个打了时间戳的区块。他本身不能验证交易，但是通过连接到链上的一个地方，他可以看到网络节点已经接受了它，后面的区块进一步确定网络接受了它。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/2792beecd19b503347ee799501053267abdb0e98f6c8c5dae564aff28c4568e4.jpg" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>因此，如果诚实节点控制着网络，验证就是可靠的，如果网络被攻击者控制，验证就是很弱的。虽然网络节点本身可以验证交易，但这种简化验证的方法会被攻击者编造的交易欺骗，因为攻击者可能持续控制网络。防止这种情况的一种策略是接收网络节点的告警，当他们检测到无效块的时候，提示用户软件下载整个区块，并且提醒确认交易的一致性。频繁接收支付的企业可能仍然想运行他们自己的节点，为了更独立的安全性和更快的验证。</p><p><strong>9． 组合和分割价值</strong></p><p>虽然可以单独处理币，为转账的每一分都单独交易是很不方便的。为了能是价值分割和组合，交易包含多个输入和多个输出。正常的会有一个单独从以前交易来的大额输入或多个小额输入组合在一起，最多两个输出：一个用来支付，一个用来找零，有零钱的话会返还给发送者。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/56f28396ac53230d693de8eff985656b5fb527248e7c69823e01f65d9aff0256.jpg" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>应该注意的是，一个交易依赖几个交易，这些交易依赖更多的交易，看起来很分散，但在这里不是一个问题。从不需要提取一个交易全部历史的独立的拷贝。</p><p><strong>10． 隐私</strong></p><p>传统的银行通过限制向有关方和信任的第三方提供信息来达到一个保护隐私的目的。向公众广播所有交易的必须性将这个方法排除了。通过打破信息在其他地方的流动性仍然可以保护隐私：通过保持公钥匿名性。公众可以看到一个人给其他人转钱了，但是没有信息可以把交易和某人联系起来。这类似于证券交易所公布的信息水平，交易时间和个人的交易规模是公开的，但不告诉当事人是谁。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/ac30134984b61979e4c373ecfc24c515782128a90bc4d6d47a41311f709660b0.jpg" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>作为一个附加的防火墙，每次交易都使用一个新的密钥对，防止和一个共同的所有者联系起来。对于多输入交易来说，这个联系无法避免，所有的输入必须表明由同一个人所有。风险是如果表明了某一个密钥的所有者，这种联系将表明其他的交易也属于同一个人。</p><p><strong>11． 计算</strong></p><p>我们想象一个这样的场景，攻击者想用比诚实节点更快的速度产生一个替代链。即使成功了，也不会让系统能任意被修改，比如凭空产生价值或拿走不属于攻击者的钱。节点将不会接受一个无效的支付，并且诚实节点绝不会接受包含这种支付的区块。攻击者只能试着改变自己的交易来拿回本该花出去的钱。</p><p>诚实的链和攻击链的竞争可以说是二项式随机走动。成功事件是诚实链延长一个区块，领先优势加一，失败事件是攻击链延长一个区块，缩小一个差距。</p><p>一个攻击者从一个给定的赤字中追上的概率类似于一个赌徒破产问题。假设一个信用无限的赌徒从赤字开始，开始进行潜在次数无数的赌博，试图达到盈亏平衡。我们可以计算他达到盈亏平衡的概率，或者说是攻击链赶上诚实链的概率，如下：</p><p>p=诚实节点发现下一个区块的概率</p><p>q=攻击者找到下一个区块的概率</p><p>qz =攻击者在落后z个区块的情况下，追上的概率</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/bbfb922b70122508f92c0744917090496ed5692a843225ec2c92d8f3e91a6902.jpg" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>假设p&gt;q，随着落后区块数量（z）增加，攻击者追上的概率呈指数下降。这个概率情况对攻击者不利，如果他没有幸运的提前向前冲刺，落后越多希望就越渺茫。</p><p>我们现在考虑接收者在收到新的交易的时候，需要等待多长时间才能完全确定交易不能被发送者修改。我们假设发送者是攻击者，他想让接收者暂时相信他已经付款了，然后过了一段时间又换成是支付给自己。这事发生的时候接收者会收到告警，但是发送者希望一切都晚了。</p><p>接收者创建了一个新的密钥对，签名之前很短的时间把公钥给了发送者。这防止发送者提前准备一条链，持续在上面工作，直到他足够幸运达到了领先的程度，正好执行刚才这条交易。一旦这个交易发送了，不诚实的发送者开始在一个并行的链上秘密工作，这条链包含他的交易的另一个版本。</p><p>接收者一直等待直到交易被添加到一个区块中，并且后面已经追加了z个区块了。他并不知道攻击者的准确进展，但是可以假设诚实区块每个区块花费的时间是平均期望时间，攻击者潜在的进展将服从泊松分布，期望值：</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/bc4492d6ac39aae19f34c51c6f04da1054540c4c95dc6a3f10a1c94160fc1a5d.jpg" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>为了得到目前攻击者仍能追上的概率，我们将他所取得的每一步进展的泊松密度乘以他可能从那一点赶上的概率。</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/af105782676d511a3d41f496b8de8ea777ee55acccbac47b738cae099a77ec6c.jpg" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>变换一下避免对分布的无穷尾部求和…</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/600e5318332bdc694e37b66a7ad485e15514076db96a1e66f9abd8c516883590.jpg" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>转换成C代码…</p><pre data-type="codeBlock" text="#include &lt;math.h&gt;
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 &lt;= z; k++)
{
double poisson = exp(-lambda);
for (i = 1; i &lt;= k; i++)
poisson *= lambda / i;
sum -= poisson * (1 - pow(q / p, z - k));
}
return sum;
}
"><code>#include <span class="hljs-operator">&#x3C;</span>math.h>
double AttackerSuccessProbability(double q, <span class="hljs-keyword">int</span> z)
{
double p <span class="hljs-operator">=</span> <span class="hljs-number">1.0</span> <span class="hljs-operator">-</span> q;
double lambda <span class="hljs-operator">=</span> z <span class="hljs-operator">*</span> (q <span class="hljs-operator">/</span> p);
double sum <span class="hljs-operator">=</span> <span class="hljs-number">1.0</span>;
<span class="hljs-keyword">int</span> i, k;
<span class="hljs-keyword">for</span> (k <span class="hljs-operator">=</span> <span class="hljs-number">0</span>; k <span class="hljs-operator">&#x3C;</span><span class="hljs-operator">=</span> z; k<span class="hljs-operator">+</span><span class="hljs-operator">+</span>)
{
double poisson <span class="hljs-operator">=</span> exp(<span class="hljs-operator">-</span>lambda);
<span class="hljs-keyword">for</span> (i <span class="hljs-operator">=</span> <span class="hljs-number">1</span>; i <span class="hljs-operator">&#x3C;</span><span class="hljs-operator">=</span> k; i<span class="hljs-operator">+</span><span class="hljs-operator">+</span>)
poisson <span class="hljs-operator">*</span><span class="hljs-operator">=</span> lambda <span class="hljs-operator">/</span> i;
sum <span class="hljs-operator">-</span><span class="hljs-operator">=</span> poisson <span class="hljs-operator">*</span> (<span class="hljs-number">1</span> <span class="hljs-operator">-</span> pow(q <span class="hljs-operator">/</span> p, z <span class="hljs-operator">-</span> k));
}
<span class="hljs-keyword">return</span> sum;
}
</code></pre><p>运行结果，我们可以看到概率随z的增加呈指数下降。</p><pre data-type="codeBlock" text="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&lt;0.1%的求解…
p &lt; 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
"><code>q<span class="hljs-operator">=</span><span class="hljs-number">0</span><span class="hljs-number">.1</span>
z<span class="hljs-operator">=</span><span class="hljs-number">0</span> P<span class="hljs-operator">=</span><span class="hljs-number">1.0000000</span>
z<span class="hljs-operator">=</span><span class="hljs-number">1</span> P<span class="hljs-operator">=</span><span class="hljs-number">0</span><span class="hljs-number">.2045873</span>
z<span class="hljs-operator">=</span><span class="hljs-number">2</span> P<span class="hljs-operator">=</span><span class="hljs-number">0</span><span class="hljs-number">.0509779</span>
z<span class="hljs-operator">=</span><span class="hljs-number">3</span> P<span class="hljs-operator">=</span><span class="hljs-number">0</span><span class="hljs-number">.0131722</span>
z<span class="hljs-operator">=</span><span class="hljs-number">4</span> P<span class="hljs-operator">=</span><span class="hljs-number">0</span><span class="hljs-number">.0034552</span>
z<span class="hljs-operator">=</span><span class="hljs-number">5</span> P<span class="hljs-operator">=</span><span class="hljs-number">0</span><span class="hljs-number">.0009137</span>
z<span class="hljs-operator">=</span><span class="hljs-number">6</span> P<span class="hljs-operator">=</span><span class="hljs-number">0</span><span class="hljs-number">.0002428</span>
z<span class="hljs-operator">=</span><span class="hljs-number">7</span> P<span class="hljs-operator">=</span><span class="hljs-number">0</span><span class="hljs-number">.0000647</span>
z<span class="hljs-operator">=</span><span class="hljs-number">8</span> P<span class="hljs-operator">=</span><span class="hljs-number">0</span><span class="hljs-number">.0000173</span>
z<span class="hljs-operator">=</span><span class="hljs-number">9</span> P<span class="hljs-operator">=</span><span class="hljs-number">0</span><span class="hljs-number">.0000046</span>
z<span class="hljs-operator">=</span><span class="hljs-number">10</span> P<span class="hljs-operator">=</span><span class="hljs-number">0</span><span class="hljs-number">.0000012</span>
q<span class="hljs-operator">=</span><span class="hljs-number">0</span><span class="hljs-number">.3</span>
z<span class="hljs-operator">=</span><span class="hljs-number">0</span> P<span class="hljs-operator">=</span><span class="hljs-number">1.0000000</span>
z<span class="hljs-operator">=</span><span class="hljs-number">5</span> P<span class="hljs-operator">=</span><span class="hljs-number">0</span><span class="hljs-number">.1773523</span>
z<span class="hljs-operator">=</span><span class="hljs-number">10</span> P<span class="hljs-operator">=</span><span class="hljs-number">0</span><span class="hljs-number">.0416605</span>
z<span class="hljs-operator">=</span><span class="hljs-number">15</span> P<span class="hljs-operator">=</span><span class="hljs-number">0</span><span class="hljs-number">.0101008</span>
z<span class="hljs-operator">=</span><span class="hljs-number">20</span> P<span class="hljs-operator">=</span><span class="hljs-number">0</span><span class="hljs-number">.0024804</span>
z<span class="hljs-operator">=</span><span class="hljs-number">25</span> P<span class="hljs-operator">=</span><span class="hljs-number">0</span><span class="hljs-number">.0006132</span>
z<span class="hljs-operator">=</span><span class="hljs-number">30</span> P<span class="hljs-operator">=</span><span class="hljs-number">0</span><span class="hljs-number">.0001522</span>
z<span class="hljs-operator">=</span><span class="hljs-number">35</span> P<span class="hljs-operator">=</span><span class="hljs-number">0</span><span class="hljs-number">.0000379</span>
z<span class="hljs-operator">=</span><span class="hljs-number">40</span> P<span class="hljs-operator">=</span><span class="hljs-number">0</span><span class="hljs-number">.0000095</span>
z<span class="hljs-operator">=</span><span class="hljs-number">45</span> P<span class="hljs-operator">=</span><span class="hljs-number">0</span><span class="hljs-number">.0000024</span>
z<span class="hljs-operator">=</span><span class="hljs-number">50</span> P<span class="hljs-operator">=</span><span class="hljs-number">0</span><span class="hljs-number">.0000006</span>
对于p<span class="hljs-operator">&#x3C;</span><span class="hljs-number">0</span><span class="hljs-number">.1</span><span class="hljs-operator">%</span>的求解…
p <span class="hljs-operator">&#x3C;</span> <span class="hljs-number">0</span><span class="hljs-number">.001</span>
q<span class="hljs-operator">=</span><span class="hljs-number">0</span><span class="hljs-number">.10</span> z<span class="hljs-operator">=</span><span class="hljs-number">5</span>
q<span class="hljs-operator">=</span><span class="hljs-number">0</span><span class="hljs-number">.15</span> z<span class="hljs-operator">=</span><span class="hljs-number">8</span>
q<span class="hljs-operator">=</span><span class="hljs-number">0</span><span class="hljs-number">.20</span> z<span class="hljs-operator">=</span><span class="hljs-number">11</span>
q<span class="hljs-operator">=</span><span class="hljs-number">0</span><span class="hljs-number">.25</span> z<span class="hljs-operator">=</span><span class="hljs-number">15</span>
q<span class="hljs-operator">=</span><span class="hljs-number">0</span><span class="hljs-number">.30</span> z<span class="hljs-operator">=</span><span class="hljs-number">24</span>
q<span class="hljs-operator">=</span><span class="hljs-number">0</span><span class="hljs-number">.35</span> z<span class="hljs-operator">=</span><span class="hljs-number">41</span>
q<span class="hljs-operator">=</span><span class="hljs-number">0</span><span class="hljs-number">.40</span> z<span class="hljs-operator">=</span><span class="hljs-number">89</span>
q<span class="hljs-operator">=</span><span class="hljs-number">0</span><span class="hljs-number">.45</span> z<span class="hljs-operator">=</span><span class="hljs-number">340</span>
</code></pre><p><strong>12． 结论</strong></p><p>我们为无信任电子交易提出了一个系统。我们从数字签名币的常用框架开始，它对所有者有很强的控制，但是因为不能避免双花，所以还不完整。为了解决双花，我们提出了一个点对点的网络，这个网络使用工作量证明记录一个公共的交易历史，只要诚实节点控制大部分CPU算力，很快使得攻击者无法通过计算来改变交易历史。该网络的非结构化简单性使得它很稳健。节点同时工作，很少需要相互协调。他们不需要被识别，因为消息不需要路由到任何特定的位置，只需尽力传递就好。节点可以离开网络，也可以需要的时候重新加入网络，接受工作量链作为他离开的时候发生了什么的证据。他们用CPU算力投票，通过在有效区块上工作并延续它来表达对区块的接受，通过不在新区块上工作表示拒绝无效区块。任何需要的规则和激励都可以在这种共识机制下进行。</p><p>全文完</p>]]></content:encoded>
            <author>0x7775db07846dcbbe4b95284f6aa1e6c623301613@newsletter.paragraph.com (Untitled)</author>
        </item>
    </channel>
</rss>