《比特币:一种点对点的电子现金系统》-学习日记

        区块链入门学习前必读的文章,了解其来源及解决问题的本质。

目录

0、摘要

1、简介

2、交易(Transactions)

3、时间戳服务器(Timestamp Server)

4、工作量证明(Proof-of-Work)

5、网络(Network)

6、激励(Incentive)

7、回收硬盘空间(Reclaiming Disk Space)

8、简化的支付确认(Simplified Payment Verfication)

9、价值组合与分割(Combining and Splitting Value)

10、隐私(Privacy)

11、计算(Calculations)

12、结论

13、参考文献


  • 0、摘要

(1)一种完全通过点对点技术实现的电子现金系统,它使得在线支付能够直接由一方发起并支付给另外一方,中间不需要通过任何的金融机构;

(2)提出一种解决方案,目的是消除第三方的支持,实现防止双重支付(double-spending);

(3)解决方案的内容:

3.1)通过随机散列对全部交易添加时间戳(timestamps);

3.2)将时间戳添加到一个不断延伸的基于随机散列的工作量证明(proof-of-work)的链条上,作为交易记录。(只有一种情况交易记录才被修改,那就是链条上所有的记录都被修改)。

3.3)最长的链条不仅作为被观察到的事件序列的证明,也是来自CPU计算能力最大的池(pool)(或者理解为链);

3.4)除非大多数的CPU计算能力合作一起进行全网攻击,否则诚实节点将会生成最长的、超过攻击者的链条;

(4)电子现金系统另一个特点:信息尽最大努力在全网传播,节点(nodes)可以随时离开和重新加入网络,并且最长的工作链条作为发生合法交易的证明

  • 1、简介

(1)消除第三方信用中介的问题;

(2)电子支付系统,基于密码学原理而不基于信用,使得任何达成一致的双方,能够直接进行支付,消除第三方的参与;

(3)杜绝回滚(reverse)支付交易的可能,保护特定的卖家免于欺诈;

(4)本文重点:提出一种通过点对点分布式的时间戳服务器来生成依照时间前后排列并加以记录的电子交易证明,解决双重支付问题。

(5)系统安全性的保证策略:只要诚实的节点所控制的计算能力的总和,大于有合作关系的(从operating)攻击者的计算能力的总和,该系统就是安全的。

  • 2、交易(Transactions)

(1)一枚电子货币:是一串数字签名,每一位所有者通过对前一次交易和下一位拥有者的公钥(public key)签署一个随机散列的数字签名,将此签名附加在该枚电子货币的末尾,电子货币就发送给下一位所有者。收款人通过对签名进行检验,就能够验证该链条的所有者。

(2)交易过程解决的主要问题是-双重支付。解决的方案核心是:每一次交易都要将交易的货币进行重置(或者由造币长重新加工)。

(3)收款人,只需要确保之前所有交易中没有本次交易的签名。如果想要在电子系统中排除第三方中介机构,那么交易信息就应当被公开宣布,我们需要整个系统内的所有参与者,都有唯一公认的历史交易序列。收款人需要确保在交易期间绝大多数的节点都认同该交易是首次出现。

  • 3、时间戳服务器(Timestamp Server)

(1)时间戳服务器通过对以区块(block)形式存在的一组数据实施随机散列而加上时间戳,并将该随机散列进行广播,就像在新闻或世界性新闻组网络(Usenet)的发帖一样。

(2)时间戳能够证实特定数据必然于某特定时间是的确存在的,因为只有在该时刻存在了才能获取相应的随机散列值。

(3)每个时间戳应当将前一个时间戳纳入其随机散列值中,每一个随后的时间戳都对之前的一个时间戳进行增强(reinforcing),这样就形成了一个链条(Chain)。

4、工作量证明(Proof-of-Work)

(1)需要一个类似于亚当•柏克(Adam Back)提出的哈希现金(Hashcash)[6].

(2)在进行随机散列运算时,工作量证明机制引入了对某一个特定值的扫描工作,比方说SHA-256下,随机散列值以一个或多个0开始。随着0数目的上升, 找到这个解所需要的工作量将呈指数增长,而对结果进行检验则仅需要一次随机散列运算。

(3)在区块(block)中增补了一个随机数(Nonce),这个随机数的作用:生产随机散列值中所需要的0的个数。

(4)通过反复尝试来找到随机数,直到找到位置,就确定了一个工作量证明机制。只有该CPU耗费的工作量能够满足该工作量证明机制,那么除非重新完成相当的工作量,该区块的信息就不可更改。

