这是司马特小分队第12篇原创文章

上篇文章的效果出乎我的意料,看了下后台数据自然转发人数有60人之多(基础篇点此进入),阅读量也有700多还可以,当然跟大号还是没法比。凡事预则立,不预则废~欢迎大家多多关注,么么哒~

——比特币进阶篇——

1.1、在比特币世界中一定要重点讲一下“矿工”——这个在虚拟币世界中很神奇的角色。

我们在上一篇中大致介绍了矿工的工作内容,这里做一些补充:

矿工在比特币中扮演着举足轻重的地方,因为这套系统要想运作下去,要想有人记账、要想不断生成区块,就必须需要矿工。从创世区块(第一个区块)的第一阶段规定每个区块产生50个新的比特币用于奖励矿工的记账行为。此奖励每四年减半一次,经过长年累月后最终通过挖矿获得的比特币将无限趋近于0。最终比特币总量约为2100万。另外矿工必须依照一个原则:那就是一旦有新的区块广播了,必须停下手上的采矿行为,开始以新区块为父区块计算下一个区块了。


可以看到比特币挖矿是一个利益驱动的行为,利益越高的交易,节点会优先把这笔交易纳入到最新的区块中,矿工会优先记录他。这符合了市场追逐利益的本质

 

另外关于比特币的区块还需要做如下解释:

比特币区块大小限制目前为1MB,区块头是80字节,平均每笔交易至少是250字节,1M空间差不多能写入4096笔交易按平均十分钟生成一个区块每秒交易上限约为7笔。


那么为什么要限定区块大小呢?

比特币中的限定,包含区块大小、区块生成时间均为了降低并发性,以减少数据冲突或错误的可能性。在比特币建立初期,受限于网络、存储空间、处理器速度等问题,将区块大小先定位1MB。目前大多数区块仍达不到限定容积。但随着时间推移,交易量增加,而挖矿奖励减少,矿工不得不通过讲更多交易融入一个区块中以获取更多手续费时,区块容积不足的问题将凸显出来。而区块的增加导致广播(新区块传输至全网)时间延长,这将造成矿工在无效、废弃区块上消耗的能源增加。而当矿工挖矿收益不足以支撑能源消耗后,挖矿行为将大幅度减少。而用户为了保证交易尽快确认,不得不提高手续费,导致交易成本增加。因此是否增加区块大小仍在争论中~当然区块大小增加很直观的一个问题就是下载数据的时间大大增加

1.2、比特币的交易:

在比特币世界中因为没有中心化机构进行账本记录,所以其实你是不知道余额,交易时必须要验证是否有足够余额可供支出、是否存在双花、脚本能否通过等等,通常由运行节点的矿工来完成。

中心化的账本管理以支付宝为例,比如支付宝存储了我的余额100,我要花50,只要支付宝判断下我的账户余额有没有50元,加上我的授权,就可以直接支付了。但是在这里,必须要做到每笔交易都可溯源,为什么?因为没有一个所谓的账户中心来记录你有多少余额,是不是有足够多的钱可进行交易,只能通过你的历史交易来计算是否满足交易条件。这个过程需要遍历完整的区块链数据才行。

说到比特币交易,这里必须要讲一个概念:“非对称公私钥”。

每个人都有2个密钥,一个“私钥”由系统自动生成的;然后通过“私钥”生成对应的唯一“公钥”。公钥是公开的,而私钥只有自己手里有。一个账户用公钥加密后只能通过自己的私钥进行解密。当然由于私钥转化成公钥是不可逆的,所以公钥是无法反推出私钥的。


可能你很好奇这个原理:

举个很简单的例子:比如A随机生成2个质数(147、343),组合成一个6位数的私钥“147343”,公钥则是2个数相乘147*343=50421,当A只想让某个数据只能被B修改时,他可以在这个数据后加上公钥“50421”,并声明只有私钥左三位乘以右三位等于公钥时,才可以修改这个数据。如果是一个黑客,那只能采用枚举法进行不断的尝试,当这个规则足够复杂的时候,其实是很难破解的,因此可以说只有B拿到A的公钥才能解开,保证了安全性。


而在比特币系统里,则是将一个人的公钥作为他的收款账号(或者是地址)。于是我们模拟这样一个场景,A把5个比特币转给B,他只要输入附带上B的公钥,那么系统会自动帮你把这笔“币”用B的公钥锁定,这样这笔“币”就默认属于B了,但是可能是锁定状态无法使用。只有当B用自己的私钥解开后,这笔“币”也算真正划拨到B的收款账户(地址)上,B才能使用。

所以简单理解来说,私钥就相当于你的账户密码,只有你有权限解开和移动比特币。它保证了交易的安全性。

1.3、比特币钱包:

比特币钱包中存放的是一张张有面值的“一次性支票”(未花费的交易输出UTXO)和对应的“印章”(私钥)


每笔交易都有若干个Tx_in(交易输入)和Tx_out(交易输出)

交易输入:说白了就是资金来源,一种是挖矿奖励,出现在每个区块的第一笔交易中;另一种是之前交易给自己的还没有使用的资金,而它本质上也是上一个交易的输出;

