以太坊官网蜂这个游戏中存在中心操控者吗?

  区块链就一定是去中心化的嗎?

  “去中心化”应该是区块链里出现频率最高的词了每每提及区块链,必然会说到它的一个重要特性就是去中心化而当我们评测┅个项目时,也把是否足够去中心化作为一个标准如果项目不够去中心化甚至会被判定为伪区块链项目,那么到底什么是去中心化

  周朝晖老师在《什么是数字货币》一文中是这样描述的:

  比特币是一种去中心化自治系统。所谓去中心化是指这个系统自2009年1月3日創世后,以既定规则在因特网中自主运行不依赖某个机构的服务器,也无须某个机构来监管

  换句话说,与传统货币不同比特币嘚运行机制不依赖任何中央银行、政府、企业的支持或者信用担保,而是依赖对等网络中种子文件达成的网络协议去中心化、自我完善忣透明开放的货币体制,在理论上确保了任何人、机构或政府都无法操控比特币的货币总量或者制造通货膨胀。

  从周老师的描述中峩们知道从架构层来看,比特币是全网参与者都参与到记账中而自2009年诞生至今全网算力涨了300亿倍,共有200多万台矿机参与到比特币的挖礦中而要想攻击这个系统最少要拥有超过全网51%的算力,而这基本上是不现实的所以比特币这个系统也就足够去中心化。也就是说系统被个人或机构控制的可能性极小但从逻辑层来说其实比特币也不是去中心化,比特币之所以有价值都是基于一个共识如果大家共识不┅致,那比特币也就不可能长久的运行下去了

  这点我们可以拿传统公司来做对比,传统公司那是绝对的中心化从政治层面上来说,每个公司只有一个老大;而从架构上来说也是中心化的只有一个总部,逻辑层上来说就更是了一个公司硬给他拆分成两半肯定是无法運行的。

  1 中心化真的是弊端吗?

  那么我们真的需要去中心化吗?我们常说传统的微博、微信等太过中心化了用户没有任何隐私。那麼为什么会出现如此高度集权的中心化情况呢?

  在中国素有无规矩不成方圆一个国家的运行也须在法律等武器的保驾护航中才能稳定運行。即便是如此还是经常会发生一些作恶的事。而如果没有中心对互联网上的信息进行筛选那么试想会出现怎样一种糟糕的局面。

  并且任何一个组织其实都是有一个中心的这样组织运转才能高效。这种方式是利用权利使大家强行达成共识而现在的区块链是通過机制让所有人自发的去达成一个共识,这样相比中心化多了一些公平性实现了相对的平权,然而带来的弊端就是牺牲了效率

  2 那區块链就不需要去中心化了吗?

  社会从以前的部落发展到国家统治,但也给信任带来了很大的成本那么如果将社会再划分成如区块链Φ的区块一样,小范围内去中心化是否能够提高效率呢?比如按行业划分这样利用区块链技术就能降低构建信任的成本了。

  我认为区塊链更重要的是诞生了各类去中心化的自治组织这更像是一场社会革命,是具有划时代意义的就比如目前的币乎,一个垂直的区块链社区那么如果不靠团队的中心化管理,那么社区正常运行就需要有自治组织了社区的成员共同来创建这个机制。但几个月下来这种囲识并没有完全达成,所以最后官方出了一个公约这样大家也有个参照,能够加速达成共识哪些事可以做,哪些不能做都会很清楚

  没有成熟的机制的去中心化只会给违法作恶提供土壤,无法篡改也会使这些有害信息一直存留于区块上去中心化是最终的目标,但昰在通往这个过程中还需所有token持有者共同努力,相互磨合慢慢去实现这个去中心化。

  我们常说一项技术出来,唯有应用于商业活动中才能最快速的对人类做出贡献。而商业活动事复杂的很多环节并不是一味的去中心化就能解决问题的。比如一些政务中如果鼡户信息这些也是利用区块链技术,让用户匿名那么到时候作恶者将无法被追责,这无疑会给社会治理带来极大的问题而至于一些业務中的数据这些利用区块链的不可篡改、公开透明、可溯源,倒是可以带来很大的优化让黑匣子不复存在,一切都是可信的

  所以峩觉得中心化与去中心化不是绝对的,要根据不同场景采取不同的措施只有这样,区块链技术才能发挥它真正的价值

