比特币网络是一个分布式的点对点网络,网络中的矿工通过“挖矿”来完成对交易记录的记账过程,维护网络的正常运行。

  区块链网络提供一个公共可见的记账本,该记账本并非记录每个账户的余额,而是用来记录发生过的交易历史信息。该设计可以便面重放攻击,即某个合法交易被多次重新发送造成攻击。

  每次发生交易,用户需要将新的交易记录写到比特币区块链网络中,等网络确认后即可认为交易完成。每个交易包括一些输入和一些输出,未经使用的交易的输出(Unspent Transaction Outputs,UTXO)可以被新的交易引用作为合法的输入,被使用过的交易的输出(Spent Transaction Outputs,STO)则无法被引用作为合法输入。

  一笔合法的交易,即引用某些已存在交易的UTXO作为交易的输入,并生成新的输出的过程。

  在交易过程中,转账方需要通过签名脚本来证明自己是UTXO的合法使用者,并且指定输出脚本来限制未来本交易的使用者。对每笔交易,转账方需要进行签名确认。并且对每一笔交易来说,总输入不能小于总输出。总输入相比总输出多余的部分称为交易费用(Transaction Fee),为生成包含该交易区块的旷工所得。目前规定每笔交易的交易费用不能小于0.0001BTC,交易费用越高,越多旷工愿意包含该交易,也就是越早被放到网络中。交易费用在奖励旷工的同时,也避免了网络收到大量攻击。

  交易金额的最小单位是“聪”,即一亿分之一(10的负8次方)的比特币。

  刚放进网络中的交易(深度为0)并非是实时得到确认的。进入网络中的交易存在着被推翻的可能性,一般要在生成几个新的区块才认为该交易被确认。

  

账户/地址

  比特币采用了非对称的加密算法。用户自己保留私钥,对自己发出的交易进行签名确认,并公开公钥。

  比特币的账户地址其实就是用户公钥经过一系列Hash及编码运算后生成的160位的字符串。

  对账户地址串进行Base58Check编码,并添加签导字节和4字节校验字节,以提高可读性和准确性。

 

交易

  一条交易可能包括以下信息:

    付款人地址:合法的地址,公钥经过SHA256和RIPEMD160两次Hash,得到160位Hash串

    付款人对交易的签字确认:确保交易内容不被篡改

    付款人资源的来源交易ID:哪个交易的输出作为本次交易的输入

  ·   交易的金额:多少钱,与输入的差额为交易的服务费

    收款人地址:合法的地址

    时间戳:交易何时能生效

  网络中节点收到交易信息后,将进行如下检查:

    交易是否已经处理过

    交易是否合法,包括地址是否合法,发起交易者是否是输入地址的合法拥有者,是否是UTXO

    交易的输入纸盒是否大于输出之和

  若检查都通过,则将交易标记为合法的未确认交易,并在网络内进行广播。

 

交易脚本

  脚本是保障交易完成的核心机制,当所依附的交易发生时被触发。通过脚本机制而非写死交易过程,比特币网络实现了一定的可扩展性。

  一般每个交易都会包括两个脚本:输出脚本(scriptPubKey)和认领脚本(scriptSig)。输出脚本一般由付款方对交易设置锁定,用来对能动用这笔交易输出的对象进行权限控制。认领脚本则用来证明自己可以满足交易输出脚本的锁定条件,即对某个交易的输出的拥有权。

  输出脚本目前支持两种类型:

    P2PKH:Pay-To-Public-Key-Hash,允许用户将比特币发送到一个或多个典型的比特币地址上,前导字节一般为0x00

    P2SH:Pay-To-Script-Hash,支付者创建一个输出脚本,里边包含另一个脚本的哈希,一般用于需要多人签名的场景,前导字节一般为0x05

  以P2PKH为例,输出脚本的格式为:

    script PubKey: OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG

  OP_DUP是复制栈顶元素;OP_HASH160是计算Hash值;OP_EQUALVERIFY判断栈顶两元素是否相等;OP_CHECKSIG判断签名是否合法。

  另一个交易若要花费这个输出,在引用这个输出的时候,需要提供的认领脚本格式为:

    scriptSig: <sig> <pubKey>

  用pubKey对应的私钥对交易Hash值进行签名,pubKey的Hash值需要的等于pubKeyHash。

  进行交易验证时,会按照先scriptSig后scriptPubKey的顺序一次进入入栈处理,即完整指令为:

  <sig> <pubKey> OP_DIP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
  

