成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

一行代碼蒸發(fā)了¥6,447,277,680 人民幣!

booster / 1234人閱讀

一行代碼蒸發(fā)了¥6,447,277,680 人民幣!

現(xiàn)在進(jìn)入你還是先行者,最后觀望者進(jìn)場(chǎng)才是韭菜。

美圖董事長蔡文勝曾在三點(diǎn)鐘群,高調(diào)的說出了這句話,隨即被大眾瘋傳。

在他發(fā)表完言論沒多久,2月美鏈(BEC)上交易所會(huì)暴漲4000%,后又暴跌。盡管他多次否認(rèn),聰明的網(wǎng)友早已扒出,他與BEC千絲萬縷的關(guān)系。

莊家坐莊操控幣價(jià),美圖的股價(jià)隨之暴漲,蔡文勝順利完成了他的韭菜收割大計(jì)。

但在幣圈,割人者,人恒割之。

隨著BEC智能合約的漏洞的爆出,被黑客利用,瞬間套現(xiàn)拋售大額BEC,6億在瞬間歸零。

而這一切,竟然是因?yàn)橐粋€(gè)簡單至極的程序Bug。

背景

今天有人在群里說,Beauty Chain 美蜜 代碼里面有bug,已經(jīng)有人利用該bug獲得了 57,896,044,618,658,100,000,000,000,000,000,000,000,000,000,000,000,000,000,000.792003956564819968 個(gè) BEC

那筆操作記錄是 0xad89ff16fd1ebe3a0a7cf4ed282302c06626c1af33221ebe0d3a470aba4a660f

下面我來帶大家看看,黑客是如何實(shí)現(xiàn)的!

我們可以看到執(zhí)行的方法是 batchTransfer

那這個(gè)方法是干嘛的呢?(給指定的幾個(gè)地址,發(fā)送相同數(shù)量的代幣)

整體邏輯是

你傳幾個(gè)地址給我(_receivers),然后再傳給我你要給每個(gè)人多少代幣(_value)

然后你要發(fā)送的總金額 = 發(fā)送的人數(shù)* 發(fā)送的金額

然后 要求你當(dāng)前的余額大于 發(fā)送的總金額

然后扣掉你發(fā)送的總金額

然后 給_receivers 里面的每個(gè)人發(fā)送 指定的金額(_value)

從邏輯上看,這邊是沒有任何問題的,你想給別人發(fā)送代幣,那么你本身的余額一定要大于發(fā)送的總金額的!

但是這段代碼卻犯了一個(gè)很傻的錯(cuò)!

代碼解釋

這個(gè)方法會(huì)傳入兩個(gè)參數(shù)

_receivers

_value

_receivers 的值是個(gè)列表,里面有兩個(gè)地址

0x0e823ffe018727585eaf5bc769fa80472f76c3d7

0xb4d30cac5124b46c2df0cf3e3e1be05f42119033

_value 的值是 8000000000000000000000000000000000000000000000000000000000000000

我們?cè)俨榭创a(如下圖)

我們一行一行的來解釋

uint cnt = _receivers.length;

是獲取 _receivers 里面有幾個(gè)地址,我們從上面可以看到 參數(shù)里面只有兩個(gè)地址,所以 cnt=2,也就是 給兩個(gè)地址發(fā)送代幣

uint256 amount = uint256(cnt) * _value;

uint256

首先uint256(cnt) 是把cnt 轉(zhuǎn)成了 uint256類型

那么,什么是uint256類型?或者說uint256類型的取值范圍是多少...

uintx 類型的取值范圍是 0 到 2的x次方 -1

也就是 假如是 uint8的話

則 uint8的取值范圍是 0 到 2的8次方 -1

也就是 0 到255

那么uint256 的取值范圍是

0 - 2的256次方-1 也就是 0 到115792089237316195423570985008687907853269984665640564039457584007913129639935

python 算 2的256次方是多少

那么假如說 設(shè)置的值超過了 取值范圍怎么辦?這種情況稱為溢出

舉個(gè)例子來說明

因?yàn)閡int256的取值太大了,所以用uint8來 舉例。。。

從上面我們已經(jīng)知道了 uint8 最小是0,最大是255

那么當(dāng)我 255 + 1 的時(shí)候,結(jié)果是啥呢?結(jié)果會(huì)變成0

那么當(dāng)我 255 + 2 的時(shí)候,結(jié)果是啥呢?結(jié)果會(huì)變成1

那么當(dāng)我 0 - 1 的時(shí)候,結(jié)果是啥呢?結(jié)果會(huì)變成255

