分叉

本文深入探讨比特币挖矿的原理,揭示挖矿者如何通过记录、打包交易记录并将其连接到区块链上获取奖励。同时,解析区块链系统中软分叉与硬分叉的区别,及其对区块链稳定性的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

那有人说我还是不放心啊,有没有方法可以杜绝被盗。那冷钱包就是一种不错的方式。具体操作方法是,下载一个钱包,然后拷贝到一台从未连过网的电脑上,在这台电脑上随机生成私钥和地址。然后把你的比特币存在这个地址当中。这台电脑永远也不要联网,黑客永远也拿不到你的私钥。关于比特币的安全,最后总结一句,私钥在手,天下任我走
---------------------

在上个文章中,我们了解了区块和区块链,在比特币系统中,大约每10分钟产生一个有效区块,各个区块中包含了本时间段内系统中发生的所有交易记录,把很多的区块连成一条链,就组成了区块链。那么到底是谁在记录,谁在打包交易记录,以及谁来将区块连接到区块链上的呢?这就是这篇文章要介绍的内容了。

 

首先,我跟大家透露一个能赚大钱的好消息,一般人我不告诉哈,那就是,在比特币系统中,任何人,只要完成了上述工作,也就是把近10分钟内的所有有效的交易记录记下来,然后打个包,我们称之为区块,然后把这个区块连到区块链上,完成这个记录、打包、挂链子这三步工作,就能得到12.5个比特币的奖励,想想看,一个比特币就值好几万人民币呢。

 

当然,上面我只是跟大家开个玩笑,这个赚钱机会是千真万确存在的,但是这个竞争也是非常激烈的,激烈到普通的电脑几乎是无法完成上述工作。有这么好的赚钱机会,大家肯定都在抢对不对。其实上面我们提到的赚钱机会,就是我们平时经常听到的,比特币挖矿,挖矿的人做的其实就是上面说的记录、打包、挂链子三步工作。

 

参加挖矿的电脑,不光要把所有有效的交易记录都挑选出来打包好,不能有任何错误,而且还得根据所有这些交易记录的情况,解答一道很难的竞赛题。当然这里有个前提是,你首先得确保记录打包的所有交易都必须是对的,有效的,你才有资格解答这道题。这道竞赛题,要想算出正确答案很难,但验证是不是答对了却很容易。更好的电脑当然就算得更快,更有可能在比赛中胜出。胜出的那个人就可以把他打包的那个包裹挂到整个账本链上。讲到这,肯定很多人跃跃欲试了,我也有电脑,我也想去挖矿。那我遗憾的告诉你,咱们普通的电脑,能解答出那道竞赛题的概率,比连中10次大乐透还低。系统能根据整个网络中电脑的计算能力,不断改变竞赛题目的难度,从而控制在大概每10分钟左右只有一个人能解出答案。所以在最开始的时候,当整个比特币网络中只有比特币发明人中本聪的时候,只有他一台电脑在解答这个题目,为了保证大概每10分钟有一次答对,竞赛题目就会很简单,然后随着第二个人、第三个人慢慢加入比特币网络,这道题目也慢慢变难。直到现在,因为参加比赛的人实在实在太多了,他们的电脑计算能力太强了,所以这道题目已经很难很难了。所以说,出名要趁早,挖矿更得趁早。

 

接下来我再讲讲,奖品是如何发放给胜出者的。比特币系统规定,任何一个参加记账单比赛的人,都可以在自己记录的账单上加入一笔特殊的交易记录,这笔交易的付款人是比特币系统,收款人则是他自己,金额呢,则是一个只能是系统规定的数字,这个数字每四年减半,比如我们现在是2018年,那这个金额就只能是12.5。那如何才能让这笔凭空产生的交易记录有效呢,那就是想办法把它挂到账本的链条,区块链上。所以,只有胜出的人才能把包裹挂到账本链的末尾。这个人打包的包裹成为新账本链的一部分,那那笔指向自己的特殊交易就成为了有效的交易了。就是这样

我们在接触区块链的时候,肯定会经常听到分叉,有时候还会听到软分叉,硬分叉。那么这些概念都是什么意思呢?分叉又是如何产生的呢?

 

