比特币是如何运作的?
Bitcoin实现原理

比特币

一直以来,金融交易系统都是建立在信任基础之上的。需要一个可信机构,来认证每个人拥有的财富值,认证每笔交易的正确性。不能你个人说自己有多少钱就有多少钱。不能随随便便拿走别人的钱。不能谎称自己给过别人多少钱。交易系统要需要足够的个人身份信息来确认一个账户的所有者,比如银行肯定得知道哪个账户属于哪个人。

而比特币却颠覆了这两点。

数学和密码学概念

公钥和私钥

这是非对称密码学的基础。公钥让所有人知道,私钥只让自己知道。非对称密码适用于加密系统和认证系统中。

加密系统的使用场景是:在公开场合有人想给我说私事儿,所有人都能听到这话,但希望只有我能听得懂这话。

在加密系统中,公钥对明文进行加密,产生密文。私钥对密文进行解密,恢复回明文。公钥被任何人知道。如果有人想跟我说悄悄话,那么他拿着公钥把一份数据加密,然后广播出去,其他人都能收到密文但不能解出明文。只有唯一拥有私钥的我可以解密。

认证系统的使用场景是:我经常在公开场合发布通告,但有人会冒充我的身份发通告,我希望大家能有办法辨别出那些通告真的是我发出的。

在认证系统中,私钥对数据进行加密,产生一个签名字符串。公钥结合原数据和签名字符串进行解密。当有人收到通告后,使用公钥对通告里的原数据和签名进行验证,如果能够计算成功,说明签名是使用我的私钥生成的,则认为这真的是我发出的通告。

ECDSA 椭圆曲线签名算法

使用椭圆曲线密码(ECC)对数字签名算法(DSA)的模拟。 和大多数的签名算法的原理类似,使用私钥进行签名,使用公钥进行验证。 使用过程就是:

创建CngKey对象
生成密钥CngKey.Create
可以从秘钥中导出公钥,从密钥中导出私钥
使用私钥,对数据字符串签名
使用公钥,结合原数据字符串和签名串进行验证

比特币协议使用该算法对交易进行签名。

摘要算法

摘要算法又可以叫哈希算法,又可以叫散列算法。它是一种精心设计的数学函数y=f(x)。输入一个值x到函数,得到一个值y。这很容易。但对于逆运算,给你一个值a,问你f(?)=a,这比登天还难,你只能遍历世上所有的数进行尝试。典型的摘要算法有MD5,SHA256等。

数学工作量证明

比特币设计了需要极大计算量的题目,需要足够的工作量才能得到结果。工作量大意味着需要足够的时间。想要缩短时间,必须加大计算机的计算能力。

而对这一计算问题求解正确与否的验证过程是很快的。

比特币协议中的题目大致是要寻找一个随机数,使得这个数字与新区块的交易信息一起输入SHA256摘要算法后产生的数字前n位都是0,其中n是参数,来控制这道题的难度。由于摘要算法具有不可逆性,很明显这道题只能一个一个试,直到试出合理的解。而验证解的正确性非常快。

计算机系统概念

Client/Server架构系统

客户端/服务器架构 和 浏览器/服务器架构 一直以来是绝大多数网络系统的架构。客户端位于个人的机器上,其功能简单,主要的数据来源是通过访问服务器获得到的;服务器位于机构组织假设的专有服务器上,其实现了复杂的功能,来为每一个客户端提供数据。

这是一对多的网络系统。从安全角度去看,中心服务器不仅仅是数据提供者,还是仲裁者。客户端是信任服务器提供的数据和信息的。客户端有好人有坏人,坏人会想办法欺骗服务器,要么冒充好人客户端去跟服务器接触,要么伪造假数据欺骗服务器。因此服务器要保证自己绝对可信、安全,清正廉洁且有能力鉴别真伪。

P2P架构系统

peer-to-peer架构是创新式的网络系统架构,去中心化,不要中心服务器来服务大众。所有系统中的成员都是一样的角色即客户端。典型的P2P系统有电驴、BT种子下载以及比特币网络。

对于这样的系统,单个客户端所需要的数据必然是从其他客户端得到的。那么从安全角度看,需要网络协议解决的问题有:

比特币系统和协议

比特币系统

比特币协议

区块(Block)

一个区块含有比特币系统一笔交易的记录。

区块还是一个具有数学工作量证明的单元,可以理解为区块内含有一个超难解的数学题的答案。

根据比特币协议的设计,区块的总数是有限的,2100万个。但比特币的最小单位是可以无限小的。

一个区块还应包括新出生比特币的交易,它是特殊的交易(没有付款人),收款人是计算出该区块的矿工

区块链(Blockchain)

区块链是一串使用密码学方法产生的数据块。它一个按时间顺序排列的比特币交易公共记录。块链由所有比特币用户共享。它被用来验证比特币交易的永久性并防止一笔钱付给多个人。

比特币系统中的矿工们会努力计算一笔交易对应的数学题,首次计算出正确解的人才有资格将自己生成的这个区块加入到区块链中去。

区块链存在于每个用户的机器里,所有在线机器的区块链都是一样的,也就是说每个人都存有所有账户的所有记录。

比特币账户地址

比特币的地址是由用户的公开密钥经过 SHA-256 散列运算后,再通过 RIPEMD-160 散列运算而得,其长度固定为 160 个比特(bits)。

比特币账户公钥

公开密钥是可以通过私密密钥推算出的。

比特币账户私钥

私钥就是账户保险柜钥匙。掌握私密密钥就等于掌握其对应地址中存放的比特币。