那么當(dāng)我 0 - 2 的時(shí)候,結(jié)果是啥呢?結(jié)果會(huì)變成255

那么 我們回到上面的代碼中,

amount = uint256(cnt) * _value

則 amount = 2* _value

但是此時(shí) _value 是16進(jìn)制的,我們把他轉(zhuǎn)成 10進(jìn)制

(python 16進(jìn)制轉(zhuǎn)10進(jìn)制)

可以看到 _value = 57896044618658097711785492504343953926634992332820282019728792003956564819968

那么amount = _value*2 = 115792089237316195423570985008687907853269984665640564039457584007913129639936

可以在查看上面看到 uint256取值范圍最大為 115792089237316195423570985008687907853269984665640564039457584007913129639935

此時(shí),amout已經(jīng)超過了最大值,溢出 則amount = 0

下一行代碼
require(cnt > 0 && cnt <= 20);
require 語句是表示該語句一定要是正確的,也就是 cnt 必須大于0 且 小于等于20

我們的cnt等于2,通過!

require(_value > 0 && balances[msg.sender] >= amount);

這句要求 _value 大于0,我們的_value是大于0 的
且,當(dāng)前用戶擁有的代幣余額大于等于 amount,因?yàn)閍mount等于0,所以 就算你一個(gè)代幣沒有,也是滿足的!

balances[msg.sender] = balances[msg.sender].sub(amount);

這句是當(dāng)前用戶的余額 - amount

當(dāng)前amount 是0,所以當(dāng)前用戶代幣的余額沒有變動(dòng)

for (uint i = 0; i < cnt; i++) {
    balances[_receivers[i]] = balances[_receivers[i]].add(_value);
    Transfer(msg.sender, _receivers[i], _value);
}

這句是遍歷 _receivers中的地址,
對(duì)每個(gè)地址做以下操作

` balances[_receivers[i]] = balances[_receivers[i]].add(_value);
`
_receivers中的地址 的余額 = 原本余額+value

所以 _receivers 中地址的余額 則加了57896044618658097711785492504343953926634992332820282019728792003956564819968 個(gè)代幣!?。?/p>

`Transfer(msg.sender, _receivers[i], _value);
}`
這句則只是把贈(zèng)送代幣的記錄存下來?。?!

總結(jié)

就一個(gè)簡單的溢出漏洞,導(dǎo)致BEC代幣的市值接近歸0

那么,開發(fā)者有沒有考慮到溢出問題呢?

其實(shí)他考慮了,

可以看如上截圖

除了amount的計(jì)算外, 其他的給用戶轉(zhuǎn)錢 都用了safeMath 的方法(sub,add)

那么 為啥就偏偏這一句沒有用safeMath的方法呢。。。

這就要用寫代碼的人了。。。

啥是safeMath

safeMath 是為了計(jì)算安全 而寫的一個(gè)library

我們看看他干了啥?為啥能保證計(jì)算安全.

function mul(uint256 a, uint256 b) internal constant returns (uint256) {
uint256 c = a * b;
assert(a == 0 || c / a == b);
return c;
}

如上面的乘法.
他在計(jì)算后,用assert 驗(yàn)證了下結(jié)果是否正確!

如果在上面計(jì)算 amount的時(shí)候,用了 mul的話,
c / a == b
也就是 驗(yàn)證 amount / cnt == _value

這句會(huì)執(zhí)行報(bào)錯(cuò)的,因?yàn)?0 / cnt 不等于 _value

所以程序會(huì)報(bào)錯(cuò)!

也就不會(huì)發(fā)生溢出了...

那么 還有一個(gè)小問題,這里的assertrequire 好像是干的同一件事

都是為了驗(yàn)證 某條語句是否正確!

那么他倆有啥區(qū)別呢?

用了assert的話,則程序的gas limit 會(huì)消耗完畢

而require的話,則只是消耗掉當(dāng)前執(zhí)行的gas

總結(jié)

那么 我們?nèi)绾伪苊膺@種問題呢?

我個(gè)人看法是

只要涉及到計(jì)算,一定要用safeMath

代碼一定要測(cè)試!

代碼一定要review!

必要時(shí),要請(qǐng)專門做代碼審計(jì)的公司來 測(cè)試代碼

這件事后需要如何處理呢?

目前,該方法已經(jīng)暫停了(還好可以暫停)所以看過文章的朋友 不要去測(cè)試了...

不過已經(jīng)發(fā)生了的事情咋辦呢?

我的想法是,快照在漏洞之前,所有用戶的余額情況

然后發(fā)行新的token,給之前的用戶 發(fā)送等額的代幣...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/24033.html