(5)由于之后的区块是建立在该区块之后的,所以想要改动该区块的信息,就还需要重新完成之后所有区块的全部工作量。

(6)工作量证明机制的本质则是一CPU一票,而非是一IP地址一票。最长的链包含最大的工作量。

(7)如果大多数的CPU为诚实的节点控制,那么诚实的链条将以最快的速度延长,并超越其他的竞争链条。

(8)想要对已出现的区块进行修改,攻击者必须重新完成该区块的工作量外加该区块之后所有区块的工作量,并最终赶上和超越诚实节点的工作量。

(9)如果对区块进行修改,其成功概率将呈指数化递减。(后面的公式和代码可做参考)

(10)另一个问题:硬件的运算速度在告诉增长,而节点参与网络的程度则会有所起伏。解决方法:工作量证明的难度(the proof-of-work difficulty)将采用移动平均目标的方法来确定,即令难度指向令每小时生产区块的速度为某一个预定的平均数。如果区块生成的速度过快,难么难度就会提高。

5、网络(Network)

运行在该网络的步骤:

(1)新的交易向全网进行广播;

(2)每一个节点都将收到的交易信息纳入一个区块中;

(3)每个节点都尝试在自己的区块中找到一个具有足够难度的工作量证明;

(4)当一个节点找到了一个工作量证明,它就向全网进行广播;

(5)当且仅当,该区块中所有交易都是有效的切之前未曾发生过,其他节点才会认同该区块的有效性;

(6)其他节点接收该区块,其接受的方法是:在跟随该区块的末尾,制造新的区块以延长该链条,而将被接受区块的随机散列值视为先于新区块的随机散列值。

网络区块信息同步分析:

(a)节点视最长的链条为正确的链条,并持续工作和延长该链;

(b)如果两个节点同时广播不同版本的新区块,那么其他节点在接收到该区块的时间上将存在先后差别。此时将在率先收到的区块基础上进行工作,但也会保留另外一个链条,以防止后者变成最长的链条。该僵局(tie)的打破要等到下一个工作量证明被发现,而其中的一条链条被证实为是较长的一条,那么在另一条分支链条上工作的节点将转换阵营,开始在较长的链条上工作。

(c)所谓“新的交易要广播”,实际上不需要抵达全部的节点。只要交易信息能够抵达足够多的节点,那么他们将很快被整合进一个区块中。而区块的广播对被丢弃的信息是具有容错能力的。如果一个节点没有收到某特定区块,那么该节点将会发现自己缺失了某个区块,也就可以提出自己下载该区块的请求。

6、激励(Incentive)

(1)约定:每个区块的第一笔交易进行特殊处理,该交易产生一枚由该区块创造拥有的新的电子货币。

(2)新的电子货币,就是增加了节点支持该网络的激励,并在没有中央集权机构发行货币的情况下,提供一种将电子货币分配到流通领域的一种方法。其特点:将CPU的时间和电力消耗看做是消耗的资源,而添加的电子货币看做是挖矿得到的黄金。

(3)交易费(transaction fees)也是激励的来源。如果某笔交易的输出值小于输入值,那么差额就是交易费,该交易费将被增加到该区块的激励中。只要既定数量的电子货币已经进入流通,那么激励机制就可以逐渐转换为完全依靠交易费,那么本货币系统就能够免于通货膨胀。

(4)激励措施(激励策略、激励系统)有助于鼓励节点保持诚实。简单描述一下:如果一个节点组织其他节点进行非诚信交易其拥有的电子货币的获取量还不如组织其他节点进行诚实交易得到的电子货币更多。因此攻击者不会破坏这个系统使得其自身财富的有效性受损。

7、回收硬盘空间(Reclaiming Disk Space)

(1)如果最近的交易已经被纳入了足够多的区块之中,那么就可以丢弃该交易之前的数据,以回收硬盘空间。为了同时确保不损害区块的随机散列值,交易信息被随机散列时,被构建成一种Merkle树(Merkle tree)[7] 的形态,使得只有根(root)被纳入了区块的随机散列值。通过将该树(tree)的分支拔除(stubbing)的方法,老区块就能被压缩。而内部的随机散列值是不必保存的。

(2)一Merkle树形式散列的交易

(3)将Tx0-2从区块中剪除

