比特币(BitCoin)到底是什么?运作原理大揭密!

最近比特币真的非常红,世界上有许多大型服务都接受比特币付款,可惜我还不知道比特币到底是什么?所以、想说趁编杂志的机会了解一下,比特币到底是怎么运作的。

2008 年中本聪(Satoshi Nakamoto,化名)提出了一种数字货币,有兴趣者请参考中本聪的原始论文:

  • Bitcoin: A Peer-to-Peer Electronic Cash System — http://bitcoin.org/bitcoin.pdf

随后,他以开放、对等、共识、直接参与的理念为基准, 结合开源软件和密码学中块密码的工作模式,在P2P对等网络和分布式数据库的平台上,开发出比特币发行、 交易和帐户管理的作业系统。其系统让遍布整个对等网络使用者端的各节点,按照其种子档案达成网络协定, 从而确保在货币发行、管理、流通等环节中公平、安全、可靠。并承诺比特币将成为类似电子邮件的「电子现金」。实作在不需要审批、人人都有权发行的前提下,避免通货膨胀,并无法伪造;支付完成之后,使用者就失去对该比特币的所有权。2009年1月3日50个比特币问世。

与传统货币不同,比特币执行机制不依赖中央银行、政府、企业的支援或者信用担保,而是依赖对等网络中种子档案达成的网络协定,去中心化、自我完善的货币体制,理论上确保了任何人、机构、或政府都不可能操控比特币的货币总量,或者制造通货膨胀。它的货币总量按照设计预定的速率逐步增加,增加速度逐步放缓,并最终在2140年达到2100万个的极限。

有多种途径使用比特币,透过电子货币交易所、服务商和个人等渠道,就能兑换为当地的现金或金币;也可以直接使用它购买物品和服务。随着接受比特币支付的个人、组织、商家和企业的迅速增长,其汇率在四年内上涨了数千倍。截止到2013年3月30日,全部发行比特币按市价换算为美元后,总值突破为10亿美元。虽然比特币是目前使用最为广泛的一种电子货币,但是除部分国家对虚拟货币有明文规定外,还没有任何国家对比特币的发行作出法律的规范和保障。

2009年1月3日,中本聪开创了比特币P2P开源使用者群节点和哈希函数系统,从此,其对等网络和它的第一个区块链开始执行, 他发行了有史以来的第一组50个比特币。

一年后,在比特币论坛上,使用者群的自发交易中,产生了第一个比特币公允汇率。该交易是一名使用者发送一万个比特币, 购买了一个披萨饼。目前,比特币最为主要的参考汇率是MT.GOX 交易所内比特币与美元的成交汇率。

2013 年11 月18 日,在东京的MT.GOX 市场交易的比特币对美元汇率飙升至一对九百美元。

如果一块披萨以10 元美金计算的话,比特币从2010 年到2013 年间,已经从万分之十美元,涨到了九百美元,总共涨了九十万倍,这真是超级夸张的一种涨法啊!

比特币的运作方法

比特币是类似电子邮件的电子现金,交易双方需要类似电子信箱的比特币钱包和类似电邮位址的比特币位址。和收发电子邮件一样,汇款方透过电脑或智能手机,按收款方位址将比特币直接付给对方。下列表格,列出了免费下载比特币钱包和位址的部分网站。

使用者端名称 网址 许可协定
Multibit(云端资料区块功能) http://multibit.org/ MIT
Bitcoin-Qt(中本聪使用者端) http://sourceforge.net/projects/bitcoin/ MIT
My Wallet(线上钱包,独立式) https://blockchain.info/wallet 专有软件
Coinbase(线上钱包,混合式) http://coinbase.com 专有软件
Electrum http://electrum.ecdsa.org/ GPL
Armory(具有离线储存功能) http://bitcoinarmory.com AGPL

举例而言,「1DwunA9otZZQyhkVvkLJ8DV1tuSwMF7r3v」就是一个比特币位址,比特币位址是由27 到34 个之间的英文或数字所构成的,第一个字元只能是1 或3。(这个位址类似RSA 当中的公钥)