相關(guān)文章

  • 容器最大盛水量

    摘要:容器最大盛水量給定個(gè)非負(fù)整數(shù),,,,其中每個(gè)表示坐標(biāo),處的點(diǎn)。找到兩條線,它們與軸一起形成一個(gè)容器,使得容器含有最多的水。 容器最大盛水量 Container With Most Water 給定n個(gè)非負(fù)整數(shù)a1,a2,...,an,其中每個(gè)表示坐標(biāo)(i,ai)處的點(diǎn)。 繪制n條垂直線,使得線i的兩個(gè)端點(diǎn)在(i,ai)和(i,0)處。 找到兩條線,它們與x軸一起形成一個(gè)容器,使得容器...

    luckyw 評(píng)論0 收藏0
  • 關(guān)于SVG

    摘要:以前前端時(shí)代做按鈕,圖標(biāo)背景圖用,后來主流現(xiàn)在各種流體結(jié)構(gòu),高分屏的需求,大行其道,無論是體積還是靈活性還是品質(zhì)都遠(yuǎn)勝。 以前前端IE6時(shí)代做按鈕, 圖標(biāo)背景圖用gif, png, 后來主流png, 現(xiàn)在各種流體結(jié)構(gòu),高分屏的需求, svg大行其道, 無論是體積還是靈活性還是品質(zhì)都遠(yuǎn)勝png。 之前自己也總結(jié)了一下使用svg的各種方法吧: 1.直接使用 alt=> IE/Edge的...

    Ajian 評(píng)論0 收藏0
  • 遭做空股價(jià)大跌 看金蝶如何回應(yīng)?

    摘要:金蝶國際針對(duì)做空的回應(yīng)遭遇做空后,金蝶管理層積極應(yīng)對(duì),第一時(shí)間針對(duì)指控做出回應(yīng),認(rèn)為金蝶國際的云轉(zhuǎn)型戰(zhàn)略非常正確,這幾年業(yè)績有目共睹,對(duì)未來充滿信心。這幾天,金蝶國際可謂喜憂參半!繼3月14日公布其截至2018年12月31日的全年業(yè)績,集團(tuán)收入同比增長21.9%,其中金蝶云業(yè)務(wù)收入大幅增長49.5%的喜人財(cái)報(bào)后,3月18日,金蝶國際在Webb-site于其網(wǎng)站上發(fā)布的一份突如其來的做空?qǐng)?bào)告襲...

    Kyxy 評(píng)論0 收藏0
  • 發(fā)力新基建,UCloud綠色數(shù)據(jù)中心建設(shè)之路

    摘要:綠色數(shù)據(jù)中心的理念,也令順利獲得上海市經(jīng)濟(jì)和信息化委員會(huì)的用能指標(biāo)批準(zhǔn)優(yōu)刻得青浦?jǐn)?shù)據(jù)中心獲批上海新建用能指標(biāo),這些技術(shù)將繼續(xù)用于青浦?jǐn)?shù)據(jù)中心的建設(shè),發(fā)力新基建。該數(shù)據(jù)中心的設(shè)計(jì)指標(biāo)達(dá)到。?環(huán)保意識(shí)的提高,使數(shù)據(jù)中心的能耗日益成為關(guān)注點(diǎn)。近年來,UCloud探索實(shí)踐了多項(xiàng)節(jié)能減排技術(shù),并在自建的烏蘭察布數(shù)據(jù)中心取得了良好效果,電能使用效率PUE維持在1.3左右。綠色數(shù)據(jù)中心的理念,也令UClo...

    J4ck_Chan 評(píng)論0 收藏0
  • 踐行“碳中和”,UCloud優(yōu)刻得烏蘭察布數(shù)據(jù)中心預(yù)計(jì)一年減碳7380噸

    摘要:優(yōu)刻得首個(gè)自建數(shù)據(jù)中心選址內(nèi)蒙古烏蘭察布,全年平均氣溫,氣溫低于的時(shí)長超小時(shí)。機(jī)房余熱回收利用優(yōu)刻得將這一技術(shù)應(yīng)用于冬季只有左右的烏蘭察布數(shù)據(jù)中心,每年預(yù)計(jì)回收廢熱吉焦,一種熱量單位,可實(shí)現(xiàn)減少二氧化碳排放量噸,等同于種植了萬棵樹木。碳中和是指國家、企業(yè)、產(chǎn)品、活動(dòng)或個(gè)人在一定時(shí)間內(nèi)直接或間接產(chǎn)生的二氧化碳或溫室氣體排放總量,通過植樹造林、節(jié)能減排等形式,以抵消自身產(chǎn)生的二氧化碳或溫室氣體排...

    Tecode 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<