区块

  比特币区块链的一个区块主要包括以下:

    4字节的区块大小信息

    80字节的区块头信息(版本号:4字节,上一个区块头的SHA256Hash值:链接到一个合法的块上,32字节;包含所有验证过的交易的Merkle树根的哈希值,32字节;时间戳:4字节;难度指标:4字节;Nonce:4字节,PoW问题的答案)

    交易个数计数器:1~9字节

    所有交易的具体内容,可变长

 

避免作恶

  避免作恶基于经济博弈原理。在一个开放的网络中,无法通过技术手段来保证每个人都是合作的。但可以通过经济博弈来让合作者得到利益,让非合作者遭受损失和风险。比特币网络中所有试图参与者都要首先付出挖矿的代价,进行算力消耗,越想拿到新区快的决定权,意味着抵押的算力越多。一旦失败,这些算力都会被没收掉,称为沉没成本。当网络中存在众多参与者时,个体试图拿到新区块决定权要付出的算力成本是巨大的,意味着进行一次作恶付出的代价已经超过可能带来的好处。

 

负反馈调节

  比特币网络中旷工越多,系统越稳定,比特币价值越高,但挖到矿的概率会降低。反之,网络中矿工减少,会让系统更容易被反击,比特币价值降低,但挖到矿的概率会提高。因此比特币的价格理论上应该稳定在一个合适的值,这个价格乘以挖到矿的概率,恰好达到矿工的收益预期。

 

共识机制

  比特币网络是不实现面向最终确认的共识,而是基于概率,随时间逐步增强确认的共识。现有达成的结果在理论上可能被推翻,只是攻击者要付出的代价随时间而指数级上升,被推翻的可能性随之指数级下降。此外,考虑到Internet的尺度,达成共识的时间相对比较长,因此按照区块来进行阶段性的确认,从而提高网络整体的可用性。最后,限制网络中共识的噪声。通过进行大量的Hash计算和少数的合法结果来限制合法提案的个数,进一步提高网络中共识的稳定性。

 

挖矿

  挖矿是参与维护比特币网络的节点,通过协助生成新区块来获取一定量新增比特币的过程。

  当用户向比特币网络中发布交易后,需要有人将交易进行确认,形成新的区块,串联到区块链中。在一个互相不信任的分布式系统中,由旷工通过挖矿的方式来解决这个问题。

  目前,每10分钟左右生成一个不超过1MB大小的区块(记录这10分钟内发生的验证过的交易内容),串联到最长的链尾部,每个区块的成功提交者都可以得到系统12.5个比特币的奖励以及用户附加到交易上的支付服务费用。即便没有任何用户交易,矿工也可以自行产生合法的区块并获得奖励。

  每个区块的奖励最初是50个比特币,每隔21w个区块自动减半,即4年时间,最终比特币总量稳定在2100w个。因此,比特币是一种通缩的货币 挖矿的具体过程为:参与者综合上一个区块的Hash值,上一个区块生成之后的新的验证过的交易内容,再加上自己猜测的一个随机数X,一起打包到一个候选新区块,让新区块的Hash值小于比特币网络中给定的一个数。这是一道面向全体矿工的“计算题”,这个数越小,计算出来就越难。

  系统每隔两周会根据上一周期的挖矿时间来调整挖矿的难度(通过调整限制数的大小),调节生成区块的时间稳定在10分钟左右。为了避免震荡,每次调整的最大幅度为4倍,历史上最快的出块时间小于10秒,最慢的出块时间超过1小时。为了挖到矿,参与处理区块的用户端往往需要付出大量的时间和算力。算力一般以每秒进行多少次Hash计算为单位,记为h/s。

 