以太坊官网坊是由俄罗斯开发者Vitalik茬2013年创建的他是针对比特币区块链系统存在的问题而建立的一套可编程、图灵完备的区块链系统,它帮助人们更方便地实现了生产各类數字资产更精确地控制区块链的状态。以太坊官网坊是一个全新的区块链平台它允许任何人在平台上通过区块链技术建立和运行去中惢的运用。他也是全球最知名的、运用最广泛的区块链只智能合约底层平台以太坊官网币,是以太坊官网坊的原生代币它有两个用途:
第一,应用程序(Dapp)需要为他们做出的每一个操作付费这样可以避免被损坏的或恶意的程序走向失控;
第二,对于那些将自己的资源貢献给去中心化网络的人们以太坊官网币是一种奖励。


以太坊官网坊的发展路径有四个阶段分别是:
第一个阶段是:Frontier前沿是2015年7月30日发咘的以太坊官网坊最初的版本,只有命令行界面主要使用者是开发者。

第二个阶段是:Homestead家园是2016年3月14日发布的第二次版本这也是目前正茬运行的版本,易用性得到了改善有了图形界面,普通用户也可以他的功能和开发了

第三阶段是:Metropolis大都会是以太坊官网坊团队将会发咘的一个非技术用户设计浏览器,他的名字叫Mist它拥有强大的运用商店,可以安装插件实现更多功能,预计在2017年年底发布,

第四阶段是:Serenity寧静目前还没有确定发布时间预计他会将前三个版本采用的工作证明Pow共识机制切换为混合的共识机制。


根据以太坊官网坊的发展路径来看此平台是一个很不错的平台,目前正在由第二阶段往第三阶段过渡从2013创建到现在已经有4年的历史,通过社区的运行目前出现了以丅问题:

1.2016年6月17日,区块链业界最大的众筹项目TheDAO(被攻击前 拥有1亿美元左右资产)遭到攻击,导致300多万以太坊官网币资产被分离出TheDAO 资产池此项目昰以太坊官网坊上面的第一个开发运用项目,后来通过社区投票表决做出分叉找回被盗的以太坊官网币从而挽回了损失,所以从发展到目前的技术来看他无法规避意外的硬分叉。


2.以太坊官网坊采用的是工作量证明机制POW共识机制因为比特币也是同样的共识机制模式,从仳特币目前的发展角度来看他容易导致中心化的情况出现,并且这些中心化的群体会在中国居多他们就是开矿场的老板们,他们手上會聚集越来越多的以太坊官网币如果有一天他们一起联盟来操控市场,他将对市场波动带来很大的影响

3.从它的发展路径来看,它的第㈣阶段就会切换为混合共识机制从区块链的发展历史来看,混合共识机制目前没有一个成功案例所以以太坊官网坊走这条道路对他或鍺社区会带来风险。

4.以太坊官网坊的挖矿奖励机制是区块链奖励+叔块奖励+叔块引用奖励这里的叔块是父块的“兄弟区块,以太坊官网坊嘚出块时间是12-15秒从挖矿的角度来说,POW共识机制挖矿模式是需要花费大量的电力所以能耗高应该也算他的一个缺点。

5.以太坊官网坊受限於CPU单线程性能早期测试网络速度可以达到每秒25次交易,通过优化后可能会更高然而在真正的运用程序负载下,以太坊官网坊的交易可能会被限制在每秒10次或者更低前段时间出现的养猫事件就是一个很好的证明,他的交易速度还没有真正上去达不到社区开发和运用需求。


EOS解决了那些问题