一个区块链系统,不管是比特币以太币还是瑞波币系统,他们其实都是一个软件。那我们来看,在刚一开始的时候呢,所有的节点运行同样版本的软件,遵循着同样的共识协议,维护着同样的一条区块链(blockchain)。然后呢有一天,区块链软件有了新的版本,这时,有一部分节点会选择升级为新的软件版本,那,新的软件生成的区块,能不能被旧的软件认可呢?当然结果无非两种,一种是旧软件认可新区块,一种是旧软件不认可新区块。这两种情况,历史上都发生过,我们分别来看两个例子。

 

第一个例子,我们看下图:

 

这是比特币中的记录一笔交易的数字格式,称作交易的数据格式,也就是说我们用这样的一个格式,就可以明确的表示一笔交易了。

 

我们来看上面红字加粗的那个字段,原来这个地方他是没有被明确定义的,也就是没有被使用,在中本聪刚发布的比特币系统里,虽然预留了这么一个字段,但是没有使用。后来呢,在2016年,社区想在这个字段上做点手脚,把它利用起来,利这4个字节的空间呢,在比特币区块链上创造了用于支付的智能合约功能。这其实就是比特币软件的一次升级了。

那由于这种未明确定义的字段在旧版本的比特币完整节点上就不会被仔细验证,所以怎么样呢,所以选择升级软件的节点按照定义过的规则生产的新区块,仍然是可以被旧版本的节点验证通过的。

 

但这显然不是长远之计,因为这种字段就这么一个,你用了一次,哪以后就没有了。

 

我们在来看第二个例子。同样发生在2016年,以太坊软件进行了一次比较大的改动,由于改动大,所以新软件生成的区块不能通过旧软件的验证。对于这种情况,最好是大家都能选择升级新的软件。但是实际情况是,这次改动并未获得所有人的认可,有些人选择不升级软件。那最终的结局是怎么样呢?就是新版本和旧版本各自为政,各自生成各自的区块链,这样,本来同属一条的区块链,在尾端就分叉成了两条,也就是我们现在看到的ETH和ETC。

 

上面的两个例子,其实就分别是软分叉和硬分叉的例子,大概或许已经能明白了,我再总结一下:

软分叉:当系统中出现了新版本的软件(或称协议),而旧软件能接受新软件的区块,新老双方从始至终都工作在同一条链上,这称为软分叉。

硬分叉是指:当系统中出现了新版本的软件(或称协议),并且和前版本软件不能兼容,老软件节点无法接受新软件节点挖出的全部或部分区块(认为不合法),导致同时出现两条链。尽管新节点算力较大,比如99%的算力为新节点,1%的老节点依然会维护着不同的一条链,因为新节点产生的区块老节点实在是无法接受(尽管它知道网络上99%的节点都接受了),这称为硬分叉。

 

从上面的概念大家可以看出,其实,只有硬分叉才会导致区块链被分叉成两条链。所以刚开始的时候,分叉就是指硬分叉,后来才引入了软分叉这个概念,区分成我们现在经常听到的软分叉和硬分叉。

 

软分叉不要求所有节点同一时间升级,允许逐步升级,且并不影响软分叉过程中的系统稳定性和有效性;可以保证不想升级的人不去升级,这种不想升级的需求在现实生活中其实是很常见的。

软分叉的升级空间有限,因为目前的比特币交易数据结构和区块数据结构所有字段都已经详细定义好了,你想保证向前兼容,就不可能增加新的字段,否则旧节点就会拒绝你。所以软分叉的升级空间补束缚在对现有字段的重新定义。就包括软分叉就无法重新定义区块数据结构里的“区块大小”这个字段,也就是软分叉永远实现不了对1M区块的突破。而且这种极端复杂的兼容性稍微出点错,就会新旧节点不兼容,即导致硬分叉。这个事情已经发生过一次了。

 

硬分叉必须要求所有旧节点进行升级,否则旧节点就无法识别新节点生产的交易和区块,导致区块链分成两条链。

 

硬分叉的升级空间则要大很多,因为硬分叉只要考虑能够接受以前旧节点生产的交易和区块就可以了,硬分叉不需要考虑旧节点是否会接受新节点生产的交易和区块。那硬分叉就可以对交易数据结构和区块数据结构更大胆的修改。

 

最后,我们会看到,交易数据结构和区块数据结构中都有一个字段叫“版本号”,意义是“明确这笔交易或区块参照的规则”。这意味着原本是希望使用硬分叉来修改这些规则,就是说如果我们要修改规则,那就重新定义版本号。但软分叉在不修改“版本号”的前提下,却修改了规则。软硬分叉涉及到的问题是去中心的化的节点软件、协议、版本升级的问题。是一个非常重要且值得讨论的问题。所以如果我们有机会去开发一条区块链,或者选择投资一条区块链的时候,分叉问题就是我们需要提前考虑的一个重要问题。
 

 

