从今天开始,教你写一个你自己的比特币

序言

随着你不断的深入学习区块链知识,终有一天你会想要自己从零开始实现一个完整的区块链程序。这样做不但可以把以前学习的各种零散的区块链知识有机的结合在一起了,也通过对底层的了解,你终于可以用区块链实现你想要做的事情了,而不仅仅是现在已经成熟应用的几个有限的领域。

在我第一次从零开始写区块链程序的时候,我有一个明确的愿景,想要做一个区块链数据库,用以轻松的替代现存的关系型数据库,虽然开源的区块链程序不计其数,但受限于我当时对区块链底层技术的理解,在开源区块链的基础上修改出我所期望的区块链数据库,这个目标并不现实,因为显然这些开源区块链程序并没有为我做这样的扩展做好铺垫。

于是我从零开始,一个模块一个模块的将区块链领域的各个知识点打通了,并知道和克服了一系列的底层的诸如性能优化、设计抉择的困难,最终实现了最初的愿景——区块链数据库。

这不是终点,就如大家所知的,关系型数据库利用“关系”,ACID原则等使得数据库程序更加的健壮和稳定,但却牺牲了性能,总有一些行业和应用更加关心数据库的性能,于是NoSql数据库应运而生,在这些“简单”的数据库中,所有维持系统健壮和稳定的事情都需要程序员亲力亲为,但系统却提供了前所未有的高性能。而在这个过程中开发的区块链数据库虽然提供了一种快捷、方便,且稳定、健壮的选择,但却牺牲了性能,当前区块链行业发展迅速,会有各行各业拥有不同的对数据库的要求,这并不是一个全能型方案。

因此接下来的这一段时间,我将带领大家通过亲自编写一个类比特币的区块链程序,再编写一个类以太坊的区块链程序,最终结合这个过程中学到的经验,编写了一个区块链数据库程序,以此让读者朋友们了解到编写区块链程序的过程,以及这个过程中涉及到的问题和挑战,为未来读者朋友自己实现符合自己业务需求的区块链数据库奠定基础。

我没有使用学术界推崇的伪代码方式,而是直接使用C#(符合DotNet Core 2.0框架的)编写的代码,代码不但可以直接在实际项目中应用,学习过程还可以通过真实代码的实际执行,并结合章节习题亲自动手修改代码,加深对区块链理论的认识,并可以将这些能力更快的应用到实际项目中去。

让我们开始征程吧~


到这里才是今天要更新的正文的分界线


突然说要写一个自己的比特币,心里是不是有点小激动!

确实,当我脑子里冒出这个想法时,我是非常激动的,而且很开心的是我居然做到了!

但是!

你要知道,写比特币并不一件容易的事,而教别人写比特币也并不是那么容易……即使我现在已经非常激动的,想直接跟你讲代码实现了……我的理智告诉我,还是要按部就班来比较好。

所以我们第一课,还是需要从比特币和区块链的历史讲起。


第一部分 古典的区块链

比特币作为第一个实践区块链的程序,被称作第一代区块链、区块链1.0或古典区块链。在第一部分中,我将带领你从零开始实现一个类似于比特币的区块链程序。

第1章 初探区块链

1.1        比特币的历史及发展

区块链的历史,其实就是比特币的历史。

1.1.1      比特币的发布到壮大

2008年10月31日,一份署名中本聪的论文被发表在bitcoin.org网站上(该域名于两月前才被注册),其标题为《比特币:一种点对点的电子现金系统》。论文中详细描述了如何使用对等网络来创造一种“不需依赖信任第三方的电子交易系统”,而正是在这篇论文当中他提出了区块链这样一种数据结构。

2009年1月3日比特币网络上线,推出了第一个开源的比特币客户端软件,中本聪使用该软件对挖出了创世区块(第一个区块),并获得了第一笔的50个比特币。在这笔交易中包含了这样的一句话“The Times 03/Jan/2009 Chancellor on brink of second bailout forbanks”,这是当天的泰晤士报头版标题,也是对当时由银行系统引起的不稳定的一种嘲讽。

2010年5月,佛罗里达的一个程序员,用1万比特币购买了价值25美元的披萨优惠券(2个披萨),而当时的比特币价格纯粹是根据比特币论坛上的使用者彼此协商的结果。

2010年11月27日,世界上最早的矿池出现了。在当时看来,建立矿池是一件很有远见的事情。以当年1万比特币才能兑换25美元的披萨优惠券来说,比特币总量2100万,也就价值5万多美元,这对于当时的矿池来说,其实是没有足够的经济利益的。

