1.比特币介绍
2008年爆发全球金融危机,2008年11月1日,一个自称中本聪(Satoshi Nakamoto)的人在P2P foundation网站上发布了比特币白皮书《比特币:一种点对点的电子现金系统》 ,陈述了他对电子货币的新设想——比特币就此面世。2009年1月3日,比特币创世区块诞生。
我们现如今使用的现金系统都是由银行来进行货币发行和交易记录,而比特币没有一个集中的发行方,而是由网络节点的计算生成,谁都有可能参与制造比特币,而且可以全世界流通,可以在任意一台接入互联网的电脑上买卖,不管身处何方,任何人都可以挖掘、购买、出售或收取比特币,并且在交易过程中外人无法辨认用户身份信息。2009年1月5日,不受央行和任何金融机构控制的比特币诞生。比特币是一种数字货币,由计算机生成的一串串复杂代码组成,新比特币通过预设的程序制造,随着比特币总量的增加,新币制造的速度减慢,直到2140年达到2100万个的总量上限。
假如有A、B、C、D四个人在比特币交易平台上进行交易,A付给了B 10个比特币,那么他就要把这笔交易记录广播给其余三个人,其他三个人就在自己的账本上记录这一条消息。然后B又付给C 8个比特币,同时B也会将这条消息广播给另外的三个人,D的交易记录也同样如此。这些交易记录会记录在一个块里——区块,每个区块会存储4000条左右交易记录。这个块打包后把这个块连接到以前的块上,这条链就叫做区块链。打包这个块就叫做挖矿。但这个系统需要解决下列几个问题:
1)交易记录以谁的账本为准。比如由于网络延时问题C会先收到B支付C的交易信息,后收到A支付B的交易信息,而D恰好相反,那么就需要一个账本作为基准。
2)为什么要记账。我们每个人的硬盘资源是有限的,我们为什么要花费资源去记录别人的交易记录呢。
3)如何防伪。比如A公布了“A支付给B 10比特币”这条记录,但实际上并没有付给B 10个比特币,那么这条记录就是伪造的。
2.为什么记账
记账会有奖励。一个是手续费的奖励:每个用户都可以记账,那么这条记录的发起人就要支付一部分手续费作为记账的奖励;另一个是打包的奖励:打包成功就会得到系统给的比特币奖励。中本聪设计比特币系统时设置了一条规则:每十分钟打一个包,并且在最初的四年中,打包成功后会获得50个比特币的奖励,四年后奖励变为25,再过四年就变为12.5个。所以比特币总量就为2100万个。有了这两个奖励后人们就会去打包这些交易记录,那么都去打包,应该以谁的为准呢?
3.账本标准——工作量证明
挖矿就是做数学题,去求解一个特定的数,谁求出这个数,谁才能去打包,也就是获得挖矿奖励。这道数学题没有任何一个人可以用脑子算出来,只能依靠计算机。
哈希函数也叫数字摘要或散列函数,它的意思是可以把字符串经过运算转换为摘要的形式,这个算法正算很容易、反推很难。而哈希算法中有一种算法叫SHA256算法,是美国国家安全局发明的一种算法:如果把一个字符串输入这个算法,就会输出一个256位的二进制数。挖矿就是利用这个算法进行两次SHA256运算,也就是SHA256(SHA256(字符串))。
挖矿的输入值应该由那些部分组成呢?前块的头部+账单的信息+时间戳+个人签名等+随机数,把这些输入算法中,输出结果为一个前n为是零的256位二进制数。假设n为30,为满足这个条件需要的随机数就是这个块的解,求出这个随机数后,将输出的哈希值(256位二进制数)作为新块的头部一起打包连接到链上,也就是挖矿成功,获得奖励。因为每个人所记录的交易信息不同,时间戳、签名等都不同,计算随机数的难度也会不同,但基本上算力更强的计算机更容易挖到矿。n的位数越多,计算越困难,为了满足设计初期每十分钟打包一次的速度,需要根据全球挖矿的计算机的算力进行n的调整。比如全球有10000台进行挖矿的计算机每台计算机每秒可进行14T(1.4*10^13)次哈希运算,十分钟可进行8*10^19次运算约为2^66次运算也就是说算出前66位都是0的概率接近1,在这种情况下就会设置前66位为0的规则。第一个算出前66位为0的人就可以打包这个块,并以他所记的账单为标准。
4.如何防止伪造交易记录
我们必须保证每条交易记录都是由比特币持有者发出,而非其他人伪造。这就需每个用户都有一个电子签名。用户在注册时系统会为用户生成一个随机数,通过这个随机数产生一个叫私钥的字符串,私钥又可以产生公钥,以及一个地址。私钥由用户保存,公钥和地址他人可见,私钥用来对字符串进行加密,公钥可以用来对加密后的密文进行解密,比如A发出了一条“A付给B 10个比特币”的交易记录,那么他会把这条消息进行哈希运算得到一个摘要,再把这个摘要用私钥进行加密,之后把公钥、“A付给B 10个比特币”的交易记录连同加密后的密文一同广播出去。收到消息的人会去验证这条消息的真伪,他们把交易记录进行哈希运算得到摘要一,把密文和公钥进行解密得到摘要二,如果摘要一和摘要二相同那么就说明这条信息确实是A发出的,这个过程就叫做电子签名。
我们如何保证不会出现余额不足、双重支付?比如A发出“A付给B 10个比特币”的交易记录,但A并没有这么多比特币,或者A只有10个比特币,但却同时支付B和C 10个比特币。这就需要余额检查:如果在当前所有交易记录中计算出的A的余额大于10个比特币,那么A发出的“A付给B 10个比特币”这条交易记录就会被人们接受,如果不满足条件,这条消息就不会被接受,一直到这条记录被打包到一个区块里就会被系统接受。就解决了余额不足的问题,那么如何解决双重支付的问题呢?A只有10个比特币,但同时发出了两条消息“A付给B 10个比特币”、“A付给C 10个比特币”,用户们收到消息后就回去验证余额,如果接受了第一条消息后就会拒绝第二条消息。但有些用户可能先接收到了第二条消息,那么就会拒绝第一条消息。虽然用户接受到了消息,但此时交易并不会被确认,知道这条消息被打包进一个块里。当这个块被确认后,其他用户就会放弃自己记录的消息,然后从新产生的链后进行打包,假如这个块里记录的是“A付给B 10个比特币”这条消息,那么“A付给C 10个比特币”这条记录就会被放弃。所以我们收到别人的付款时不能立即认为钱已经到账,应该等块形成后才能确认。
第三个问题,应该如何防止篡改交易记录呢?我们不可能去伪造别人的电子签名,但可以伪造消息记录,比如A付给了B 10个比特币,但他想删掉这条记录,应该怎么防止呢?比特币的另一个原则——最长链原则:区块链总以最长的分支作为标准。比如有两个矿工同时打包了一个新块,那么可能会有两批人收到不同的新链(1和2),那么不管他们知不知道另一个分支的存在,他们都会各自在自己收到的链后进行打包,直到有一个人又打包出一个新块并把这条链(比如1链)广播出去,那么全网就会接受更长的分支并把它作为主链继续打包。假如有一个人认准2链并在其后进行挖矿、打包,那么他就需要算的比其他所有人都要快,才能使2链变为最长链,才能使人们接受这条链。除非你有全世界矿机50%以上的算力才有可能去篡改交易记录。