跳转至

Bitcoin

历史

参考:
区块链启示录:中本聪文集(The Book Of Satoshi: The Collected Writings of Bitcoin Creator Satoshi Nakamoto)
wikipedia·比特币历史

  • 2008.8.18 Satoshi Nakamoto(中本聪)和Martti Malmi(马尔·蒂马尔米)注册了域名:bitcoin.org

去中心化准官网:bitcoin.org

  • 2008.11.1 中本聪在 bitcoin.org 上发表了比特币的白皮书:《Bitcoin: A Peer-to-Peer Electronic Cash System》(比特币:一种点对点的电子现金系统)

各种语言的白皮书:https://bitcoin.org/en/bitcoin-paper

  • 2008.11.9 比特币项目在 sourceforge.net 平台注册

最新的源码在GitHub:https://github.com/bitcoin/bitcoin

  • 2009.1.3 中本聪打包出了创始区块(Genesis Block

20220718221933

创始区块中附带了一段文本:
The Times 03/Jan/2009 Chancellor on brink of second bailout for banks
《泰晤士报》 2009年1月3日 英国财政大臣正欲对银行业实施第二轮救助

20220718221945

  • 2009.1.9 中本聪在 sourceforge.net 发布了比特币0.01版本源码
  • 2010.5.22 拉斯诺用挖到的比特币购买了两个比萨,共花费10000BTC,这是比特币第一次被用于实物支付
  • 2010.7 世界上第一家比特币交易所 Mt.Gox(门头沟) 在日本东京成立
  • 2010.12.12 中本聪在 bitcointalk.org 论坛发布了比特币0.3.19版本公告,然后便销声匿迹,此时比特币价格约$0.25
  • 2014.3.7 中本聪在 p2pfoundation 论坛发布了一条辟谣消息:我不是多里安·中本聪,此后便再也没出现过

挖矿原理

比特币的区块链可以看作是运行在P2P网络中的公开账本,一笔笔交易存储在区块结构体中,然后被打包成一个区块,一个个区块按更新顺序串联成一条区块链,第一个区块被称之为创世区块。

打包区块的过程叫做工作量证明(POW),因为可以从中获取奖励,所以俗称挖矿,由分布式网络中的节点来完成,俗称矿工。

区块奖励最初为50个BTC,每开采 210,000 个区块则会减半,2012年首次减半到25个,2016年减半到12.5个,2020年5月减半到了6.25个,平均每四年一次,下一次减半到3.125个预计在2024年。

20220721193416

每个区块由区块头和区块体两部分组成

交易明细存储在区块体中,最大可存储1M,约4000条左右,交易是按顺序存放的,第一条交易是矿工写给自己的挖矿奖励,称作Coinbase交易,然后才是普通用户的交易,当然交易可以只有Coinbase(即空块),但通常矿工不会这样做,因为打包其他交易还可以赚取手续费。

比特币诞生之初,单个区块大小的最高可以达到32M,但由于有人恶意制造的大量小额转账使网络中有大量的待确认交易,影响了网络运转,所以改为了1M

也就是说矿工每挖取并成功更新一个区块,获取的激励为:区块奖励+手续费,正因如此,才会有人愿意主动去做这件事,比特币网络才得以正常运行。

矿工在写奖励时不能乱写,否则会验证失败,白费精力

不过矿工可以优先选择打包手续费高的交易

但挖矿并没有那么容易,需要满足一定的条件

首先将每一笔交易哈希,然后每两个交易的哈希再哈希,依次递归,如果遇到奇数则使用自身的副本配对,最终会形成一颗倒立的哈希二叉树,其根哈希被称作默克尔根(Merkle)。

哈希二叉树,是一种用作快速归纳和校验大规模数据完整性的数据结构,在比特币网络中,可以通过默克尔树快速地校验某个交易是否存在于某个区块中。

默克尔根与父区块的哈希等组成区块头

  • 父区块的哈希
  • 默克尔根
  • Nonce(随机数)
  • 其它:区块高度、bits(难度系数)、时间戳等

20220721173614

然后将区块头哈希,如果生成的哈希值小于某个目标值,便可以广播到区块链网络,反之则需要重新哈希。

目标值是基于难度系数根据公式动态算出来的,由256位二进制数组成,每一位不是0就是1,0的概率为1/2,要求小于目标值,实际就是要求前n位有多少个0,即概率为(1/2)的n次幂,理论上目标值越小则需要0越多,概率越低,挖矿的难度越大,为了保证生成一个区块的时间恒定,每更新2016个区块会计算一下平均耗时,理想时间为两周(1,209,600秒,平均10分钟一个区块),如果过快则会调高难度(调小目标值),反之调低。

观察区块头可知,除了Nonce和时间戳外其它都是不能随意改变的,其中时间戳并不需要时时改变,只要大于上一个区块的时间戳并且在将来2小时以内即可。所以通常只能用穷举法不断地调换随机数来满足目标条件,这个过程便称之为工作量证明(Proof of Work),简称POW。

不同矿工打包时的Coinbase交易收取地址不同,而且打包的交易也不一定相同,所以每个矿工要寻找的随机数也是不同的。

比特币网络的算力和难度一直呈上升趋势,目前全网算力大概200EH/s左右,而单机CPU算力不过几M,GPU算力也不过1G,所以单机挖矿的成功率几乎等于0,现在主要是专用的ASIC芯片构建的矿池挖矿。

算力:每秒产生哈希碰撞的能力,最小单位:H(Hash),即1次运算
1E=1000P=1000,000T=1000,000,000G=1000,000,000,000K=1000,000,000G=1000,000,000,000,000H

平均10分钟左右挖出一个区块,1小时就是6个,约每4年奖励减半一次,大致可以推算出比特币的总量约为2100万个,预计在2140年全部挖出。

6x24x365x4x50(1+1/2+1/4+1/8+...)=2100W

交易

参考
廖雪峰区块链教程:P2P交易原理、可编程支付原理
bitcoindeveloper·transactions

区块体中的每一笔交易并不是平时我们见到的那种付款方和收款方一对一的关系,而是由多对多的输入和输出构成,称之为UTXO模型,除了Coinbase交易外(只有一个输出),其它交易至少有一个输入和一个输出。

Unspent TX Output,TX指交易(Transaction),就是还没有被使用的交易输出,可以理解为就是余额

比特币使用LevelDB存储UTXO,比特币的交易就是不断地消耗现有的UTXO,并产生新的UTXO

20220721233301

忽略手续费的前提下,比如小A有10BTC,全部转给小B,然后小B把10BTC又全部转给我了小C,这就是1输入1输出;如果小B只转5BTC给小C,剩下的5BTC需要转给自己(UTXO),这就是1输入2输出,如果此时再有个人给小C转5BTC,那小C的这10BTC就对应两个输入。

无论输入还是输出实际上都是一个脚本,输出是一个锁定脚本,输入是一个解锁脚本,比特币的脚本语言是一种类似FORTH的基于栈结构的低级语言,为了安全特意被设计为无状态且非图灵完备。

脚本有P2PKH(Pay to Public Key Hash)和P2SH(Pay To Script Hash)等不同类型

20220721233710

FROM: UTXO Hash#index
AMOUNT: 0.5 btc
TO: OP_DUP OP_HASH160 <PubkeyHash> OP_EQUALVERIFY OP_CHECKSIG

20220722103520

           Sig 48 (30450221...68fa9b01)
        PubKey 21 (03dd8763...14cf740f)
        OP_DUP 76
    OP_HASH160 a9
    PubkeyHash 14 (dc5dc65c...fe9f489c)
OP_EQUALVERIFY 88
   OP_CHECKSIG ac

20220722103438

每一笔交易都有一个唯一的TXID,可以在区块链浏览器中查询交易相关的信息

比特币的交易最小单位为聪(Satoshi),1btc=10^8聪(1亿聪)


最后更新: 2022-07-29