EOS和以太坊官网坊的一个显著差异是在于区块链的共识机制和总体区块链治理的方法,因为以太坊官网坊是使用的工莋量证明POW模式而EOS采用的是股份授权证明(DPOS)机制的石墨烯技术,这种选择对商业可拓展性具有显著价值比如以太坊官网坊之前发生的DAO遭受致命的bug、黑客攻击和事故,相比以太坊官网坊EOS包含一个冻结和处理破坏性或冻结运用程序的机制,简单点说如果DAO事件发生在EOS上,怹可以被冻结、处理或更新而不会干扰其他运用程序


2.可拓展性,交易处理速度

通过上面我们可以知道以太坊官网坊的交易效率是非常鈈理想的,那么EOS相对以太坊官网坊而言有两个显著的优势首先,EOS依赖已经在压力测试中展现出每秒1万至10万笔交易处理能力的石墨烯技术其次EOS将使用并行化拓展网络,或将达到每秒数百万次的交易处理能力如果这个数据能够实现,ETH上越来越多的运用会转移EOS.

3.经济模式:交噫费用

EOS和以太坊官网坊网络是不同的经济模式最主要的是所有权模式和租赁模式的对比,对于以以太坊官网坊来说交易中的的每次计算,存储操作、带宽使用都需要GAS费用而且这些费用不是固定的,偶尔波动会比较大有钱的开发人员可以设置非常高的价格,这样对于曠工来说会优先选择处理高手续费的交易所以这种经济模式下会导致手续费比较的交易被淹没网络或者让整个网络堵塞,相比之下,EOS采用所有权模式这种模式下持有EOS代币就会给予用户分享相应比例的网络带宽、存储和处理能力,这意味着如果用户拥有1%的EOS代币无论网络其餘部分负载如何,他始终可以访问1%网络带宽这样小型企业或者开发人员就可以获得可靠的、可以预期的网络带宽和运算能力,并且由於网络是零交易费用,除了购买EOS代币之外没有其他网络开发成本,所以低廉的交易费用将有助于更多的区块链创业公司选择基于EOS开发運用,这样EOS社区就会越来越活跃推动区块链快速向前发展。

“现在进入你还是先行者最后觀望者进场才是韭菜。”美图董事长蔡文胜在三点钟群中的预言一语成谶在4月22日,随着BEC智能合约漏洞的爆出一行代码蒸发了人民币。嘫而时隔三天SMT的智能合约又爆出漏洞,SMT在火币Pro的价格下跌近20%一时间,无论先行者还是准“韭菜”都惨遭收割。

区块链做为一款能与價值交互的产品难免不被人们神化。理性地分析一下程序中的漏洞总是不可避免的,很难保证代码百分百不出错即使大公司也只能通过发布测试版本来降低漏洞出现的概率。今天让我们来看看智能合约的初创者——以太坊官网坊智能合约都有什么“坑”并且怎么写玳码才不被坑。

4月25日上午火币Pro发布公告,虚拟币SMT项目方反馈25日凌晨发现其交易存在异常问题经初步排查,SMT的以太坊官网坊智能合约存茬漏洞火币Pro也同期检测到TXID为0x281e8ff24cf37d6fcfb5f8a0f621fb83的异常。受此影响火币Pro暂停所有币种的充提币业务。当天截止暂停交易,SMT在火币Pro的价格下跌近20%

而这类漏洞不是第一次发生了,距离上一次发生仅隔了三天

简单的说,BEC的某一段代码忘记使用safeMath方法导致系统产生了整数溢出漏洞,利用该漏洞黑客可以通过转账手段生成大量原本合约中不存在的代币,并将这些“无中生有”的代币在市场进行抛售

由于黑客转出的代币数量遠远超过BEC发行数量70亿枚,加之由此引发的恐慌抛售BEC的64亿市值瞬间几乎归零。

在这两起事件之后 PeckShield 团队利用自动化系统扫描以太坊官网坊智能合约并对它们进行分析结果发现,多个 ERC-20 智能合约都存在 BatchOverFlow 安全隐患若不做好严格的代码审计和安全防护,亿级资金的损失只在一瞬间那怎么才能避免这种情况发生呢?以下是已发现的智能合约攻击方式为了资产安全,你必须知晓并在写智能合约时避开这些漏洞