(4)不含交易信息的区块头(Block header)大小仅有80字节。如果设定区块生成的速率为每10分钟一个,那么每一年产生的数据位4.2MB。(80 bytes * 6 * 24 * 365 = 4.2MB)。2008年,PC系统通常的内存容量为2GB,按照摩尔定律的预言,即使将全部的区块头存储于内存之中都不是问题。

8、简化的支付确认(Simplified Payment Verfication)

(1)网络节点不完整的情况下,也能完成对支付的检验。用户需要保留最长工作量证明链条的区块头的拷贝,它可以不断向网络发起询问,直到它确信自己拥有最长的链条,并能够通过merkle的分支通向它被加上时间戳并纳入区块的那次交易。

(2)节点想要自行校验该交易的有效性原本是不可能的,但通过追溯到链条的某个位置,它就能看到某个节点曾经接受过它,并且于其后追加的区块也进一步证明全网曾经接受了它。

(3)只要诚实的节点控制了网络,检验机制就是可靠的。

(4)如果全网中有一个计算力强的攻击者进行攻击时,网络节点就会变的脆弱。原因是网络节点能够自行确认交易的有效性,只要攻击者能够持续地保持计算力优势,简化的机制会被攻击者焊接的交易欺骗。

(5)上述交易欺骗如何处理呢?采用报警的方式。只要链路中发现一个无效的区块,就立刻发出警报,收到警报的用户将立刻开始下载被警告有问题的区块或者交易的完整信息,以便对信息的不一致进行判断。

9、价值组合与分割(Combining and Splitting Value)

(1)系统可以单个单个的处理电子货币,但是不建议这样做。为了使得交易中的价值易于组合与分割,在交易过程中可以设置多个输入和输出。
(2)某次价值较大的前次交易构成的单一输入,或者由某几个价值较小的前次交易共同构成的并行输入,但是输出最多只有两个:一个用于支付,另一个用于找零(需要的话就存在,不需要只有一个支付就可以)。(如下图所示)

(3)需要明确的是,当前的一笔交易依赖之前的多笔交易,多笔交易又各自依赖之前的多笔交易,但这样也不会影响到校验的效率,因为这个过程并不需要展开校验之前发生的所有交易历史。

10、隐私(Privacy)

(1)由于向可信任的第三方索取交易信息是受到限制的,因此传统造币过程对参与者的信息具有一定的隐私保护。

(2)对于全网广播是否会打破这种隐私的保护呢?不会的。其策略为:将公钥保持为匿名。各个公众节点得知的信息仅仅是有某个人将一定数量的货币发给另一个人,但是难以将该交易通特定的人联系起来,即公众节点不能确定这些人究竟是谁。这可以类比于股票交易所发布的信息,股票交易发生的时间,交易量是记录在案且可供查询的,但是交易双方的身份信息却不予透露。

(3)为增强隐私安全,使用者可以让每次交易都生成一个新的地址,以确保这些交易不被追溯到一个共同的所有者。但是由于并行计算的存在,一定程度上的追溯还是不可避免的。因为并行输入表面这些货币都属于同一个所有者。若某人的某一个公钥被确认属于他,那么就可以追溯出此人的其他很多交易。

11、计算(Calculations)

(1)设想如下场景:一个攻击者试图比诚实节点产生链条更快地制造替代性区块链。即便它达到了这一目的,但是整个系统也并非就此完全受制于攻击者的独断意志了,比方说凭空创造价值,或者掠夺本不属于攻击者的货币。这是因为节点将不会接受无效的交易,而诚实的节点永远不会接受一个包含了无效信息的区块。一个攻击者能做的,最多是更改他自己的交易信息,并试图拿回他刚刚付给别人的钱。

(2)诚实链条和攻击者链条之间的竞赛,可以用二叉树随机漫步(Binomial Random Walk)来描述。成功事件定义为诚实链条延长了一个区块,使其领先性+1,而失败事件则是攻击者的链条被延长了一个区块,使得差距-1。

(3)攻击者成功填补某一既定差距的可能性,可以近似地看做赌徒破产问题。假定一个赌徒拥有无限的透支信用,然后开始进行潜在次数为无穷的赌博,试图填补上自己的亏空。那么我们可以计算他填补上亏空的概率,也就是该攻击者赶上诚实链条,如下所示:

(4)假定p>q,那么攻击成功的概率就因为区块数的增长而呈现指数化下降。

(5)由于概率是攻击者的敌人,如果他不能幸运且快速地获得成功,那么他获得成功的机会随着时间的流逝就变得愈发渺茫。

