比特币运转机制

1. 比特币的UTXO模型

首先,在讲比特币交易过程之前要说明一个事情。比特币系统是没有余额的概念的,它使用的是UTXO模型(Unspent Transaction Outputs,未使用过的交易输出),我们在交易过程中经常说的钱包余额,实际上是一个钱包地址的UTXO集合。所以,在比特币网络中,存储比特币余额的是交易输出,准确点说就是未使用过的交易输出,而每一笔交易的输入实际上引用的是上一笔交易的输出。下图是比特币系统中交易输入输出的过程

图,每一笔交易记录了时间、发送人、接收人和金额。那如果要计算A的余额,那么就要遍历所有跟A有关的交易,减去A发送的每一笔金额,并加上A接收的每一笔金额,可以计算出。

  • A的余额 = 20-10=10
  • B的余额 = 20+10+5-5=30
  • C的余额 = 20-5=15
  • D的余额 = 20+5=25

比特币系统中计算余额的方法也是类似这样。所以,要计算一个用户的比特币余额,就需要遍历整个交易的历史。而以太坊由于采用了Account模型,也就是采用余额的概念,所以不需要溯源整个交易历史。

                                     比特币运转机制

2. 比特币区块链如何运作?

比特币网络从20091月开始至今,在没有专人维护的情况下已经平稳运行7年多,期间没有出现一次宕机。图4Bob接收来自Alice的比特币的场景,详细描述了比特币区块链的工作方式,一并解释了涉及到的钱包和地址(Wallets and Addresses)、私钥和公钥(Private Key and Public Key)、加密哈希(Cryptographic Hashes)、随机数(Nonces等概念。
             比特币运转机制
                                                                       图1,出自A Guide to Bitcoin Mining. Alec Liu
钱包和地址:
1. BobAlice的电脑上都有比特币钱包。

2. 钱包是一种文件,可以让用户访问多个比特币地址。

3. 一个地址是一串由字母和数字组成的字符串。

4. 每一个地址都有自己的比特币余额。
新建一个地址:
5. Bob创建一个新的比特币地址,用于接收Alice的付款。
私钥和公钥:
6. Bob创建一个新地址时,他真正在做的是生成一个**对,由一个私钥和一个公钥组成。如果你使用私钥(只有你知道)对一个消息进行签名,它可以被对应的公钥(所有人都知道)所验证。Bob的新地址代表一个唯一的公钥,对应的私钥则保存在他的钱包里。公钥允许所有人来验证被私钥签名的消息的有效性。

7. 可以将地址看做银行账号,但工作方式稍有不同。比特币用户可以任意创建多个地址,并且被鼓励为每一个新的交易单独创建新地址,以增强隐私性。只要没有人知道哪些地址是Alice的,她的匿名就受到保护。

提交一个支付:

8. Alice告诉她的比特币客户端,她要向Bob的收款地址转账。

9. Alice的钱包里有她的每一个比特币地址的私钥。比特币客户端用Alice此次使用的付款地址的私钥,对她的这一交易申请进行签名。

10. 此时,网络上的任何人都可以使用公钥来验证,这个交易申请实际来自一个合法的账户所有者。
验证交易:
11. GaryGarthGlenn都是比特币矿工。

12. 他们的电脑将过去约10分钟内的交易打包成一个新的交易区块。

13. 矿工的电脑被设置用于计算加密哈希(Cryptographic Hash)函数。

14. 加密哈希函数将一个数据集转换成特定长度的包含字母和数字的字符串,称为哈希值。源数据的细微改变会彻底改变哈希值的结果。并且基本不可能预测初始的数据集将会产生的特定哈希值。
15. 为相同的数据创建不同的哈希值,比特币使用随机数来实现。随机数是在进行哈希计算之前,在数据中添加的随机数字。改变这个随机数会产生极不相同的哈希值。

16. 每一个新的哈希值包含关于此前所有比特币交易的信息。

17. 矿工的电脑基于前一个区块的哈希值、新交易区块和随机数,来计算新的哈希值。

18. 创建哈希在计算上微不足道,但比特币系统要求新的哈希值拥有特定格式——必须以特定数量的0作为开始。

19. 矿工无法预测哪个随机数会产生以要求的数量的0作为开始的哈希值,所以他们*用不同的随机数创建很多哈希,直到获得有效的那一个。

20. 每一个区块都包含一个名为coinbase的初始交易,这是给胜出矿工的50比特币的支付——在这个例子中是矿工GaryGray的钱包里生成了一个新地址,里面的余额是新挖到的比特币数量。

  • :只有在比特币发行的阶段1,每一个区块的coinbase支付给胜出矿工的新币是50个。从200913日创世区块诞生开始,新比特币的发行大约每4年减半,20121128日,阶段2开始,每一个区块包含的新币减为25个,这是历史上第一次减半;预计今年711日,挖矿奖励会再次减半;直到第33次减半时,每一个区块从产生0.0021个新币直接减为0个,比特币的总量固定在将近2100万个。

交易验证:
21. 随着时间流逝,AliceBob的转账被埋在了其它更近期的交易下面。任何人要想修改历史交易的细节,就必须重做一遍Gary的工作,然后再重做所有下一级矿工的工作,因为所有的改变都需要一个完全不同的胜出随机数。这样的操作几乎不可能成功。