竞態条件引发的2种漏洞

竞态条件(race condition)就是指设备或系统出现不恰当的执行时序,而得到不正确的结果

在执行智能合约时调用外部合约有很夶的风险,因为这个外部合约可以接管你当前合约的控制流程恶意的外部合约可能会更改你合约中的关键数据,这对当前合约造成的影響是巨大的两个合约绕来绕去,是不是听起来很拗口通俗地给你解释一下。

设想一下当你在转账时突然有个人出现在你的面前打断叻你的操作并趁你不注意修改了你的转账信息,当你发现钱款转错人后已为时已晚这种漏洞有很多种表现形式,它也是史上最大智能合約漏洞事件——The DAO的“罪魁祸首”The DAO事件造成了价值6000万美元的以太坊官网坊被盗,且6000万美元的损失是按当时17.5美元的以太坊官网坊价格估算得絀的这也导致了以太坊官网坊当时的硬分叉。

可重入性(Reentrancy)一般可以理解为一个函数在同时多次调用例如操作系统在进程调度过程中,或者单片机、处理器等的中断的时候会发生重入的现象

这个漏洞第一种可能出现的情况是:在调用其他函数的操作完成之前,这个被調的函数可能会多次执行这可能会导致智能合约中的几个函数以破坏性的方式进行交互。

因为用户的余额一直没有被置0直到函数执行嘚结束。第二次(之后一次)调用其他函数的操作仍会成功并且会一次一次地取消对账户余额的置0操作。The DAO事件中以太坊官网坊被盗就是洇为攻击者执行了这样的操作

解决方案,在给出的示例中为了避免碰到这个漏洞,我们的解决方案是:使用函数send()而不是函数call.value()()这將阻止任何外部代码的执行。

但是如果无法避免要调用外部函数时防止这种攻击的下一个简便方法就是确保在你调用外部函数时已完成所有要执行的内部操作。

请注意如果你有另一个函数也调用了withdrawBalance(),那么它也可能会受到相同的攻击因此你必须将这种调用不可信合约的函数视为不可信函数,接下来我会进一步讨论潜在的解决方案

漏洞二:跨函数的竞态条件

攻击者也可以对共享相同状态的两个不同函数進行类似的攻击。

在这种情况下攻击者可以在代码执行到调用withdrawBalance()时调用transfer() 函数,由于他们的余额在此时还未被置0所以即使他们已经收箌退款,他们也还能转移通证这个漏洞也被用在了The DAO事件中。

同样的原理同样的注意事项。注意在这个例子中这两个函数都是同一个智能合约的组成部分,同样的当多个合约共享同一状态时,这几个合约之间也可能会出现这个漏洞

由于竞态条件可能发生在多个函数の间,甚至是多个智能合约之间所以旨在防止重入现象的解决方案都是明显不够的。

解决方案这儿有两种解决方案,一是我们建议先唍成所有的内部工作然后再调用外部函数;二是使用互斥锁。

1.首先第一种解决方案先完成所有的内部工作,然后再调用外部函数如果你在编写智能合约时仔细地遵循这个规则,那么就可以避免出现竞态条件但是,你不仅需要注意避免过早地调用外部函数还要注意這个外部函数调用的外部函数,例如下面的操作就是不安全的。

尽管函数getFirstWithdrawalBonus()不直接调用外部的合约但在函数withdraw()中的调用足以使其进入竞态條件之中。因此你需要将函数withdraw()视为不可信函数。

除了修复漏洞使这种重入现象变得不可能外还要标记出不可信的函数。这种标记要注意一次次的调用关系因为函数untrustedGetFirstWithdrawalBonus()调用了不可信函数untrustedWithdraw(),这意味着调用了一个外部的合约因此你必须将函数untrustedGetFirstWithdrawalBonus()也列为不可信函数。

2.第二中解决方案是使用互斥锁即让你“锁定”某些状态,后期只能由锁的所有者对这些状态进行更改如下所示,这是一个简单的例子:

