主页 > imtoken钱包激活 > 比特币基本概念介绍2

比特币基本概念介绍2

imtoken钱包激活 2023-09-23 05:10:19

区块链结构 1. 实验介绍 1.1 实验知识点 1.2 实验环境 2. 哈希指针

此处输入图片的描述

首先,我们需要引入一个概念,叫做哈希指针。 一般来说,一个普通的指针就可以告诉你数据存放在哪里。 哈希指针除了可以告诉你数据存储在哪里,还可以告诉你对应的数据是否被篡改过,因为它也存储了对应数据的哈希值。

3. 区块链

此处输入图片的描述

区块链实际上是一个用哈希指针代替普通指针的链表,所以每个区块不仅包含前一个区块的地址,还包含前一个区块的哈希值。

我们来看一下python实现的区块链简化版:

import hashlib as hasherclass Block:def __init__(self, index, timestamp, data, previous_block , previous_hash):self.index = indexself.timestamp = timestampself.data = dataself.previous_block = previous_blockself.previous_hash = previous_hashself.hash = self.hash_block()def hash_block(self):sha = hasher.sha256()sha.update(str(self.index) + str(self.timestamp) + str(self.data) + str(self.previous_hash))return sha.hexdigest()import datetime as datedef create_genesis_block():# Manually construct a block with# index zero and arbitrary previous hashreturn Block(0, date.datetime.now(), "Genesis Block", None , "0")def next_block(last_block):this_index = last_block.index + 1this_timestamp = date.datetime.now()this_data = "Hey! I'm block " + str(this_index)this_hash = last_block.hashreturn Block(this_index, this_timestamp, this_data , last_block, this_hash)# Create the blockchain and add the genesis block
blockchain = [create_genesis_block()]
previous_block = blockchain[0]# How many blocks should we add to the chain
# after the genesis block
num_of_blocks_to_add = 10# Add blocks to the chain
for i in range(0, num_of_blocks_to_add):block_to_add = next_block(previous_block)blockchain.append(block_to_add)previous_block = block_to_add# Tell everyone about it!print "Block #{} has been added to the blockchain!".format(block_to_add.index)print "Hash: {}\n".format(block_to_add.hash)

此处输入图片的描述

在区块链中,如果我们假设一个区块已被篡改:

此处输入图片的描述

那么如果我们对这个块中的数据进行哈希值计算,就会与下一个块中存储的哈希值不匹配,就会出现验证问题。 所以要想掩盖这个问题,就必须改变下一个区块的哈希值,直到最新的区块。 有一个特殊的哈希指针指向最近的块。 由于这个哈希指针不能被黑客篡改,黑客就没有办法通过篡改区块来攻击区块链。

4.默克尔树

事实上比特币相关知识,所有带指针的数据结构都可以用散列指针代替普通指针。 比如我们可以把二叉树的指针换成哈希指针比特币相关知识,就可以得到默克尔树。

Merkle树底部的叶子是我们的交易数据,每个父节点是两个子节点的哈希值之和的哈希值。

此处输入图片的描述

我们可以通过简化版的python程序看一下Merkle树

from hashlib import sha256 as shadef chunks(l, n):"""Yield successive n-sized chunks from l."""for i in range(0, len(l), n):yield l[i:i + n]def m_tree(transactions):"""Takes an array of transactions and computes a Merkle root"""sub_t = []for i in chunks(transactions,2):if len(i) == 2:hash = sha(str(i[0]+i[1])).hexdigest()else:hash = sha(str(i[0]+i[0])).hexdigest()sub_t.append(hash)print sub_tif len(sub_t) == 1:return sub_t[0]else:return m_tree(sub_t)m_tree(['a' , 'b' , 'c' , 'd' , 'e'])

此处输入图片的描述

树状数据结构为我们快速验证交易是否存在提供了便利。 在比特币中,我们为每笔交易存储一条 Merkle 路径。 比如我们要验证交易K,只需要存储蓝色的根节点,通过颜色的哈希值重构根节点即可验证交易是否存在。 不需要整棵树的数据,大大节省了空间和时间,Merkle树在比特币的SPV轻钱包认证中起到了非常重要的作用。

此处输入图片的描述

5. 区块链结构

最后,我们可以看看交易在真实的比特币系统中是如何存储的。

此处输入图片的描述

从上图我们可以看出,在真实的比特币系统中,外层是区块链,每个区块使用一棵默克尔树来存储交易。 外层区块链保证了结构简单,为后面介绍的挖矿和共识奠定了基础,而Merkle树则为快速验证交易提供了基础。

读者可以尝试编写一些代码,结合区块链和默克尔树的知识,搭建一个比特币系统的区块链结构原型。

总结

在本节中,我们通过学习哈希指针、区块链和默克尔树,对区块链相关的重要数据结构有一个基本的了解。 在下一节中,我们将介绍比特币系统。 挖矿和共识机制。