第二篇:区块链的结构和相关技术概述

特点

1.优点:

(1)分布式的去中心化
(2)无须信任系统
(3)不可篡改

2.缺点

(1)交易账本必须公开:在一定程度上会暴露用户隐私
(2)延迟性:会造成大量的算力、能源浪费。而随后发展的其他共识算法,如POS、DPOS等
(3)浪费能源:POW会造成大量的算力、能源浪费。而随后发展的其他共识算法,如POS、DPOS等
(4)占用空间:想同步完整的账本数据,需要至少上百G的空间。
(5)修复时间长:从发布漏洞补丁开始到区块链网络中每个节点都完成修复是需要耗费很长时间的,而且还不能保证每一个节点都及时修复。

如何避免作恶

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

比特币网络需要所有试图参与者(矿工)都首先要付出挖矿的代价,进行算力消耗,越想拿到新区块的决定权,意味着抵押的算力越多。一旦失败,这些算力都会被没收掉

负反馈调节

比特币网络在设计上,很好的体现了负反馈的控制论基本原理。
比特币网络中矿工越多,系统就越稳定,比特币价值就越高,但挖到矿的概率会降低。反之,网络中矿工减少,会让系统更容易导致被攻击,比特币价值越低,但挖到矿的概率会提高。

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

共识机制

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

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

挖矿

原理与过程:了解比特币,最应该知道的一个概念就是“挖矿”,挖矿是参与维护比特币网络的节点,通过协助生成新区块来获取一定量新增的比特币。

当用户发布交易后,需要有人将交易进行确认,写到区块链中,形成新的区块。在一个互相不信任的系统中,该由谁来完成这件事情呢?比特币网络采用了“挖矿”的方式来解决这个问题。

挖矿的具体过程为:参与者根据上一个区块的 hash 值,10 分钟内的验证过的交易内容,再加上自己猜测的一个随机数 X,让新区块的 hash 值小于比特币网络中给定的一个数。这个数越小,计算出来就越难。系统每隔两周(即经过 2016 个区块)会根据上一周期的挖矿时间来调整挖矿难度(通过调整限制数的大小),来调节生成区块的时间稳定在 10 分钟左右。为了
避免震荡,每次调整的最大幅度为 4 倍。

为了挖到矿,参与处理区块的用户端往往需要付出大量的时间和计算力。算力一般以每秒进行多少次 hash 计算为单位,记为 h/s。

客户端

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

  • 完整客户端:存储所有的交易历史记录,功能完备;
  • 轻量级客户端:不保存交易副本,交易需要向别人查询;
  • 在线客户端:通过网页模式来浏览第三方服务器提供的服务。

矿机

专门为“挖矿”设计的硬件,包括基于 GPU 和 ASIC 的芯片。

原理和设计

比特币只是区块链技术的一个具体实现。

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

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

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

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

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

账户/地址**

比特币账户采用了非对称的加密算法,用户自己保留私钥(由第一次安装钱包随机生成),对他发出的交易进行签名确认,并公开公钥。

这个过程在用户第一次安装钱包时由客户端生成

私钥:用钱包生成一个私钥(这个私钥其实就是一个很大的随机数,比特币也不会去验证你的私钥别人用没用,它的理论是认为这个碰撞是没有的,这也是比特币安全的一个基础)

公钥:私钥通过非对称加密算法(椭圆曲线加密法是一种基于离散对数问题的非对称加密法),算出公钥

比特币地址:在公钥的基础上经过两次不一样的哈希算法(HASH160(PubKey),或 RIPEMD160(SHA256(PubKey)) ),算出一个公钥哈希值,再通过一个Base58Check编码160 位(20 字节),就是一个大家比如容易读的字符串,这才是一个比特币地址

由于私钥不存在于区块链上,而且花钱时需要用它签名,如果你把它丢了,你就找不到你的币了,相对应地址里的钱就永远花不掉了。

参考区块链密钥和地址算法

钱包

广义上,钱包是一个应用程序,为用户提供交互界面。 钱包控制用户访问权限,管理密钥和地址,跟踪余额以及创建和签名交易。 狭义上,即从程序员的角度来看,“钱包”是指用于存储和管理用户密钥的数据结构,这里主要指第二种