比特币位址和私钥是成对出现的,他们的关联就像银行卡号和密码。比特币位址就像银行卡号一样用来记录你在该位址上存有多少比特币。你可以随意的生成比特币位址来存放比特币。每个比特币位址在生成时,都会有一个相对应的该位址的私钥被生成出来。这个私钥可以证明你对该位址上的比特币具有所有权。我们可以简单的把比特币位址理解成为银行卡号,该位址的私钥理解成为所对应银行卡号的密码。只有你在知道银行密码的情况下才能使用银行卡号上的钱。所以,在使用比特币钱包时请保存好你的位址和私钥。

中本聪的论文

如果您了解RSA 这样的非对称式金钥加密系统,要了解比特币的技术应该就不太难了。

透过公开金钥的方式,我们可以设计出如下图的加解密货币系统,来纪录每一笔交易,但是这样的系统有个弱点,就是没办法防止同一块钱(coin) 被重复使用。

如果要避免重复使用的问题,那么就必须要加入造币厂(mint) 中央控管的方式,以下是中本聪在该论文谈到的关键文句。

The problem of course is the payee can't verify that one of the owners did not double-spend the coin. A common solution is to introduce a trusted central authority, or mint, that checks every transaction for double spending. After each transaction, the coin must be returned to the mint to issue a new coin, and only coins issued directly from the mint are trusted not to be double-spent. The problem with this solution is that the fate of the entire money system depends on the company running the mint, with every transaction having to go through them, just like a bank

所以、我们需要在「没有造币厂中央控管」的情况下,设计出一种机制,能够让收款人(payee) 确定该数字钱币的前一任收款人(previous owner) 没有重覆花用该钱币。

We need a way for the payee to know that the previous owners did not sign any earlier transactions. For our purposes, the earliest transaction is the one that counts, so we don't care about later attempts to double-spend. The only way to confirm the absence of a transaction is to be aware of all tr​​ansactions. In the mint based model, the mint was aware of all tr​​ansactions and decided which arrived first. To accomplish this without a trusted party, transactions must be publicly announced, and we need a system for participants to agree on a single history of the order in which they were received. The payee needs proof that at the time of each transaction, the majority of nodes agreed it was the first received.

为了设计出这样的机制,中本聪提出了一个采用「时间戳记伺服器」(Timestamp Server) 的办法,该钱币的每一手用户都要对前一手的讯息(包含签名) 再进行签名,如下图所示:

The solution we propose begins with a timestamp server. A timestamp server works by taking a hash of a block of items to be timestamped and widely publishing the hash, such as in a newspaper or Usenet post. The timestamp proves that the data must have existed at the time, obviously, in order to get into the hash. Each timestamp includes the previous timestamp in its hash, forming a chain, with each additional timestamp reinforcing the ones before it.

图2、对交易进行时间戳记的机制

哈希现金系统

但是、光有时间戳记并没办法解决问题,因此中本聪写到,我们需要一个「验证机制」 (Proof-of-Work),这种机制采用了Adam Back在Hashcash – A Denial of Service Counter- Measure (PDF, 2002)这篇文章中所创造出的一种哈希现金系统,这种系统才是虚拟货币的主角,而中本聪的主要贡献是将P2P的机制引入这种哈希现金系统当中,并创造出对应的程式。。

To implement a distributed timestamp server on a peer-to-peer basis, we will need to use a proof-of-work system similar to Adam Back's Hashcash, rather than newspaper or Usenet posts.

  • 注1:上述Adam Back的论文并非第一篇,而是Adam Back在1997年提出hashcash stamp五年后的一个总结版本,后来Adam Back为此成立了http://www.hashcash.org/这个网站:

  • 注2:学术论文往往都是这样,看一篇论文时,最麻烦的是一层一层往上追,追出与该技术相关的重要论文,以便串出整个故事的脉络。

那么、到底Adam Back 的论文说了些什么呢?其中的关键在于一个称为成本函数(Cost-Functions) 的技术上面。

成本函数(Cost-Functions)

为了建构出一种无法否认的数字现金系统,必须仰赖一类称为成本函数(Cost-Functions) 的不可逆函数,这种函数很容易验证(efficiently verifiable),但是却很难破解( parameterisably expensive to compute)。

A cost-function should be efficiently verifiable, but parameterisably expensive to compute. We use the following notation to define a cost-function.

成本函数并非只被用在现金系统上,也可以用在对付「垃圾邮件」上,例如以下文章中就记载可用像「因数分解」这样的问题来考验「寄信者」 让他们不容易到处发垃圾信,因为收信端只接受那些「通过因数分解」问题的信件,于是发垃圾邮件者就必须耗费大量的CPU 时间去发信给这些采用Cost-Functions 认证的人,否则信件就不会被接受。

  • 可爱的Python:用hashcash打击垃圾邮件-想发送垃圾邮件,就要付出代价 , David Mertz, Ph.D. (mertz@gnosis.cx),开发人员, Gnosis Software, Inc.