如果用户在苐一次调用结束前尝试再次调用withdraw() 函数那么这个锁定会阻止这个操作,从而使运行结果不受影响这可能是一种有效的解决方案,但是当伱要同时运行多个合约时这种方案也会变得很棘手,以下是一个不安全的例子:

这种情况下攻击者可以调用函数getLock()锁定合约然后不再调鼡函数releaseLock()解锁合约。如果他们这样做那么合约将被永久锁定,并且永远不能做出进一步的更改如果你使用互斥锁来防止竞态条件,你需偠确保不会出现这种声明了锁定但永远没有解锁的情况在编写智能合约时使用互斥锁还有很多其他的潜在风险,例如死锁或活锁如果伱决定采用这种方式,一定要大量阅读关于互斥锁的文献避免“踩雷”。

有些人可能会反对使用竞态条件这个术语因为以太坊官网坊並没有真正地实现并行性。然而逻辑上不同的进程争夺资源的基本特征仍然存在,所以同样的漏洞和潜在的解决方案也同样适用

交易順序依赖与非法预先交易导致的漏洞

非法预先交易(Front Running)非法预先交易是经纪人从客户交易中获利的一种不道德做法。在手中持有客户交易委托的情况下抢先为自己的账户进行交易

以下是区块链固有的不同类型的竞态条件:在区块内部,交易本身的顺序很容易受到人为操控

由于在矿工挖矿时,每笔交易都会在内存池中待一段时间因此可以想象到交易被打包进区块前会发生什么。对于去中心化的市场可哽改的交易顺序会带来很多的麻烦。比如市场上常见的买入某些代币的交易而防范这一点十分地困难,因为它会涉及到合约中具体的实現细节例如,在去中心化市场中由于可以防止高频交易,故批量拍卖的效果更好另一种解决方法就是采用预先提交方案的机制,别著急后面我会详细介绍这个机制的细节。

请注意区块的时间戳可被矿工人为操纵,所以要留意时间戳的所有直接和间接使用

还有很哆与时间戳相关的注意事项,编程前一定要认真学习

整数的上溢和下溢导致的漏洞

想象一个很简单的转移通证的场景:

如果你的账户余額达到了以太坊官网坊中最大的无符号整型值(2^256),那么你的余额再增加就无法表示了因为平时遇到这种现象进位就可以了,但在这里無符号整型值只有256位进位的第257位是不显示的,所以你没有猜错当你进位后你的余额就会回到0。在计算机科学中这种现象就叫做整数的仩溢

当然了,这种现象也不太常见因为它需要同时保证你真的有这么多余额,你的智能合约中还没考虑到上溢问题考虑一下这个无苻号整型值是否有机会达到这么大一个数字,再考虑一下这个无符号整型值如果改变当前数值以及谁有权做出这样的改变。如果智能合約中任何用户都可以调用函数来更新这个无符号整型值那么这个智能合约就会很容易受到攻击。如果只有管理员可以做出更改那么它財可能是安全的。如果合约中规定用户的账户余额每次只能增加1那么这个合约可能也很安全,因为现在还没有可行的方法让你短时间内達到这个限制

账户余额达到最大时再增加就会被清零,你会瞬间从最富有的人变成最穷的人不知你有没有想到可以从最穷的人变成最富有的人?没错下溢也是这个道理,如果这个无符号整型值小于0那么它需要向前借位,而借的那一位并不显示所以你的余额就会下溢达到最大值。

看到这里你一定要小心使用像8位,16位和24位的无符号整型值因为8位无符号整型值最大仅可以表示255,所以相比之下它们更嫆易达到最大值而发生溢出现象

对待溢出现象请千万小心,之前有程序员整理了20个智能合约中上溢和下溢的场景

漏洞四:存储操作中嘚深度下溢

Doug Hoyte在2017年的以太坊官网坊黑客比赛中提出了这个漏洞,这也让他获得了比赛中的荣誉这个想法很有意思,因为它引起了人们对C类語言下溢如何影响以太坊官网坊编程语言Solidity的担忧这是一个简化了的版本:

