當(dāng)前位置:首頁(yè) > 物聯(lián)網(wǎng) > 區(qū)塊鏈
[導(dǎo)讀] 依序?qū)⒔榻B時(shí)間扭曲攻擊(time warp attack)、以太坊的uncle挖礦、比特幣的交易可鍛性(malleability problem)及投票中的隔離見(jiàn)證(segregated wit

依序?qū)⒔榻B時(shí)間扭曲攻擊(time warp attack)、以太坊的uncle挖礦、比特幣的交易可鍛性(malleability problem)及投票中的隔離見(jiàn)證(segregated witness)。

時(shí)間扭曲攻擊(TIme warp attack)

這個(gè)攻擊的起因來(lái)自于

1.區(qū)塊的TImestamp是由礦工填入,雖然TImestamp的值要遵守一些限制(大小要超過(guò)過(guò)去十一個(gè)區(qū)塊按照TImestamp大小排列的中間值、小于其他連線中節(jié)點(diǎn)的當(dāng)?shù)貢r(shí)間的平均值加兩小時(shí)等等的規(guī)則),但還是是一個(gè)礦工可以操縱的變數(shù)。

2. 鏈的難度在調(diào)整時(shí)有一個(gè)空檔,例如:[blk 0, blk 1, … , blk 2015] [blk 2016, blk 2017, … , blk 4031] …

所以礦工可以調(diào)整blk 2015的timestamp,例如多加兩個(gè)小時(shí),這樣大家在調(diào)整難度時(shí)會(huì)發(fā)現(xiàn)blk2015減去blk 0的時(shí)間變多了,所以調(diào)低難度。

但要發(fā)動(dòng)這個(gè)攻擊前提需要攻擊者的算力要夠(因?yàn)橐苷莆仗囟▍^(qū)塊,控制timestamp),這在如今相當(dāng)成熟的比特幣非常難實(shí)行(這也算是51%算力攻擊的一種) ,但有一些altcoin都曾經(jīng)被成功攻擊過(guò)(Myriad、Geist Geld等)。

Uncle Mining

這個(gè)問(wèn)題來(lái)自于以太坊挖礦的機(jī)制—? GHOST。

因?yàn)橐蕴豢s短了區(qū)塊產(chǎn)生的時(shí)間,導(dǎo)致會(huì)有更多被挖到的區(qū)塊因?yàn)榫W(wǎng)路延遲或是運(yùn)氣問(wèn)題而被丟棄(稱(chēng)為stale block)。所以GHOST的設(shè)計(jì)讓這些stale block也能被采納,獲得(比較少的)獎(jiǎng)賞。這也是為什么這些區(qū)塊會(huì)被稱(chēng)為uncle block的原因,見(jiàn)下圖:

藍(lán)色的2060 uncle block被2061收入

Uncle Mining顧名思義,是專(zhuān)門(mén)挖uncle block來(lái)獲利的一種旁門(mén)走道。

礦工把挖到的區(qū)塊(假設(shè)應(yīng)該要是第2001個(gè)區(qū)塊)藏起來(lái),等到主鏈的第2001個(gè)區(qū)塊被挖出才公布出去,成為uncle block。

收入uncle block的區(qū)塊也會(huì)獲得Reward,且uncle block越快被收入雙方獲得的Reward越多。

假設(shè)某礦工(或礦池)的算力為25%,正常情況他的獲利是Reward*0.25:

正常情況,每四個(gè)區(qū)塊有一個(gè)是他挖出的。

現(xiàn)在他不挖主鏈(表示挖主鏈的算力只剩75%),改挖uncle block(假設(shè)uncle block馬上被下一個(gè)高度的區(qū)塊且獲利為Reward*7/8):

因?yàn)橥谥麈溗懔κ?5%,所以變成每三個(gè)區(qū)塊一個(gè)循環(huán)。

如此他的獲利變成Reward*(7/8)*1/3 = Reward*0.29。

假設(shè)礦工的算力是X%,正常情況獲利是Reward*X;采用uncle mining獲利是Reward*7/8*X/(1-X),X只要大于12.5獲利即大于正常情況(但7/8是理想情況,如果uncle block越慢被收入獲利就會(huì)越少,門(mén)檻也就越高;再加上以太坊限制每個(gè)區(qū)塊最多只可收入兩個(gè)uncle block)。