总财富的增加方式 - 挖矿

交易是不能使比特币总数增加的,在系统建立之时,比特币的总数应该为0。新的人民币是中国人民银行印出来的,那么比特币是如何增多的呢?

挖矿是比特币协议中最重要也最匪夷所思的概念。为什么叫挖矿呢?因为这一点上比特币有点像黄金。我们知道黄金是货币,那么黄金是如何新增呢?那就是去荒郊野外挖金矿了。

新出世的比特币也是通过“挖矿”产生的。并且挖矿事件很“消耗精力”的事情。在比特币协议里,挖到一粒黄金像是解一道超级难的数学方程,求解很难。对于一个解,代入方程进去可以很快判断这个解是对是错。

协议对挖矿的设计

和挖金矿不同,比特币挖矿的难度是协议中设计好的。为了保证区块产生的速度维持在大约每十分钟一个,比特币协议要保证挖矿数学题的难度能够自动调整,总使得矿工第一名能在十分钟计算出答案。

早期的时候,矿工的数量比较少,矿工的整体计算水平都不高,所以题目不能设计的太难。而当越来越多的人加进来当矿工时,矿工的整体计算水平变得很高,题目就会调整的很难。因此,对于全体矿工来讲,每一次挖矿第一名的出现时间是基本一致的。但是对于矿工个人来讲,挖矿的难度在不断增长。

由于比特币总值是有限的,所以不能允许无穷无尽的通过挖矿来新增比特币,所以协议设定的挖矿所得新币数目会逐渐减少。

该设计也使得新币是按照约定速率而产生的。

比特币如何交易

交易一定是付款人发起的。付款人用私钥签名这笔交易,大家用公钥认证这笔交易是否真的是你本人发起的。你将这笔账单广播给所有人,矿工收到之后就开始给你这笔账单计算区块。等到有矿工计算生成新区块,并且得到大家的认可之后,新区块就会被加入到区块链中。

怎么确保一份交易账单真实有效?

如何在一个没有信任中心的系统中认证一个事情的真假?这里有个假定,就是好人比坏人多,即整个系统内百分之五十以上的人会严格遵守比特币协议的规则。比特币对交易是由矿工来确认的,也就是说我们认为好矿工比坏矿工多,对于错误的账单,好矿工都是会拒绝的。那么坏人就无法进行伪造、篡改。

比特币的交易认证包含两个事情:一是各路矿工对新区块数学难题的求解,一是全体同志对求解出答案的矿工的答案进行验证。

挖矿的难度设计出了一个基本固定的十分钟时间,当你提出一笔交易,接下来这十分钟时间内比特币系统对你的这笔交易申请进行验证,看看你是不是有这笔钱。矿工们会努力进行求解,第一个算得结果的人会把结果广播出去,让大家来评判对错,如果对的话,大家就会认可这笔交易。

账单的确认实际上是在试图向区块链添加新的区块,也就是要计算出新的区块。

如何防止坏人伪造他人身份?

通过非对称密码签名,当矿工发现这个账单不是付款人合法签名的账单,自然会拒掉。

如何防止本人制造虚假账单?

如果是是不依赖于你自己以前的账面为基础而进行的交易账单,那肯定和别人计算出的解不同,不会被大家认可。 如果你想要反悔以前你的某次付款,那计算量更是比登天还难。

比特币有没有伪钞?

比特币系统的财富全部是依赖交易账单计算的,区块链中的交易面额都是真钞,挖矿得到的进账交易也是真钞,所以就不存在伪钞这个概念了。

比特币的神秘发明人

比特币的发明人一直是个迷。2009年一个网名叫中本聪的人在密码学邮件列表里发了一篇论文,讲述了这种不依赖于信任关系的金融交易系统,随后中本聪开发了第一款比特币系统。可是没人知道他的真实身份,他有意隐藏自己的一切身份信息。无数技术牛人试图通过各种方式寻找这个天才黑客数学家的线索,都没能如愿。

目前来讲,我们不知道他是一个人还是一个团队,不知道他所在的地区和时区,只知道他精通英语、数学、计算机。

经济学问题

这篇文章主要是从技术角度来认识比特币系统和比特币协议的设计,并没有从经济学角度去评判比特币的优劣。而从经济学理论来认识比特币,一定是又一番内容。

为什么比特币会有价值?

腾讯接收Q币充会员,人们愿意用人民币去兑换Q币,于是Q币就具有了价值。当越来越多的人认为比特币有价值,加上比特币稀缺且难以获得,人们愿意用它来支付和交易其他货币,于是比特币就有了价值。

比特币的价格是怎么定的?

这应该是经济学基础。比特币的价格是由比特币的数量和其内的流通法定货币共同决定的。比如当前比特币的总数为100万个,当前世界上人们总共用了100万美元去买比特币,那么当前1个比特币的价格就是1美元。也就是说,越多人用真钱去买入比特币,比特币的价格就会越高。

比特币和螺旋式通货紧缩

通货紧缩和当前我国的通货膨胀情况相反。指的是物价水平下降,货币的购买力上涨,于是人们认为钱在升值,更倾向于存钱而不是消费或投资,于是市场交易率下降,企业利润下降。这又反过来导致国民收入下降,产生恶性循环。

比特币的总量有限,价格如果一直上涨,就会出现通货紧缩。比特币购买力一直升高,人们倾向于存着比特币不花,构成通缩。

参考资料

官网

比特币wiki

中本聪wiki

最原始论文

比特币协议说明

*****
Written by Lu.dev on 26 December 2015