V0W's Blog

区块链基础与安全初探

字数统计: 5,093阅读时长: 17 min
2018/09/18 Share

前言

DDCTF出过一道关于区块链的题目,并且近年来也是非常的火,但是一直没有用心研究过,之前表哥们开课了解到一些概念,最近又看了些书,算是有个大概的了解,于是写下这篇总结。

但是区块链和比特币博大精深,更多内容还需要更多的学习和研究。由于本人实在很菜,对区块链了解实在甚少,如果路过的大佬发现本文如果有所谬误,还请通过右侧的DaoVoice或者关于页面的联系方式联系我进行修改。

起源

区块链的概念首次在2008年末由中本聪(Satoshi Nakamoto)发表在比特币论坛中的论文《Bitcoin: A Peer-to-Peer Electronic Cash System》提出。 论文中区块链技术是构建比特币数据结构与交易信息加密传输的基础技术,该技术实现了比特币的挖矿与交易。

区块链是一种支持比特币运行的底层技术。 2009年1月3日,中本聪在位于芬兰赫尔辛基的一个小型服务器上挖出了比特币的第一个区块——创世区块(Genesis Block),并获得了首批“挖矿”奖励——50个比特币。

基本概念

区块链定义

区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。
区块链(Blockchain)是比特币的一个重要概念,它本质上是一个去中介化的数据库,同时作为比特币的底层技术。区块链是一串使用密码学方法相关联产生的数据块,每一个数据块中包含了一次比特币网络交易的信息,用于验证其信息的有效性(防伪)和生成下一个区块。

——来自百度百科

  • 去中心化

    以往的电子交易方式是以银行为中心的,客户为边缘节点,无论转账还是消费,都是先把钱给银行。银行记账,之后电子转账给其他节点。但是区块链没有这样一个中心,都直接是区块链用户给用户,P2P形式。

  • 分布式: 每个人都可以架设服务器成为区块链的一个节点

  • 数据库: 区块链是存储数据的

基本特征

  • 区块链是一种去中心化分布式数据库。
  • 开放性

    系统是开放的,除了交易各方的私有信息被加密外,区块链的数据对所有人公开,任何人都可以通过公开的接口查询区块链数据和开发相关应用,因此整个系统信息高度透明。

  • 自治性

    区块链采用基于协商一致的规范和协议(比如一套公开透明的算法)使得整个系统中的所有节点能够在去信任的环境自由安全的交换数据,使得对“人”的信任改成了对机器的信任,任何人为的干预不起作用。

  • 不可篡改

    一旦信息经过验证并添加至区块链,就会永久的存储起来,除非能够同时控制住系统中超过51%的节点,否则单个节点上对数据库的修改是无效的,因此区块链的数据稳定性和可靠性极高。

  • 匿名性

    由于节点之间的交换遵循固定的算法,其数据交互是无需信任的(区块链中的程序规则会自行判断活动是否有效),因此交易对手无须通过公开身份的方式让对方自己产生信任,对信用的累积非常有帮助。

区块链的结构

比特币是目前区块链技术最广泛的应用,可以通过比特币作为实例了解区块链的结构。 但比特币并不是区块链,区块链是一种技术、平台。比特币只是区块链的一个应用。

区块链是由许多区块组成的链,每个区块由区块头和数据组成。

区块头里有32字节的父区块哈希值,父区块的哈希值由区块头各个字段的值连在一起经哈希函数(sha256)运算后得到的哈希值,这样区块便链接在一起。 如果某一区块发生改变,那么之后的区块都必须改变,当区块足够多时,计算量是非常大的。在100个区块以后,区块链已经足够稳定。几千个区块(一个月)后的区块 链将变成确定的历史,永远不会改变。这也保证的区块链的安全性。

比特币没有中心机构,几乎所有的完整节点都有一份公共总帐的备份,这份总帐可以被视为认证过的记录。区块链并不是由一个中心机构创造的,它 是由比特币网络中的所有节点各自独立竞争完成的。

结构图:

mark

区块头结构:

mark

挖矿与比特币