首先用钱包生成一个私钥,这个私钥其实就是一个很大的随机数,比特币也不会去验证你的私钥别人用没用,它的理论是认为这个碰撞是没有的,这也是比特币安全的一个基础。

这个私钥通过非对称加密算法(椭圆曲线加密法),算出公钥,在公钥的基础上经过两次不一样的哈希算法,算出一个公钥哈希值,再通过一个Base58Check编码,就是一个大家比如容易读的字符串,这才是一个比特币地址。

一个常见误解是,比特币钱包里含有比特币。 事实上,钱包里只含有钥匙。 “钱币”被记录在比特币网络的区块链中。

由于私钥不存在于区块链上,而且花钱时需要用它签名,如果你把它丢了,相对应地址里的钱就找不到了,当然也就永远花不掉了

有两种主要类型的钱包,区别在于它们包含的多个密钥是否相互关联。

第一种类型是非确定性钱包(nondeterministic wallet),其中每个密钥都是从随机数独立生成的。密钥彼此无关。这种钱包也被称为“Just a Bunch Of Keys(一堆密钥)”,简称JBOK钱包。随机密钥的缺点就是如果你生成很多私钥,你必须保存它们所有的副本。这就意味着这个钱包必须被经常性 地备份。每一个密钥都必须备份,否则一旦钱包不可访问时,钱包所控制的资金就付之东流。

第二种类型是确定性钱包(deterministic wallet),其中所有的密钥都是从一个主密钥派生出来,这个主密钥即为种子(seed)。该类型钱包中所有密钥都相互关联,如果有原始种子,则可以再次生成全部密钥。所以只用在初始创建时的一个简单备份就足以搞定。确定性钱包中使用了许多不同的密钥推导方法。最常用的推导方法是使用树状结构,称为分级确定性钱包或HD钱包(参见“ 分层确定性钱包(BIP0032/BIP0044)”)。并且种子也足够让钱包导入或者导出。这就很容易允许使用者的私钥在钱包之间轻松转移。

确定性钱包由种子衍生创造。为了便于使用,种子被编码为英文单词,也称为助记词。

提示:除了简单的测试之外,不要使用非确定性钱包。 它们对于备份和使用来说太麻烦了。 相反,推荐使用基于行业标准的HD钱包,可以用种子助记词进行备份。,遵循BIP-32,BIP-39,BIP-43和BIP-44标准

参考资料钱包技术概述

种子和助记词(BIP-39)

HD钱包具有管理多个密钥和地址的强大机制。
由一系列英文单词生成种子是个标准化的方法,这样易于在钱包中转移、导出和导入。
如果HD钱包与这种方法相结合,将会更加有用。这些英文单词被称为助记词,标准由BIP-39定义。 今天,大多数比特币钱包(以及其他加密货币的钱包)使用此标准,并可以使用可互操作的助记词导入和导出种子进行备份和恢复。

让我们从实际的角度来看以下哪种种子更容易抄录、阅读、导出以及导入。

16进制表示的种子: 0C1E24E5917779D297E14D45F14E1A1A

助记词表示的种子:
army van defense carry jealous true garbage claim echo media make crunch

常用的标准:
助记码,基于BIP-39
HD钱包,基于BIP-32
多用途HD钱包结构,基于BIP-43
多币种和多帐户钱包,基于BIP-44

交易

交易有两种类型,一种是Coinbase交易,也就是挖矿奖励的比特币,由于没有发送人,所以比较特殊。另一种就是我们常见的普通交易了,包含输入和输出的。

块的交易里有一个特殊的交易叫CoinBase交易,就是只有输出没有输入,输出的地址就是矿机的地址。但是并没有一个账号去存比特币的余额,账号的余额存在什么地方呢?就存在之前所有的把这个地址作为输出的那些交易里,其中没有花费的交易的金额合计就是这个地址的余额。

111
由于Alice挖矿被奖励了12.5个比特币。而Alice在一笔交易中,需要转账给Bob10个比特币。而Bob最终确认并接收了Alice发送的10个比特币,而同时由于多出了2.5个比特币。其实这笔交易最终是生成了2个输出,一个是发送给Bob的10个比特币,另一个是找零产生的发给Alice的2.5个比特币(备注:这里不考虑交易费)