因?yàn)橐蕴坏耐诘V機(jī)制不是贏者全拿的零和游戲(如比特幣),所以如果有礦工采用uncle mining,全體礦工的獲利其實(shí)是會(huì)提升的(從Reward*1/4變成Reward* 1/3,但也會(huì)造成總體發(fā)行的以太幣數(shù)量增加,間接導(dǎo)致價(jià)格下跌)。

但如果有其他礦工也采用uncle mining,則會(huì)出現(xiàn)競(jìng)爭(zhēng)情況讓彼此獲利下降。

交易可鍛性(Transaction Malleability)

這個(gè)漏洞來(lái)自于比特幣的簽名機(jī)制:

script因?yàn)榘灻旧?,所以不?huì)成為被簽名的一部分(否則就會(huì)產(chǎn)生無(wú)窮循環(huán):簽名包含script,script本身又包含簽名…。)。也因?yàn)閟cript和簽名是分開(kāi)的,才會(huì)有transaction malleability的問(wèn)題。

首先介紹哈希值與ID

交易的哈希值可以視為該交易的ID(區(qū)塊里Merkle tree的各個(gè)leaf node的值即是交易的哈希值),由該筆交易數(shù)據(jù)串行化后丟進(jìn)哈希函數(shù)后產(chǎn)生。如果交易數(shù)據(jù)不一樣,所得到的哈希值就會(huì)不一樣。

怎么發(fā)生的?

以下是一筆正常交易中的解鎖script: 0x48 《signature》 0x41 《public key》(0x48及0x41指令是將后面的48 bytes、41 bytes的值推進(jìn)stack里,也就是分別把signature和public key推進(jìn)去),當(dāng)你把這筆簽名廣播出去,有心人士收到之后,去將解鎖script修改成0x4D4800 《signature》 0x4D4100 《public key》(0x4D指令將長(zhǎng)度為后面兩個(gè)byte構(gòu)成的數(shù)字的bytes推進(jìn)stack里,也就是把長(zhǎng)度共0048的bytes推進(jìn)去,opcode詳細(xì)可看wiki),這和原本的script做的事情是一樣的,但修改過(guò)后的交易丟進(jìn)哈希函數(shù)后產(chǎn)生的ID會(huì)完全不一樣。

怎么利用這個(gè)漏洞?

因此當(dāng)你還在用你手中的ID檢查是否被收入?yún)^(qū)塊里、交易是否完成的時(shí)候,交易可能以另外一個(gè)ID被收入了(聽(tīng)起來(lái)好像沒(méi)差,畢竟你的交易最后還是完成了)。

2014年的MtGox,有心人士先向MtGox提回比特幣,同時(shí)攔截、修改并發(fā)出。如果原本的交易先被收入?yún)^(qū)塊鏈里,那就正常的拿回原本應(yīng)該要拿的錢(qián);如果修改過(guò)的交易先被收入,則他除了拿到比特幣之外,等到MtGox系統(tǒng)發(fā)現(xiàn)交易沒(méi)有完成并補(bǔ)償或重發(fā)時(shí),有心人士就額外多獲得了一筆錢(qián)。

還有很多方法可以修改script,利用malleability的漏洞(例如在script開(kāi)頭推入無(wú)用數(shù)據(jù)、在script里拼接public key等等),預(yù)防機(jī)制就是不要使用交易ID當(dāng)作確認(rèn)交易是否完成的條件。

隔離見(jiàn)證(Segregated Witness)

Segregated Witness(以下簡(jiǎn)稱(chēng)SegWit)最早由Pieter Wuille在2015年提出,在16年加進(jìn)BIP里,被視為目前解決比特幣交易量問(wèn)題的最佳解決辦法。比特幣的區(qū)塊大小限制在比特幣社群里引起廣泛的討論有很長(zhǎng)一段時(shí)間了,許多人覺(jué)得將區(qū)塊大小提升兩倍并不能真正解決問(wèn)題,也有許多人支持用硬分叉方式擴(kuò)大區(qū)塊大小先應(yīng)急(但擴(kuò)大到多大也沒(méi)有共識(shí)),一直沒(méi)有一個(gè)多數(shù)支持的解法。

推行方式:

SegWit不透過(guò)硬分叉的方式擴(kuò)大區(qū)塊大小,而是透過(guò)改變礦工認(rèn)證交易的方法來(lái)解決問(wèn)題。雖然不需要用代價(jià)很高的硬分叉的方式,但仍然需要絕大多數(shù)的礦工同意(需要礦工都接受SegWit驗(yàn)證交易的方式,否則會(huì)有沖突,即一邊的礦工覺(jué)得這筆交易合法,另一邊覺(jué)得不合法),因此目前正在進(jìn)行投票中。