想要生产下一个区块,必须计算出当前最新区块的区块头的哈希值。计算哈希值的过程便是挖矿。
但计算出的哈希值要小于目标值,即target。
target=targetmax/difficulty
其中targetmax=0x00000000FFFF0000000000000000000000000000000000000000000000000000
difficulty即区块头中的难度目标,difficulty动态变化,控制难度,使一个新区块的产生周期为10mins
矿工通过遍历Nonce的值,来寻找合适的哈希值。所以也说挖矿掺杂运气成分。
Nonce一共32位,所以最大计算次数可以到21.47亿。

每个区块中的第一个交易是特殊的: 它为第一个采到有效区块的人创建新的比特币。

开始时为2009年1月每个区块奖励50个比特币,然后到2012年11月减 半为每个区块奖励25个比特币。之后将在2016年的某个时刻再次减半为每个新区块奖励12.5个比特币。基于这个公 式,比特币挖矿奖励以指数方式递减,直到2140年。届时所有的比特币(20,999,999,980)全部发行完毕。换句话说 在2140年之后,不会再有新的比特币产生。
每笔交易都可能包含一笔交易费,在2140年之后,所有的矿工收益都将由交易费构成。

挖矿主要方式是矿池挖矿,独立挖矿的风险过于庞大,几乎不可能。通过工作量证明(Nonce)分配收成。

共识——最长链的选择

如果两个矿工同时算出哈希值,由于距离远近,不同的矿工看到这两个区块是有先后顺序的。通常情况下,矿工们会把自己先看到的区块复制过来,然后接着在这个区块开始新的挖矿工作。于是就出现了两个区块链:

mark

但由于算力不同,最终会有一条区块链比较长,当矿工发现全网有一条更长的链时,他就会抛弃他当前的链,把新的更长的链全部复制回来,在这条链的基础上继续挖矿。所有矿工都这样操作,这条链就成为了主链,分叉出来被抛弃掉的链就消失了。

mark

这一点是基于共识的。

交易流程

小明和小红每人有一个比特币的地址(公钥:相当于是我们银行卡的卡号 )和一个私钥(相当于银行卡密码或者说你的签名),像这个样子:

1JQMpgRThCJjKbs7P8Ht6x142zjPJFmZVY

我们需要填写转账的金额和对方的比特币地址,就像我们平时用银行卡转账一样的操作,一段时间后,对方即可收到你的转账金额。

这是作为用户能感知到的,看上去和我们平时的转账交易没什么不同,只是“卡号”看起来奇怪了一点,交易时间变长了一点。

那么当你按下“转账”按钮时,背后的区块链系统到底发生了什么?

  1. 使用私钥对这笔即将发生的交易进行签名
  2. 从你的客户端把你的这笔交易提交到区块链网络
  3. 由已经开启“挖矿”程序的计算机(称为矿机)把10分钟内的交易打包成一个数据块(相当于一个账本,其中就包含了小明的这笔交易)
  4. 这个数据块就是上图中的“区块主体”,而此时,这些区块主体中的交易并未生效。
  5. 那么如何使这些交易生效呢?每个区块中都有一个哈希值,通过不断哈希运算,不断哈希运算(可能是几亿次)最终找到一个比当前哈希小的值,就认为这个区块被确认。即为交易生效,这个过程就称为“挖矿”。
  6. 那谁来做这个哈希呢?全球那么多交易,如果只是一家公司的几台计算机是远远不够的。所以,比特币有“激励机制”,当一台计算机确认了一个区块,就可以奖励12.5个比特币。为了得到Money,越来越多矿工就有动力造更大更多算力的矿机来“挖矿 ”。越多的人参与挖矿的竞争,算力就越分散,比特币系统就越不可能被某一个人控制。这就形成了“双赢”的局面,对于矿工来说,想想你每天游山玩水,有一台机器每天帮你赚钱,源源不断地打到你的账户#滑稽脸。对于创造比特币的人来说,几乎不花钱一分钱就能常年安全稳定地运行一套这么牛X的系统,一样可以去游山玩水而不用担心系统的维护。