整个流程如下:

1)最开始,Alice由于挖矿被奖励了12.5个比特币,从而产生一笔Coinbase交易。这个交易中包含一个输入和一个输出。输出中,包含当前输出的索引、金额、锁定脚本和接受者的公钥。这里锁定脚本的作用是,设定成只有Alice才能使用这笔输出。而要使用这个UTXO,就必须要证明自己是Alice。

2)由于Alice要发送给Bob10个比特币,那么她首先要做的就是确认自己有没有足够的“余额”去支付这笔交易。我们在上一节说了,要计算用户的余额,就要遍历Alice的所有交易记录,这里,我们假设Alice就只有一笔Coinbase交易,也就是说Alice当前的余额是12.5个比特币。由于12.5大于所要支出的10个比特币,所以交易可以进行

3)接下来,就是要创建一笔交易。这笔交易包含1个输入、2个输出(一个发送给Alice,一个找零发给自己)

4)检查都通过,则将交易标记为合法的未确认交易,并在网络内进行广播。
5)当一个矿工准备挖一个新块时,他会将交易放到块中,然后开始挖矿。
6)当新块被挖出来以后,网络中的所有其他节点会接收到一条消息,告诉其他人这个块已经被挖出并被加入到区块链。
7)当一个块被加入到区块链以后,交易就算完成,它的输出就可以在新的交易中被引用。

交易的数据结构没有交易费的字段。相替代地,交易费是指输入和输出之间的差值。从所有输入中扣掉所有输出之后的多余的量会被矿工作为矿工费收集走:

交易费即输入总和减输出总和的余量:交易费 = 求和(所有输入) - 求和(所有输出)

警告:如果你忘记了在手动构造的交易中增加找零的输出,系统会把找零当作交易费来处理。“不用找了!”也许不是你的真实意愿。

一笔交易的输入实际上使用的是上一笔交易的输出(UTXO)。输入中也包含发送者的公钥,这里是Alice的公钥。这里,有一个很重要的问题,我们怎么知道Alice使用的是自己的UTXO呢?如果Alice使用的是别人的UTXO,我们怎么去校验呢?

输入中除了引用上一个交易输出和发送者Alice的公钥,还包含了一个解锁脚本。

锁定脚本

验证接收人的合法性:
第一笔交易为例,这个锁定脚本包含Alice的比特币地址A,因为Alice只公开了经过对公钥HASH后的比特币地址A,因为HASH函数的性质,比特币网络上的任何人,都不能通过A逆向得到Alice的公钥,也就是说,只有Alice知道自己的公钥能够构建解锁脚本,即只有Alice的公钥,才能通过HASH运算出地址A,只有能运算出地址A的比特币账户,才能支配这笔比特币。

解锁脚本

验证创建人的合法性:
包含了上一笔交易输出的接收人的签名和公钥,该脚本公钥哈希与所引用的一笔交易输出哈希相匹配(这保证了发送方只能花费属于自己的币);
通过数字签名技术,我们可以使用公钥对用户的签名(私钥加密)进行验证从而证明签名者是否用户本人

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

  • 付款人地址:合法的地址,公钥经过 RIPEMD16(SHA256(PubKey)) 得到 160 位hash 串;
  • 付款人对交易的签字确认:确保交易内容不被篡改;
  • 付款人资金的来源交易 ID:从哪个交易的输出作为本次交易的输入;
  • 交易的金额:多少钱,跟输入的差额为交易的服务费;
  • 收款人地址:合法的地址;
  • 收款人的公钥:收款人的公钥;
  • 时间戳:交易何时能生效。
    网络中节点收到交易信息后,将进行如下检查:
  • 交易是否已经处理过;
  • 交易是否合法。包括地址是否合法、发起交易者是输入地址的合法拥有者、是否是UTXO;
  • 交易的输入之和是否大于输出之和。

一笔交易若要有效,就必须满足两个条件:
(1)这个交易必须包含一个有效签名,来自它所花费的UTXO的拥有者
(2)被花费的UTXO的总金额必须大于等于该交易产生的UTXO总金额。