对交互式质询来说,因数分解足以胜任。比如,我有一个在线资源,希望您能象征性地为其付出代价。我可以向您发送一个消息,说“只要您能因数分解这个数,我将让您得到这个资源”。没有诚意的人将无法得到我的资源,只有那些能够证明自己有足够的兴趣、付出一些CPU 周期来回答这个质询的人才能得到这个资源。

但是质数问题并不是最好用的,目前最常使用的Cost-Function 是SHA (Secure Hash Algorithm),其运作方法如下

为了实现非交互式的“支付(payment)”,hashcash 让我向所有想给我发送电子邮件的人都分发一个标准质询。在您的消息头中,必须包括一个合法的hashcash 戳记(hashcash stamp);具体地说,该标志中包含我的收件人地址。

hashcash提出质询的方式是,当通过安全散列算法(Secure Hash Algorithm)进行散列时,要求“minters”生成一个字符串(戳记,stamps),在它们的散列中有很多前导零。所找到的前导零的数目就是特定戳记的比特值。给定SHA-1的一致性与加密强度,找出给定比特值的hashcash戳记的惟一已知途径是平均次运行SHA-1。

然而,要确认一个戳记,只需要进行一次SHA-1 计算即可。对于电子邮件中的应用来说,当前推荐使用的是20-比特值: 为了找到一个合法的戳记,发送者需要进行大约一百万次尝试,在最新的CPU 和经过编译的应用程序上,这将需要不到一秒的时间。在相对旧一些的机器上它也只需要几秒钟的时间。

由于SHA 函数可以很容易的设定b 的大小,从而可以很容易的控制该Cost-Function 的难度,于是我门就可以指定希望耗用的CPU 时间, 而那些愿意耗用这些CPU 时间的人,就可以透过CPU 时间换取这种数字现金。

于是、我们就可以利用这种方式,去考验某些人是否有足够的「耐心」,因为这些人必须努力的用CPU 时间去通过考验,然后才能得到那些现金(也就是某种萝卜或报偿,像是取得寄送email 给某人的权利,或者拥有一个比特币的权利)。

  • 注3:必须注意的是,比特币采用的算法是SHA-2 族群的SHA-256 算法,而非上述防止垃圾邮件文章中所使用的SHA-1 演算法,SHA-256 比SHA-1 更加安全,更难破解。

  • 注4:SHA-2 一族的算法针对SHA-1 进行了安全改良,SHA-2 其实是SHA-224, SHA-256, SHA-384, SHA-512 的统称。

  • 注5:我不太了解所谓「前导零」数量与「找出给定比特值的hashcash戳记的惟一已知途径是平均次运行SHA运算」之间的关连,一种猜想是我们对某文件进行SHA运算,算出的SHA签名之后必须有b位元的前导零,这样确实需要尝试大约次才能得到一次成功,但我不确定是否是这样运作的。

验证系统

让我们回到中本聪的论文里,谈到如何建构「验证系统」(proof-of-work)的那部份,中本聪提到像SHA-256这样的哈希函数可以用来建立签名链。由于SHA这类哈希函数有个特性,就是哈希值的二进位是以一堆前导0开始的,如果前导0的个数(b值)越多,则越难找出该函数的签名(因为平均需要次的SHA运算才能找到)。

The proof-of-work involves scanning for a value that when hashed, such as with SHA-256, the hash begins with a number of zero bits. The average work required is exponential in the number of zero bits required and can be verified by executing a single hash.

但是一但签名者找出并签上之后,要验证时只需要一次的SHA 运算就行了,因此这种SHA 运算完全符合上述的成本函数(Cost-Function) 之要求。而且更棒的是,可以透过前导0 的个数(b 值) 设定签名的困难度。

有了像SHA 这类的Cost-Function 之后,中本聪想出了一种仰赖于CPU 总计算时间的「时间戳记系统」,这种签名系统仰赖SHA 中前导0 个数(b) 来确认该「签名链」 (Block-Chain) 是否正确,以下是「中本聪」论文中的图片与说明:

