# 侧链+双花问题

By [sole12343](https://paragraph.com/@sole12343) · 2022-03-09

---

**区块链以前的问题**：1、数据量过大，区块链体积过大

2、数据确认时间过慢

3、交易频率太低，目前比特币每秒能处理6.67笔交易

4、缺乏必要的制度规范和法律保护

**区块链进阶**

简单支付验证(SPV):无需维护完整区块链信息，只需要根据区块头部信息进行支付验证的技术。

![](https://storage.googleapis.com/papyrus_images/ef73c92743a345326dc81b46f759bd882dd6c82261b2fe54a30eee495b97ecf2.png)

SPV的功能扩展：SPV对节点当前的状态（账户余额，账户信息、合约状态）都无法证明。以太坊对其进行扩展，将区块头从一棵默克尔树增加到三棵默克尔树，分别是交易树、数据树、状态树。以太坊不仅可以实现SPV的支付验证，而且可以快速验证账户是否存在、了解账户余额甚至快速判断交易是否执行成功等信息，实现了良好的SPV扩展。

SPV面临的问题 ：第一个是问题是SPV节点与区块链系统去中心化程度似乎存在一定的矛盾。随着SPV节点数量的增多，那么区块链参与完整验证的节点数量就会减少。第二个问题是交易可锻性攻击。

**可锻性攻击**：一次交易请求过后，用户接收到的仅有一个交易ID，根据这个交易ID可以查看交易是否成功。当交易发送到比特币网络中后，网络中的各个节点会根据之前生成的签名来验证交易的真实性。椭圆曲线数字签名ECDSA-- 修改签名的某个字节能够使签名依然校验成功，这样伪造签名之后交易依然能够成功进行。第三方判断到两个ID不同便会确定当前交易失败，而事实上交易已经成功了。这时如果用户发现交易提示失败，可以再次发起交易，第三方交易系统一看之前交易确实失败了，那就会再进行一次交易。这时用户的比特币钱包里就会多收到一份比特币，造成了第三方交易平台资金损失。

**侧链**：侧链是相对于主链说的，侧链协议是指可以让比特币安全地从比特币主链转移到其他区块链，又可以从其他区块链安全地返回比特币主链的一种协议。

关于**侧链的一些属性**：

一个用户在一条链上的资产被转移到另一条链上后，还应该可以转移回到原先链上的同一用户名下；

资产转移应该没有对手卷款逃跑的风险；

资产的转移必须是原子操作，即要么全发生，要么不发生；

侧链之间应该有防火墙，一条链上的软件错误造成链上资产的丢失或增加不会影响另一条链上的资产丢失或增加。

**侧链协议的产生：**

1.以太坊、比特股区块链上升势头迅猛，对比特币区块链产生威胁；

2.比特币区块链有合约币、万事达币、彩色币等附生链，不受比特币核心开发组欢迎，认为降低了比特币的安全性；

3.面对以太坊众筹的成功和巨大回报，比特币核心开发团队成立BlockStream公司，拟实现商业化价值。

**侧链协议**：侧链协议的目的是实现双向锚定，使得比特币可以在主链和侧链中互转。

![](https://storage.googleapis.com/papyrus_images/9947e6a2ee58f7f257ccecb9707ff55db47756ceb1bfa714ebc31e7f6ec2419c.png)

**双向锚定的过程分4个阶段：**

发送锁定交易

比特币持有者操作，发送一个特殊交易，把比特币锁定在区块链上。

2.等待确认

等待交易被更多区块确认，可防止假冒锁定交易和拒绝服务攻击。

3.赎回交易

交易确认后，用户在侧链上创建一个交易花掉锁定交易的输出，并提供SPV工作量证明，输出到自己在侧链上的地址中去。SPV为赎回交易所在区块的工作量证明。

4.等待一个竞争期

竞争期的作用是防止双花。竞争期结束后，改赎回交易将被打包到区块中，用户可以使用自己的比特币。

**双花问题**

“双花”，即双重支付，指的是在数字货币系统中，由于数据的可复制性，使得系统可能存在同一笔数字资产因不当操作被重复使用的情况，同样一笔钱被花掉两次或多次。

比特币如何解决“双花”问题？

主要依靠未花费的交易输出（unspend transaction output, UTXO）和时间戳来解决“双花”问题。

比特币交易的基本单位是未花费的一个交易输出，简称UTXO。UTXO是不能再分割、被所有者锁住和记录区块链网络中的一定数量的比特币货币。当一个用户接收比特币时，金额被当作UTXO记录到区块链里。一个用户拥有的比特币实际上会被当作UTXO分散到数百个交易和数百个区块中。

比特币现金系统中记录着当前每一笔“未花费的交易输出”。当节点接收到一笔交易信息的时候，它需要去 UTXO 数据库里查，看看这笔交易所引用的 UTXO 是否存在，它的收款人（拥有者）是不是当前新交易的付款者。交易结束之后，系统会做相应的更新。

**总结一下**，面对“双花问题”，比特币现金系统是这样解决的：

1.首先，每笔交易都要先确认对应比特币之前的情况，要检查它是否存在于小明的UTXO中。如果不在，那么该交易会被系统拒绝。

2.如果小明用同一笔UTXO付给李雷和韩梅梅，系统中的节点只确认先接收到的那一笔。

3.当两笔时间上很接近的交易被不同节点确认，区块链将发生分叉。剩余节点选择在他们认为的最长链上构建新的区块。当其中一笔交易被6个节点确认后，它将成为系统最长链，可以认为这笔交易获得了最终的确认。

---

*Originally published on [sole12343](https://paragraph.com/@sole12343/DTSlTX4oYpRfdl2JEtq7)*
