原理和设计

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

比特币通过区块链网络提供一个公共可见的记账本,用来记录发生过的交易的历史信息。

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

比特币原理和设计

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

在交易过程中,转账方需要通过签名脚本来证明自己是 UTXO 的合法使用者,并且指定输出脚本来限制未来对本交易的使用者(为收款方)。对每笔交易,转账方需要进行签名确认。并且,对每一笔交易来说,总输入不能小于总输出。

交易的最小单位是“聪”,即 比特币。


下图展示了一些简单的示例交易。更一般情况下,交易的输入输出可以为多方。

交易 目的 输入 输出 签名 差额

T0 A 转给 B 别人给 A 的交易的输出 B 账户可以使用该交易 A 签名确认 输入减输出,为交易服务费

T1 B 转给 C T0 的输出 C 账户可以使用该交易 B 签名确认 输入减输出,为交易服务费

... X 转给 Y 别人给 X 的交易的输出 Y 账户可以使用该交易 X 签名确认 输入减输出,为交易服务费


下面分别介绍比特币网络中的重要概念和设计思路。

比特币网络中的重要概念和设计思路

比特币概念

账户/地址

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

比特币的账户地址其实就是用户公钥经过一系列 hash(HASH160,或先进行 SHA256,然后进行 RIPEMD160)及编码运算后生成的 160 位(20 字节)的字符串。

一般,也常常对账户地址串进行 Base58Check 编码,并添加前导字节(表明支持哪种脚本) 和 4 字节校验字节,以提高可读性和准确性。

交易

交易是完成比特币功能的核心概念,一条交易将可能包括如下信息:

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

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

  • 付款人资金的来源交易 ID:从哪个交易的输出作为本次交易的输入; 交易的金额:多少钱,跟输入的差额为交易的服务费;

  • 收款人地址:合法的地址;

  • 收款人的公钥:收款人的公钥; 时间戳:交易何时能生效。

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

  • 交易是否已经处理过;

  • 交易是否合法。包括地址是否合法、发起交易者是输入地址的合法拥有者、是否是UTXO;

  • 交易的输入之和是否大于输出之和。

检查都通过,则将交易标记为合法的未确认交易,并在网络内进行广播可以从 blockchain.info 网站查看实时的交易信息。例如一次较新的交易。

0beca08914de596217f098d744e3fb8da68aa5e00dd8f63a3364b451f3f4a70f。

比特币概念

脚本

脚本(Script) 是保障交易完成(主要用于检验交易是否合法)的核心机制,当所依附的交易发生时被触发。通过脚本机制而非写死交易过程,比特币网络实现了一定的可扩展性。比特币脚本语言是一种非图灵完备的语言,类似 Forth 语言。

一般每个交易都会包括两个脚本:输出脚本(scriptPubKey)和认领脚本(scriptSig)。

输出脚本一般由付款方对交易设置锁定,用来对能动用这笔交易输出(例如,要花费交易的输出)的对象(收款方)进行权限控制,例如限制必须是某个公钥的拥有者才能花费这笔交易。

认领脚本则用来证明自己可以满足交易输出脚本的锁定条件,即对某个交易的输出(比特币)的拥有权。

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

  • P2PKH:Pay-To-Public-Key-Hash,允许用户将比特币发送到一个或多个典型的比特币地址上(证明拥有该公钥),前导字节一般为 0x00;

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

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

scriptPubKey: OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG

其中,OP_DUP 是复制栈顶元素;OP_HASH160 是计算 hash 值;OP_EQUALVERIFY 判断栈顶两元素是否相等;OP_CHECKSIG 判断签名是否合法。这条指令实际上保证了只有

pubKey 的拥有者才能合法引用这个输出。

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

scriptSig: <sig> <pubKey>

其中, 是拿 pubKey 对应的私钥对交易(全部交易的输出、输入和脚本)hash 值进行签名,

pubKey 的 hash 值需要等于 pubKeyHash。

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

读者可以按照栈的过程来进行计算,体会脚本的验证过程。

引入脚本机制带来了灵活性,但也引入了更多的安全风险。比特币脚本支持的指令集十分简单,基于栈的处理方式,并且非图灵完备,此外还添加了额外的一些限制(大小限制等)。

区块

一个区块将包括如下内容:

4 字节的区块大小信息;

80字节的区块头信息

版本号:4字节;

  • 上一个区块头的 SHA256 hash 值:链接到一个合法的块上,32 字节; 

  • 包含的所有验证过的交易的 Merkle 树根的哈希值,32 字节;

  • 时间戳:4 字节;

  • 难度指标:4字节;

  • Nonce:4字节,PoW 问题的答案; 交易个数计数器;

所有交易的内容。

设计理念

如何避免作恶

基于经济博弈原理。在一个开放的网络中,无法通过技术手段保证每个人都是合作的。但可以通过经济博弈来让合作者得到利益,让非合作者遭受损失和风险。

实际上,博弈论早已被广泛应用到众多领域。

比特币设计理念

一个经典的例子是两个人来分一个蛋糕,如果都想拿到较大的一块,在没有第三方的前提下,该怎么指定规则才公平?

最简单的一个方案是负责切蛋糕的人后选。注:如果推广到 N 个人呢?

比特币网络需要所有试图参与者(矿工)都首先要付出挖矿的代价,进行算力消耗,越想拿到新区块的决定权,意味着抵押的算力越多。一旦失败,这些算力都会被没收掉,成为沉没成本。当网络中存在众多参与者时,个体试图拿到新区块决定权要付出的算力成本是巨大 的,意味着进行一次作恶付出的代价已经超过可能带来的好处。

负反馈调节

比特币网络在设计上,很好的体现了负反馈的控制论基本原理。

比特币网络中矿工越多,系统就越稳定,比特币价值就越高,但挖到矿的概率会降低。

反之,网络中矿工减少,会让系统更容易导致被攻击,比特币价值越低,但挖到矿的概率会提高。

因此,比特币的价格理论上应该稳定在一个合适的值(网络稳定性也会稳定在相应的值), 这个价格乘以挖到矿的概率,恰好达到矿工的收益预期。

从长远角度看,硬件成本是下降的,但每个区块的比特币奖励每隔 4 年减半,最终将在 2140

年达到 2100 万枚,之后将完全依靠交易的服务费来鼓励矿工对网络的维护。

共识机制

传统的共识问题是考虑在一个相对封闭的体系中,存在好节点、坏节点,然后如何达成一致。

对于比特币网络来说,因为它是开放的,网络质量也是完全无法保证的,导致问题更加复杂,难以依靠传统的一致性算法来实现。

比特币网络对共识进行了一系列的放宽,同时对参与共识进行了一系列的限制。

首先是不实现最终共识,理论上现有达成的任何结果都可能被推翻,只是被推翻的可能性随着时间而指数级的下降,要付出的代价迅速上升。

此外,达成共识的时间比较长,而且是按照块来进行阶段性的确认(快照),提高网络可用性。

此外,通过进行 PoW 限制合法提案的个数,提高网络的稳定性。

玖壹区块链声明

加微信:469649885区块链培训教程
还可免费获取区块链培训班试学名额

分享:

扫一扫在手机阅读、分享本文

区块链评论

玖壹区块链培训

玖壹区块链培训学院简称(玖壹学院http://www.91xiubbs.com/)提供区块链技术培训资料、区块链开发培训视频教程等下载,不过网上自学区块链技术课程必然存在一些缺陷:遇到问题易卡壳、学习周期漫长、无针对性等。区块链培训机构现场面对面的讲授区块链培训课程可以让您和团队在最短时间内掌握正确、系统、高效的区块链实战技术。