• 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算法解释
    维基百科比特币
    维基百科区块链

  • 相关阅读:
    springmvc(架构、组件、视图解析器的配置)
    springmvc(mvc、springmvc、springmvc入门程序)
    jvm类文件结构解析(访问标志、异常)
    软件工程(项目前期)
    jvm:java类文件结构(字节码文件的解析)
    Mybatis动态sql(if、where、sql、foreach、choose)
    ARM指令系统(CISC与RISC、新建工程)
    pyppeteer之流程解析
    Puppeteer简介及安装
    selenium之前进后退
  • 原文地址:https://www.cnblogs.com/funmary/p/13191904.html
Copyright © 2020-2023  润新知