原文:姚勇 编辑:沈大海 一、比特币运行机理概述 比特币体系是由 账簿(block),交易单,钱(bitcoin),和交易(transactions)等几个概念组成。 1 账簿(BLOCK),账簿链,与交易单 1)账簿 比特币体系,不存在单独货币。只存在账簿(BLOCK)与交易单。每个人有自己的账户 ID(一个或多个钱包)。 每一次交易,获得多少钱,花多少钱,全以交易单形式记录在一个全世界唯一的账簿上。账簿 上会记录很多交易单。相当于银行交易底单。只要账簿上收支都记录清楚,这个世界不需要单独 货币也可以做交易(等于大家都刷卡交易)。 账簿有很多本。每本账簿只记录比特币全世界 10 分钟内的交易信息。每 10 分钟一个新的 账簿被产生(制造/创建)出来。所以账簿随时间流逝会不断增多。每个人每做一笔交易,某个 账簿上就会记录这笔交易单。这个记录过程是比特币软件通过网络自动完成的(黑客很难伪造)。 目前比特币世界存活了 4 年多,就有大概 24 万多本账簿了。(4 年*365 天*24*60 分钟/10 分钟 = 21 万本账簿) 2)账簿链 账簿本全局唯一。因为这个世界发生过的交易肯定是全局唯一的。记账记录也会是唯一的。 所有账簿本是被一根链子串起来的(双向链表---账簿链)。每个账簿里,都记录着前一个账簿 和后一个账簿的索引。知道任何一个账簿,都能顺藤摸瓜向前或者向后找到所有账簿 。这也决定 了账簿记录交易的前后关系。这等于是银行的对账底单。后面会说交易的前后关系对比特币体系 是最核心最重要的事情。 这个链表保证了不可更改,确认真伪等。 比特币世界(以下简称“世界”),只有一套唯一的账簿(由于被串起来,也就是账簿链)。 在每个用户 PC 上都保存一个备份。等于每个用户都保存一份这个世界从诞生起到当下所有交易 的记录备份(全球所有用户的所有交易)。记录备份较大,比特币软件会有优化手段,这里不细 说。 每个用户都备份所有交易记录,这就是比特币没有银行的机理,因为不需要一个中心来储 存所有交易,每个人都必须要储存所有的。 3)交易单 交易单记录一笔交易的具体信息。比如付款人账号 ID,收款人账号 ID,付款金额,付款人 签字,收款人公钥,等。 世界中,每隔差不多 10 分钟,就会有一个新的账簿本制造出来,添加到世界里(加到账簿 链尾部)。有了新的账簿,这十分钟里发生的交易单,就都写到这个新产生的账簿中。查看账 簿可以去这里:http://blockexplorer.com/,输入账簿(BLOCK)的序号,从 0 到 24 万,就可 以看每个账簿里记录的交易单。 可以看到序号靠前的账簿(BLOCK)里都没有交易单。说明账簿 产生前 10 分钟里没有交易(那时候大家还根本不知道这么个玩意儿)。 世界中,先临时记录下 10 分钟里的交易。然后用这些交易单,创建一个新账簿。把这些记 录都放进去。之后这本账簿就封存作为底单。只提供查询用。每个用户账户有多少钱,都要从这 些底单中推算出来。 2 钱(比特币/bitcoin)的由来---账簿创建(挖矿) 1)钱的由来 有账簿,可以记录交易。但是世界中总要有钱可花。初始时可以花的钱怎么来的? 世界中每个用户都可以创建账簿。 谁创建账簿,就给谁钱! 一个账簿被创建后,这个账簿里初始就有钱。钱归创建者所有。所以每个账簿第一条 交易 单总是“世界给予创建者张三 50 元”。注意,比特币世界里没有独立的钱,只有交易单。钱都 是通过交易单体现的。钱的产生都是从每个账簿第一条交易单来的。 账簿里初始有多少钱,根据世界中已经创建账簿的数量来定。世界刚开始,创建一个账簿 有 50 元。产生到第 21 万个账簿之后,每个账簿里初始降低为 25 元。以此类推,第 42 万个账簿 创建后,账簿里初始只有 12.5 元。 但随着账簿创建数量增多,账簿里初始钱减少。最后,比特 币世界中只会有 2100 万元钱。钱初始全部是创建账簿的人所有。账簿可以不断创建下去,但是 每个新账簿里初始的钱几乎为 0 了。(可花的钱数量恒定,很像通货紧缩的世界)。 这些创建账簿的人有钱之后,可以和其他愿意兑换的人兑换,做交易。比如买 PIZZA,或者 和愿意用美元/人民币购买比特币的人换现金。 2)账簿创建 /制造(挖矿) 世界先记录 10 分钟里发生的所有交易单。接着用这些交易单创建一个账簿。账簿里记录了 这些交易单。 账簿创建后,成为记录全世界 10 分钟里发生交易的永久记录本。账簿属于这个世界。不属 于创建者。但是里面的钱归创建者。 账簿制造很难。不能随意创建。极其消耗电脑时间。大家先理解为那是一个艰难的计算过 程,和扔几亿个骰子差不多 。要等到几亿个骰子的数字加起来刚刚符合要求 。如果网络上一个用 户扔出的骰子符合要求,还要和其他正在扔骰子的用户比较 。看看谁扔的筛子更多。选出扔筛子 最多的人制造的账簿。这要买很多 CPU/显卡来计算(GPU),要花电费。是个苦差事。创建一个账簿后, 账簿里面的钱,是奖励这些创建账簿的人。也是这个世界钱的由来。账簿极难伪造,所以钱也很 难造假。比现实世界造伪币难多了。 世界中,整个世界账簿每 10 分钟产生一个的速度不会改变。不管有多少试图创建账簿的用 户在同时努力,每 10 分钟只会有一个新账簿被创建出来。这是算法决定的。算法具体的后面讲。 创建出一个新的账簿,这个用户就发了一笔小财。每 10 分钟会有一个幸运儿。 现实世界中,人们需要买采矿机,挖掘矿石卖出得到钱。比特币世界里,人们需要买来强 力 PC 和显卡/ASIC 等,来创建账簿以得到钱。所以创建账簿这件事被形象地叫做“挖矿”。只 不过不用去发现金矿位置。在比特币互联网数字世界里,2040 年前,只要有强力矿机,就能挖 出矿(创建账簿),随即获得钱(不用卖矿)。 总得来讲,账簿是算出来的,钱也是凭空产生的。之所以有人愿意花现实世界的钱去购买, 一定是有某种原因的。后面再讲。归根结底是必须有人 愿意。比如类似炒股票,抄黄金。低价 买高价卖。股票是纸,黄金是用处很小的金属。之所以有人 愿意买,是因为卖得出去,能换成 现实世界的物品或者货币。 提一句,挖矿到最后,账簿本身就没有比特币产出了。但是由于交易频繁,交易过程中可 能因为交易数量和交易单分支过大 ,会产生一些交易费。这个交易费会直接给予交易单所在账簿 的制造人。这么做是为了鼓励在 2100 万比特币挖完之后,依然有动力继续制造账簿。没有账簿 就没有比特币交易体系。账簿必须不断制造下去。否则比特币体系就完蛋了。(没钱谁还挖矿 , 没矿这世界就坍塌,这真的不是个坑么?) 3 交易过程(TRANSACTION) 用一个例子说明比特币世界交易过程 比如,2012 年某一天,张三要给李四 10 元(单位是比特币)。用来够买李四的披萨饼。 张三要做的事,是用比特币软件向全世界宣布,“我张三给李四 10 元了”。 于是比特币世界会 生成一个交易单,向 P2P 全网广播,大致内容(不一定精确,但说明个意思): 1 交易单 ID 2 资金来源---上个交易单 ID(张三的钱从哪 里来的,比如王二), 3 王二对上一笔资金的签字(证明是王二给 张三的) 4 资金去向---李四收款帐号, 5 数额---10 元, 附加张三的签字(每个用户都能够鉴别这是 张三签的 10 元交易单,不能伪造) 之后此交易单记录在世界第 180000 本账簿上。 网络上每个用户都保存了这个交易记录。这就 是交易全部过程。这个交易单世界每个用户可以查询。至于张三的名字,是以一串数字代替 。这 样虽然可以查询交易单 ,但是不知道是现实世界中谁做的交易 。每个用户在比特世界只是一串数 字。用于大家匿名交易。 张三李四各用比特币软件查询自己的账户时,由于第 180000 本账簿上有一笔交易单,李四 向全网求证这个交易是否属实(非常快就可以证实12345),如果属实,李四头上就多了 10 元。张三的账户同理,会少了 10 元。 账户余额统计 注意,交易单里缺少一个信息,就是张三账户有多少钱。世界中也没有银行储存张三账户 有多少钱。那么如何辨别每个人账户有多少钱,是否能够支出那么多数额? 下面讲解比特币世 界如何统计一个用户的账户余额。 统计张三余额,就是统计张三的钱从哪里来,有多少。那只有 2 个可能。1,张三创建账簿 (挖矿)里初始给的钱;2,别人给张三的。从“上一个交易单 ID”可以很容易追溯张三户头的 钱都从哪些交易里来。 比如我账户有 200 元。来源分别是:1,创建账簿获得 50;2,张三给我 100 元;3,李四给 我 50 元。 张三的 100 元是创建 2 个账簿获得。李四 50 元是王二和周七 2 人各给了李四 25. 王 二和周七的钱也有来源,比如都由刘八分别给王二和周七各 25 元。刘八的 50 元是创建账簿所得。 逐步追溯回去,每个人的钱来源都能统计清楚。那就得到了我账户的 200 元数目。 追溯所有单据后,所有的账户约都会回溯到挖矿所得,经过多次交易,得到我的余额:200 最终大家钱的来源都会追溯到账簿创建时给予创建者的钱。毕竟钱只有 “创建账簿”这么 一个来源。钱在交易过程中被不断分割为不同数量 ,给向不同账户。钱在比特币世界中,所有的 交易走向历史全部清清楚楚。每个人账户的钱也是靠交易单中的 “资金来源”追溯出来。 我如果给出 200 元。我的交易单中就要注明这 200 元的 3 个资金来源(交易单 ID): 1)我 创建账簿(挖矿)获得 50 元的交易单。 2)张三给我 100 元的交易单 ID。 3)李四给我 50 元的 交易单 ID。 4)资金去向:壹基金捐助帐号 ID 5)金额:200 元 我的签字 二,安全的保障 比特币体系最大的贡献和优点,是很好的解决了交易安全问题。 现实生活中,金子有假的, 钞票有假的,支票有假的,信用卡有假的 。但比特币交易单没假的。 银行和基金虽然没假的,但是银行利用国家暴力机器,强行逼迫被统治的劳动人民使用它 发行的统一货币。从而达到彻底控制人民劳动所得,任意利用金融工具获得巨额利益。恣意增发 货币导致通货膨胀,货币贬值,物价增高,人民劳动成果化为流水,房价高到无法负担,或者房 市崩盘。人民居无定所。这都是由于某些金融机构,某些国家,某些集团,利用货币中央管理的 特点,进行的正确或者错误的控制与操作导致 。所以在安全交易的基础上 ,去中心化这个想法天 生有一些令人神往的特点(是不是真的靠谱后面细说 )。交易安全也是摒弃中央银行管理的基础 。 没有安全,一切无从谈起。 下面简单讲述一下比特币体系如何保障用户交易安全的机制。比特币安全机制涉及到非对 称加密算法和数字签名,sha256 散列算法(hash),Hashcash 的工作量证明机制等。详细理解 机理,需要仔细阅读这些技术文献。为了做到通俗易懂,本文把这些算法全部映射到现实中日常 生活用到的概念。不保证精确,但保证概念正确。 比特币世界中,张三提交一笔交易,给李四付款 25 元。类似张三签一张支票给李四。要保 证安全,需要确认几点: 1,交易确实是张三提交的;2,张三有 25 元;3,张三签署的支票这 25 元过去没有支付过给别人。以下逐一介绍。 1,sha256(散列/hash)含义 首先我们需要一个编码方法。给任意不同的数据(字符串,字母数字组合排列等,比如账 簿内容,或者交易单内容),标记一个全世界唯一的标记(一个整数)。相同的数据,给予相同的 标记。不同的数据(字母数字,以及排列顺序等),一定给予不同的标记。 这个编码方法有个特点。对一个数据编码很容易。但是只有编码,无法反推出编码的数据。 这个特点被广泛用于比特币机制。 sha256 散列的含义:可以理解为 sha256 是一个函数。任何一串数据,送入这个函数,都会 得到一个整数。这个整数大小范围在 0 到 2^256 次方。也就是 256bit 长度的整数。相同的数据 送入此函数,会得到相同的结果。数据不同,就会得到不同的结果。等于用一个 256bit 的数, 给任意数据做编码。每个数据都有自己特定的编码。256bit 长度的这个整数非常巨大。比地球 上所有沙子的颗粒还多。所以只要送入这个函数的数据稍有不同 (字母数字,以及排列顺序等), 这个数据就会得到自己独一无二的 256bit 整数编码。 2,是否交易真实 ------ 数字签名 1)交易单签字 由于没有银行做保证中介,张三和李四是直接交易。现实生活中 2 个从未相识的人做交易, 会极其不靠谱。因为没有实体货币,张三声称付款给李四后,完全可以不认帐。即便现实中 ,张 三也可以用假币付款然后跑路。 比特币采取的方法是:让付款方用户在交易单上根据交易单内容来签字(数字签名)。并 且让收款方有办法验证这个签字的真实性(不用法院和笔迹对比专家)。 这个签名靠“非对称加密算法”,保证付款方签的字,没人能作假,并且付款方自己必须 认帐。 2)数字签名大致描述 有必要简单介绍数字签名。 一个只有签名者自己知道的密码,作为密钥。签名者用这个密钥可以对任意数据加密。得 到一个数字签名。 同时这个签字者对全世界公开一个“公钥”,意思即为公开的钥匙。其他人 可以方便快速的用这个“公钥”解密签字,查看签字的解密后内容。如果有证据表明:解密签字 后的内容,与加密者加密的内容相符 ,就能证明这个内容确实是加密者加密的 。比如加密者用私 钥加密了一个字符串,写着自己名字的签名。大家用公钥解开一看,便知道这个签名一定是加密 者干的。 最重要的是,比特币交易单这个签名和交易内容严格相关。一个人,用同样的私钥(印章/ 手印)签署不同内容的交易单,签出来的字也会不同 。这一点是计算机算法比按手印更优越的 地方。所以一旦用户对一个交易单签字了,且被其他人验证,就有两样事情他无法抵赖:1,付 款方签字付款了;2,付款方的资金来源(包括金额) 3)对交易单的签名和验证过程 签名: 1 付款人 A 首先制作一张交易单 T2。T2 要包括收款人 B 的“公钥”(一组数字)。 2 得到 A 资金来源的上一张交易单 T1 的数据。T1 代表 A 要支付这笔钱的来源,它必然是之 前某个时刻由某人通过 T1 支付给 A 的(或者挖矿所得)。 3 利用 T1 的数据和 B 的公钥联合起来,求出一个 hash 数值 x。 4 A 用自己密钥对 x 进行加密。得到一个 A 的签名 s。 5 把这个 A 的签名 s 附加到交易单 T2。发给收款人 B。 验证: B 为了验证这个签名。需要做以下事情: 1,得到付款人 A 的公钥,这是解密 A 签名 s 的钥匙。 付款人的公钥,会在此张交易单的 上一张交易单 T1(资金来源交易单)里。 因为 A 要付款的这笔钱,一定是之前某个时刻,由某 个人 X,通过交易单 T1 发给 A 的。 于是付款人 A 的公钥也会在上面。 2,收款人 B 解密 T2 上 A 的签名 s,得到 A 加密前的内容,是一个整数 x。 3,收款人 B 把 T1 交易单数据与 B 的公钥联合起来, 取 hash 值 y 4,检验 x 是否等于 y。如果等于,那么说明 T2 交易单有效。一定是 A 发出的,且资金来源 A 无法抵赖。因为资金来源是 T1 交易单中的支付内容数据(包括金额),已经被关联计算到 hash 值 y 中。A 既然对 y 加密 成为数字签名 s,而这个加密过程只有 A 自己能做,故而证明交易单 T2 是 A 签署支付的。 网络上没有人能签出一样的数字签名。而且如果这个世界上存在一个被你签名的交易 单,说明你确实签过这个交易单,这个事实无从抵赖。类似现实生活的指纹画押。这都是算法保 证的,不用怀疑。类似方法各大银行包括美国军方也在使用。 有交易单,上面有你的签字。证明你确实付款了,而且这个签字和交易金额直接相关。金 额也无法抵赖。于是你账户的钱就会少。耍赖反悔是没用的。相当于卡已经刷了,你再也没有能 力拿回你的钱。 你不能制作一个别人向你付款的交易单。因为只有付款的人才有能力签字。你没有对方的 密钥(印章/手印等),无法签出一张别人向你付款的交易单。 另外,每个一笔钱的走向是由一系列交易单 链串起来的。交易单 签名的时候,签出来的名字,不仅和一张交易单内容相关,而且还和这笔钱之前相关所有交易单 的内容都相关(签字的形成,和前一个交易单的散列值相关)。这一个签字下去,就固化了一笔 钱上所有交易单的内容,金额与之前的签字(签字也是交易单内容的一部分)。任何人可以很容 易的验证和这笔钱相关交易单链中的所有签字 。这意味着:要伪造或修改一个交易单,需要把一 笔钱交易单链条中,被修改交易单后面所有交易单全部修改一遍 。而交易单储存在全世界统一的 账簿中。账簿又被所有用户备份。所以比特币世界,没有任何人能够修改交易单链中间的单据 。 3,是否有足够的钱支付 前面的交易单说明了如何根据交易单内容的“资金来源”一项,最终回溯出 一个账户的余额是否足够支付交易单款项 。一个用户是否可以伪造自己的账户余额?并且签署一 个交易单,支付出本来不存在的钱? 首先,伪造挖矿是极难的。后面细说。 其次,伪造某一个交易单。让交易单的“资金来源”指向一个金额很大的大款账户交易单。 这需要伪造那个大款账户的签名 。因为“资金来源”下面跟着是资金来源付款方的签名 。这个签 名必须和交易单内容对应上。每个用户私有签名别人无法模仿,这是算法保证的,所以做不到 。 然后,篡改交易单,让交易单的“资金去向”是自己的小号,然后付款金额改得很大。根 据交易单关系图,金额修改得再大也没用。因为软件要从这个账户交易单一直追溯到挖矿记录 。 你篡改的交易单金额,无法正常回溯,会识做非法支付。即便你篡改了自己的软件。当别人用正 常软件回溯交易单(注意交易单是全世界统一的)时,依然会露馅。 4,是否重复支付 ------ 建立全局唯一交易记录 还有一种对交易单篡改的情况,没有列出。那就是复制交易单。修改其中一个交易单的收 款人。从一个“资金来源”,重复向 2 个人付款。这就是“重复支付”。 举例: A 挖矿所得 50 比特币后。A 给 B 支付 50 比特币换取 PIZZA。提交一个交易单“AB”。然后 复制此交易单变为“AC”,改为 A 给 C 支付 50 比特币换取 50 美元。A 把“AB”和“AC”2 个交 易单同时提交出去。 由于网络传输速度不同,B 先接到了付款交易单 AB。快递了 PIZZA。C 先接到了交易单“AC”, 支付给 A 美元。由于交易单签名是合法的。只是由于 B 和 C 所处网络地点不同,无法全面了解 A 发出交易单的全部情况和顺序。导致 A 用 50 元的余额账户支付了 100 元。 所以这种由于没有中 央服务器来决定交易时序的情况,就必须得到解决。 在银行的体系下,于比特币的付款类似在支票上签字。当我签字两张支票给 2 个收款人后, 2 个收款人会去银行兑现。银行的交易记录中,2 人的兑现必然是分前后次序的。一个人用支票 从我账户取钱时,另外一个人绝对不可能同时从我账户取钱(双重支付)。假如我账户只有 50 元。我签署了两张 50 元的支票。2 个收款人同时在 2 个银行网点兑现。银行的交易记录必然有 一笔兑现交易在前,取走 50 元后,我账户余额为 0.第二个收款人无法再从我账户提取现金。假 如银行允许同时支付,2 个用户同时兑现支票,他们俩人都会发现我账户有 50 元。于是同时提 现......比特币系统大家都是平等地位 ,没有银行之说,谁也说不清我是否为一笔钱签署了两张 支票。即便需要把 2 张支票的交易向全网广播,由于网速问题,整个网络也无法判断哪笔支付在 前。 禁止重复支付,是比特币技术要解决的核心问题。它的核心,就是在 P2P 网络体系下,创 建一套全世界统一且唯一的有前后次序的交易记录。以保证一笔钱的交易没有重复支付的情况。 下一章专门讲解。 |