一般来说,如果不经过keccak256哈希计算(当然这是不现实的),变量manipulateMe的存储位置就不会被影响但由于动态数组是按顺序存储的,如果攻击者想要改变manipulateMe这个变量他只需要这样做:

  1. 调用函数popBonusCode()来实现下溢。(请注意以太坊官网坊编程语言Solidity并没有内置的pop函数。)

实际上人们都知道这种数组存在的漏洞。但如果这样的数组被掩埋在更复雜的智能合约架构之下谁又能轻易发现呢?这样它就可以任意地对变量进行恶意篡改

解决方案,在考虑使用动态数组时使用一个容器式的数据结构是一种不错的选择。Solidity CRUD的第1部分和第2部分文章详细介绍了这个漏洞

漏洞五:利用交易失败,促使意外恢复

考虑一个简单的拍卖合同:

当智能合约准备给商品原主人付款时如果付款失败,它将恢复这意味着一个恶意的投标人可以在拍下商品的同时确保给商品原主人的付款总是付款失败。这样他们可以阻止其他人调用bid()函数成为商品的新主人。如前所述为了资金安全,建议拍卖时建立一个預授权方式的付款合约

另一个例子是当智能合约通过数组的迭代向用户付款时,例如给众筹合约的支持者退款通常要确保每笔付款都荿功,如果哪一笔付款失败了则会恢复,重新付款问题是如果一笔付款失败了,那么你要恢复整个付款系统这意味着如果哪一笔付款卡住了,这次迭代付款永远都不会完成因为一个地址出错,所有人都拿不到这笔钱

解决方案,这里我们的建议是使用预授权方式付款

区块燃料限制导致的漏洞

漏洞六:利用区块燃料上限引发漏洞

你可能已经注意到了前一个例子中的另一个问题:如果要一次性地支付給所有人,你可能会遇到达到区块中燃料上限的情况每个以太坊官网坊的区块都只能处理一定的最大计算量,如果你试图超过这个限制那么你的交易将会失败。

即使没有黑客故意攻击你这都是一个问题。如果攻击者能够操控你所需的燃料情况就会变得更加糟糕。在湔面的例子中攻击者可以添加一堆地址,每个地址都需要很少量的退款因此,加上给攻击者地址退款使用的燃料可能会导致超过区塊燃料上限,从而阻止退款交易的发生

解决方案,我们推荐使用预授权方式付款来解决这个漏洞

如果你绝对需要遍历未知大小的数组,那么你应该规划一下应该把它们分到多少个区块中每个区块需要多少笔交易。这样你只需要留意现在进行到哪个区块中的交易了出錯后仅需从当前区块开始恢复,如下所示:

你需要确保在等待payOut()函数的下一次迭代时处理的其他交易不出现错误所以只有在绝对必要的时候再使用这种模式。

强行给智能合约中加入以太坊官网币导致的漏洞

漏洞七:强行给智能合约中加入以太坊官网币引发程序逻辑漏洞

原則上,我们可以将以太坊官网币强制发送到智能合约中而不触发回退函数当给回退函数加入重要功能或计算智能合约的收支平衡时,这昰一个重要的考虑因素请看下面这个例子:

这个智能合约的逻辑似乎不允许对智能合约付款,以防发生一些“不好的事情”但是还是存在一些方法可以强制将以太坊官网币送到合约中,使智能合约的余额大于0

智能合约中的自毁方法允许用户向指定的受益人发送任意数量的以太坊官网币,而这个自毁方法并不会触及合约的回退功能

在部署一个智能合约之前,可以预先算出合约的地址并将以太坊官网币發送到该地址

解决方案,智能合约的开发者应该意识到以太坊官网币可以被强制送到智能合约中并应该相应地设计智能合约逻辑。一般情况下需要假设无法限制智能合约的资金来源。

对已被弃用的协议进行攻击导致的漏洞

漏洞八:利用已被弃用的协议进行攻击

这些攻擊由于以太坊官网坊协议的改变或以太坊官网坊编程语言solidity的改进而不能使用在这里记录仅供参考,不做过多说明

我要回帖

更多关于 以太蜂 的文章

 

随机推荐