IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 区块链 -> 区块链安全初探(一):比特币概述 -> 正文阅读

[区块链]区块链安全初探(一):比特币概述

最近做了一些区块链安全的相关研究,发现虽然这个概念非常火,但是真正想了解却不容易。区块链技术从最初的 比特币(Bitcoin)发展至今,各种用途、各种概念的加入,使得它变成了一个高度灵活的体系。也正是因为技术的蓬勃发展,使得区块链在除了电子货币的领域也得到了应用。

区块链这个世界的起源,从中本聪的那篇论文《 Bitcoin: A peer-to-peer electronic cash system》[1]开始。他提出了一种不依赖第三方的、在P2P网络上运行的现金交易系统,可以完成转账并防止双重支付(Double-spanding,也称为双花)。因此,区块链技术的本源是一个分布式账本

区块链、比特币,到底是什么关系?

在谈论具体技术之前,需要先搞清楚基本概念:比特币是什么,而区块链又是什么?如果不说明这两者的关系,后文中的很多概念都会混淆。

比特币

在2008年,中本聪第一次提出了 ”点对点电子货币系统“ 的概念,并命名为 ”比特币(Bitcoin)“。在他的论文[1]中,阐述了他构建这个系统的基础:区块(Block)用于记录一定的交易,每个区块之间通过哈希值连接起来(有点像链表的结构,当前区块记录上一个区块的哈希值),这样就形成了链(Chain)的关系。

实际上,在中本聪的论文中,全篇都没有提及区块链(Blockchain)这个词汇,只是分别说了区块(Block)和链(Chain)的概念。

区块链

比特币概念的提出似乎更倾向于一个概念,因为在2009年中本聪本人挖出第一笔奖励的时候,也无法预估使用人数、未来的使用场景。在对一个区块的大小进行定义的时候,由于当时使用人数很少,且设置较大可能会更容易引发垃圾交易(SPAM Tx)[2],中本聪给出了1MB大小这一数字。而一笔交易所占用的大小约为200-300Bytes,有些交易可能会更大。因此,比特币的交易性能较差(约每秒7笔)。

由于区块链是公有链,因此区块信息很容易查询和验证。比如可以访问Bitcoin Explorer来查看比特币链的信息:

image-20210701103645755

图1. Blockchain.com 区块查询页面

可以看到这个区块包含的交易数是4246个,大小1424327B,平均一个交易的大小是约335B。

显然,这个交易速度实在太缓慢,此外比特币链的功能也较为单一,只能记录交易信息。因此,在比特币火了之后,各种各样的”魔改“版本出现,解决了各自的需求。比如有些提高了交易的效率,有些支持智能合约,能运行复杂逻辑(以太坊等),有些针对业务场景进行了优化(瑞波币)。

这些不同的”分布式数字货币系统“的原理类似,只是在一些具体技术上进行了一些改进和妥协,不能被称之为”比特币“。因此,根据这类技术的共同特点,称之为”区块链“技术。

Bitcoin是如何运行的

[3]中指出,区块链就是一个安全的分布式数据库,保存交易记录。“A blockchain functionally serves as a distributed and secure database of transaction logs”。在这样一个系统中,需要解决以下问题:

  1. 在一个分布式网络中,没有中心节点给出“权威”数据,怎么保证大家记账的内容都一样呢?
  2. 在分布式环境中,如何证明 “A向B转账1BTC“ 这条交易记录确实是A发出的,而不是其他人伪造的呢?
  3. 怎么保证A不会将一笔钱同时转给两个收款方?(比如A账户余额只有1个BTC,他向一部分人宣布给B转账1BTC的同时,和另一些人说这1BTC是转给C的)

因此,Bitcoin中设计了一些机制,来解决上述问题,但是方案在实现的时候可能就无法按照想象那么美好,实际运行中Bitcoin以及其他区块链还是出过很多安全事故。下面以Bitcoin为例,简要说说区块链技术,在理论层面如何保障分布式环境交易安全的。

问题的答案