共识机制

  比特币区块链采用了PoW的机制来实现共识。

  工作量证明(PoW)通过计算来猜测一个数值(nonce),使得拼凑上交易数据后内容的Hash值满足规定的上限。由于Hash难题在目前计算模型下需要大量的计算,这就保证在一段时间内系统中只能出现少数合法提案。反过来,能够给出合法提案,也证明提案者确实付出了一定的工作量。同时少的合法提案会在网络中进行广播,收到的用户进行验证后,会在用户认为的最长链基础上继续难题的计算。因此,系统中可能出现链的分叉(fork),但最终会有一条链称为最长的链

  Hash问题具有不可逆的特点,因此目前除了暴力计算外,还没有有效的算法进行解决。反之,若获得符合要求的nonce,则说明在概率上付出了对应的算力。谁的算力多,谁最先解决问题的概率就越大。当掌握超过全网一半的算力时,从概率上就能控制网络中链的走向。

 

权益证明

  权益证明(Proof of Stake, PoS)是拥有股份越多的人越统一获取记账权。典型的过程是通过保证金来对赌一个合法的块称为新的区块,收益为抵押资本的利息和交易服务费。提供证明的保证金越多,则获得记账权的概率就越大。合法记账者可以获得收益。一般情况下,对于Pos来说,需要掌握超过全网1/3的资源,才有可能左右最终的结果。

 

闪电网络

  闪电网络的主要思路十分简单——将大量交易放到比特币区块链之外进行,只把关键环节放到链上进行确认。闪电网络主要通过引入智能合约的思想来完善链下的交易渠道。核心的概念主要有两个:RSMC(Recoverable Sequence Maturity Contract)和HTLC(Hashed TimeLock Contract)。

  RSMC:即可撤销的顺序成熟度合同。首先假定交易双方之间存在一个“微支付通道”(资金池)。交易双方先预存一部分资金到“微支付通道”里,初始情况下双方的分配方案等于预存的金额。每次发生交易,需要对交易后产生资金的分配结果共同进行确认,同时签字把旧版本的分配方案作废掉。任何一方需要提现时,可以将他手里双方签署过的交易结果写到区块链网络中,从而被确认。从这个过程中可以看到,只有在提现时才需要通过区块链。任何一个版本的方案都需要经过双方的签名认证才合法。任何一方在任何时候都可以提出提现,提现时需要提供一个双方都签名过的资金分配方案。在一定时间内,若另外一方拿出证明表明这个方案其实之前被作废了,则资金罚没给质疑方;否则按照提出方的结果进行分配。罚没机制可以确保没人会故意拿一个旧的交易结果来提现。另外,即使双方都确认了某次提现,首先提出提现一方的资金到账时间也要晚于对方,这就鼓励大家尽量在链外完成交易。通过RSMC,可以实现大量中间交易发生在链外。

  HTLC:微支付通道通过HTLC来实现的,中文意思是“哈希的带时钟合约”。实际上是限时转账。通过智能合约,双方约定转账方先冻结一笔钱,并提供一个哈希值,若在一定时间内有人提出一个字符串,使得它哈希后的值与已知值匹配,则这笔钱转给接收方。

  RSMC保障了两个人之间的交易可以在链下完成,HTLC保障了任意两个人之间的转账都可以通过一条“支付”通道来完成。闪电网络整合这两种机制,就可以实现任意两个人之家的交易都在链下完成。

 

侧链

  侧链(sidechain)协议允许资产在比特币区块链和其他区块链之间互转。侧链可以是一个独立的区块链,有自己按需定制的账本,共识机制,交易类型,脚本和合约的支持等。侧脸不能发行比特币,但可以通过支持与比特币区块链挂钩来引入和流通一定数量的比特币。当比特币在侧链流通时,主链上对应的比特币会被锁定,直到比特币从侧链回到主链。侧链机制可将一些定制化或高频的交易放到比特币主链之外进行,实现了比特币区块链的扩展。

 

SPV证明

  SPV能够以较小的代价判断某个支付平是否已经被验证过,以及得到了多少算力保护。SPV客户端只需要下载所有区块的区块头,并进行简单的定位和计算工作,就可以给出验证结论。

  侧链协议中,用SPV来证明一个动作确实已经在区块链中发生过,称为SPV证明。SPV证明包括两部分内容:一组区块头的列表,表明工作量证明;一个特定输出确实存在于某个区块中的密码学证明。

 