2011年,后来成为以太坊之父的维塔利克(Vitalik),协同创办了《比特币杂志》。

2012年10月,BitPay发布报告说,全球超过1000家商户通过他们的支付系统来接收比特币的付款。

2013年10月,世界第一台比特币柜员机在加拿大温哥华问世,由Robocoin公司所推出,允许使用者把比特币兑换成为加元提取,每天最高上限为3千加元;另一方面,使用者亦可以透过存入现金购入比特币

2013年12月,中国人民银行发布了《关于防范比特币风险的通知》,明确了比特币不具有,与法币等同的法律地位。

随着比特币的不断发展,比特币越来越被大众所接受,比特币网络的算力也是突飞猛进,在Github上面与比特币相关的项目数也是大幅的增长。

1.1.2      站在巨人肩膀上

比特币的各项技术基础也在比特币之前一步一步的成型了。

1979年,拉尔夫·默克尔(Ralph Merkle)将其提出的默克尔树申请了专利。

1982年,大卫·乔姆(David Chaum)最早提出了不可追踪的密码学网络支付系统。

1985年,Neal Koblitz和Victor S. Miller独立提出了椭圆曲线加密算法(ECC),该算法在2004年到2005年开始大范围的使用。

1990年,乔姆将他的想法扩展为最初的密码学匿名现金系统,这个系统就是后来所谓的ecash。

1998年,戴维(Wei Dai)发表文章阐述一种匿名的、分布式的电子现金系统,他将其命名为“b-money”。同一时期,尼克·萨博发明了“Bit gold”。和比特币一样,“Bit gold”也设置类似的机制,用户通过竞争性地解决“工作量证明问题”,然后将解答的结果用加密算法串联在一起公开发布,构建出一个产权认证系统。“Bit gold”的一个变种是“可重复利用的工作量证明”,开发者是哈尔·芬尼(比特币中第一笔转账交易的接收者)。

1999年,P2P文件共享软件Napster上线,使得P2P网络共享这种非常专业的事情走入普通人的世界。

2001年,美国国家标准与技术研究院(NIST)发布了SHA-2,并申请了专利,但同时也授权公众可以无版税的使用该算法。

1.1.3      比特币历史上的失误

2010年8月6日,比特币协议被发现重大漏洞,交易在登录到区块链之前并没有经过完整认证,让使用者可以绕过比特币的经济限制设定,并制造出无上限的比特币。8月15日,这个漏洞被恶意利用,一笔转账交易过程中产生了1840亿比特币,并分别转送到比特币网络上的两个地址。数小时内,这笔异常交易就被发现,并在漏洞修复后这笔异常交易被识别为无效交易,整个网络也更新为新版的比特币协议,网络发生软分叉。截至2018年7月,这是比特币历史上唯一发现并被利用的重大安全漏洞。

2013年3月12日,比特币迎来了重大的0.8版本,该版本会产生超过0.7版本允许大小的区块(由于开发者没有注意到原作者中本聪写的区块大小限制,这也是后来非常重大的功能“隔离见证”试图解决的问题),导致比特币网络出现明显的分叉,对于用户能感知到的,是可以在运行0.7和0.8版本的交易所(即两个分叉)上分别花掉一次同一份钱。作为反馈,Mt. Gox交易所临时停止了比特币的提现,比特币价格也迅速的下跌。当时的主要矿工讨论决定将新版本退回到旧版本0.7,使得0.8版本导致的分叉被废弃掉,几个小时后,整个比特币网络重新恢复了共识。

下一章节预告:

下节我将为大家带来“区块链系统概述”。

狭义来讲,区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式数据结构,并以密码学方式保证的不可篡改和不可伪造的分布式账本。

广义来讲,区块链技术是利用块链式数据结构来验证与存储数据、利用分布式节点共识算法来生成和更新数据、利用密码学的方式保证数据传输和访问的安全、利用由自动化脚本代码组成的智能合约来编程和操作数据的一种全新的分布式基础架构与计算方式。 

以下几节分别从密码学、区块链的链状结构、分布式网络、轻量客户端和智能合约方面对区块链系统做概念上的阐述。

本章内容并没有打算深入到每一个细节,只是希望能给读者以区块链的全局观,方便后续做程序实现的时候,可以更加明白自己正在做的是区块链的哪个部分,而技术细节和一些关于细节方面的疑问都会在后续的具体代码实现的章节中得到解答。

感谢小漫画作者汐亚 weibo.com/lovehiya 喵喵~