所以Segregated Witness在做什么事?

這里witness指的是交易的簽名(signature),而顧名思義,Segregated Witness做的就是分離簽名,把交易的簽名從script中抽出去。但簽名抽掉之后其他新的節(jié)點(diǎn)加入時(shí)要怎么驗(yàn)證這些交易?你可以想像成將這些簽名做成另一個(gè)Merkle Tree。

原本一個(gè)區(qū)塊的Header里有包含一個(gè)Merkle Root,這是由這個(gè)區(qū)塊包含的所有交易的ID組成的Merkle Tree的root。

先介紹一下目前的

txid: 是由[nVersion][txins][txouts][nLockTime]經(jīng)過(guò)哈希而得;

而SegWit的IDwtxid則是[nVersion][marker][flag][txins][txouts][witness][nLockTime]經(jīng)過(guò)哈希而得。

witness是該筆交易input(txins)相對(duì)應(yīng)的簽名數(shù)據(jù),而txid的簽名是包含在txins里面。每個(gè)交易都會(huì)有txid和wtxid,如果是一筆普通交易,那它的txid會(huì)和wtxid長(zhǎng)得一樣。

現(xiàn)在SegWit將txid相對(duì)應(yīng)的wtxid組合成另一個(gè)相對(duì)應(yīng)的Merkle Tree,但如果要把這新的root塞進(jìn)Header里,表示要改變Header結(jié)構(gòu),就必須要硬分叉。

所以SegWit將這個(gè)root存在區(qū)塊的coinbase transaction里,coinbase transaction是礦工領(lǐng)獎(jiǎng)賞的交易,且可以讓該礦工在這個(gè)交易的script填入任意數(shù)據(jù),例如中本聰在比特幣創(chuàng)始區(qū)塊里填入的:“The Times 03/Jan/2009 Chancellor on brink of second bailout for banks”。

而SegWit的script因?yàn)槌樽吡撕灻?,所以也做了修改。上鎖的script變成一串長(zhǎng)度為數(shù)十bytes的數(shù)據(jù)(在沒(méi)有采用SegWit的節(jié)點(diǎn)眼中,看到的是一串無(wú)意義的數(shù)據(jù)),分成兩部分:1 byte長(zhǎng)的版本號(hào)和2至40bytes長(zhǎng)的witness program。

目前版本號(hào)是零(0x00),而在這個(gè)版本之下有兩種witness program:

1.長(zhǎng)度為20 bytes的pay-to-witness-public-key-hash,可以視為SegWit版的P2PKH。如果要花這個(gè)UTXO,你必須提供witness,witness包含signature和public key,而這個(gè)public key經(jīng)過(guò)哈希(HASH160)后要等于那個(gè)20 bytes長(zhǎng)的witness program。

2.長(zhǎng)度為32 bytes的pay-to-witness-script-hash,可以視為SegWit版的P2SH。如果要花這個(gè)UTXO,你必須提供witness,witness包含一個(gè)redeem script,而script經(jīng)過(guò)哈希(SHA256)后要等于那個(gè)32bytes長(zhǎng)的witness program(如同P2SH)。

因?yàn)閣itness是額外紀(jì)錄,所以一個(gè)SegWit交易的解鎖script有可能會(huì)是空的(可以玩玩這個(gè)比特幣script的模擬器測(cè)試看看),SegWit節(jié)點(diǎn)從其他方式收到witness再用來(lái)解鎖。

新設(shè)計(jì)帶來(lái)的好處

版本號(hào)提升了系統(tǒng)的彈性,未來(lái)若推出新的script規(guī)則及驗(yàn)證方式,只需利用版本號(hào)來(lái)判別即可,不但能新舊兼容,還不需要用硬分叉的方式來(lái)施行。

此外,因?yàn)镾egWit的P2WSH的redeem script是包含在witness里,表示redeem script的大小不受限制,可以設(shè)計(jì)更為復(fù)雜的redeem script。

那非SegWit節(jié)點(diǎn)呢?