双向挂钩

  侧链协议的设计难点在于如何让资产在主链和侧链之间安全流转。简而言之,接收资产的链必须确保发送资产的链上的币被可靠锁定。具体来说,协议采用双向挂钩机制实现比特币向侧链的转移和返回。主链和侧链需要对对方的特定交易做SPV验证。

  1. 当用户要向侧链转移比特币时,首先在主链创建交易,待转移的比特币被发往一个特殊的输出,这些比特币在主链上被锁定

  2. 等待一段确认期,使得上述交易获得足够的工作量确认

  3. 用户在侧链创建交易提取比特币,需要在这笔交易的输入指明上述主链被锁定的输出,并提供足够的SPV证明

  4. 等待一段竞争期,防止双重花费攻击

  5. 比特币在侧链上自由流通

  6. 当用户想让比特币返回主链时,采取类似的动作。首先在侧链创建交易,待返回的比特币被发往一个特殊的输出。等待一段确认其后,在主链用足够的对侧链输出的SPV证明来解锁最早被锁定的输出。等待一段竞争期后,主链比特币恢复流通

 

  比特币的设计目的在于支持一套安全,开放,分布式的数字货币系统。围绕这一目标,比特币协议的设计中很多地方都体现了权衡的思想。

  区块容量:更大的区块容量可以带来更高的交易吞吐量,但会增加挖矿成本,带来中心化的风险,同时增大存储的代价。兼顾多方面的考虑,当前的区块容量上限设定为1MB

  出块间隔时间:更短的出块间隔可以缩短交易确认的时间,但也可能导致分叉增多,降低网络的可用性

  脚本支持程度:更强大的脚本指令集可以带来更多的灵活性,但也会引入更多的安全风险

  

分叉

  比特币协议不会一成不变。当需要修复漏洞,扩展功能或调整结构时,比特币需要在全网的配合下进行升级。升级通常涉及更改交易的数据结构或区块的数据结构。

  由于分布在全球的节点不可能同时完成升级来遵循新的协议,因此比特币区块链在升级时可能发生分叉。对于一次升级,若把网络中升级的节点称为新节点,为升级的节点称为旧节点,根据新旧节点互相兼容性上的区别,可分为软分叉(soft fork)和硬分叉(hard fork)。

  若旧节点仍然能够验证接收新节点产生的交易和区块,则称为软分叉。旧节点可能不理解新节点产生的一部分数据,但不会拒绝。网络即向后又向前兼容,因此这类升级可以平稳进行

  若旧节点不接受新节点产生的交易和区块,则称为硬分叉。网络只向后兼容,不想前兼容。这类升级往往引起一段时间内新旧节点所认可的区块不同,分出两条链,知道旧节点升级完成

  

交易延伸性

  交易延伸性(Transcation Malleablility)是指当交易发起者对交易签名后,交易ID仍然可能被改变

  

扩容

  隔离见证方案

    隔离见证(Segregated Witness,简称SegWit)是指将交易中的签名部分从交易的输入中隔离出来,放到交易末尾的被称为见证(Witness)的字段当中。同时隔离见证将区块容量上限理论上提高4MB。

  Bitcoin Unlimited方案

    Bitcoin Unlimited方案(简称BU)是指扩展比特币客户端,使矿工可以自由配置他们想要生成和验证的区块容量。

 

  比特币相关工具包括客户端,钱包和矿机

  客户端

    比特币客户端用于和比特币网络进行交互,同时可以参与网络的维护

    客户端分为三种:完整客户端,轻量级客户端和在线客户端。

    完整客户端:存储所有的交易历史记录,功能完备
    轻量级客户端:不保存交易副本,交易需要向别人查询

    在线客户端:通过网页模式来浏览第三方服务器提供服务

  钱包

    比特币钱包可以存储和保护用户的私钥,并提供查询比特币余额,收发比特币等功能。根据私钥存储方式不同,钱包主要分为一下几种:

      离线钱包:离线存储私钥,也成为“冷钱包”,安全性相对最强,但无法直接发送交易,便利性查

      本地钱包:用本地设备存储私钥,可直接向比特币网络发送交易,易用性强,但本地设备存在被攻击的风险

      在线钱包:用钱包服务器存储用户口令加密过的私钥,易用性强,但钱包服务器同样可能被攻击  

      多重签名钱包:由多方共同管理一个钱包地址

 

  矿机

    比特币矿机是专门为“挖矿”设计的硬件设备。矿机最重要的属性是可提供算力和所需要的功耗。