最近 bitcoin 很火,我也是最先从云风那里了解到的,后来发现李笑来&霍炬对其都有涉及。不过他们对其具体技术原理的描述还是不够细致,所以我自己把bitcoin wiki又重新看了一遍。 看完之后,疑惑挺多,我对这个体系远没有前面三位这么乐观。诚然,它会成为"Geeks "手中的玩物甚至灰色交易的工具,但要说的达到「一出天下反」的程度,那还需要解决一些技术和金融方面的问题。
这里先谈技术原理,技术和金融缺陷见下一篇bitcoin 的技术和金融缺陷。要想了解 bitcoin 的技术原理,首先需要了解两个重要的密码技术:
- HASH 码:将一个长字符串转换成固定长度的字符串,并且其转换不可逆,即不太可能从 HASH 码猜出原字符串。bitcoin 协议里使用的主要是SHA256。
- 公钥体系:对应一个公钥和私钥,在应用中自己保留私钥,并公开公钥。当甲向乙传递信息时,可使用甲的私钥加密信息,乙可用甲的公钥进行解密,这样可确保第三方无法冒充甲发送信息;同时,甲向乙传递信息时,用乙的公钥加密后发给乙,乙再用自己的私钥进行解密,这样可确保第三者无法偷听两人之间的通信。最常见的公钥体系为RSA,但 bitcoin 协议里使用的是lliptic Curve Digital Signature Algorithm。
和现金、银行账户的区别?
bitcoin 为电子货币,单位为 BTC。在这篇文章里也用来指代整个 bitcoin 系统。
和在银行开立账户一样, bitcoin 里的对应概念为地址。每个人都可以有 1 个或若干个 bitcoin 地址,该地址用来付账和收钱。每个地址都是一串以 1 开头的字符串,比如我有两个 bitcoin 账户, 1911HhKdLbnsffT5cRSiHgK3mdzMiyspXf 和 1JSUzrzMk7f6iymfVkvqLBJDBZXBopyfZK。一个 bitcoin 账户由一对公钥和私钥唯一确定,要保存账户,只需要保存好私钥文件即可。
和银行账户不一样的地方在于,银行会保存所有的交易记录和维护各个账户的账面余额,而 bitcoin 的交易记录则由整个 P2P 网络通过事先约定的协议共同维护。
我的账户地址里到底有多少钱?
虽然使用 bitcoin 的软件可以看到当前账户的余额,但和银行不一样,并没有一个地方维护每个地址的账面余额。它只能通过所有历史交易记录去实时推算账户余额。
我如何付账?
当我从地址 A 向对方的地址 B 付账时,付账额为 e ,此时双方将向各个网络节点公告交易信息,告诉地址 A 向地址 B 付账,付账额为 e。为了防止有第三方伪造该交易信息,该交易信息将使用地址 A 的私钥进行加密,此时接受到该交易信息的网络节点可以使用地址 A 的公钥进行验证该交易信息的确由 A 发出。当然交易软件会帮我们做这些事情,我们只需要在软件中输入相关参数即可。
网络节点后收到交易信息后会做什么?
这个是整个 bitcoin 系统里最重要的部分,需要详细阐述。为了简单起见,这里只使用目前已经实现的 bitcoin 协议,在当前版本中,每个网络节点都会通过同步保存所有的交易信息。
历史上发生过的所有交易信息分为两类,一类为"验证过"的交易信息,即已经被验证过的交易信息,它保存在一连串的「blocks」里面。每个"block"的信息为前一个"bock"的 ID (每个 block 的 ID 为该 block 的 HASH 码的 HASH 码)和新增的交易信息(参见一个实际的 block)。另外一类指那些还"未验证"的交易信息,上面刚刚付账的交易信息就属于此类。
当一个网络节点接收到新的未验证的交易信息之后(可能不止一条),由于该节点保存了历史上所有的交易信息,它可以推算中在当时每个地址的账面余额,从而可以推算出该交易信息是否有效,即付款的账户里是否有足够余额。在剔除掉无效的交易信息后,它首先取出最后一个"block"的 ID ,然后将这些未验证的交易信息和该 ID 组合在一起,再加上一个验证码,形成一个新的「block」。
上面构建一个新的 block 需要大量的计算工作,因为它需要计算验证码,使得上面的组合成为一个 block ,即该 block 的 HASH 码的 HASH 码的前若干位为 1。目前需要前 13 位为 1 (大致如此,不确定具体方式),此意味着如果通过枚举法生成 block 的话,平均枚举次数为 16^13 次。使用 CPU 资源生成 block 被称为「挖金矿」,因为生产该 block 将得到一定的奖励,该奖励信息已经被包含在这个 block 里面。
当一个网络节点生成一个新的 block 时,它将广播给其它的网络节点。但这个网络 block 并不一定会被网络接受,因为有可能有别的网络节点更早生产出了 block ,只有最早产生的那个 block 或者后续 block 最多的那个 block 有效,其余 block 不再作为下一个 block 的初始 block。
对方如何确认支付成功?
当该笔支付信息分发到网络节点后,网络节点开始计算该交易是否有效(即账户余额是否足够支付),并试图生成包含该笔交易信息的 blocks。当累计有 6 个 blocks ( 1 个直接 blocks 和 5 个后续 blocks )包含该笔交易信息时,该交易信息被认为「验证过」,从而该交易被正式确认,对方可确认支付成功。
一个可能的问题为,我将地址 A 里面的余额都支付给地址 B ,同时又支付给地址 C ,如果只验证单比交易都是有效的。此时,我的作弊的方式为在真相大白之前产生 6 个仅包括 B 的 block 发给 B ,以及产生 6 个仅包含 C 的 block 发给 C。由于我产生 block 所需要的 CPU 时间非常长,与全网络相比,我这样作弊成功的概率微乎其微。
网络节点生产 block 的动机是什么?
从上面描述可以看出,为了让交易信息有效,需要网络节点生成 1 个和 5 个后续 block 包含该交易信息,并且这样的 block 生成非常耗费 CPU。那怎么样让其它网络节点尽快帮忙生产 block 呢?答案很简单,协议规定对生产出 block 的地址奖励 BTC ,以及交易双方承诺的手续费。目前生产出一个 block 的奖励为 50BTC ,未来每隔四年减半,比如 2013 年到 2016 年之间奖励为 25BTC。
交易是匿名的吗?
是,也不是。所有 BITCOIN 的交易都是可见的,我们可以查到每个账户的所有交易记录,比如我的。但与银行货币体系不一样的地方在于,每个人的账户本身是匿名的,并且每个人可以开很多个账户。总的说来,所谓的匿名性没有宣称的那么好。
但 bitcoin 用来做黑市交易的还有一个好处,它无法冻结。即便警方追踪到了某个 bitcoin 地址,除非根据网络地址追踪到交易所使用的电脑,否则还是毫无办法。
如何保证 bitcoin 不贬值?
一般来说,在交易活动相当的情况下,货币的价值反比于货币的发行量。不像传统货币市场,央行可以决定货币发行量, bitcoin 里没有一个中央的发行机构。只有通过生产 block ,才能获得一定数量的 BTC 货币。所以 bitcoin 货币新增量决定于:
1、生产 block 的速度: bitcoin 的协议里规定了生产 block 的难度固定在平均 2016 个每两个星期,大约 10 分钟生产一个。CPU 速度每 18 个月速度加倍的摩尔定律,并不会加快生产 block 的速度。
2、生产 block 的奖励数量:目前每生产一个 block 奖励 50BTC ,每四年减半, 2013 年开始奖励 25BTC , 2017 年开始奖励额为 12.5BTC。
综合上面两个因素, bitcoin 货币发行速度并不由网络节点中任何单个节点所控制,其协议使得货币的存量是事先已知的,并且最高存量只有 2100 万 BTC (目前每周增加约 5 万 BTC )
更多信息可参考bitcoin wiki。
Q. E. D.