mark

区跨链攻击方式

  • %51攻击
  • 双重花费攻击
  • 自私采矿攻击:挖到新块先不广播
  • 算力伪造攻击:利用算法漏洞虚报算力,得到超额奖励分配
  • 扣块攻击:私吞新区块
  • 日蚀攻击

这里我也只是参考别人的答案,更多内容待学习和补充。

%51 攻击

想实施%51攻击的前提条件是掌握足够多的算力,想让攻击一定成功,则需要至少51%的算力。

我们可以利用超高算力做很多事情,因为比特币是始终以最长链为主链的,抛弃非最长链。所以只要我们能掌握足够多的算力,就可以在最短的时间伪造区块,比其他人都快,从而最先确认,而将愿友谊真实的区块给挤掉。

攻击过程举例

  1. 卖掉你的比特币
    首先将你的比特币全部卖掉,举个例子,你拥有100个比特币,全部卖掉,同时提现,将钱全部放入自己的银行卡里,假设这笔交易发生在Block5中。

  2. 开始攻击
    攻击的过程,其实就是伪造更长的区块链,从而将正确的区块“挤”出去,毕竟区块链是谁长听谁的。
    这个时候使用你掌握的大量算力,开始从block4计算,并且忽略到自己的所有交易,重新构造后面的所有区块,利用算力优势和全网赛跑(掌握了51%的算力,你说跑步跑得过?你就说怕不怕?),很快产生N个区块,而全网产生的正常区块长度为M,当N>M的时候,就会丢弃正常的区块。

  3. 攻击完成
    在后面所有的区块中,都没有你的交易记录,那么你的比特币其实还在block4之前的区块链中记录着,也就是说,你的比特币相当于没有花出去,而你的银行卡里,已经有了100个比特币的钱。

事实上,对于比特币这样全球无数矿池的电子货币来说,想掌握51%的算力实在是太难了,几乎是不可能的,除非一大半矿池都不想干了,不想在用这个比特世界体系。

但是,对于一些山寨币的51%攻击其实不难,因为山寨币的使用和挖矿人数较少,甚至可能两三个矿池联手就可以做到。这也是比特币比其他山寨币安全的原因。

双重花费攻击

双花攻击其实更像是51%攻击的具体实例。

双花攻击 即一笔钱花了多次。

区块链网络实现的就是价值传输,那么它首先解决的问题就是双花问题,在区块链网络中是不可能出现双花现象。

双花发生的情况举例:

一种情况你用1个比特币进行了一次交易,在这笔交易还未被确认完成,继续进行第二次花费,通俗理解就是1个比特币被花费两次,需要在同一个区块中被验证通过。

二种情况第一次交易被验证通过被记录入区块后,在该网络中有更高的算力验证出新的更长链条(分叉),在该链条中这个比特币被第二次花费,由于第二次花费的区块链条更长使第一次交易区块所在链条为无效链条导致的双花问题,即51%算力攻击问题。

以上这两种情况就目前科技来说基本是不可能做到的,除非网络中51%算力都是作弊的算力

算力伪造攻击

顾名思义,就是利用某些漏洞,虚报自己的算力,从而获得额外收益。其实,这个并不是针对比特币的攻击方式,而是测算算力的算法等的漏洞。

扣块攻击

扣块攻击指的是扣押你在矿池挖出的区块。

扣块攻击主要有两种。

第一种,大家都知道的芬妮攻击,目标是双花发生时所获得的财富收益。

第二种目标是对矿池造成的财产损失。一个矿工在找到区块后,可以通过保留经过验证的哈希,并且不进行广播。矿工的成本是微不足道的(拿不到本可分摊的区块奖励),但矿池的损失很大,因为整个矿池失去了获得50BTC(现在是12.5BTC)区块奖作为对矿工劳动补偿的机会。

扣块攻击最简单的形式是把它叫做芬妮攻击,是由HalFinney命名的,他也是描扣块攻击的第一人。这种攻击是一种双花攻击的变化,与0确认交易相关。

