欢迎光临KOTOO财情




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

2024-11-28 233

编按

最近比特币真的非常红,世界上有许多大型服务都接受比特币付款,连台湾的华义国际在数天前也开放比特币交易,在国内也掀起一阵话题,阿达前几天分享过一篇“什么是 比特币 Bitcoin ?什么是 挖矿?如何挖矿教学总整理”反应也非常好,但很多人看完只了解了“如何挖矿”,对于比特币的运作机制与原理还是“雾杀杀”。昨天在硬是要学上面看到一篇转载的文章觉得非常讲解的非常清楚,可以让一般人很轻易的了解。要阿达简单说的话大家可以想像“比特币”是一种Geek在玩的虚拟货币(就跟以前天币可以买车子一样意思),但有没有价值花那么多时间去挖矿?热潮能维持多久?没人知道,现在进入的门槛也非常高,大家就当作吸收新知就好吧!
image
图片出处

前言

最近比特币涨到 900 美元,引起了很多注目,可惜我还不知道比特币到底是什么碗糕?所以、想说趁编杂志的机会 了解一下,比特币到底是怎么运作的。

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

随后,他以开放、对等、共识、直接参与的理念为基准, 结合开源软件和密码学中块密码的工作模式,在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) 被重复使用。

图 1、传统的数位货币系统架构图

图 1、传统的数位货币系统架构图

如果要避免重复使用的问题,那么就必须要加入“造币厂”(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 transactions. In the mint based model, the mint was aware of all transactions 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、对交易进行时间戳记的机制

图 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 认证的人,否则信件就不会被接受。

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

图 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 值有很多个前导零,这些比特币交易讯息的网页可以做为进一步研究比特币运作机制的参考。

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 等这样大型的操作系统,也可以透过市集模式建构出来。

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

 

参考文献

【本文由陈锺诚取材并修改自 维基百科,采用创作共用的 姓名标示、相同方式分享 授权】
原文出处

延伸阅读:

什么是 比特币 Bitcoin ?什么是 挖矿?如何挖矿教学总整理

 

2018-01-27 18:44:00

标签:   资讯头条 kotoo科技资讯 kotoo科技 kotoo科技资讯头条 科技资讯头条 KOTOO商业产经 新闻网 科技新闻网 科技新闻 Kotoo科技新闻网 Kotoo科技新闻网 科技新闻 科技新闻网 新闻网 KOTOO商业产经 科技资讯头条 kotoo科技资讯头条 kotoo科技 kotoo科技资讯 资讯头条 Kotoo Kotoo科技新闻网 科技新闻 科技新闻网 新闻网 KOTOO商业产经 kotoo科技资讯头条 kotoo科技 kotoo科技资讯 资讯头条
0