图3、愈往后、签名填入愈困难的签名链(Block-Chain)

For our timestamp network, we implement the proof-of-work by incrementing a nonce in the block until a value is found that gives the block's hash the required zero bits.

上文中,中本聪提到,透过随机数(nonce) 递增的方式,要求能用SHA 随机找出对应数量前导零的方式,可以形成这样的时间戳记网络。

接着中本聪说,如果有人想要从某节点开始伪造,就必须伪造该节点之后的所有签名,除非他能计算的比所有其他人的总和更快,否则将无法成功的骗过大家,如下文所示:

Once the CPU effort has been expended to make it satisfy the proof-of-work, the block cannot be changed without redoing the work. As later blocks are chained after it, the work to change the block would include redoing all the blocks after it .

因此诚实的伺服器总是占有优势的,因为诚实者不需从头计算起,只要忠实的将他人计算出的签名记录下来就行了,因此想要伪造的人通常会耗费大量的CPU 时间,而且很难打败诚实的伺服器。

这样的系统也在某种程度上解决了「投票决定谁是老大」的问题,而这种投票机制是建构在「一颗CPU 一票」的架构上,而非像网络用一个IP 位址一票的方式。在这种架构下,谁的签名链最长,谁就是拥有决定权的老大,而诚实的伺服器由于不需重新计算签名,因此比不诚实者更具有优势。

The proof-of-work also solves the problem of determining representation in majority decision making. If the majority were based on one-IP-address-one-vote, it could be subverted by anyone able to allocate many IPs. Proof-of- work is essentially one-CPU-one-vote. The majority decision is represented by the longest chain, which has the greatest proof-of-work effort invested in it. If a majority of CPU power is controlled by honest nodes, the honest chain will grow the fastest and outpace any competing chains. To modify a past block, an attacker would have to redo the proof-of-work of the block and all blocks after it and then catch up with and surpass the work of the honest nodes. We will show later that the probability of a slower attacker catching up diminishes exponentially as subsequent blocks are added.

  • 注6 :在https://en.bitcoin.it/wiki/Nonce这个比特币网站中,对Nonce一词进行了解释如下,所以比特币要求SHA-256要能找出可以符合b个前导零的签名才能被认证,这也是为何前导零越多越难找到的原因了。

The “nonce” in a bitcoin block is a 32-bit (4-byte) field whose value is set so that the hash of the block will contain a run of zeros. The rest of the fields may not be changed, as they have a defined meaning.

Any change to the block data (such as the nonce) will make the block hash completely different. Since it is believed infeasible to predict which combination of bits will result in the right hash, many different nonce values are tried, and the hash is recomputed for each value until a hash containing the required number of zero bits is found. As this iterative calculation requires time and resources, the presentation of the block with the correct nonce value constitutes proof of work.

您可以从以下这个代表Block #274933的比特币区块网页看到,其中的hash值有很多个前导零,这些比特币交易讯息的网页可以做为进一步研究比特币运作机制的参考。

  • https://blockchain.info/block-index/447551/000000000000000084b3fa58d47c178c8cd33aa8896b2d228ef8dcd07ac7c9f9

  • 注7:在How Bitcoin Hashing Works这个网页中,有一段话解释了nonce的概念如下:

The nonce (rhymes with once), is a user editable 4 byte field to calculate the final hash. This will typically start at 0, and for every unsuccessful hash will be incremented and hashed again. It will continue this until 2^32 numbers are checked, and if the last one is invalid, a message will be sent to the network saying the Merkle Root extended nonce needs to be increased and the whole process starts again.

So how do you determine if the hash is valid or not? The target. The final hash needs to be less than or equal to the target.

This target is the “Bits” field, only it has to be padded. However, since getting such a low target (in most cases) is so difficult, so most miners choose the largest target value they can compare to and check to see if the hash they got meets the requirements and then sends it off.

签名与货币之间的关系

但是看到这里,中本聪只说明了「前导零」越长,要填入签名就越困难,但是这与比特币之间的关系是什么呢?

关于这点,我在该论文里没有看到相关的说明语句,但是根据整个论文的逻辑,我的理解推论如下:

假如每填入一个签名,就可以获得一枚比特币,那么所有人就都要努力的去填入签名,以便获得比特币。

但是这样有个问题,一开始没有任何比特币,因此也就没有任何的「交易」,没有交易的话那就不需要签名了,所以这世界上根本就不会有这样的货币存在啊。