上面列出的三个问题,是我个人认为在Bitcoin中比较重要的理论基础,也是我认为中本聪这套机制特别巧妙的地方。当然,在他的原论文中讨论的问题也不止这三个,但这里先回答这三个问题,其他方面的机制后面再慢慢覆盖,先对Bitcoin有个直观的认识。

  1. 在一个分布式网络中,没有中心节点给出“权威”数据,怎么保证大家记账的内容都一样呢?

    (通过Bitcoin的 共识机制网络通信准则

  2. 在分布式环境中,如何证明 “A向B转账1BTC“ 这条交易记录确实是A发出的,而不是其他人伪造的呢?

    (交易记录中的 公钥签名 机制)

  3. 怎么保证A不会将一笔钱同时转给两个收款方?(比如A账户余额只有1个BTC,他向一部分人宣布给B转账1BTC的同时,和另一些人说这1BTC是转给C的)

    (需要全部的参与方共同验证,即大部分的节点是诚实的、少数服从多数)

下面逐一进行说明。

如何达成共识

共识机制是区块链中的一个非常重要的技术,任何声称自己是”区块链“的技术都绕不开共识。Bitcoin采用了 Proof-of-Work 的方式来进行共识。

Proof-of-Work(PoW),即工作量证明,是通过增加成本来限制攻击者攻击的方法。Bitcoin是一个开放的系统,任意节点都可以通过部署客户端加入到这个系统中。参与PoW的节点称为”矿工“节点,这与现实中付出劳动”挖矿“并获取工资的行为非常类似。

Bitcoin的区块简单来说就是包含一系列交易的一个数据段。其中,除了交易信息Tx,还有上一个区块的哈希值Prev Hash,以及一个可变字段Nonce

image-20210701110728530

图2. 区块示意图[1]

矿工们需要做的就是,根据系统给定的”难度“(即计算出的目标哈希前面有多少0,具体形态可以参见图1),尝试改变Nonce字段的内容,使得计算的结果满足难度要求。

一旦发现满足要求的随机数,发现这个数字的矿工就向全网广播这个区块,其他矿工验证通过后,就将这个块记录下来,作为得到认可的交易数据。然后将这个区块的哈希值放到下一个块中,继续计算。

挖矿原理”一文中有更简洁的解释。

为什么矿工要按规则挖矿?

一个矿工节点,在找到正确的Nonce之后是有比特币奖励的。

这个奖励会写在当前的区块中。如果矿工不按照规则去进行,那么他计算出的区块不被其他人认可,自然也无法得到这笔奖励。因此矿工必须遵守规则,按照上述规则生成区块,得到其他节点的认可,从而获取奖励。

PoW是如何保证共识的?

由于寻找符合要求的Nonce非常复杂,但验证很简单,且区块中的交易被改动的话,整个区块的哈希会变化,因此一旦找到了Nonce就能防止区块被篡改。

同时,挖矿是有收益的,这个收益的来源是基于遵守规则的情况下。遵守规则,就有可能在挖矿中获取比特币奖励的正向激励;不遵守规则,虽然没有惩罚措施,但是发出的区块不会被其他节点记录,对整个系统几乎没有什么影响。

这种方式真的安全吗?

Bitcoin使用的PoW共识需要大部分节点的诚实。作为一个分布式、没有可信第三方的场景,只能通过少数服从多数的原则来保障多数人的利益。

随着Bitcoin规模的不断增加,应该会越来越安全。由于寻找Nonce是一个概率问题,因此掌握算力的比例占全网总算力的比例越高,算出下一个区块的概率越大。但只要不是区块的产出一直控制在一个矿工手里,那相对来说就是安全的。

具体的内容会在共识机制的部分详细的讨论。

如何证明转账信息不是伪造的?

这里使用了公钥和签名来完成。

image-20210701150952873

图3. 交易(Transaction)示意图[1]

通过在交易里包含转账人的公钥,以及对交易信息+公钥进行签名,即可保证这条信息是由转账者本人发起的。

当然,前提条件是,私钥是保存完善的。一旦私钥泄露,那么你的账户余额就不保咯。

如何防止双花(Double Spending)?

首先,在Bitcoin体系中,是没有传统的账户概念。因为区块链不断延长,不可能每次转账要检查账户余额的时候,都从链头检索一遍。

首先,区块链引入“未花费交易输出(UTXO)”的概念,可以追溯某一笔交易的“前世今生”。“UTXO模型”一文有比较清晰的阐述。

其次,在确定转账余额充足后,矿工节点会检查待生成区块中的全部交易,是否有问题。就包括同一笔金额是否被转给两个收款方。如果遇到问题,矿工节点一般会删除这个交易,以保证一笔钱只转给一个收款方。

如果有人作恶

有两种情况:

  1. 矿工节点作恶:在生成区块时,不按照规定删除冲突的交易,而是正常生成
  2. 交易者作恶:交易者有选择的给不同的矿工节点发送交易,尝试让他们同时生成两个各自含有冲突交易的区块

对于情况1:

? 其他矿工节点接收到挖出的新区块时,会检查其内容。如果发现有问题将拒绝接收。

对于情况2:

? 首先,两个节点同时生成区块太难了。即使有这种情况,其他节点会选择其中的一个,在上面继续延伸。选择的机制在分叉的处理部分会提及。

总结

比特币的出现,解决了分布式环境下,没有可信第三方的场景中的交易问题,但有其局限性。为了扩展其使用场景,出现了各种各样的“币”,以及其他形式。借用中本聪文章里对于Bitcoin的描述,成为“区块链”。

Bitcoin通过PoW的共识方式保证所有矿工节点记账都是一致的,即使有人作恶,也会因为少数服从多数的策略而失败;通过签名和公钥的方式来进行身份的验证;矿工节点记录区块和生成区块的时候,进行验证以防止双花。

参考文献

[1] Nakamoto S. Bitcoin: A peer-to-peer electronic cash system[R]. Manubot, 2019.

[2] 佚名. 比特币扩容纷争:双链的诞生. https://zhuanlan.zhihu.com/p/30930715, 2017-11-15.

[3] Zhang R, Xue R, Liu L. Security and privacy on blockchain[J]. ACM Computing Surveys (CSUR), 2019, 52(3): 1-34.

  区块链 最新文章
盘点具备盈利潜力的几大加密板块,以及潜在
阅读笔记|让区块空间成为商品,打造Web3云
区块链1.0-比特币的数据结构
Team Finance被黑分析|黑客自建Token“瞒天
区块链≠绿色?波卡或成 Web3“生态环保”标
期货从入门到高深之手动交易系列D1课
以太坊基础---区块验证
进入以太坊合并的五个数字
经典同态加密算法Paillier解读 - 原理、实现
IPFS/Filecoin学习知识科普(四)
上一篇文章      下一篇文章      查看所有文章
加:2021-07-10 14:35:35  更:2021-07-10 14:36:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:20:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码