如同前所述,沒(méi)有采用SegWit的節(jié)點(diǎn)看SegWit交易的script看到的會(huì)是一串沒(méi)有意義的東西,也就表示解鎖script不要求任何簽名,這在他們眼中都是”Anyone-can-spend”的交易,所以非SegWit節(jié)點(diǎn)可以直接把SegWit交易的錢(qián)提走(解鎖script是空的即可),這也是為什么SegWit投票需要絕大多數(shù)的礦工支持。

基本上非SegWit節(jié)點(diǎn)不會(huì)受到影響,還是可以制作和驗(yàn)證非SegWit交易,但如果要提走SegWit交易的錢(qián),最后會(huì)發(fā)現(xiàn)沒(méi)人承認(rèn)而白做工。

SegWit將會(huì)對(duì)比特幣的交易效率產(chǎn)生很大影響,包含以下方面:

1. 影響區(qū)塊容量:

將簽名從交易里抽走之后減少了交易數(shù)據(jù)的大小。如果一個(gè)區(qū)塊里都是SegWit交易的話,一般情況約是2MB大小,最差情況可塞到4MB。里頭包含一般交易數(shù)據(jù)和winess,而且是在一般交易數(shù)據(jù)沒(méi)有超過(guò)1MB容量限制的前提下。

2. 影響交易費(fèi)用:

因?yàn)楸忍貛诺慕灰踪M(fèi)用是看交易數(shù)據(jù)的大小而決定,所以SegWit將signature從交易數(shù)據(jù)中拿掉,減少了交易數(shù)據(jù)的大小,直接的降低了交易費(fèi)用。

3.影響礦工成本:

礦工的成本之一是他必須將所有UTXO(Unspent Transaction Output)記下來(lái)存在內(nèi)存中,如果比特幣網(wǎng)絡(luò)UTXO越多礦工成本就愈高,而且使用者有動(dòng)機(jī)來(lái)產(chǎn)生越多的UTXO。試想如果你有三筆UTXO分別是0.5、0.5及0.9 BTC,你要支付一筆0.75的費(fèi)用,考察交易費(fèi)用后你會(huì)選擇花一筆0.9 BTC的UTXO而不是0.5 BTC + 0.5 BTC共兩筆UTXO,因?yàn)閕nput(即UTXO)越多表示交易數(shù)據(jù)越大,交易費(fèi)用就越高。但這會(huì)產(chǎn)生更多的UTXO(一筆0.9變成0.75 + 0.15兩筆),造成礦工成本上升,所以使用者的利益和礦工的利益是相沖突的。

在SegWit計(jì)算交易費(fèi)用的方式里,假設(shè)交易A的input數(shù)量大于output數(shù)量(3 inputs,2 outputs),交易B的input數(shù)量小于output數(shù)量(2 inputs,3 outputs,表示交易A減少UTXO數(shù)量而交易B則產(chǎn)生更多的UTXO),則交易A的交易費(fèi)用會(huì)小于交易B。

但在沒(méi)有SegWit的情況下,交易A數(shù)據(jù)大小會(huì)大于交易B(因?yàn)橐粋€(gè)input的大小大于一個(gè)output的大?。?,交易A的交易費(fèi)用就會(huì)比較高,所以在SegWit的機(jī)制下,減少UTXO對(duì)使用者和礦工都是有利的。

4. 解決Transaction Malleability

因?yàn)镾egWit將簽名從script中抽離,而上鎖script(witness program)和解鎖script(witness)都固定了格式,因此即便有心人士攔截了交易數(shù)據(jù),他也無(wú)從竄改起。改了witness program任何一個(gè)位,都會(huì)導(dǎo)致witness經(jīng)過(guò)哈希后得到的哈希值和witness program不一樣。

而解決了Transaction Malleability也間接解決了閃電交易網(wǎng)絡(luò)(Lighting Network)的一大問(wèn)題,SegWit不僅加速了在線交易,也同時(shí)解決了線下交易的問(wèn)題。

越來(lái)越多錢(qián)包、礦場(chǎng)和應(yīng)用完成對(duì)接SegWit的升級(jí),詳情可見(jiàn)這個(gè)列表。投票狀況可到這里觀看。SegWit投票從2016年11月中開(kāi)始持續(xù)一年,必須超過(guò)95%的礦工投票支持才會(huì)通過(guò),也就是2016個(gè)區(qū)塊里要有1916個(gè)區(qū)塊標(biāo)記贊成。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車(chē)的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車(chē)技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車(chē)工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車(chē)。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車(chē) 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶(hù)希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱(chēng),數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱(chēng)"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