### 分叉树的概念与实现 #### 一、分叉树的基本概念 分叉树是一种广义上的树形结构,其中每个节点可以拥有多个子节点。这种结构通常被称为多叉树或多路树[^3]。 在实际应用中,分叉树的具体形式可能因需求而异,比如 B 树就是一种典型的多叉平衡查找树。 分叉树的关键特征包括: - **节点数量**:每个内部节点最多可以有 \( m \) 个子节点。 - **关键字分布**:节点内的关键字按照一定顺序排列。 - **平衡性**:整棵树保持高度平衡,所有叶节点位于相同层次。 --- #### 二、分叉树的存储方式 分叉树可以通过多种方式进行存储,常见的两种方式为: 1. **数组存储** 数组适合表示固定大小的完全分叉树。假设父节点索引为 `i`,则其第 \( j \) 个子节点的位置可通过公式计算得出: ```python child_index = i * m + j + 1 ``` 2. **链式存储** 链式存储更适合动态扩展的分叉树。每个节点包含若干指向子节点的指针以及自身的数据域。例如,在 C/C++ 中定义一个多叉树节点可采用如下方式: ```c typedef struct TreeNode { int value; // 节点的数据域 struct TreeNode* children[m]; // 子节点指针数组 int num_children; // 当前拥有的子节点数 } TreeNode; ``` --- #### 三、分叉树的核心操作 以下是分叉树的一些基本操作及其伪代码实现: 1. **插入新节点** 插入操作需考虑目标位置是否有足够的空间容纳新的子节点。如果当前节点已满,则需要分裂节点或将多余的部分移动到其他分支。 ```python def insert_node(tree, parent_value, new_child_value): # 查找指定父节点并插入子节点 pass ``` 2. **删除节点** 删除某个节点时需要注意调整剩余兄弟节点的关系,并维护整个树的平衡性。 ```python def delete_node(tree, target_value): # 定位待删节点并移除关联关系 pass ``` 3. **遍历分叉树** 类似于二叉树,分叉树也可以通过递归完成先序、中序和后序遍历。但由于存在多个子节点,具体逻辑会稍显复杂。 ```python def preorder_traversal(node): if node is None: return print(node.value) for i in range(len(node.children)): preorder_traversal(node.children[i]) ``` --- #### 四、B 树作为分叉树的应用实例 B 树是一种经典的分叉树结构,广泛应用于数据库管理系统和文件系统中。以下是一个简单的 B 树节点定义及插入方法示例(Python 版本): ```python class BTreeNode: def __init__(self, leaf=False): self.keys = [] # 关键字列表 self.children = [] # 子节点列表 self.leaf = leaf # 是否为叶子节点标志 def split_child(parent, index): # 将过载的孩子节点拆分为两个较小的节点 z = BTreeNode(leaf=parent.children[index].leaf) y = parent.children[index] # 移动一半的关键字到新节点z z.keys = y.keys[t:] if not y.leaf: z.children = y.children[t:] # 更新原节点y的内容 y.keys = y.keys[:t] # 在父节点中插入中间关键字 key_to_move_up = z.keys.pop(0) parent.keys.insert(index, key_to_move_up) # 添加新节点z为父节点的一个孩子 parent.children.insert(index + 1, z) def insert_non_full(node, key): # 假设node未满的情况下执行插入 i = len(node.keys) - 1 if node.leaf: # 如果是叶子节点 node.keys.append(None) while i >= 0 and key < node.keys[i]: node.keys[i + 1] = node.keys[i] i -= 1 node.keys[i + 1] = key else: # 否则是内部节点 while i >= 0 and key < node.keys[i]: i -= 1 i += 1 if len(node.children[i].keys) == (2*t - 1): # 判断子节点是否已满 split_child(node, i) if key > node.keys[i]: i += 1 insert_non_full(node.children[i], key) ``` --- #### 五、总结 分叉树作为一种通用的树形结构,具有强大的表达能力和灵活性。无论是静态场景下的数组存储还是动态环境中的链式管理,都可以找到合适的解决方案。而在实际开发过程中,像 B 树这样的高级变种更是极大地提升了性能表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值