这次新的交易记录在了新的区块上,但没有改变历史区块的数据。

UTXO模型
比特币系统是没有余额的概念的,它使用的是UTXO模型,专有名词 Unspent Transaction Output 的缩写(Transaction act发音简写为X),叫“未花费交易输出”

比特币系统中用户的“余额”实际上并不直接存在,而是通过UTXO集合计算得来

用户A 有多少钱?
UTXO的答案是,看多少笔交易给了A钱并且A没有花费掉,A就有多少钱。

可能有人会问这个值算起来容易吗?
其实从0开始算的话肯定是难的,但是因为所有的矿机都是从第一个区块开始一点点算出来的,所以每个块会把每个块的交易,还有用户的交易,以及花费的未花费的交易都放在节点内存或硬盘里,一直累计到现在这个块的时候,就能知道这个账号有哪些交易未花费,并很快就能查出来余额是多少

举例

以现实的钱包举例,一个钱包中有一个 10 元、1 个 5 元,1 个 1 元,一共 16 元。比特币一个账户的余额,也是根据这个账户 UTXO 计算的。

当花 12 元买东西时,可以把 10 元和 5 元拿出去,然后得到找零的 3 元, 那这个时候之前的 10 元和 5 元因为已经花出去了就不再是 UTXO 了,新找零的 3 元成为新的 UTXO,再加上之前未动的 1 元 UTXO,目前的余额是 4 元。

交易签名

UTXO未花费交易就是别人给你的钱,但是怎么避免认领错误呢,他会在交易里有一个支付的解锁脚本,这个解锁脚本必须得用你的签名和你的公钥才能解锁,这里用的其实就是非对称加密。

ECDSA就是用椭圆曲线来解一个数学难题。ECDSA非对称加密比常见的RSA安全性和效率都更高。

非对称加密的两个用处
1.就是用私钥做签名,用公钥来验证这个人确实是我。
2.是你用我的公钥加密一个东西,然后通过网络传给我,只有用我的私钥才能解开。

比特币里其实只用了第一个用途,就是数字签名。

多重签名

多重签名脚本设置了一个条件,其中N个公钥被记录在脚本中,并且至少有M个必须提供签名来解锁资金。这也称为M-N方案,其中N是密钥的总数,M是验证所需的签名的数量。例如,2/3的多重签名是三个公钥被列为潜在签名人,至少有2个有效的签名才能花费资金。

虽然多重签名十分强大,但其使用起来还是多有不便。基于之前的脚本,Mohammed必须在客户付款前将该脚本发送给每一位客户,而每一位顾客也必须使用特制的能产生客户交易脚本的比特币钱包软件,每位顾客还得学会如何利用脚本来完成交易。

此外,由于脚本可能包含特别长的公钥,最终的交易脚本可能是最初交易脚本长度的5倍之多。额外长度的脚本将给客户造成费用负担。

最后,一个长的交易脚本将一直记录在所有节点的随机存储器的UTXO集中,直到该笔资金被使用。采用这种复杂输出脚本使得在实际交易中变得困难重重。

P2SH正是为了解决这一实际难题而被引入的,它旨在使复杂脚本的运用能与直接向比特币地址支付一样简单。

脚本

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

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

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

超级账本中已经支持Python,go等脚本语言

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

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

  • P2PKH:Pay-To-Public-Key-Hash,允许用户将比特币发送到一个或多个典型的比特币
    地址上(证明拥有该公钥),前导字节一般为 0x00;
  • P2SH:Pay-To-Script-Hash,支付者创建一个输出脚本,里边包含另一个脚本(认领脚
    本)的哈希,一般用于需要多人签名的场景,前导字节一般为 0x05;比如,一个公司的账户,由5个人支配,但只要有2个人以上的签名就能进行比特币支付

由于多重签名带来的弊端,引入了P2SH,在支付中,复杂的锁定脚本被哈希值所代替。但解锁脚本必须含有与哈希相匹配的脚本(整个原始脚本,而非哈希值),作为解锁脚本在输出花费时的一部分。 这使得给矿工的交易费用从发送方转移到收款方,复杂的计算工作也从从发送方转移到收款方。

P2SH的优点
与直接使用复杂脚本以锁定输出的方式相比,P2SH具有以下特点:

  • 在交易输出中,复杂脚本由简短电子指纹取代,使得交易代码变短。
  • 脚本能被编译为地址,支付指令的发出者和支付者的比特币钱包不需要复杂工序就可以执行P2SH。
  • P2SH将构建脚本的重担转移至接收方,而非发送方。
  • P2SH将长脚本数据存储的负担从输出方(存储于UTXO集,影响内存)转移至输入方(存储在区块链里面)。
  • P2SH将长脚本数据存储的重担从当前(支付时)转移至未来(花费时)。
  • P2SH将长脚本的交易费成本从发送方转移至接收方,接收方在使用该笔资金时必须含有赎回脚本。

参考资料高级交易和脚本

区块结构的链式结构

一个区块将主要包括如下内容:
4 字节的区块大小信息;
80 字节的区块头信息:

  • 版本号:4 字节;
  • 上一个区块头的 SHA256 hash 值:链接到一个合法的块上,32 字节;
  • 包含的所有验证过的交易的 Merkle 树根的哈希值,32 字节;
  • 时间戳:4 字节;
  • 难度指标:4 字节;
  • Nonce:4 字节,PoW 问题的答案;
  • Merkle根:该区块中交易的merkle树根的哈希值
  • 区块高度:记录该区块在区块链中位置

交易个数计数器:1~9 字节;
所有交易的具体内容,可变长

难度指标:每两周,也就是每2016个块之后会调整难度。其实就是拿前2016块的时间平均起来和10分钟相比,如果这个平均时间大于10分钟的话就调小难度,如果时间小于10分钟就调高难度。这个难度也会作为别人验证所挖出区块是否合法的一个条件,也就是说如果一个块广播到网络中,但是别人认为难度没有达到共识机制中的那个难度,就会直接把这个块扔掉,不会在这个块的后面进行记账工作。

然后每个区块通过连接上一个区块,最终形成一条长链,如下图所示:

Merkle

Merkle树,也叫哈希树,是一种二叉树,它是一种用做快速归纳和校验大规模数据完整性的数据结构。

Merkle树由一个根节点、一组中间节点和一组叶节点组成。最下面的叶子节点可以存储哈希值或者数据,每个中间节点是两个子节点的内容的哈希值,而根节点同样也是由两个子节点的内容的哈希值组成。

我们可以发现,只要存储数据的叶子节点有任何的变动,都会传递到相应的父节点,最终其Merkle树的根节点都会发生变化。

如下图的,如果需要证明区块上是否存在一笔交易C,那么我们只需要N3和N4的哈希值就可以证明,过程如下:

Step1:获取交易C的哈希值,N2=Hash(交易C)
Step2:通过N2和N3的哈希值,得到父节点的哈希值:N5=Hash(N2+N3)

Step3:同上,通过N4和N5的哈希值,得到根节点的哈希值:Root=Hash(N4+N5)

Step4:然后将上一步得到的根哈希值对比区块头中MerkleTree的根哈希值,如果相同,则证明该区块中存在交易C,否则说明不存在

SPV,布隆过滤器(BLOOM FILTER)

SPV

简单支付认证,即Simple Payment Verification,简称SPV。SPV的目标是为了验证某个交易支付是否存在,以及得到比特币网络多少个确认(多少个区块)。比特币中的SPV功能就应用到了Merkle树的特性。

为什么需要SPV机制
我们知道,比特币网络中所有产生的交易均打包进区块中,一般情况下,一个区块中包含几百上千笔交易是很常见的。
SPV的概念:不运行全节点也可以验证支付,用户只需要保存所有的区块头就可以了。虽然用户不能自己验证交易,但如果能够从区块链的某处找到符合的交易,就可以知道这笔交易已被网络确认,也可以确认该笔交易得到网络多少笔确认。

SPV强调的是验证支付,不是验证交易。这两个概念是不同的。验证支付,比较简单,只需要判断用于支付的那笔交易是否被验证过,以及得到网络多少次确认(即有多少个区块叠加)。而交易验证则复杂的多,需要验证账户余额是否足够支出、是否存在双重支付、交易脚本是否通过等问题,一般这个操作是由全节点的矿工来完成。

