译者 | 陈峻
审校 | 孙淑娟
不知您是否听说过女巫攻击(Sybil Attack)。其中,“Sybil”一词来自一位名叫Shirley Ardell Mason(又名Sybil Dorsett)的艺术家,她曾被诊断出患有多重人格障碍。顾名思义,此类攻击往往发生在当一个用户使用了多个虚假身份(像极了具有多重身份的女巫),去破坏或以其他方式获得对于网络的控制。近年来,有越来越多的在线假身份和分布式拒绝服务(DDoS)类型的攻击在区块链领域日益猖獗。那么,女巫攻击究竟会涉及到哪些方面,我们又该如何保护自己的数字资产呢?

作为一种在线安全威胁,女巫攻击也被称为身份或声誉攻击。它是由一个实体创建多个节点、帐户或主机,意在接管某个特定的网络。此类攻击既可能像在社交媒体平台上使用多个帐户那样简单,也可能像是入侵高安全性的网络一样危险和复杂。
不过,它更容易被运用于加密货币的场景中。也就是说,在区块链中,攻击者通过运行多个节点,来达到某些非法的目的。目前,我们常见的有两种类型的女巫攻击:
女巫攻击会从如下常见方面对区块链造成严重的破坏:
一个完备的女巫攻击总会通过生成足够多的身份,使欺诈者能够在投票中击败各个诚实的节点。这将会导致传输的失败、以及无法接收到正确的区块。
完备的女巫攻击可以为具有访问和控制能力的攻击者,提供超过半数(即51%)的总计算能力。这足以破坏区块链系统的完整性,并导致潜在的网络干扰。毕竟51%攻击足以改变交易的顺序,并通过逆转交易的方式,去支持女巫攻击者,进而阻止交易的确认。有时,这也被称为双花攻击(Double Spending,详见下文解释)。
女巫攻击可以通过多种方式被部署到区块链的场景中,其中最常见的有如下两种形式:
攻击者通过控制至少51%的网络计算能力(也称为哈希率),实现阻止、逆转或更改某些交易的顺序,以至于产生导致“双花”,甚至无法确认那些合法的交易。此处的“双花”是指:用户通过复制数字货币,并将其副本发送给多个接收者,以实现多次花费相同的资金。可见,如果不采取有效的措施防止这种行为,则可能最终导致数字货币系统的彻底崩溃。
如果系统中有足够多的假身份节点,那么它们就能以“多数获胜”的方式击败合法节点(或称为诚实节点)。就像日蚀攻击(eclipse attack)那样,如果女巫造成链网络不再传输或接收区块,那么就会直接导致其他诚实的用户被阻止参与。
许多区块链都会使用共识算法(Consensus Algorithms)作为防御攻击的一种形式。虽然该算法本身并不能从根本上防范攻击,但是它会使得攻击者的部署成本相当高昂。下面是三种最常用的共识算法:
作为防止双花攻击的最古老、且最主要的算法机制,PoW旨在使用计算能力,对区块中的数据进行哈希处理,以检查生成的哈希值是否符合某些给定的条件。如果满足的话,您将获得加密硬币,以及开采新的区块所产生的交易费用。当然,您需要为此类计算能力付出一定的代价(如:电力),其中包括多次部署失败的哈希值的尝试,这也就是所谓的“挖矿”的过程。
同时,请记住,用于维护挖矿节点网络的硬件(如,被称为ASIC的专用集成电路)往往是非常昂贵的。工作量证明于2008年被中本聪引入比特币中,并且目前仍然是所有算法中最安全且最容错的。
您也许注意到了,PoW的问题在于:用户必须通过大量计算,来证明他们的工作,进而挖到区块。而权益证明机制只需要您通过证明和使用自己所持有的代币。由于它并不依靠计算能力,而是凭借用户持有的代币,因此解决PoW的最大问题——挖矿成本。自2011年被推出以来,PoS就被认为是PoW最受青睐的替代方案之一。总的说来,在区块链领域,目前虽然仍以PoW为主(毕竟它被认为最安全、最可靠),但是PoS已是最流行的区块链网络之一。
该机制系统使用权益年龄(Staking Age)、随机化元素(Element of Randomization)和节点财富(Nodal Wealth)作为选择验证者的因素。而验证者必须将一定数量的代币资助到网络中,才能锻造区块(注意:尽管可以互换使用,但是“挖矿,Mine”常被用在PoW中,而“锻造,Forge”则是PoS的术语)。
在安全性方面,攻击者需要为了获取51%的代币,而付出高昂的代价。例如,他们可能需要进行多次失败的尝试。而这等同于巨大的付出(当然,在低市值的区块链中,可能并非如此)。可见,PoS提高了区块链的安全性。
同时,它也提高了分散性和可扩展性,即每秒交易数量的限制。目前,使用PoS的典型网络包括:Avalanche、BNB Chain/Smart Chain、以及Solana。
由Daniel Larimer于2014年推出的委托权益证明,是PoS的一种流行替代方案。由于它具有更好的可扩展性,即每秒能够处理更多的交易,因此DPoS被认为是PoS的更高效的版本。
通过使用投票系统,DPoS允许用户将他们的工作外包给各个代表(或证人),由他们代表自己维护网络的安全。利益相关者可以根据每个用户所拥有的代币数量,去投票选择代表。被选出来的代表负责确保在挖矿和验证新的区块方面达成共识。当有奖励产生时,代币会在利益相关者和他们的代表之间按比例分成。
由于是基于民主投票系统,因此该算法有效地依赖了代表的声誉,并发挥了积极的作用。如果他们的节点不能生效、或不道德地运作,那么他们就会被驱逐出所在的网络。目前,使用DPoS的典型网络示例包括:Ark和Lisk。
为了入侵系统,并导致网络活动的中断,网络攻击者往往会以女巫攻击的方式,创建虚假的身份,并使用这些身份来获取访问权限,进而控制整个网络。为了打击数据盗窃和网络系统的入侵,数字货币爱好者们需要参考上述建议,采用强大的数据安全保护措施。
原文标题:What Is a Sybil Attack and How Does It Affect Blockchain?,作者:OLUWADEMILADE AFOLABI
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i