交易输出:就是资金去向,一种是已经交易出去的金额;另一种已经在另一个人名下,但是他还没使用,或者说还在冻结状态的资金。本质上这两者都不属于你了,你已经没有支配权了。


用户钱包中的比特币实际上是用户拥有支配权的、且尚未花费的Tx_out中记录的金额总和,即用户可支配的所有UTXO金额之和。完整的钱包中应存有若干个UTXO和支配每个UTXO时所对应的私钥。

当一个用户安装了第三方的钱包后,下载全网所有比特币区块数据,然后在本地存储所有的UTXO,然后就可以开心地在钱包里查询自己地址下的UTXO数据啦。

——————

聪明的你于是又提出了一个问题,怎么在钱包下载数据的时候保证数据的准确性和完整性,或者说验证某笔交易是否真实存在?

因为下载数据的时候都是从周边节点下载的,但是可能存在周边节点数据不准确的情况,或者在下载过程**现数据丢失,从而导致下载后的数据是不准确的。

这个时候就需要去验证数据准确性了。

我们知道验证某笔交易的有效性或者数据的准确性,其实就是验证那笔交易是否已经收录于有效区块链中,并得到了6次确认。

那么最最常规的方法:我们可以通过下载全部数据(区块体中包含了所有交易数据),然后和可信链路上的数据进行一一比对,来确保某一笔交易的准确性。

但是很显然,下载一个几十G的数据包实在是太浪费时间和空间了,况且一旦出错,又得重新下载一次全部数据。我觉得是个人应该都会疯~

针对这个问题,聪明的聪老师采用了更为“优美”的SPV验证。

那么什么是SPV验证呢?SPV又叫简单支付验证。它不需要下载所有数据,只需要保存所有区块头数据就可以验证某笔交易了。那么这到底是怎么实现的呢?

说到SPV就要讲到Merkle树了,因为SPV验证离不开Merkle树。

我们前面有张图区块头里包含了Merkle根(说白了就是个哈希值,见上图),Merkle根哈希是怎么算出来的?

在点对点网络数据传输时,会从多个节点上下载数据,如果每次都下载所有数据,那么就太耗资源了,更好的方式是把所有数据拆分成一小块一小块数据。这样的好处是,如果小块数据在传输过程中损坏了,那么只要重新下载这一小块数据就行了,不用重新下载整个文件。


接着我们对每个小数据块做哈希(或者叫SPV节点),然后把相邻2个小块数据的Hash值拼到一起,然后对这个长字符串在作一次Hash运算,不断地组合、哈希进行递归,最后得到整个树的根Hash(Top Hash or Root Hash)

那么回到主问题“怎么验证某笔交易是否真实存在?”

聪明的你肯定能想到:很简单啊,先从可信数据源(最长主链)得到该笔交易所在区块的Merkle根哈希,然后跟下载下来的Merkle根哈希进行比较,如果一致,那么就说明所有数据都是准确的。

那么怎么定位这笔交易在哪个区块中?

比特币提供了一种叫做布隆过滤器(Bloom filter)的功能,节点会在通信链路上建立一个这样的过滤器,限制只接受含有目标地址的交易,从而能过滤掉大量不相关的数据,减少客户端不必要的下载量。比如,SPV节点会收到少于1KB的有关区块头和Merkle路径的数据,其数据量只约占一个完整区块(目前大约1MB)的千分之一。根据该交易的hash和某个区块的Merkle路径上的数据进行比对,就能知道是否在该区块中。

那么假如根hash不一致呢?下载下来的数据到底哪里出问题了呢?

比如:8对应的数据被人篡改,通过Merkle Tree很容易定位找到问题在8处,因为哈希树可以通过一条分支1—2—4—8的哈希值的比对验证来定位。

——区块链的延伸及发展——

其实现在的比特币都属于公有链,即只要有一台矿机,谁都可以加入其中。于是乎就有人想针对某个群体、某类组织内部建立一套区块链系统,不对外开放~

2.1、联盟链:区块链受预选节点(特定机构/人)控制,预选节点打包区块后,获得超过半数的节点认可即可确认,允许某个人或固定参与者可读取。

联盟链的优势和劣势:

(1)节点减少后可以有效减少分叉产生的可能性。在节点大幅度减少的情况下,生成区块的时间可以大大缩短。

(2)预选节点可以减少公众对于区块链的控制权,从而使得区块链可以更好的为各种应用服务。

当然很明显,它也有自己的缺点,那就是失去了真正的中心化记账,由于其有限的节点,很可能出现超过50%以上节点窜通后篡改数据,而失去了公正性。

马特查询了下联盟链的应用案例,发现马爸爸早已开始布局了。

阿里巴巴打造了透明可追溯的跨境商品供应链,即为每个跨境跨境商品生成一条特定联盟链。商品生产厂商、商品检测机构、境外海关、境内海关、物流公司等作为预选节点。用户可通过开放API查询商品从生成到送达的全过程。

2.2、私有链:写入权限完全掌握在一个组织手中的区块链。读取权限或开放或进行限制.

