4

比特币的技术原理

 3 years ago
source link: https://zhiqiang.org/it/technical-document-of-bitcoin.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

比特币的技术原理

作者: 张志强

, 发表于 2011-06-07

, 共 3353 字 , 共阅读 165 次

最近 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.


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK