作者地址:136LvpXuWFRjfuVBCmoqFFGSstbMQkNEKr
在不删除作者地址,不删改原文的前提下,本文可在任何形式媒体上自由转载。(是的,署名都不需要保留)
第负一章 反馈
第负一章第一节 风险警示
鉴于有人说这是软文,作以下声明:
1.作者目的在于阐述原理,并主观判断比特币作者的本意不在于“骗钱”。但是如果大家认为目前的过分乐观的宣传是为了忽悠后来者接盘,我并不否认这种可能性。
2.比特币随时可以价值归零(或者基本归零) 2013-03-12 IEEE Spectrum: Major Bug In The Bitcoin Software Tests The Community。政府可以随时宣布比特币非法。
3.由于比特币涨跌幅度巨大,我不愿意有人因为我的文字买或者没买而遭受巨大损失,以后如果再答题的话将仅提供纯粹信息,不包含任何主观意见。
4.谁能让@李笑来 给我发点工资?地址见上。那样我就名至实归了。
第负一章第二节 删节版
鉴于大多数人(包括我在内)认为此文又臭又长,特提供删节版,希望有所帮助。
function mine() { while(true) { longestChain = getLongestValidChain() -- A number that changes every time, so that you don't waste time -- trying to calculate a valid blockHash with the same input. nonce = getNewNonce() currentTXs = getUnconfirmedTransactionsFromNetwork() newBlock = getNewBlock(longestChain, currentTX, nonce) -- http://en.wikipedia.org/wiki/SHA-2 -- and this is what all the "mining machines" are doing. blockHash = sha256(newBlock) if(meetReqirements(blockHash)) { broadcast(newBlock) -- Now the height the block chain is incremented by 1 -- (if the new block is accepted by other peers), -- and all the TXs in the new block are "confirmed" } } } //////////////////////////////////////////////////////////////// function sendBTC(amount) { sourceTXs = pickConfirmedTransactionsToBeSpent(amount) tx = generateTX(sourceTXs, targetAddrs, amount, fee) signedTx = sign(tx, privateKeysOfAllInputAddress) broadcast(signedTx) } ////////////////////////////////////////////////////////////////
第零章 玩具
最近比特币又火了,而且得到了主流媒体的普遍报道。可惜的是大概一万个谈论比特币的人中也没有一个真正懂它是怎么工作的,于是只要一提到比特币,什么庞氏骗局,传销之类的话马上就杀过来了。弄得普及比特币知识的人一个个都是骗子。要知道比特币在进入大众视野之前,是一帮hackers和geeks慢慢养大的玩具,他们绝对不是生长骗子的土壤。
改变世界要从自己做起。所以我今天下定决心,写一篇让初中生也看得懂的文章(如果你觉得还是看不懂,绝对不是你智商不够,而是我无知自大,写得不好。那些说自己智商不够的朋友让我觉得惶恐),来介绍比特币运行的原理。也许你看完跟我一样,会佩服其天才的设计:原来他是这样把“个人发行货币”这种荒诞不经的想法变为现实的。
通俗易懂是本文的初衷,同时又希望篇幅尽量小,势必要忽略细节,或做不精确的比喻,必定贻笑大方,还请谅解,而且欢迎各种批评指正。文中包含了大量比喻,对这部分千万不要当真。我会用非专业性的语言尽我所能地描述事实真相,但是如果想真正懂得原理,请去官网。当然本文也可以用于研究官方文档前的预热。
比特币是个比较复杂的系统,如果你想10分钟就弄明白,神仙也办不到。还希望多开点耐心的预算。
第一章 账单
第一章第一节 撕纸游戏
比特币本质上是一个广播和管理账单的系统。也许有点让人难以相信的是,每个标准客户端都保存有有史以来每一笔帐单。而且没有任何特殊结点(服务器),因而称之为去中心化的点对点系统。
很显然帐单必须唯一,那么在一个点对点的系统中如何能做到这一点呢?想像100个互不信任的人住在一个小岛上,他们没有物理货币,只能相互给账面上钱,并且每给一笔都喊一句让所有人知道。如果他们每人都可以记帐,显然就乱套了:当两个人的帐单对不上号怎么办?如果由一个指定的人来记帐,那他又有可能以权谋私。
比特币怎么解决这个问提?每个人都可以记帐,把每一笔交易都记在一张牛皮纸上,签个名。那么,谁的牛皮纸算数呢?很简单,所有人都得把这张纸撕成等面积的两半,让误差小于一定值,比如0.1%。如果满足这个条件,那么你的就被大家认可,每人复印一份拿回家。什么?你撕完了发现误差是0.100001%?对不起,大侠请重新来过。为什么要撕纸呢,因为纸一分为二形成的那一条线,是独一无二的,具备了防伪的功能。而撕成误差极小的两半,是有“难度”的,没有难度无法成为游戏。
没事干玩撕纸游戏干嘛?因为大家约定,每个人都可以在帐单上添一笔,说“比特岛公共基金给本人25元”。你的账单被判为有效的话,你就得到了这25元。这个撕纸游戏就叫挖矿,因为游戏过程就像淘金一样。
比特币的挖矿就是用电脑来进行这种撕纸撞大运的游戏,当前的数据是全络“撕”61,000,000,000,000次每秒,换句话说大概每61,000,000,000,000 x 600 次尝试产生一个幸运儿。无疑这需要巨大的硬件和能源,但是如你现在所知,这是维持比特币这个金融系统必须付出的成本,而不是所谓的“纯粹浪费资源”。要明白现实中的金融系统要比这个昂贵得多,一个银行客服的成本相当于多少台电脑?
第一章第二节 账单链
所有的有效账单组合在一起,才能成为完整的账单。怎么做到这一点呢?每一份账单都把前一份账单缩小成1/10,贴在自己的角落上,换句话说每个账单都知道上个账单是哪个,一个链就形成了。这对玩记账游戏的人有产生问题了:假如第123份账单生成好了,A和B都拿这个作为前一个节点,记账,撕纸,然后他们几乎同时撕出了符合要求的账单怎么办?那个稍微慢一点点的(假定是B)怎么甘心认输呢?方法很简单:大众只认最长的那一条链。所以,当一个新账单生成并被广播时,每个玩家会立即放弃当前这一局游戏,拿到最新的账单缩小成1/10,贴在自己的新的一张账单的角落上,开始下一轮游戏。否则就算你撕出了合法的账单,也会被孤立,变得无效。
明白B是怎么被淘汰的了吗?想象这样一个有趣的无限接力赛游戏:环形赛道,每一棒一圈,每圈跑完以后你就把棒子插到一个“下一代接力棒生成器”中,生成一大堆下一代接力棒供下一棒的选手们使用。只要你的棒子的下一代被大多数人使用,你就为这一轮的胜者。显然下一棒的选手们会去拿最早生成的新一代棒子,因而其他的上一棒的选手会自动就放弃。哪怕是由于惯性B也跑到交棒点,然后顺手把棒子插到一个“下一代接力棒生成器”中,也是徒劳的。因为大家都已经跑了,再也没人理会你的接力棒了。
但是如果真的有两个人同时跑到终点怎么办?那也没关系,下一轮就会有拿着两种棒子的人跑了。平局的这一轮两个人如何决胜?你应该也已经想到,“我不比你快,我儿子比你快就行”。在现实挖矿中,这种两种棒子同时跑的现象是十分常见的,所以矿工每隔一段时间就要经历一次“空欢喜”。具体可见Orphaned Blocks。
第一章第三节 游戏规则
记账是个日常事务,所以矿工每时每刻都在试图制造合法的账单。那么假如我希望每天一份账单就好,但是这些矿工技术越来越好,玩的人越来越多了怎么办呢?没关系,如果账单生成得太快,就提高误差要求,反之降低要求,以达到动态平衡。比特币的控制目标是十分钟一个账单,就是传说中的一个"Block".
怎么保证没有人伪造账单呢?答案是不能100%保证,但是伪造非常困难。由于账单链的存在,伪造一份账单必须把从这份账单以后的所有账单全部伪造一遍。否则,比如你伪造的是第123份,大众拿手里的第124份的复印件中的第123份的缩略图一对比,会发现撕纸的痕迹不一样。因而拒绝承认你的合法性。你也无法直接窜改那牛皮纸,因为撕纸游戏规定一旦有改动,该纸立即作废。因而那个被大众所承认的账单链代表的,其实是历史上所有的最高效的撕纸生产力的总和。你要推翻它就必须拿出比这个更大的生产力伪造一条新的更长账单链,然后指鹿为马说,你这条链才是合法的,因为大众只认可最长的那一条。
这里需要注明的是,不是说如果一个人控制了51%的资源的话他就能为所欲为了,他能做的只是把自己曾经花钱的账单抹掉,或者把自己花出去的某一笔钱的收款人改掉。也就是说他不可能给自己凭空加钱,或者吧别人的账单改掉。这也是为什么有很多山寨币就这样被攻击也没有死掉的原因。
注意,这不是不可能。现实中新一代矿机的制造商完全有这样的能力,因为他们的生产力是别人的成百上千倍,再加上规模化制造矿机,这个是很容易实现的。但问题是很显然这背离了他们的利益,这会是对他们自己赖以赚钱的平台的核心机制毁灭性打击,所以这种事情是不会发生的。
如果对这个还是不放心的话,其实已经有修补这个漏洞的方案,只不过似乎目前并未实施。
第一章第四节 2100万
如同很多人知道斯诺克满分是147一样,很多人最先了解到比特币的信息之一便是,比特币总数上限是2100万。对普通人来说,这就是最大的卖点。而这又是如何实现的呢?其实这个上限就是前面提到的比特岛公共基金的总量,通过撕纸游戏分配给获胜者。显然总有一天是要坐吃山空的,怎么办呢?两个办法。一是往后拖:每四年撕纸的奖励减半,09年还奖励50呢,如今13年就只有25了。这么玩要玩到下个世纪才算瓜分完。二是伸手要:假如你给别人钱的同时,给记账的一点小费,别人就优先给你记账,你的交易就较早第得到确认。原作者的假设是,到最后矿工只通过小费获得收益。
这里面隐藏的一个重要的信息是,比特岛公共基金是通过这个游戏做了另外一件非常重要的事,把钱分发出去的。发现了吧,记账和分发货币,这两个最基本的工作,就是由这个巧妙的游戏完成的。
第二章 支付
第二章第一节 匿名
说了这么多,其实最根本的问题还没有聊到,那就是比特岛上的人都是没有名字的,这个账单要怎么写?更重要的是,D 说 D 给了 WM 0.5元,记账的如何知道 D 的账户上有没有0.5元,又如何记录 WM 从此多了0.5元钱呢?比特岛人是通过“发微博”实现的,神奇吧。
假定 D 的微博号是 188Nxs23XGUonU8og9u6n4CNwr5oqqsVjE(以下简写为188N),WM 的微博号是 19XRiapec1aDN4NCJMmLkkp7iXegEQvBGz(以下简写为19XR)。只要 D 在微博上发 “我支付给 @ 19XR 0.5元” 就好了。为什么这句话直接就被判定为真话呢?@罗永浩说自己的ROM比MIUI好,大家都会怀疑他是不是吹牛,但是如果他说自己的ROM比MIUI差,就不会有人质疑他了。同样的道理如果@188说“@19XR支付给我0.5元”,是不会有人直接采信的,但反之则可。
我们来一个案例分析,其中有三名参与者。除了上文提到的 D,WM 外,再加上微博号为 136LvpXuWFRjfuVBCmoqFFGSstbMQkNEKr(以下简写为136L)的比特岛居民 DS。DS辛苦挖矿得到25元,然后上交20元给 D, 后来 D 又支付0.5元给WM。
首先是 DS 赢得了某轮的撕纸大赛,那个全岛唯一,人手一份的账单链上的最后一份账单是 DS 生成的。那么这份账单上就有一条写着“比特岛公共基金支付 @136L 25元”。(当然如果这位 DS 真名是雷锋,他就会写成 “比特岛公共基金支付 @188N 25元”,完全把自己的劳动成果奉献给 D,这也是完全可以的。)
然后 DS 通过微博账号@136L 发微博说“我支付 @188N 20元”。这时所有矿工们(也就是记账的)都看到了,要不要记录在册呢?他们首先要去查账单链,看看@136L总共收到多少钱,又送出去多少钱,如果其余额大于20的话,那这笔账就是有效的,可以记下了。矿工们查完发现@136L 只存在于一笔获得25元的交易上,余额就是25元,当前交易有效。
后来 D 又通过微博账号@188N 发微博说“我支付 19XR 0.5元”。同样由于根据账单链发现@188N余额大于0.5元,交易被记录。
总结一下。 第一,一组微博的用户名密码就是承载比特币的一个容器,所谓的“钱包”就是记录你所拥有的所有的微博用户名密码的文本文件。第二,账单链中保存的全部都是“微博用户名”,你根本无法知道是谁拥有这些用户名对应的密码,这就是所谓的匿名。
但是从另外一个角度看,比特币又是完全透明的。因为任何一个“微博用户名”的财富总量都是公开的数据。如果你有兴趣可以去观摩一下高富帅的交易历史,比如Bitcoin Address 1933phfhK3ZgFQNLGSDXvqCn32k2buXY8a
第二章第二节 点对点
现实生活中比特币的交易是完全点对点的,不依赖于微博这么蠢的东西。(事实上任何网站都不是比特币系统的一部分,不管是官网,还是最大的交易网站mtgox,或者是http://blockchain.info。它们都只是这个生态圈的一部分,比特币的运转,不依赖于它们任何一个。)而做到这一点,比特币用的是数字签名技术。而且比特币系统并不会刻意跟踪某个地址拥有多少钱,而是通过管理每笔交易的输入输出来记录账目的。
数字签名比较复杂,比特岛人是用不惯的,他们如何操作呢?还是撕纸。我们还是拿 D 给 WM 0.5元为例子。我们先假定 DS 在第1024页账单的419条目给了 D 25元。
第一步,WM 随便拿张纸,随便撕成甲乙两半。然后吧其中甲部分交给 D,这半张纸就是一个比特币地址。
第二步,D 向大众广播这样一封信:“我是第1024页账单的419条目的受益方,我要将其中的0.5元转让给这半张纸(附上 WM 给他的半张纸)。”
第三步,记账者收到消息,调出第1024页账单的419条目,查看此条目的受益方收到的钱够不够,然后验证次受益方就是本次交易的发起人。全部确认后,则把这则账目包括这半张纸(或者其复印件)纳入账单中。假定此条目为1984页1989条。
现在,当 WM 要把钱转让给别人时,他就可以拿出他剩下的那张纸的乙部份,证明的收益方是他,因为世界上只有他这半张纸跟1984页1989条中记载的那半张纸匹配。
再回来看第二步,其实D也是通过提供某张纸的乙部份来证明他是第1024页账单的419条目的收益方的。
总结一下,一个交易包含一下信息:
1.资金来源,即前面某个账单中的某个条目。
2.资金去向,即某张纸的甲部分的复印件,和金额大小。用于指定本次交易的受益方和金额。
3.签名,即资金来源条目中所副的那张半张纸对应的乙部份的复印件,用于证明此次交易是由资金来源所指向的收益方发起的。
这里要注明的是,我们假定撕开的纸的甲部分是可以无限重复复印的。而乙部份由受益方持有,且只有从原件复印出来的第一代复印有效,换句话说签名只有乙部份的持有人才可以做。
实际上在这个例子中,一张纸的甲部分就是比特币地址,比如我提供的136LvpXuWFRjfuVBCmoqFFGSstbMQkNEKr,而乙部份则是被我严格加密保存在wallet.dat中的一个秘钥,他跟136LvpXuWFRjfuVBCmoqFFGSstbMQkNEKr是一对。而所谓的附上乙部份的第一代复印件,就是利用秘钥对信息签名的过程。
换句话说,“我向136LvpXuWFRjfuVBCmoqFFGSstbMQkNEKr打入0.0001BTC”实际的意思是“我把0.0001BTC的控制权交给了136LvpXuWFRjfuVBCmoqFFGSstbMQkNEKr对应的秘密字符串的拥有者”。
第二章第三节 重要的细节
一个典型的比特币客户端含有N个地址及其对应的私钥,而不是一个。而且这N个地址相互没有什么特殊关系,只不过在界面上它会显示所有地址所拥有的比特币的余额。这是相对于常见的一用户名一密码模式的最大区别。这个带来的问题是“钱包备份”的问题:别以为备份一次就万事大吉了,有可能有新产生的地址秘钥没有得到备份。当然这样的备份方法也是有的,这里只是提醒要安全备份,就不展开说了。
再介绍另外一个有趣的细节。如上文所说,当你把比特币打给另外一个地址时,你所发出的消是,“我要吧第M号交易的输出到地址X的一些比特比作为输入源,输出给地址Y”。这里有一个非常重要的规定,就是每笔交易都必须输入源的金额用光!所以比特币客户端的做法是创建一个“找零地址”,把额外的输入输出给这个找零地址。举个例子,假如我的某地址136LvpXuWFRjfuVBCmoqFFGSstbMQkNEKr某次交易获得了1万个比特币,然后当我拿这笔钱中的0.01个币买一瓶矿泉水时,公众就会从全局账单看到地址136LvpXuWFRjfuVBCmoqFFGSstbMQkNEKr打到地址DZA 0.01个币,同时打到DZB 9999.99个币。当然公众无从知道这个DZB只是我的一个找零地址。所以有些搞数据分析的专家看到频繁的大规模财产转移就会以为这是刻意的转移/掩盖财产,最后发现闹了笑话。
第三章 沙发 --总结以及FAQ
第三章第一节 主观臆断
这一章叫沙发,因为文章主体已经结束了。
相信很多人都抢过沙发,或者是在论坛上抢整。我想问大家一个问题:把时间倒回2009年,当比特币还一钱不值的时候,你们会去挖矿抢币吗?我想我一定会的,原因跟抢沙发类似,但是比抢沙发更有意思:
a. 我所抢的东西是个“好”东西,它好到可以让人崇拜。正如你会去抢你喜欢的人的沙发。
b. 稀缺,如果没有总量上限,我就不会去“抢”了。沙发也如此,是限量供应的。
c. 绝对可靠的物权,只要没有丢掉我的私钥,我的就永远是我的,没人能拿走。
我想,不管当初钟本聪开发比特币时,是抱着实验的心态,还是真的预见到自己要改变世界,对于普通玩家来说,在最初很长的一段时间内,挖矿只是一种优雅的抢沙发的方式,当然也许还有认为它日后真的能生根发芽的一种“信仰”。
总有人问我,比特币有什么“实际价值”,一般来说有此会引发一堆关于法币,黄金或者是“Rai stones”的大辩论。这里我不想纠缠于这个问题,只想回答另外一个问题:比特币问什么有价格?有人想要,可以交换,稀缺这三个要素构成了价格形成的必要条件。可以交换,稀缺是比特币天生的,那么”有人想要“这个判断为不为真呢?当然!我只需要举出一个例子,那就是我,本文作者。
回到那个虚拟的比特岛,如果把世界上的所有人分成两类,相信比特币的和不相信比特币的,然后前者都住在比特岛上。那么,不管在岛外的人看起来多么可笑,对于岛上的人来说,比特币就是黄金。
比特岛外的人也是可以持有比特币的,因为尽管他不承认这种货币,但是只要他随时可以到比特岛换回”真金白银“就可以了。
听说过那个2010年有人用1万比特币买一个pizza的故事吗?比特币不是一个突然冒出来的价值上千人民币一个的怪物。只不过是比特岛的人口一直在不紧不慢的增长,比特币的潜在价值也在不紧不慢地增加,在这个IT时代的参照系中,比特币发展得没有你想象的快。但是比特币的价格并没有像其潜在价格一样增长,而经常是积蓄上涨的力量,然后突然像火山喷发一样,吸引全世界的眼球。
比特币真的会改变世界吗?如果你问我而且只能用“会“或”不会“来回答,我的回答是”不会“。正如比尔盖茨所说“I think it's a techno tour de force, but that's an area where governments are gonna maintain a dominate role.(我认为比特币是个技术杰作,但是政府会在这个[货币]领域保持统治地位)”取代法币是妄想。比特币的下限是继续沦为少数人的玩具,上限是成为IT时代的黄金。
以上是主观臆断。
第三章第二节 客观事实
客观事实是:比特币不是骗局,所以任何形式的骗局都跟比特币无关。对我个人而言,说比特币是庞氏骗局会让我很难受,就像我本来有个女儿像奶茶妹一样漂亮却被人说长得跟凤姐一样。
先简单介绍一下庞氏骗局:我要骗钱,于是我成立了一个基金,但是我并不投资,只是做假账,跟投资者说我的基金回报又稳定又高。这样一来我的基金必然会出现越来越大的实际亏空,这没关系,只要有越来越多的人把钱投入我的基金,我的现金流就不会枯竭,骗局也就不会被拆穿。众所周知的诈骗500亿美元的Bernard Madoff就是因为金融危机才导致其骗局显形。
说比特币是庞氏骗局的人认定比特币创始人 Satoshi Nakamoto(注:没人知道Satoshi是一个人还是一个组织,而且目前他已经”退出江湖“) 就是 Bernard Madoff。因为Satoshi作为最早的挖矿者之一,是大量比特币的持有者,所以比特币升值他就是最大的受益者。因而他就是背后的骗子。这个理论最大的问题在于一个”骗“字。在比特币的世界,一切都是透明的,骗从何来?任何人如果购买比特币都是基于自己对公开信息的判断,Satoshi既没有也无法跟投资者保证又高又稳定的回报,而这个是庞氏骗局的基本特征。
任何一个庞氏骗局都有一个死穴,那就怀揣一本假账。Madoff以前总是以商业机密为由,拒绝透露投资细节。任何一个基金只要将自己的投资流向完全公开,就可以洗脱庞氏骗局的嫌疑了。那么我想问,如果Satoshi想要洗脱嫌疑,你作为怀疑者想要他公开什么?他持有的比特币的数量?好吧,就算他如人们所猜测拥有100万比特币,站在镜头前像全世界宣布这个事实,那又怎么样呢?比特币就土崩瓦解了?我看不出来为什么这会对比特币有什么致命性的影响。没有谁骗了谁,没有阴暗的秘密,骗局无从谈起。
现在说说传销,比特币是我见过最滑稽的传销了。假如我拥有十个比特币,那么我传销一个比特币获得的收益有多少呢?我们可以大致估算一下:假定传销出去一个比特币给比特币带来的升值约相当于销毁一个比特币所带来的,那么每传销出去一个比特币我持有的每个比特币大约升值 1/(2100万)。换句话说,我这是为所有的比特岛人搞传销,或者说共产主义传销。这么崇高的共产主义传销你见过吗?
传销的特点是,每个人*直接*从其下家获利,比特币完全不具备这个特点。实际上持有比特币的人鼓吹比特币,跟持有黄金的人鼓吹黄金,或者持有北京房子的人鼓吹房价没有什么区别。是有点讨人厌啦,但是传销这帽子扣得大了点。我个人一般都在鼓吹的同时警示风险,表示不懂的话不要玩。
为什么大家都喜欢说比特币是骗局呢,并不是因为他们真的通过分析比较,然后从逻辑上得出这样一个论断。而是因为他们对比特币的看法是“没有实际价值,最后下家买单”。长得这么反革命,自然就是反革命了,拖出去游街批斗!
比特币长得这么反革命不是没有原因的,但是我想把“没有实际价值,最后下家买单”改成“可能低于实际价值,可能最后下家买单”。对比特币的恶评,无非是来源于对其巨大的泡沫风险和不确定性风险的反感。是的,查理芒格爷爷说得没错”比特币是老鼠药“。对于一个不了解它的人,最好把它当做老鼠药:不要碰!
第三章第三节 结语
比特币是什么?本质上,跟HTTP 或者 Bittorrent 一样,它是基于因特网的一个协议,一个天才的发明创造。跟HTTP 或者 Bittorrent 一样,它以互联网为基础,使得以前不可想象的事情变成可能。
在现实中,它被说成是一帮无政府主义者的乌托邦,也被说成是人类经济史上的一次大革命;它被认为是天才的技术创造,也被认为是有很多缺陷的一个开源软件;它被利用成投资或是投机的工具,也被当做不可接触的老鼠药。
由于不同的背景,不同的看问题角度,每个人眼中必然有不同的比特币。盖茨说它是技术杰作,而芒格说它是老鼠药,从某种角度看,他们都能自圆其说。作为键人我,唯一的希望是,你看完这篇文章后不要再说比特币是“骗局”了。这种说法真的显得很没文化,你不觉得吗?
---------------------------------
[更新 2013-8-2]
添加 51%攻击细节
[更新2013-11-6]
应要求增加Copyfree版权声明。
[更新2013-11-13]
风险警示
[更新2013-11-22]
删节版