美文网首页
区块的生成和链接(一)

区块的生成和链接(一)

作者: kathy亚峰 | 来源:发表于2017-10-14 11:39 被阅读214次

    这周听了新大的区块链课程,每个字都能听清连在一起就不知道什么意思,所以想到把文字整理出来,为的是可以反复看反复理解,于是就有了这篇文章,这是第五课的前半部分内容。

    一、交易的传播验证。

    先讲交易的传播验证,交易的传播验证完成后存在本地的数据库里,成为一个交易池,这个交易池的作用是什么呢?就是当挖矿之前要先生成区块,区块里主要包含交易所有内容,区块是从交易池里选一些优先级比较高的交易打包进区块,然后进行挖矿,然后挖矿成功后需要把区块和包含工作量证明这些所有的值都填进去,然后向全网广播,尤其是临近的节点,临近节点收到后再对这个区块进行验证,包括里面的交易也会重新走一遍。最后讨论一下MERKLETREE,这是一种数据结构,它有两个目的:1.是防止区块中的交易被恶意篡改,2.是做为轻钱包的快速验证功能,发现你的交易是否在某个区块链里。

    先回顾一下上节课的内容,一个交易包含两部分内容,有输入有输出,N个输入,M个输出,N>=0 M>0,这里有个问题,为什么N可以等于0?在什么情况下没有输入,只有输出?当矿工挖到矿后,系统自动生成一个交易,这个交易没有输入只有输出,输出的接收方就是矿工或矿池的公钥的哈希锁定的。

    输入理解为你要花费的UTXO(未花费的输出,别人给你转的比特币生成了一个UTXO,就是别人的交易包含了转的币值和你的公钥哈希值,即锁定脚本,当你花这个币的时候,别人给你这个币的UTXO是要被包含进来的,这个包含不是把这个数据的整个结构都包含进来,它是通过指针指向以前那个交易,指向之前那个交易的index,可以叫做UTXO的下标,输入是:要被花费的UTXO加上你的解锁脚本,解锁脚本包含签名和公钥),然后用解锁脚本加上锁定脚本来验证你这个交易是合法的,你花费输出的这个人是否有权利花这个币。用栈的方式,把你的签名、公钥压进去,再把解锁脚本数据压进去,再用运算符把数据弹出来进行计算,最终结果为TURE的话就说明这个交易过了。

    输出可以理解为UTXO,输出可以有多个UTXO,其中有转给他人的,没花完的转给自己的UTXO,即找零。

    交易是用钱包软件生成的,生成后会向临近的节点广播,临近节点接收到后第一步就需要对交易验证,这个交易的验证和挖矿没有关系,并不是说谁先验证完这个交易就得到币,得到币只是和挖矿有关系,谁先挖到矿谁得到币。它不验证的话就不知道这个交易是否合法,不验证直接就把这个交易打包进区块里边就去挖矿的话,费千辛万苦把挖出12.5个币,然后把这个区块对外广播到其他节点的话,别的节点对这个区块进行验证,只要有一个交易非法的,这个矿就白挖了。

    对于交易的验证条款比较多,这里只说主要的内容

    1.要看交易的大小,这个交易的SIAZE一定要小于区块规定的上限.隔离见证之前规定的,区块的SIZE是不能超过1M,所以交易的SIZE是不能超过区块的总的SIZE,如果交易的SIZE大于区块的SIZE,这个交易就被抛弃的。

    2.需要验证这个交易输入的UTXO是不是真的存在,是否存在于全节点,全节点这个UTXO存在一个池子,可以理解为一个存UTXO的数据库,会去检索这个UTXO是否真实存在,如果不存在就是非法的,还可以检验你的这个UTXO是否被其他交易所引用,被花两次。

    3.输入金额要大于输出金额,交易是需要付费的,需要给矿工付费的。看比特币交易那本书里描述有时不付矿工费的,如果交易费为零的话,币龄时间足够长或UTXO的深度足够深,我仍然可以以交易费为零的情况下促使这个交易成功,但据业界的人说这个取决于矿工,所以现在基本上不付矿工费的交易应该不会被打包进区块的,尤其在比特币交易阻塞的情况下,有好些交易几个小时甚至两三天都不能成功的话,像这个没有小费的交易就更不可能了,因为矿工或矿池是可以改这个比特币的软件的,他可以改,打包这个交易的时候可以剔除掉那些没有交易费的交易,验证交易时不把这类交易放入池子里,所以输入总金额一定要大于输出总金额。

    4.会把这个交易的解锁脚本和锁定脚本放到一起去验证,验证通过了就认为这个交易是合格的,就放入本地的交易的数据库里,并且把合法的交易广播给临近的节点,这个速度很快,也就零点几秒,临近的节点收到这个交易会把当前交易做过的事情再做一遍,然后它把这个交易再传给临近的其他节点。

    二、区块的生成

    一个交易传播给其他节点,其他节点验证后会把它放入自己的数据库里,一个transcation pool,如果你是一个矿工,你有自己的全节点你要挖矿的话,挖矿之前需要先构造一个区块,把所有交易打包进去,然后构造区块头,然后再进行挖矿。第一步要先把coinbase放在区块的最顶端,所以它会留出一部分空间用于挖矿的交易输出,它不会把挖矿的交易输出打包到交易的最后边,因为区块的的大小是有一定limit(限制)的。举例的话,区块是一节车厢,整个区块链是一列火车,每节车厢客人是固定的,座位是固定的,所以会预留一些座位给coinbase,即挖矿的交易,把其他的位置按交易池中的优先级最高的打包到区块中,优先级别如何界定有一个公式。

    3.优先级等于交易的额度(这个额度就是交易的总输入或总输出,因为交易的输入和输出差别不大)乘以UTXO的深度(以前讲过区块高度,从区块下标为零开始,钟本聪挖的创世区块是第一个区块就是下标为零,然后1、2、3…。区块的深度的方向正好相反,刚被挖出来的区块、被大家验证过的区块它的深度为1,数字下标从1开始,如果再有一个区块出来了,被验证合法了,那么这个区块深度就加一为二了。

    UTXO在比特币里虽然没有深度这个概念,但在这里你用区块深度的概念来理解比较简单,你这个UTXO所被包含进的区块的深度是多少,如果这个深度是1000,这个优先级相对于深度为100、10的那个深度优先级就要高很多。多以交易的额度会增加优先级,所花费的UTXO存在的那个区块的深度也会增加优先级,举例就像你存在银行的钱,存的越久,你去取钱的时候,你的客户优先级就越高。就是说你额度非常大,你是VIP客户,交易数量也是非常大的,那么你的优先级就非常高,如果你的钱存的时间非常长,那么优先级也非常高。

    什么会影响交易的优先级呢,就是交易的SIZE的大小。为什么交易会有SIZE呢,之前说过交易有输入,有N个输入,有M个输出,这个基本上没有什么上限,但是去看那个代码,M不能大于1024,或是2048,这是打个比方,这肯定是有上限的,但这个上限不会是几十个或一百个,可能会非常大,如果一笔交易包含了一百个输入,二百个输出,你的这个交易就会比别人的交易一个输入两个输出会大出很多。比如去银行转账,把这个卡里的钱和另外的几个银行卡里的钱凑成一个数转给赵、钱、孙、李等多人,就会被认为你这个交易处理起来会非常慢,你的优先级就被放低了。

    比特币交易优先级这样的设计,当初钟本聪可能是为了防止“粉尘攻击”,粉尘就是碎末,可以这样理解,比如你开了一间饭馆,你的竞争者也开了一个饭馆,某一天一开门就来一大帮人进来占着座位,就点一杯茶就这样坐着,别的客人来说可以拼桌吗,他说不可以,就是很多小额的交易占据着你所有的营业时间和营业场所,使你的大额交易和一些正常的交易无法进行。

    就是在比特币里交易额度非常小,比如输入是非常小的就0.001个比特币,输出也非常小,0.0001个比特币甚至更小,然后M非常大,N也非常大,一个交易占据了整整一个区块,打个比方,比如,有的黑客非常极端他非常推崇以太坊,然后就去攻击比特币,就用这样额度非常小的粉尘攻击,因此比特币设计这个交易额度会增加优先级,这个额度设计非常小的话就某种程度可以防止粉尘攻击,包括UTXO的深度,如果深度非常浅,比如刚产生的交易,这个优先级就比较低。这个交易优先级的设计就是为了防止竞争者的攻击。

    把交易打包进区块后,区块的身体就做成了,身体就包含了所有的交易,接着还需要创建区块的头部,区块头部的数据结构如图:

    1.版本号

    2.父区块的哈希:

    哈希函数就是把任意的一头猪变成等长的香肠,哈希值可以理解为被哈希内容的指纹,它可以唯一的确定这个哈希所一一对应的标的物,这样可以通过哈希值来回溯到父区块,从区块的数据结构能看出区块的身体只包含交易,没有下一个区块的任何信息,区块的头部只有父区块哈希值没有子区块和自身的哈希值,通过父区块的哈希值可以创建一条链,从最后一个区块一直回溯到创世区块。在区块链里可能每一个区块可能不止一个子区块,它可能会产生临时的分叉,比如两个人同时在竞争挖矿,然后同时把矿挖到了,然后同时向全网广播,这样共同的父区块就产生了两个子区块,就形成了两条链,这两条链会互相竞争看谁长得更长,一旦发现哪个链更长,很多算力就会转到更长的链上去挖矿。父区块哈希的好处是,如果父区块的哈希值有变化会使子区块中的父区块哈希字段变化,如果有人攻击父区块的数据,如果某一个字节改了之后整个哈希值就完全不同,所以要篡改区块的话,只对一个区块攻击没用,得对后续的所有区块重新计算NONCE值,所以几乎是不可能的。父区块哈希的作用是可以回溯,还可以防止篡改。

    父区块的哈希值是矿工或矿池在创建区块的时候先计算最新区块的哈希值然后放在区块的头部,只计算一次

    3.MERKLE树根是一种数据结构,便于查找数据

    4.时间戳记录区块生成的时间

    5.NONCE难度值

    相关文章

      网友评论

          本文标题:区块的生成和链接(一)

          本文链接:https://www.haomeiwen.com/subject/wbexuxtx.html