因此、系统必须采用某些货币产生策略,稳定的产生一些比特币作为那些建立伺服器让比特币系统运作起来的网站之报酬。

中本聪称这种报酬为Incentive (奖励)。

于是中本聪写到:

By convention, the first transaction in a block is a special transaction that starts a new coin owned by the creator of the block. This adds an incentive for nodes to support the network, and provides a way to initially distribute coins into circulation, since there is no central authority to issue them. The steady addition of a constant of amount of new coins is analogous to gold miners expending resources to add gold to circulation. In our case, it is CPU time and electricity that is expended.

当然、这种奖励机制应该是公开透明、而且可以被所有伺服器计算出来的,否则就会有些伺服器乱给自己奖励了。

有了这种奖励机制之后,就能解决「一开始没有任何比特币」的问题,于是整个系统就可以完整的运作了。

为何比特币挖矿越来越难?

当这些奖励注入系统时,就有可能开始进行交易了,有了交易,那么就会产生如图1 所示的交易链,而这些交易链需要签名以避免被恶意窜改(如图2),而那些帮忙计算签名的人又可以获得一些比特币,于是比特币就会越来越多。

但是由于签名链越来长,所以如果货币发行率(由奖励公式决定) 越来越小的时候,那么计算签名的任务将会耗用更多的CPU 时间, 要能透过帮助计算签名去取得比特币也就会越来越难了。

  • 说明:我猜测比特币一开始时,前导零的长度可能很小,但是随着时间与挖掘的数量,笔者推测前导零的长度应该会随之增加,也就是b的値会越来越大,于是想要找出符合这种b个前导零的SHA哈希值就会越来越难了(因为要花费次SHA运算),这应该也就是比特币之所以越来越难挖的原因了。

研读至此,我大概已经理解了比特币的运作原理,剩下的就是整个货币系统的建构细节考量了!

在论文的后半段,中本聪说明了这种比特币网络的建构与讯息流通原理,另外还透过「布瓦松分布」(Poisson Distribution) 去分析比特币被骇客攻击,导致某些签名链被修改的机率。对于这部份有兴趣的朋友就请直接看原始论文啰!

但是、在读完中本聪的比特币论文之后,笔者仍然有个疑问,现行比特币的奖励公式到底是什么呢?中本聪在论文里好像没有提出说明!

后记

这篇文章是笔者研读中本聪的比特币论文Bitcoin: A Peer-to-Peer Electronic Cash System的笔记,一开始笔者完全不了解这个领域的技术,研读时也没办法彻底理解文中很多技术的意义,还好笔者有点密码学的概念,因此稍微可以读懂。

于是当我写了「初稿」之后就在自己的facebook上与程式人杂志社团里分享给网友看,结果看的人还不少,甚至有些网友还指出文章中的一些问题,像是有人说「比特币不是采用SHA-256吗?」,于是笔者查证之后发现确实是SHA-256,因此赶紧更正,然后又有网友发现我对nonce的解释有问题,因此说:「至少nonce的运作方式说明错了,公开的发表要小心!」,而且还告诉我们「https://blockchain.info/可以查到比特币的立即资讯」,这让笔者可以透过观察「比特币交易」更进一步了解比特币的运作方式。

笔者并非很严谨的人,而且很喜欢分享文章,因此往往在文章写好后就分享出去。在这篇文章的分享过程中,我发现了这种早期就分享文章的撰写方式,其实有点像Linux 这种开放原始码软件的建构方式,透过不断的修改与分享,可以让「读者与作者」随时进行交流,于是「程式与文章」都可以透过这种交流逐渐成熟。

在开放原始码领域,领域里的Eric Steven Raymond曾经写过一篇称为大教堂和市集的经典文章,将传统软件开发隐喻为大教堂模式,而开放原始码像Linux这样的系统开发则隐喻为市集模式。

结果Eric Steven Raymond 发现市集模式其实也可以做出很好的软件,像是Linux 等这样大型的作业系统,也可以透过市集模式建构出来。

而在这篇文章的撰写过程当中,我们也发现采用类似市集模式的方法,我们也可以用在写作文章上面。未来或许会有些伟大的文章或书籍,是采用市集模式撰写出来的也说不定呢?(其实、维基百科就是这样一个范例,不是吗?)

本文链接地址:https://www.wwsww.cn/btbwhy/1423.html
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。