比特币网络节点类型

(1)全节点

包含钱包(支付验证)、矿工、完整区块链数据库、网络路由节点的功能。

(2)SPV节点

就只有简单的支付验证功能:只涉及到包含钱包(支付验证)、网络路由节点

布隆过滤器(BLOOM FILTER)

布隆过滤器(Bloom Filter)是1970年由布隆提出的,它实际上是由一个很长的二进制向量和一系列随意映射函数组成。

它是一种基于概率的数据结构,主要用来判断某个元素是否在集合内,它具有运行速度快(时间效率),占用内存小的优点(空间效率),但是有一定的误识别率和删除困难的问题。它能够告诉你某个元素一定不在集合内或可能在集合内。

布隆过滤器(Bloom Filter)的优点

相比于哈希表、链表等数据结构,其空间和时间的优势明显。而且布隆过滤器的插入、查询时间都是常数O(k),也就是说每次想要插入或查询一个元素是否在集合中时,只需要使用k个哈希函数对元素求值,并将对应的比特位标记或检查对应的比特位即可。

布隆过滤器(Bloom Filter)的缺点

一般情况下,无法从布隆过滤器中删除元素。因为在删除元素之前,我们需要确认一个元素是否在集合中,而我们知道布隆过滤器只能给出可能在集合中或者一定不在集合中的回复,而无法给出是否一定在集合中的回复。】

布隆过滤器在比特币中的应用
比特币中布隆过滤器是在BIP-0037中提到。下面我们通过“比特币钱包如何知道有多少钱”的问题来介绍布隆过滤器在比特币中的应用。这个问题其实就是“比特币钱包如何知道有多少UTXO”

在《Merkle树和SPV机制》文章中,我们提到过比特币网络中主要有两种节点类型:

全节点:存放所有区块数据和交易
SPV节点:只存放区块头(Block Header)
我们假设,比特币钱包最开始值存储了私钥,没有任何其他数据。那么它要获取跟自己地址相关的UTXO,只能向比特币网络中相邻的全节点询问,询问的方式有3中:

方法一:下载完整的区块链账本,自己查找

这种方法很简单,也能隐藏用户的隐私(全节点无法知道SPV节点关联的钱包的地址)。但是在手机端是不现实的,每次用户需要下载上百G的区块链数据,才能知道自己钱包有多少钱,虽然保护了用户隐私,但是浪费了存储空间和带宽。所以这种方法不行,而这也是为什么有SPV的概念存在,中本聪也是考虑到移动支付的场景的。

方法二:直接告诉全节点自己钱包的所有地址,全节点返回所有跟钱包地址相关的UTXO

这种方法直接等于是泄露了用户隐私,其他全节点就知道SPV节点所关联的钱包地址。但是好处是所要下载的数据少了很多,也更精确了。

方法三:告诉全节点部分自己钱包的地址信息,全节点返回可能相关的UTXO

这种方法实际上就是采用布隆过滤器的方法隐藏用户隐私,从而做到即保护用户隐私,又节省存储空间和带宽。在前面的章节,我们知道布隆过滤器的两个特点:只能告诉你某个元素可能存在集合中以及某个元素一定不存在集合中。这里可以简单理解Bloom Filter就是一个过滤器,用来过滤不属于钱包的UTXO。

钱包节点(SPV节点)会以布隆过滤器的形式告诉相邻全节点自己地址信息,那么根据布隆过滤器的特性,会有两种结果:

没有通过布隆过滤器过滤出来的UTXO,就【一定】不属于钱包地址
通过布隆过滤器过滤出来的UTXO,【可能】属于钱包地址

这种方法虽然在一定程度上保护用户隐私,节省了存储空间和带宽,但是根据布隆过滤器的特点,我们知道,随着钱包交易的UTXO越多,布隆过滤器误报率会越高,也就是相邻全节点返回正确的UTXO概率越低。

验证过程

用户A在购买商品时通过比特币支付,并声称自己已经转了1BTC给商家,到商家验证支付有效(SPV验证),这个过程是

Step1:SPV节点如果只关心某个支付到自己比特币地址的交易,则可以通过建立布隆过滤器(布隆过滤器是一种基于哈希的高效查找结构,能够快速确定某个元素是否在一个集合内)限制只接收含有目标比特币地址的交易。

