在接触比特币,了解比特币原理以后,对我这个开发者来说,对我思维方式影响最大的是其以博弈的方式来激励大家按照规则来参与这个游戏,确保遵守规则时利益最大化、违反规则时会遭受损失或承担风险。这我之前十年接触的开发理念完全不同,却又非常有意思。本文将初步介绍比特币的原理,后续会基于区块链技术详细介绍。
一 什么是比特币
比特币(BTC)是基于区块链技术一种数字货币实现。
比特币网络是去中心化的网络,即一个分布式的点对点网络,网络中的矿工通过挖矿来完成对交易记录。区块链网络提供了一个公共可见的记账本,任何人任何时候都可以查看此账本的信息。注意,该记账本并非记录每个账户的余额,而是用来记录发生过的交易的历史信息。
比特币是一种虚拟货币,既然是货币,那么就必须要聊一下,比特币是如何产生、流程的,安全性怎么保障的。简单来说,比特币产生于挖矿,流通于每一笔交易中,主要通过通过技术和博弈两个方面保证安全性。
二 虚拟货币
比特币是一种虚拟货币,那么比特币是如何做到和现实社会中的钱一样流通呢?
1 比特币钱包
1) 钱包
比特币采用了非对称加密算法,用户自己保存私钥并公开公钥。公钥就是这个人对外的唯一身份标识,私钥则是使用者开启钱包使用比特币的钥匙。
公钥是对外公开的,在比特币的规则里公钥即代表了网络里钱包使用者的地址。比特币钱包的地址其实就是用户公钥经过一系列Hash及编码运算后生成的160位(20字节)的字符串。
可以简单的认为:比特币钱包就是一把锁,这把锁的编号就是公钥,私钥就是打开这把锁的钥匙;如果钥匙(私钥)遗失了,那么钱包就无法打开了;当别人需要给你转账时,你只需要将公钥给对方,收到钱以后你用自己保存的私钥就可以打开钱包,使用其中的钱了。
2) 非对称加密技术
非对称加密的典型特性:
²  私钥签名,公钥验签(证明谁是发起人)。
²  公钥加密,私钥解密(证明交易发给谁,其他人无法窃取)
签名、验签示例:A用私钥签名,然后用签名结果和A的公钥就可以验证信息肯定是A发送的,而不是其他人发送的。
加密、解密示例:A、B之间相互传东西,A拥有A的私钥、B的公钥;B拥有B的私钥、A的公钥;这样当A给B传信息的时候,用B的公钥加密,这样只有B才能解密,保证了信息的安全。同理,B给A传信息是一样的。
在比特币的一次转账交易中,需要通过转账人的私钥确保这笔钱属于当前转账人,然后指定收款方账户(即收款方公钥);收款方收到钱后,就可以通过自己的私钥要解密出来。
2 比特币从何而来
比特币钱包中的钱有两个来源:挖矿(系统奖励+服务费)和他人转给自己的。
3 比特币的使用
1) 花钱时要解锁输入(私钥解密)
能花的钱来自于之前别人或者自己(找零的情况)针对自己的一个输入,该输入针对自己上了锁,自己必须解锁才能证明自己可以拥有这笔比特币。
2) 花钱时要锁定输出(指定的收款方账户)
输出输入是衔接的,锁定输出是为了确保只有收款人才能解锁,如果锁定时使用的锁不正确,这笔钱要么转入陌生人账户,要么转入黑洞被销毁。
3) 输入/输出组成的交易单不能被篡改
在现实世界中,我们将交易单交给银行,有银行确保不恶意篡改。比特币世界是去中心化的,所有几点都是对等的,他的实现方式是:工作量证明。具体见《区块链》。
在比特币世界中,能确保两点:既有的交易不能被修改(不是完全不能修改,而是修改的成本非常之高);自己钱包里的钱未来确实可以花出去。
三 挖矿
我们先聊一下比特币是如何产生的,如何流转的。
1 挖矿
在比特币网络中,每10分钟左右生成一个不超过1MB大小的区块,串联到最长链的尾部,每个区块的成功提交者可以获得系统的比特币奖励,同时可以获得用户附加到交易上的服务费。注意:即便是网络中不存在交易,矿工也可以自行产生合法的区块并获得奖励。这整个过程就是所谓的挖矿。
2 比特币发放
挖矿过程中,系统奖励给每个区块的成功提交者一定数量的比特币,这就是整个比特币网络中新增的比特币。最初每生成一个有效新区块的奖励是50比特币,奖励每4年减半,预计2140年全部奖励完,最终总量稳定在2100万个。
3 服务费
从比特币的发放规则上我们看到,随着时间推进,奖励的比特币越来越少,系统总有一天不再奖励比特币,即没有矿可以挖了,为了激励矿工继续挖矿,中本聪还建立了另外一种奖励措施:服务费(也称手续费)。
区块中记录的主要信息就是交易记录,每个交易被记录都是要付费的,这就可以让矿机有无限动力挖矿。每个区块都会根据手续费的高低排列交易,没给手续费的或者手续费很低的交易往往很难写入到区块,也就是最终很难写入到区块链。基于此,如果想让自己的交易写入区块链中,达到全网共识,可以多给一些服务费(是不是很像现实社会中的小费)。
4 挖矿过程
挖矿的过程简单来说,大概是这样的:矿机对区块头的数据(包括:上一个区块的hash、当前区块的hash、区块生成时间、难度系数、随机数nonce、等等)进行hash计算。如果hash结果小于target(target=固定的常量值/difficulty),那么会认为该区块是有效区块,这样的区块才能被同步到区块链中;如果hash结果不小于target,那么需要重新计算。生成区块以后需要将此区块加入到区块链的尾部。
区块链是去中心化的,新区块加入到区块链的过程是一个集体协商的过程,简单来说过程如下:矿机成功产生一个有效区块(例如Block1)后,会将该有效区块在全网广播,有完整区块链数据备份的服务器会接收到该区块信息,验证通过后将该有效区块加入到区块链的末尾。注意此时此区块还不是全网共识的区块。比特币系统里是每10分钟左右才有一次机会把新区块加入到区块链里,当后续有6个新区块加入时,此区块才成为共识区块。这里的6个区块其实是基于计算量的,伪造6个区块的成本非常之高。
四 交易
比特币交易的过程即为比特币在网络中的流通过程。
1 交易基础
区块链中每个区块中记录的主要内容是一笔笔的交易信息。具体内容见《区块链-区块结构》。
一笔合法的交易是引用某些已经存在交易的UTXO作为交易输入,并生成新的输出的过程。
UTXO(Unspent Transaction Outputs)指未经使用过的交易输出。只有UTXO才能作为新交易的输入,这个比较好理解,即只有我收到且未花出去的钱,才能用;如果在之前的交易中已经花出去了,那以后就再也不能用了(除非伪造假钱)。与之对应的是STO,STO(Spent Transaction Outputs)指被使用过的交易输出。
交易过程中,转账方需要使用签名脚本来证明自己是UTXO的合法使用者,并指定收款方。每一笔交易的总输入应该大于总输出,差额的部分作为每笔交易的交易费用,即服务费。
2 交易
交易是比特币的一个核心概念。一条完整的交易可能包括以下内容:
- 付款人地址
- 付款人对交易的签字确认:确保交易内容不被篡改。
- 付款人资金的来源交易id:那个交易的输出作为本次交易的输入。
- 交易的金额:多少钱,与输入的差额作为服务费。
- 收款人地址
- 收款人的公钥
- 时间戳
网络节点收到交易信息后,进行一下检查:
- 交易是否已经处理过
- 交易是否合法,包括地址是否合法、发起者是否是输入地址的合法拥有这、是否是UTXO。
- 交易的输入和是否大于输出和。
如果检查通过,则将交易标记为合法的未确认交易,并在网络内广播。在经过挖矿过程中的打包区块、生成有效区块、全网广播、达成共识等阶段后,这笔交易就成为全网全网共识的交易,此后此笔交易再不能被修改。
因为交易的过程其实就是区块链生成新区块的过程,这里描述的比较简略,可以参考《区块链》。