(6)那么考虑一个收款人需要等待多长时间,才能足够确信付款人已经难以更改交易了。假设付款人是一个支付攻击者,希望让收款人在一段时间内相信他已经支付完成,然后立即将支付的款项重新支付给自己。虽然收款人届时会发现这一点,但为时已晚。

(7)收款人生成了新的一对密钥组合,然后只预留一个较短的时间将公钥发送给付款人。这将可以防止以下情况:付款人预先准备好一个区块链然后持续地对此区块进行运算,直到运气让他的区块链超越了诚实链条,方才立即执行支付。当此情形,只要交易一旦发出,攻击者就开始秘密地准备一条包含了该交易替代版本的平行链条。然后收款人将等待交易出现在首个区块中,然后在等到z个区块链接其后。此时,他仍然不能确切知道攻击者已经进展了多少个区块,但是假设诚实区块将耗费平均预期时间以产生一个区块,那么攻击者的潜在进展就是一个泊松分布,分布的期望值为:

(8)为了计算攻击者追赶上的概率,我们将攻击者取得进展区块数量的泊松分布的概率密度,乘以在该数量下攻击者依然能够追赶上的概率。

(9)重新排列以避免对分布的无限尾部求和:

(10)利用C语言实现上述逻辑:

#include <stdio.h>
#include <math.h>

double AttackerSuccessProbability(double q, int z);
main()
{
	double d = 0.0;
	d = AttackerSuccessProbability(0.1,2);
	printf("%lf \n",d);//输入0.1和2,结果为0.050978 
}
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; 
}

对应的结果,各位可自行计算进行分析攻击成功的概率值。

注1:二叉树随机漫步(Binomial Random Walk):也就是指随机漫步是两个方向,要么是诚实链条领先,要么是攻击链条领先,形成的一种概率模型。(学习链接)

注2:赌徒破产问题(Gambler’s Ruin problem):(学习链接)

12、结论

(1)本文提出了一种不需要信用中介的电子支付系统;

(2)首先讨论了通常的电子货币的电子签名原理,虽然这种系统为所有权提供了强有力的控制,但是不足以防止双重支付。

(3)为了解决上述问题,文中提出了一种采用工作量证明机制的点对点网络来记录交易的公开信息,只要诚实的节点能够控制绝大多数的CPU计算能力,就能使得攻击者事实上难以改变交易记录。

(4)该网络的强健之处在于结构上的简洁性。节点之间的工作大部分是彼此独立的,只需要很少的协同。每个节点不需要明确自己的身份,对交易信息的流动路径无任何要求,只要尽其最大努力传播即可。

(5)节点可以随时离开网络,重新加入也非常方便,只需要补充接收离开期间的工作量证明链条就行。

(6)节点通过自己的CPU计算力进行投票,表决他们对有效区块的确认,节点不断延长有效的区块链来表达自己的确认,并决绝在无效的区块之后延长区块以表示拒绝。
(7)另外,本文提到了一个激励机制措施。

13、参考文献

  1. [1]  W. Dai, "b-money," http://www.weidai.com/bmoney.txt, 1998.

  2. [2]  H. Massias, X.S. Avila, and J.-J. Quisquater, "Design of a secure timestamping service with minimal

    trust requirements," In 20th Symposium on Information Theory in the Benelux, May 1999.

  3. [3]  S. Haber, W.S. Stornetta, "How to time-stamp a digital document," In Journal of Cryptology, vol 3, no

    2, pages 99-111, 1991.

  4. [4]  D. Bayer, S. Haber, W.S. Stornetta, "Improving the efficiency and reliability of digital time-stamping,"

    In Sequences II: Methods in Communication, Security and Computer Science, pages 329-334, 1993.

  5. [5]  S. Haber, W.S. Stornetta, "Secure names for bit-strings," In Proceedings of the 4th ACM Conference

    on Computer and Communications Security, pages 28-35, April 1997.

  6. [6]  A. Back, "Hashcash - a denial of service counter-measure,"

    http://www.hashcash.org/papers/hashcash.pdf, 2002.

  7. [7]  R.C. Merkle, "Protocols for public key cryptosystems," In Proc. 1980 Symposium on Security and

    Privacy, IEEE Computer Society, pages 122-133, April 1980.

  8. [8]  W. Feller, "An introduction to probability theory and its applications," 1957.

发布了327 篇原创文章 · 获赞 133 · 访问量 63万+

猜你喜欢

转载自blog.csdn.net/qq_30507287/article/details/103661290