Step2:一旦比特币网络中其他当节点探测到某个交易符合SPV节点设置的布隆过滤器条件时,其它节点将以Merkleblock消息的形式发送该区块,Merkleblock消息包含区块头和一条连接目标交易与Merkle根的Merkle路径。

Step3:接下来,SPV节点需要验证交易,需要做2个检查,分别是:交易的存在性检查和交易是否重花的检查。

Step4:SPV节点通过该Merkle路径找到跟该交易相关的区块,并验证对应区块中是否存在目标交易(该过程也被称为:Merkle Path Proof)。SPV节点所收到的Merkleblock数据量通常少于1KB,只有一个完整区块(大约1MB)大小的千分之一左右。

Step5:现在通过Merkle Path Proof,SPV节点确认了交易确实存在于区块链中,但是这个还是无法保证这笔交易(Transaction)的Input(引用的上一笔UTXO)没有被重花(双重支付)。这时候SPV节点通过去看这笔交易所在区块之后的区块个数,Block个数越多说明该区块被全网更多节点共识,一般来说,一笔交易所属区块之后的区块个数达到6个时,就说明这笔交易是被大家核准过(达成共识)的,没有重花,而且被篡改的可能性也很低,如下图所示。

共识机制

比特币网络是公开的,因此共识协议的稳定性和防攻击性十分关键。
比特币区块链采用了 Proof of Work(PoW)的机制来实现共识,该机制于 1998 年在 B-
money 设计中提出。
目前,Proof of 系列中比较出名的一致性协议包括 PoW 和 PoS,都是通过经济惩罚来限制恶
意参与。

PoW

工作量证明,Proof of Work,通过计算来猜测一个数值(nonce),得以解决规定的 hash 问题(来源于 hashcash)。保证在一段时间内,系统中只能出现少数合法提案。同时,这些少量的合法提案会在网络中进行广播,收到的用户进行验证后会基于它认为的最长链上继续难题的计算。因此,系统中可能出现链的分叉(Fork),但最终会有一条链成为最长的链。

hash 问题具有不可逆的特点,因此,目前除了暴力计算外,还没有有效的算法进行解决。

如果获得符合要求的 nonce,则说明在概率上是付出了对应的算力。谁的算力多,谁最先解决问题的概率就越大。当掌握超过全网一半算力时,从概率上就能控制网络中链的走向。这也是所谓51% 攻击的由来

PoS

权益证明,Proof of Stake,2013 年被提出,最早在 Peercoin 系统中被实现,类似现实生活
中的股东机制,拥有股份越多的人越容易获取记账权。

PoS 是试图解决在 PoW 中大量资源被浪费的缺点。恶意参与者将存在保证金被罚没的风险,即损失经济利益。

对于 PoS 来说,需要掌握超过全网2/3 的资源,才有可能左右最终的结果

PoS 也有一些改进的算法,包括授权股权证明机制(DPOS),即股东们投票选出一个董事会,董事会中成员才有权进行代理记账。

智能合约

区块链,如果往里放的是一个数字,而且还有交易协议和系统的话就是一个加密货币。如果放一个别的东西,就成为另一个别的平台了,比如放一个智能合约。

智能合约是不可篡改的,而且是自动达成的,如果新增某个条件,比如时间、人数或钱数,达到这个条件后,会把代币等有价值的东西自动转移。

智能合约在区块链之前就已经存在了,这是个概念性的东西,区块链技术出来后,发现这是一个做智能合约的完美的载体,所以将两者结合起来。

P2P网络

区块链作为分布式网络,其实现的关键就是基于P2P网络。P2P技术发展到现在,已经经历了3代的发展。

第1代:采用中央服务器的模式,每个节点都需要先连接中央服务器才能知道其他节点的位置,这种技术有个致命缺陷—单点故障。典型代表是:Napster。

第2代:采用广播的模式,每个节点在定位资源或节点的时候,会向自己相连的所有节点进行询问,被问到的节点如果不知道结果也执行同样操作,直到找到资源或节点位置。这种技术的一个问题是会引发”广播风暴”并严重占用网络带宽。典型代表是:Gnutella的早期版本。

