zoukankan      html  css  js  c++  java
  • 20199326 2019-2020-2 《网络攻防实践》综合实践

    一、论文简介

    基本信息

    论文标题:StrongChain: Transparent and Collaborative Proof-of-Work Consensus
    论文出处:The 28th USENIX Security Symposium
    论文作者:Pawel Szalachowski, Daniël Reijsbergen, and Ivan Homoliak, Singapore University of Technology and Design (SUTD); Siwei Sun, Institute of Information Engineering and DCS Center, Chinese Academy of Sciences

    概念解释

    比特币:比特币是一种采用区块链技术的电子货币,现实社会中流通的货币必须有可信任的机构为我们担保,像银行,支付宝,我们可以把钱存里面,是因为他们是可信的。以上说的这些都是一些中心化的解决方案。而比特币,则是一种去中心化的货币。它采用区块链技术。

    区块链:它是一串使用密码学方法相关联产生的数据块,每一个数据块中包含了一批次比特币网络交易的信息,用于验证其信息的有效性(防伪)和生成下一个区块。那么,比特币是怎么产生的呢,创始人中本聪(网名)设计的规则是,创建新的区块并加载到区块链中会触发新币生成,换言之,比特币是作为对维护区块链所付出劳动(即解决系统设置难题耗费的算力)的奖励。比特币创始人开发了创世区块(第一块),按我的理解啊,简单来说,中本聪对一串字符哈希了一下(具体规则不是我说的这样,我只是简单起见),生成了hash值,矿工们的任务就是找出这个对应的字符串。学过密码学的都应该知道,哈希函数是单向不可逆的。所以,矿工们只能通过穷举的方法来找这个字符串。这也是为什么叫他们矿工的原因。第一个找到的矿工会获取一定量的比特币。矿工辛辛苦苦挖出了矿,证明你有这个工作量了,奖励你点比特币,这就是工作量证明机制(PoW)--Proof of Work。比特币的数量是有限的,中本聪设计的就是2100万个币,刚开始奖励的币多一点,到了2020年,平均每10分钟只会产生12.5比特币。

    女巫攻击(sybil attack):在对等网络中,攻击者通过伪造多个身份标识,以控制网络中大部分节点来削弱冗余备份。

    区块:比特币的区块由区块头及该区块所包含的交易列表组成。区块头的大小为80字节,由4字节的版本号、32字节的上一个区块的散列值、32字节的Merkle Root Hash、4字节的时间缀(当前时间)、4字节的当前难度值、4字节的随机数组成。区块包含的交易列表则附加在区块头后面,其中的第一笔交易是coinbase交易,这是一笔为了让矿工获得奖励及手续费的特殊交易。区块大致结构如下图。

    内容简述

    论文提出,比特币挖矿存在三个容易出问题的点,首先是激励不相容原则,无数矿工拼命挖矿,但是只要有1个人挖到,其他矿工的努力就白费了,只能转向新的区块。这种原则叫做激励不相容。其次,在某些情况下,矿商暂时不发布这个区块, 而是继续挖下一区块, 当发现网络上别人也挖出新区块时再发布这个区块, 这时就会出现分叉的情况,恶意节点可采用女巫攻击来伪造多个节点身份,使其他诚实节点相信他,可以获得更高的收益。最后,比特币是不可持续的。比特币是一种通货紧缩的货币,按照协议规则,大约在2140年,将不会产生新的硬币(上限为2100万),这意味着矿工们将只能获得交易费作为收入,所以要想维持下去,必然会增加交易费的数额才可维持。
    这篇论文从以上三个问题触发,提出了透明与合作机制—StrongChain。而这个机制最核心的部分就是弱解的设计:
    1、弱解是协议的一部分。
    2、发现弱解的矿商会获得独立的奖励。
    3、矿商有动力立即宣布自己的解决方案和附加别人的方案。

    二、论文内容

    挖矿过程

    在比特币中,如果想生成一个新的区块并写入区块链,必须解出比特币网络出的工作量证明的谜题。这道题的关键的三个要素是工作量证明函数,区块和难度值。工作量证明函数是计算方法,也就是hash。区块头部是输入数据。难度值决定了这道题所需要的计算量。
    如果上一个区块刚刚被建立,所以矿工就需要开始为找到下一个区块努力奋斗了。他们需要将上一个区块的头部信息作为输入,然后不断修改上一个区块头的nonce(随机数)的值。直到他们找到一个hash值h,满足下面的条件。这里的Ts代表着强头部的hash值。

    然后新的块就被建立了,并连在了上一个区块之后。上边说的是比特币挖矿的一般步骤,接下来说一下StrongChain。Strongchain又定义了一个Tw,也就是弱头部的hash值。弱头部也需要满足一定的条件,如下图。

    当其他节点的矿工找到满足这样条件的头时,他会把这个弱头加到弱头部列表里,并且广播给其他矿工,其他矿工收到信息后就会去验证这个是不是弱头,然后其他矿工再把弱头加到弱头部列表里。接下来说一下具体的算法逻辑,下面是用到的算法,一个一个分析。
    挖矿函数
    首先是让弱头部数目归零。然后就是一个工作量证明过程,循环产生随机数nonce,然后产生块头,对块头进行hash,得到htmp,然后分别于Ts和Tw比较,如果htmp小于Ts,那说明已经找到合适的块头了,可以创建区块了,这里createBlock函数传入了3个参数,hdr表示块头,weakHdrsTmp表示找到的弱头数量,Txs表示上个区块下的所有交易信息。然后就向所有矿工广播区块;如果htmp小于Tw,那么弱头部列表就添加找到的弱头,然后向全体广播。

    弱头响应函数
    其他矿工在听到弱头广播后,就需要对这个弱头进行操作,第一个assert验证这个弱头是否满足弱头的标准,也就是上文我们提到的那个判断式,validHeader函数用来判断这个弱头的其他部分是否正确,就是检验是否符合区块头的标准。第二个assert用来判断,这个弱头是不是指向上一个区块的强头。如果以上条件均满足,则增加一个弱头。

    奖赏函数
    对于找到区块的矿工来说,它需要获得这个报酬,这个rewardBlock函数就是定义这个的。Reward函数的第一个参数是矿工地址,可以理解为矿工的id,第二个参数是奖励总额。这里的R代表全额奖励,TxFees代表交易费。
    对于找到弱头的矿工来说,也有奖励,奖励是两个参数,第一个是矿工id,第二个是wcR。这里的w的值等于γ*Ts/Tw。γ是弱头部相对影响因子。Ts/Tw代表强头与弱头的一个比值。说白了就是按照找到弱头的比例给予奖励。

    验证区块函数
    这个函数用来验证新区块,第一个assert用来判断区块头的hash是否小于强头目标值,然验证一下头。第二个assert用来判断这个区块是否连接在上个区块。第三个assert用来判断交易信息是否有误。然后下面的循环是用来判断弱头是否满足条件的。不再赘述。

    块布局

    Strongchain的块布局跟比特币的块布局其实差别不大,因为strongchain引入了弱解的概念,所以核心问题就是需要把引入的弱解这部分加到块中,同时不会增加太多原来块所占的字节。接下来说明一下Strongchain块布局包含的词条。
    PrevHash:这代表先前块头的hash值
    Target:这是一个定义新块hash困难度的一个目标值
    Nonce:这代表一个随机数
    Timestamp:代表时间戳
    TxRoot:代表所有交易信息的一个hash值
    Coinbase:代表矿工的id。
    那么问题来了,那些由弱解组成的块头放哪呢。块布局中我们提到了TxRoot,这里虽然是个hash值,但是它是块中所有交易信息的hash。Strongchain提出了绑定交易(binding transaction),而绑定交易就记录了所有弱头的hash。最后返回一个操作数OP_RETURN作为一个词条加入块中。

    说到这里,下边这个图就可以理解了,最上边是正常的区块链,而弱头部组成的区块则被隐含到了TxRoot词条里的binding transaction里。此外,为了减少弱头的大小。Strongchain把弱头里的PrevHash,Target这些重复字段给删去了,压缩了空间。

    分叉

    当区块链上出现两个版本的交易历史记录时,就会发生区块链分叉。对于分叉问题,Strongchain采用最强链原则,其主要指标是chainPoW方法计算出的PoW值,该值代表了整个链上的计算能力,从伪代码可以看到,他要计算的是所有块上的Pow的累加和,包含强头和弱头。然后拿这个值与分叉链进行比较。所以PoW值能反映不同链的综合计算能力,然后选择计算能力强的链,以此解决分叉。

    下图代表着一个解决分叉的过程图。在遇到如图所示分叉时,系统会马上决定选择Bi,因为他有更多的弱头,也就意味着Pow更强。算力更强。

    时间戳

    比特币系统中认为多数即正义,时间来自于链接的其他节点时间的中位数,要求链接的节点数量至少为5。这就在很大程度上相当于由那位幸运者决定。而由于Strongchain引入了弱解机制。所以显然,之前的设定已经不太满足需要了。需要考虑找弱解的时间戳。函数定义如下。

    从这个函数可以看出,Strongchain的时间戳是sumT与sumW的比值。sumT是把强头时间戳和弱头时间戳按一定比例相加得到的。强头固定分配1权重,弱头的w是动态调整的。可以看出,强链的时间戳加入了影响因子弱头,也就是说,弱头时间戳在一定程度上影响强头时间戳。

    三、分析验证

    效率和实用性

    这里主要是增加了额外的负载:弱头部。文章中利用了概率分布进行分析,证明了每个弱标头60个字节和每个比特币块1MB,最后负载会增加6%以上。这表明负载增加的不多。不会特别影响效率。
    奖励这一块,比特币目前发现区块的奖励假设为R。因为Strongchain引入了弱头,文中通过数学推导,证明了在控制一定参数值的情况下,强头部区块奖励和弱头部奖励几乎等于矿工的总奖励。所以跟传统比特币奖励实用性是一致的。

    奖励差异


    Tw/Ts表示弱解目标与强解目标比值,比值等于1表示比特币,随着比值的增加,更多的节点可以通过给出弱解来获得小份的奖励,这意味着奖励差异会缩小。α表示占全球挖矿能力的多少。

    链质量

    衡量区块链“质量”的一种方法是过时的块率,即在分叉过程中出现但未进入主链的块的百分比。即stale rate。

    如表中所示,强区块过时率部分StrongChain与比特币是差不多的,而弱区块过时率也是比较低的。在公平性方面,高延迟和低延迟两种情况下的确要差于比特币,但是中延迟时有一定的优势。

    安全性

    文章中主要利用实验证明了StrongChain为自私挖矿策略增加了健壮性,矿工的自私挖矿意图将会大大降低。

    四、实验复现

    作者留了个github地址,里面存放着strongchain的demo。由于众所周知的原因啊,上github下代码太慢了。我就把他导入到了我的码云库。
    https://gitee.com/funmary/strongchain-demo
    有需要的可以下载。
    环境准备
    1.一台linux系统。我用的是ubuntu
    2.python3的环境
    代码文件主要分为两部分,一部分是用python实现的代码,另一部分是log文件,用来记录块链的生成过程。
    实验步骤
    1.在第一个shell里使用tail命令打开log日志文件,用来跟踪块链的生成过程

    2.在第二个shell里使用python执行代码,这里的basenode表示一个节点,相当于矿工1了。

    3.执行代码后,查看第一个shell,会发现前几行相当于初始化操作,定义了发现块头和弱头的奖励,强头弱头的比值等等。然后由于这时候只有一个矿工在挖矿,所以会显示no peers are online。

    4.再启动一个shell,这里我们生成第2个矿工,basenode2。此时再去查看日志,你会发现他会有提示说,新矿工加入了。然后这个矿工就马上投入挖矿工作了。可以看到了挖到了许多弱解。

    5.下图表示强头被找到。他会显示这个块布局。

    五、个人感悟

    这篇论文讲的是比特币相关的。整体看下来,感觉作者的出发点是好的。零和游戏就是只有一个胜者,比特币采用这种机制挖到矿的矿工收益是高的,但是长此以往,会挫伤其他矿工的积极性,还有就是比特币是注定通货紧缩的货币,挖到最后,矿工们只能靠收取交易费度日了。这样并不利于比特币这样一个体系良性发展,而Strongchain强链的提出恰恰解决了这些问题。核心就是引入了弱解,然后奖励再分配。矿工们即使没有挖到强头,挖到弱头也是能按一定比例获取奖励的。比特币本来就是一个信任体系。没有矿工挖矿,这个体系自然就会崩溃,所以以矿工为本的理念是正确的。
    这次通读论文,收获还是挺多的。在读这篇文章之前,我对比特币了解不多。可是这里面涉及到很多相关术语,如果不懂的话读起来其实是很吃力的。我也是从百度百科查到维基百科。从CSDN查到简书,吸收了许多知识后才大致看懂了作者的意图。这其中还涉及了许多数学概念,考研过来的时间太久了,又给忘了。也得一个一个补。总之,这篇论文对我的学习和看论文的方式是有很大影响的。以后别人问我比特币是啥,我觉得我能给他讲明白了。

    六、学习总结和建议意见

    学习总结
    这学期很有幸选了王老师的课。总体学下来感觉收获还是蛮多的,破解软件,利用漏洞对主机进行攻击,对网页进行攻击等等,这门课几乎涵盖了攻防的所有方面。我觉得可以给自己弄一个“小黑客”的称号了。在学了这些知识后,让我对网络攻防世界有了更全面的认识。纸上得来终觉浅,实践一下才能让我记忆的更深刻。一学期下来,我觉得这门课更多的是“授人以鱼不如授人以渔”。老师把入门攻防的资料,书籍都交给我们了,然后通过实践检验学习成果。从升入大学后,我们的学习应该就是以自觉为主,更何况研究生了。你若主动学习,就能掌握许多知识,你若被动学习,那就基本很难学到真东西。所以,真的感谢这门课,至少学下来,感觉是掌握了一些知识的。有句话说得好,求上得中,求中得下,求下而无所得。

    建议意见
    我认为,学习是个不断加油的过程。这样才能保持学习的积极性。这学期是以诸葛建伟的书为时间线的,一周一章。可是通过一学期的学习,我感觉很明显,每一章的难度都不一样的。有时候就有一种,这一章的内容还没消化完,就得马上吃下一章的感觉了。所以建议老师这边在下学期授课的时候科学安排下每周的学习任务。此外,每周的实践,大家基本都是从上周4下午做到下周四下午(理论上),包括阅读,实践,博客等内容。我觉得实践量是够的。大家做实践肯定遇到了各种各样的问题,我建议老师上课时抽1个课时进行实践的复现和问题的答疑。其他2小时可以安排一些拓展性的小实践,就比如破解软件这种,我很喜欢。

    七、参考资料

    区块链共识算法
    百度百科比特币
    百度百科区块链
    区块链论文精读
    Pow算法解释
    维基百科比特币
    维基百科区块链

  • 相关阅读:
    Codeforces Round #344 (Div. 2) C. Report 其他
    Codeforces Round #344 (Div. 2) B. Print Check 水题
    Codeforces Round #344 (Div. 2) A. Interview 水题
    8VC Venture Cup 2016
    CDOJ 1280 772002画马尾 每周一题 div1 矩阵快速幂 中二版
    CDOJ 1280 772002画马尾 每周一题 div1 矩阵快速幂
    CDOJ 1279 班委选举 每周一题 div2 暴力
    每周算法讲堂 快速幂
    8VC Venture Cup 2016
    Educational Codeforces Round 9 F. Magic Matrix 最小生成树
  • 原文地址:https://www.cnblogs.com/funmary/p/13191904.html
Copyright © 2011-2022 走看看