⽐特币⼆之区块链中的数据结构
正在学习区块链,如果我哪⾥有错误希望⼤家指出,如果有任何想法也欢迎留⾔。这些笔记本⾝是在typora上写的,如果有显⽰不正确的敬请谅解。笔记本⾝也是给我⾃⼰写的,所以如果有侵权的请通知我,我⽴即删除。
⽂章⽬录
2.1 哈希指针
珠夫人其实就是⼀种特殊的链表⽽已。
链表中的⾸元节点就是创世区块,整个区块链中的第⼀个区块。链表中只存储前后节点指针就⾏,但是区块链还要存储前⼀个节点的哈希值,就是下图中的H(),⼀个链表节点就是⼀个区块。所以要想修改某⼀个区块,以后所有的区块全都要动。
因为哈希指针的存在,我其实只需要存储最后⼀个节点就能完成很多操作。如果我想知道倒数第⼆个节点呢?可以管其它节点要,那怎么知道其它节点给的对不对呢?⽤哈希指针算⼀下就好啦。
区块链和普通链表的区别就是⽤哈希指针代替普通指针,下⾯要讲的merkle tree也是,⽤哈希指针代替普通指针。
![avatar][pic2.1-1]
2.2 merkle tree推荐一个好的地方作文四年级
⼀根链表,只要记住头指针的哈希指针,整根链表就能验证了,因此也可以记住⼀棵树的根节点来验证整棵树。这个过程就叫merkle proof。
区块链就是区块的链表,区块中有什么呢?区块头block header和区块体block body。block header中存储了很多必要信息,例如merkle tree的根节点哈希。⽽block body中存储的就是这个块中的全部交易信息,这些信息是以merkle tree的形式存储的。下图就是⼀个区块链的例⼦。其中蓝⾊的是区块,树就是block body。tx是transaction的意思,就是交易。可知全部的交易tx都存在叶结点中,那中间节点呢?只是⼀个个哈希值。
![avatar][pic2.2-1]
2.2.1 merkle proof
区块分为两种,轻节点和全节点,这也就是block body为什么采⽤merkle tree的原因,可以减少空间复杂度。轻节点的block body中只会有这棵树的根哈希,全节点会存储整棵树。如果⼀个轻节点想知道某个交易记录,因为它⾃⼰不存,它就要向全节点要,⽽要的时候也不需要要整棵树,只需要要⼀
些哈希值就好。⽐如上⾯那张图,我想知道黄⾊的tx节点是否在这棵树中,我需要向全节点要图中的三个H(),⽽图中 H()是我求出来的哈希值。
先看第⼀步,求出黄⾊块的哈希值,如下图
接着⽤上⼀步的结果同向全节点要来的H()结合,求出其⽗节点的哈希值,如下图
以此类推,可以求出最终的节点是否正确。
2.2.2 merkle proof的复杂度
这个分为两种,⼀种是树中是否有这个节点,⼀种是树中是否没有这个节点。
前者的时间复杂度,那就是树⾼嘛,O(logN)。
后者的时间复杂度有些问题,按照中本聪的⽅法,merkle tree是没有任何顺序的,因此时间复杂度是O(N),因为⽐特币没有是否不存在这个需求。但是按照肖⽼师的说法,其实是可以提⾼的,⽐如在⽣成区块的时候,直接把merkle tree的叶节点进⾏排序,这样以后任何⼈在查的时候⽤⼆分就⾏了。⽐如可以⽤哈希值的⼤⼩排序。如果待查的交易哈希是20,⼆分到⼀个a和b(a是⼩于等于20的最⼤节点,b 是⼤于等于20的最⼩节点),轻节点取得a和b计算就⾏了。这⾥有点问题,肖⽼师举的例⼦中a和b的⽗节点是同⼀个,如果a和b的⽗节点是兄弟节点,我要不要做a和b⽗节点的merkle proof呢?我觉得需要。
2.3 区块链的结构
2.3.1 区块头 block header
苹果12怎么关机开机上⾯也说了,区块链解释⼀个链表,链表中存有所有的block header,轻节点中没有block body,哈希指针只计算整个block haerder。 bitcoin是没有问题的,但是在使⽤其它数据结构的时候,要注意,区
块链表只能是⼀条链,不能是循环链表。因为哈希指针始终要依赖于前⼀个节点的哈希,但是循环链表的“前⼀个节点”是⽆限递归的,所以永远不到。
下⾯是区块链中区块头的结构
Field Purpose Updated when…
Size (Bytes)
Version Block version number You upgrade the software and it specifies a new
version
4
hashPrevBlock256-bit hash of the previous block header A new block comes in32
hashMerkleRoot 256-bit hash based on all of the transactions in
the block
A transaction is accepted32
最新犯罪电影Time Current as seconds since 1970-01-01T00:00 UTC Every few seconds4 Bits Current in compact format The is adjusted4 Nonce32-bit number (starts at 0) A hash is tried (increments)4
nonce只有4个字节,最⼤只能是2^32次⽅,然⽽现在这个挖矿难度,遍历完nonce可能也不到满⾜挖矿要求的hash值,既然头部就这点东西,看看哪个值能改,改了之后能满⾜挖矿要求就⾏。
这个杀手不太冷静豆瓣评分Version是区块链的版本号,不能变。
hashPrevBlock是前⼀个区块的哈希值,不能变。米米拉作品集
Time是时间戳,其实可以变,不太离谱就好,因为区块链对时间的要求不是很⾼。不过有更好的
Bits是挖矿时的⽬标阈值,编码后的,不能变。
Nonce本来就要变的。
hashMerkleRoot这个是可以变的。因为每个区块的产⽣都有⼀个coinbase transaction,就是可以凭空造出⽐特币的那个交易,这个交易是可以改的。我的理解是,每个交易都要标明交易的发起⽅和接收⽅,接收⽅肯定是矿⼯,发起⽅就可以随便填。⽽这个交易⼀遍,整个根哈希值就变了,也就达到了修改block header的⽬的。实际中会使⽤coibase中的前8个字节也⽤来挖矿,总共就有2^96次⽅种情况。
2.3.2区块体中的实际交易transaction
红框左侧的output其实是之前交易的output,⽤于证明这部分钱是属于你的的UTXO,也就是0.05那个,0.049的是最终输出的,中间的Fees是矿⼯⼩费。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论