随着比特币、以太币、以及各种山寨币的横空出世,投资者手头上就开始囤积各种类型的币了,就好像既买了美元,又买了人名币,毫无疑问美元和人民币之间的兑换需求随之而来。但是两种不同的代币就像2个完全不同的系统,都是独立运行的,怎么实现币币交易呢?

2.3、于是出现了侧链(Sidechains)技术,我们先来了解下侧链的概念:

侧链是一种特殊的区块链。它使用一种叫做“SPV 楔入”的技术实现与其他区块链之间的资产转移,这使得用户能用已有的资产来使用新的加密货币系统。并且由于侧链是一个独立的、隔离的系统,侧链**现的严重问题只会影响侧链本身,这极大地降低了创新的风险和成本。目前,侧链技术主要是由Blockstream公司负责开发。

侧链只要理解它的2个要素就可以了:

(1)侧链是独立于主链的存在侧链中的交易不影响主链,主链中的交易也不影响侧链。

(2)实现双向锚定。什么意思?

举个简单的例子:比特币(主链)的持有者A发起一笔交易给B,如果B又是以太坊(侧链)的一个节点(B的地址包含比特币系统的地址和侧链以太坊的地址,两者是互相映射的),那么按照我们前面讲的,A 交易给B 5个比特币后先被锁定,同时侧链会产生一个输入来源为主链的交易,B在侧链的地址上会按照对应的比例(假如比例是5:8)解锁8个以太币,说白了B的资产从主链的地址上转移到了侧链的地址上。

这时作为交换,假如B要把8个以太币给A。

我们知道主链比特币上是无法创建和流通比特币以外的其他币的,所以理论上B只能把8个以太币在侧链上转移到A的侧链的地址上,然后A的8个以太币被锁定,同时主链会产生一个输入来源为侧链的交易,A在主链上之前锁定的5个比特币就解锁了,A可以在主链上转移这5个比特币了。

这就是双向锚定。主链锚定侧链,侧链锚定主链。

但是这里需要说明一点:侧链一旦出现安全事故导致解开比特币的私钥遗失,那么这个比特币也就无法找回了。

侧链技术进一步扩展了区块链技术的应用范围和创新空间,使传统区块链可以支持多种资产类型,以及小微支付、智能合约、安全处理机制、真实世界财产注册等,并可以增强区块链的隐私保护。

那么它目前有相应的应用吗?

以火币网(一个比特币和代币的交易中心,类似上海证券交易所)为例,要完成币币交易,需要比特币钱包中的BTC转到火币网的BTC地址上,然后通过火币网进行交易,这里火币网的角色其实是帮你代为保管比特币、资金,同时保证交易安全性的第三方机构。


一般来说在火币网这种虚拟币交易平台上,一个卖家想要出售比特币,那么他必须先把BTC打到火币网的地址上,然后买家在平台上针对这个出售单进行购买,钱直接打给该卖家,卖家收到钱后进行确认,然后平台会把该币转移给买家。

那么火币网是怎么实现币币交易这个过程的,这里有两种方式供大家参考:

1、火币网在各个币种的区块链上开一个节点,通过哈希锁定实现币币交易

2、火币网自己开一条侧链,然后在侧链中根据多条主链的要求自行进行交易

大家可以自行脑补结合下前面的知识点,思考这两个方式。

2.4、中继链(relays):在A.B两个链中,存在第三方数据结构C,那么这个C就是A和B的中继,如果C也是区块链结构,那么就称relay-chain。实现方式为:当检测到A链中发生了某个事件,或者在特定时间内,A链中的某个对象包含了一个特定值,将在B链执行某个智能合约。假设进行比特币和以太币交易时,设定在某个X时间内,比特币主链中确认了这笔交易,则通过中继链,将在以太币链中执行交易。

简单来说中继链和侧链差不多~

2.5、哈希锁定(Hash-locking):A和B进行比特币和以太币交易。A随机生成一个数值,经过hash计算后发送给B。A和B都遵守以下智能合约来锁定他们的资产(A先锁定,B在A锁定成功后锁定):设定一个时间X,对于A的资产,如果有人能在2X时间内猜出这个随机数值,那么资产将被转移到B,否则将返还给A;对于B的资产,如果有人能在X时间内猜出这个随机数值,那么资产将被转移给A,否则将返还给B。此时,A在X时间内将这个随机数值提供给B,以确保B的资产能转移给A,在这个过程中,就确保了B知道这个随机数值,那么B就可以提供这个随机数值给A,在2X时间内获得A转移给B的资产。

哈希锁定的本质是在私钥的基础再加一层锁,保证交易的公正性。

进阶篇的内容基本上讲到这里也差不多了。下一篇我们将选择1~2个行业和领域,深度解析到底该如何应用区块链技术,怎么改变现有的痛点,以及怎样实现商业价值。尽请期待~

没看过基础篇的小伙伴点此进入

参考文献:

1、chehw的《SPV、SPV节点和SPV钱包》

2、zerok775《Merkle Tree算法详解》


声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。