攻击者生成一个有效的块但是不会广播这个块,但是会广播交易A,交易A是指购买一个物件或者服务。商家会看到没有任何冲突的交易A并接受0确认交易。之后攻击者会广播已生成的有效块和与交易A有冲突的交易B,这时比特币网络会接受有效块并使交易A无效。

攻击的代价是非常大的,因为在攻击者生成块和完成交易A之间存在时间间隙,在此期间网络上的其他人也可以生成有效块并广播它,从而使攻击者生成的有效块变的无效。因此,只有在成功购买到商品后并且立即释放扣押的区块时,这个攻击才是有效的。比如说,购买的是软件产品的秘钥。

这种攻击的一般形式,SatoshiNakamoto在《白皮书》的第11章有提到。理论上,攻击者可以预先生成任一数量的区块,例如,商家在释放产品前需要一次确认,攻击者将在网络前预先生成两个块,并且使用双倍手续费去广播它。但是每个区块的成本呈指数上升,而且在发布购买前需要接受6次确认的验证使这种攻击只有在攻击者接近网络哈希率50%或者更高的情况下有可能发生。

日食攻击

日食攻击是通过其他节点实施的网络层面攻击,这种攻击目的是阻止最新的区块信息进入到被攻击的节点,从而隔离节点。

其攻击手段为:囤积和霸占受害者的点对点连接时隙(slot,类似时间间隔的意思),将该节点保留在一个隔离的网络中,达到隔离节点的目的。

目前的比特币网络和以太坊网络已经被证实均受日食攻击影响。

  1. 针对比特币网络的日食攻击:

    攻击者可以控制足够数量的IP地址来垄断所有受害节点之间的有效连接。 然后攻击者可以征用受害者的挖掘能力,并用它来攻击区块链的一致性算法或用于“重复支付和私自挖矿”

  2. 针对以太坊的日食攻击:

    攻击者可以垄断受害节点所有的输入和输出连接,从而将受害节点与网络中其他正常节点隔离开来。 然后攻击者日食攻击可以诱骗受害者查看不正确的以太网交易细节,诱骗卖家在交易其实还没有完成的情况下将物品交给给攻击者。

    日食攻击还可以攻击以太坊合约,方法就是让受害节点无法看清楚区块链信息,从而延迟节点看清楚智能合约的内部计算可能用到的各个参数,导致不正确的智能合约输出,因而攻击者可以大捞一笔。

    在论文中,研究者仅用2台主机就成功的发起了日食攻击,且每台主机只有一个IP地址。这说明以太坊更容易被日食攻击影响。

Q&A

  1. 比特币会分配完,那么之后的收益来源?没有收益来源还会有人记账吗?

    分配完之后,收益来源基本来源于每笔交易的手续费。由于一个区块可能有多笔交易,这样算来,其手续费也是相当可观的。

    另外,这个手续费的多少是由这次交易的数据量决定的而不是由交易金额决定(虽说交易金额的多少也占字节,但是差别很少)。

  2. merkle根有什么作用?

    merkle根:区块中每一笔交易对应一个哈希,呈树装结构,生成的最终值(根),代表了改区块中的交易。

  3. 6次确认是什么,为什么需要?

    因为每个节点最先收到的广播并不一定相同,一个节点可能收到2个节点,然后这个节点需要作出痛苦的决策,到底用哪个数据作为新节点。于是他不想做这个决策,他想,哪条链后面的节点先算出来,我就用哪条链,然而下一次有可能又有相同的问题。因此,一次交易必须经过六次这样的纠结,才能基本确定一条主链,而将其他的丢弃掉。

参考链接&文档

CATALOG
  1. 前言
  2. 起源
  3. 基本概念
    1. 区块链定义
    2. 基本特征
    3. 区块链的结构
  4. 挖矿与比特币
  5. 共识——最长链的选择
  6. 交易流程
  7. 区跨链攻击方式
    1. %51 攻击
    2. 双重花费攻击
    3. 算力伪造攻击
    4. 扣块攻击
    5. 日食攻击
  8. Q&A
  9. 参考链接&文档