第3代:也是目前广泛使用的分布式哈希表(简称DHT)技术,解决了前两代中出现的单点故障问题和广播风暴问题。

目前实现了DHT协议的算法有Kademlia[6](简称Kad)和Chord[7]等,其中Kad算法由于其简单易用而被广泛使用,比特币网络和以太坊网络中P2P网络使用的就是Kad算法。

参考P2P资料
区块链关键技术

P2P技术

P2P网络中的Kad算法

闪电网络

比特币的交易网络最为人诟病的一点便是交易性能:全网每秒 7 笔的交易速度,远低于传统的金融交易系统;同时,等待 6 个块的可信确认导致约 1 个小时的最终确认时间。

闪电网络的主要思路十分简单 – 将大量交易放到比特币区块链之外进行。该设计最早是 2015年 2 月在论文《The Bitcoin Lightning Network: Scalable Off-Chain Instant Payments》中提出。

比特币的区块链机制自身提供了很好的可信保障,但是很慢;另一方面考虑,对于大量的小额交易来说,是否真实需要这么高的可信性?闪电网络通过智能合约来完善链下的交易渠道。

核心的概念主要有两个:RSMC(Recoverable Sequence Maturity Contract)和HTLC(Hashed Timelock Contract)。前者解决了链下交易的确认问题,后者解决了支付通道的问题。

RSMC

Recoverable Sequence Maturity Contract,中文可以翻译为“可撤销的顺序成熟度合同”。就是类似准备金机制。

我们先假定交易双方之间存在一个“微支付通道”(资金池)。双方都预存一部分资金到“微支付通道”里,之后每次交易,就对交易后的资金分配方案共同进行确认,同时签字作废旧的版本。

当需要提现时,将最终交易结果写到区块链网络中,被最终确认。可以看到,只有在提现时候才需要通过区块链。

任何一个版本的方案都需要经过双方的签名认证才合法。任何一方在任何时候都可以提出提现,提现需要提供一个双方都签名过的资金分配方案(意味着肯定是某次交易后的结果)。

在一定时间内,如果另外一方提出证明表明这个方案其实之前被作废了(非最新的交易结果),则资金罚没给质疑成功方。这就确保了没人会拿一个旧的交易结果来提现。

另外,即使双方都确认了某次提现,首先提出提现一方的资金到账时间要晚于对方,这就鼓励大家尽量都在链外完成交易。

HTLC

微支付通道是通过 Hashed Timelock Contract 来实现的,中文意思是“哈希的带时钟的合约”。

这个其实就是限时转账。理解起来其实也很简单,通过智能合约,双方约定转账方先冻结一笔钱,并提供一个哈希值,如果在一定时间内有人能提出一个字符串,使得它哈希后的值跟已知值匹配(实际上意味着转账方授权了接收方来提现),则这笔钱转给接收方。

HTLC 的机制可以扩展到多个人,大家可以想象一下,想象出来了就理解了闪电网络。

闪电网络

RSMC 保障了两个人之间的直接交易可以在链下完成,HTLC 保障了任意两个人之间的转账
都可以通过一条“支付”通道来完成。整合这两种机制,就可以实现任意两个人之间的交易都可
以在链下完成了。
在整个交易中,智能合约起到了中介的重要角色,而区块链则确保最终的交易结果被确认。

侧链

允许资产在比特币区块链和其它链之间互转。降低核心的区块链上发生交易的次数。

也来自比特币社区, 2013 年 12 月提出,2014 年 4 月成立项目。
通过简单地复用现有比特币的方式,实现比特币和其他帐簿资产在多个区块链间的转移。

Blockstream 基于侧链技术探索更多功能,已发布商业化应用 Liquid,并与普华永道进行相关合作。

区块链架构模型

一、简单3层架构
实现基本的区块和比特币对接

二、6层架构
区块链技术的模型是由自下而上的数据层、网络层、共识层、激励层、合约层和应用层组成

参考区块链基础架构模型

扩展阅读

比特币交易原理分析

比特币的交易模型

区块链关键技术

精通比特币(第二版

猜你喜欢

转载自blog.csdn.net/zjcjava/article/details/80950749
今日推荐