比特幣雙花時間戳
❶ 區塊鏈鼻祖比特幣之8:分叉帶來的雙花支付、51%攻擊與解決辦法
分叉
前面講到了比特幣通過區塊鏈+工作量證明的獨特設計來解決了時間順序,但是不能保證在同一時刻有兩個節點算出了正確的解,雖然這種可能性很低很低。這就帶來了區塊的分叉。
雖然說幾乎同時有兩個節點計算出這一數學問題的可能性微乎其微,但是仍然存在這樣的可能性,所以分叉就以為著同一個區塊的後面可能會跟上兩個不同的區塊。
規則的打破一直要到下一個區塊被人解開。則會立即轉向最長的區塊,而那些短的區塊則會被拋棄。數學問題使得區塊很難被同時拆解。要連續發生多次更是困難。最終區塊鏈會穩定下來。也就是說所有人對最後幾個區塊順序達成共識。分叉意味著,譬如,若你的交易出現在較短的支鏈,它就會失去進入區塊鏈的位置。一般而言,只代表他會回到未確認交易池。然後被納入到下一個區塊。
比特幣網路如何解決分叉帶來的雙花支付
可惜,交易失去區塊位置的潛在可能,給了本來定序系統防範的重復支付攻擊機會。考慮下面的一個攻擊者A,其首先用自己的比特幣交換B節點的貨物,其立即又支付給自己。然後其通過努力的製造更長的鏈條來讓自己的支付替代掉B節點的支付,從而實現了雙重支付,B節點既得不到錢,還失去了貨物。
這時交易會退回到未確認池中,因為A節點已經利用參照同樣的input交易取而代之。節點就會認為Bob的交易無效。因為已使用掉。
你可能會猜測A節點會預先的計算出一支區塊鏈,然後抓住時機發布到網路。但是每個區塊的數學謎題阻擋了這個可能性。如前面所訴,解開區塊是猜測出一個隨機數的過程。一旦得出答案,解出的哈希值就會成為指紋一樣的區塊識別。只要區塊內容有一丁點變化,下一個區塊的參考值就會完全不同。此機制的結果就是無法在區塊鏈中置換區塊。在得到前一個區塊之前,下位區塊無法被解開。前一個區塊的指紋也是雜湊函數的引數之一。
同時,該工作量證明機制還解決了在集體投票表決時,誰是大多數的問題。如果決定大多數的方式是基於IP地址的,一IP地址一票,那麼如果有人擁有分配大量IP地址的權力,則該機制就被破壞了。而工作量證明機制的本質則是一CPU一票。「大多數」的決定表達為最長的鏈,因為最長的鏈包含了最大的工作量。如果大多數的CPU為誠實的節點控制,那麼誠實的鏈條將以最快的速度延長,並超越其他的競爭鏈條。如果想要對業已出現的區塊進行修改,攻擊者必須重新完成該區塊的工作量外加該區塊之後所有區塊的工作量,並最終趕上和超越誠實節點的工作量。我們將證明,設想一個較慢的攻擊者試圖趕上隨後的區塊,那麼其成功概率將呈指數化遞減。另一個問題是,硬體的運算速度在高速增長,而節點參與網路的程度則會有所起伏。為了解決這個問題,工作量證明的難度(the proof-of-work difficulty)將採用移動平均目標的方法來確定,即令難度指向令每小時生成區塊的速度為某一個預定的平均數。如果區塊生成的速度過快,那麼難度就會提高。
如果有一台超級電腦,能夠在區塊解題中獲勝?
即便是一台超級電腦,或者時幾百上千台電腦也很難贏得解一個區塊的勝利,因為競爭對手不是任一台電腦,而是整個比特幣網路。你可以用買彩票來比擬。操作千百台電腦,如同買了千百張彩票一樣。
51%攻擊是指的什麼
根據前面的例子,我們知道,要想有50%的概率領先其他人解題得到勝利,就需要掌握全網50%以上的算力。要連續領先他人解出區塊,掌握的運算能力還需要高得多。所以區塊鏈中的交易是受到數學競賽所保護。惡意用戶必須和整個網路較量。區塊連接建立的結果,使得在支鏈越前方的交易越安全。惡意的用戶必須在更長的時間贏過全網路,來達成重復支付,替換前面的區塊鏈。所以,系統只有支端末尾易受到重復支付攻擊。這也是為什麼系統建議多等幾個區塊,才能確認收款成功。
個人博客:https://dreamerjonson.com/
❷ 比特幣出現漏洞,手把手帶你發起攻擊,萬一暴富了呢
針對所有的支付系統,有一種攻擊方式叫作 雙花攻擊 。所謂雙花攻擊就是指一筆資金被花費多次,攻擊者先將資金轉出,獲得收益後通過攻擊的手段撤銷該筆轉賬,讓資金重新回到攻擊者的賬戶上。那麼我們能否對比特幣發起雙花攻擊並從中獲利呢?答案是肯定的!下面讓我帶你一起對比特幣系統發起攻擊。
在帶領大家發起攻擊之前,我們需要先了解一下比特幣的轉賬原理,這是我們發起攻擊的預備知識。
在比特幣系統中,用戶想要發起一筆轉賬,首先要把轉賬信息組裝好,就像填寫銀行支票一樣,寫好付款方賬戶,收款方賬戶,轉賬金額,然後使用加密技術對轉賬信息簽名,我們把這種簽名好的轉賬請求叫作交易。交易被比特幣系統處理以後,付款方的賬戶就會被扣除指定金額,收款方的賬戶就會增加指定金額。
用戶的交易會被發送給比特幣系統中的節點,節點收到交易後將其放在一個新的區塊中,然後對這個區塊進行哈希計算,也就是之前文章所說的計算數學題。哪一個節點優先計算出了這個區塊的數學題答案,就獲得了這個區塊的打包權,被這個節點打包進區塊的交易就相當於成交了,然後所有的節點會在新區塊的基礎上開始計算下一個區塊的數學題。
知道了比特幣的轉賬原理,下面我們就來看一下比特幣的漏洞到底在哪裡!
剛才我們說誰先算出答案誰負責打包區塊,那如果有兩個節點同時做出了同一個區塊的答案該怎麼辦呢?為了解決這個問題,比特幣系統設計了一個特殊的機制,叫作最長鏈原則。
通過上面的描述我們可以看出,比特幣的這條鏈是有可能分叉的,分叉以後會以最長的鏈為准,那麼在較短的分叉上的區塊就被廢棄了。 這不正為我們攻擊比特幣系統帶來了可能性嗎!
你可能已經想到了,既然比特幣系統只認最長的那條鏈,我們是不是可以通過這樣的方式對比特幣進行雙花攻擊:
至此,你之前轉出的比特幣還在你的賬戶上,並且得到了你想要的東西,所以你的攻擊成功了。
對比特幣的攻擊真的這么簡單嗎?答案當然是否定的!雖然我們說可以通過上述方法對比特幣發起攻擊,但是攻擊是要付出代價的。
所以,如果你想要創建一個新的分叉,並且超過主鏈的區塊長度,那麼你需要比主鏈上所有節點的計算速度加在一起都要快。要想實現這樣的結果,唯一的做法就是你要收買比特幣系統中超過51%的節點算力,這就是比特幣的51%攻擊原理。
想要攻擊比特幣系統並不是不可能,但是需要付出的代價可能遠遠超過作惡所獲得的收益。在比特幣系統中,節點越多,算力越強,攻擊比特幣系統的成本就越高,比特幣系統就越安全。比特幣越安全,它的價值就越高,就會吸引更多的節點加入來競爭比特幣獎勵。更多的節點進一步促進了系統的安全性,這是一個正向循環。
51%攻擊不只是針對比特幣的,所有採用 工作量證明共識演算法 的區塊鏈都面臨著這個問題。對於已經日趨成熟的比特幣系統來說,攻擊比特幣確實是不劃算的,而且隨著系統節點的越來越多,攻擊比特幣幾乎成為了不可能的事情。但是一些新的鏈,在其剛起步的時候節點和算力還不多,這種攻擊確實是真實有效的,並且這種攻擊事件時有發生。
❸ 比特幣機制研究
現今世界的電子支付系統已經十分發達,我們平時的各種消費基本上在支付寶和微信上都可以輕松解決。但是無論是支付寶、微信,其實本質上都依賴於一個中心化的金融系統,即使在大多數情況這個系統運行得很好,但是由於信任模型的存在,還是會存在著仲裁糾紛,有仲裁糾紛就意味著不存在 不可撤銷的交易 ,這樣對於 不可撤銷的服務 來說,一定比例的欺詐是不可避免的。在比特幣出來之前,不存在一個 不引入中心化的可信任方 就能解決在通信通道上支付的方案。
比特幣的強大之處就在於:它是一個基於密碼學原理而不是依賴於中心化機構的電子支付系統,它能夠允許任何有交易意願的雙方能直接交易而不需要一個可信任的第三方。交易在數學計算上的不可撤銷將保護 提供不可撤銷服務 的商家不被欺詐,而用來保護買家的 程序化合約機制 也比較容易實現。
假設網路中有A, B ,C三個人。
A付給B 1比特幣 ,B付給C 2比特幣 ,C付給A 3比特幣 。
如下圖所示:
為了刺激比特幣系統中的用戶進行記賬,記賬是有獎勵的。獎勵來源主要有兩方面:
比特幣中每一筆交易都會有手續費,手續費會給記賬者
記賬會有打包區塊的獎勵,中本聰在08年設計的方案是: 每10分鍾打一個包,每打一個包獎勵50個比特幣,每4年單次打包的獎勵數減半,即4年後每打一個包獎勵25個比特幣,再過四年後就獎勵12.5個比特幣... 這樣我們其實可以算出比特幣的總量:
要說明打包的記錄以誰為準的問題,我們需要引入一個知名的 拜占庭將軍問題 (Byzantine failures)。拜占庭將軍問題是由萊斯利·蘭伯特提出的點對點通信中的基本問題。含義是在存在消息丟失的不可靠信道上試圖通過消息傳遞的方式達到一致性是不可能的。
假設有9個互相遠離的將軍包圍了拜占庭帝國,除非有5個及以上的將軍一起攻打,拜占庭帝國才能被打下來。而這9個將軍之間是互不信任的,他們並不知道這其中是否有叛徒,那麼如何通過遠距離協商來讓他們贏取戰斗呢?
口頭協議有3個默認規則:
1.每個信息都能夠被准確接收
2.接收者知道是誰發送給他的
3.誰沒有發送消息大家都知道
4.接受者不知道轉發信息的轉發者是誰
將軍們遵循口頭規則的話,那就是下面的場景:將軍1對其他8個將軍發送了信息,然後將軍2~9將消息進行轉達(廣播),每個將軍都是消息的接受者和轉發者,這樣一輪下來,總共就會有9×8=72次發送。這樣將軍就可以根據自己手中的信息,選擇多數人的投票結果行動即可,這個時候即便有間諜,因為少數服從多數的原則,只要大部分將軍同意攻打拜占庭,自己就去行動。
這個方案有很多缺點:
1.首先是發送量大,9個將軍之間要發送72次,隨著節點數的增加,工作量呈現幾何增長。
2.再者是無法找出誰是叛徒,因為是口頭協議,接受者不知道轉發信息的轉發者是誰,每個將軍手裡的數據僅僅只是一個數量的對比:
這里我們假設有3個叛徒,在一種最極端的情況下即叛徒轉發信息時總是篡改為「不進攻」,那麼我們最壞的結果就如上圖所示。將軍1根據手裡的信息可以推出要進攻的結論,卻無法獲知將軍裡面誰是叛徒。
這樣我們就有了方案二:書面協議。
書面協議即將軍在接受到信息後可以進行簽字,並且大家都能夠識別出這個簽字是否是本人,換種說法就是如果有人篡改簽字大家可以知道。書面協議相對比口頭協議就是增加了一個認證機制,所有的消息都有記錄。一旦發現有人所給出的信息不一致,就是追查間諜。
有了書面協議,那麼將軍1手裡的信息就是這樣的:
可以很明顯得看出,在最壞的一種情況——叛徒總是轉發「不進攻」的消息之下,將軍7、8、9是團隊里的叛徒。
這個方案解決了口頭協議里歷史信息不可追溯的問題,但是在發送量方面並沒有做到任何改進。
在我們的示例中,比特幣系統里的每個用戶發起了一筆交易,都會通過自己的私鑰進行簽名,用數學公式表示就是:
所以之前的區塊就變成了這樣:
這樣每一筆交易都由交易發起者通過私鑰進行數字簽名,由於私鑰是不公開的,所以交易信息也就無法被偽造了。
如書面協議末尾所說的那樣,書面協議未能解決信息交流過多的問題。當比特幣系統中存在上千萬節點的時候,如果要互相廣播驗證,請求響應的次數那將是一個非常龐大的數字,顯然勢必會造成網路擁堵、節點處理變慢。為了解決這個問題,中本聰乾脆讓整個10分鍾出一個區塊,這個區塊由誰來打包發出呢?這里就採用了工作量證明機制(PoW)。工作量證明,說白了就是解一個數學題,誰先解出來數學題,誰就能有打包區塊的權力。換在拜占庭將軍的例子中就是,誰先做出數學題,誰就成為將軍們裡面的總司令,其他將軍聽從他發號的命令。
首先,礦工會將區塊頭所佔用的128位元組的字元串進行兩次sha256求值,即:
這樣求得一個值Hash,將其與目標值相比對,如果符合條件,則視為工作量證明成功。
工作量證明成功的條件寫在了區塊鏈頭部的 難度數 欄位,它要求了最後進行兩次sha256運算的Hash值必須小於定下的目標值;如果不是的話,那就改變區塊頭的 隨機數 (nonce),通過一次次地重復計算檢驗,直到符合條件為止。
此外, 比特幣有自己的一套難度控制系統,使得比特幣系統要在全網不同的算力條件下,都保持10分鍾生成一個區塊的速率。這也就意味著:難度值必須根據全網算力的變化進行調整。難度調整的策略是由最新2016個區塊的花費時長與期望時長(期望時長為20160分鍾即兩周,是按每10分鍾一個區塊的產生速率計算出的總時長)比較得出的,根據實際時長與期望時長的比值,進行相應調整(或變難或變易)。也就是說,如果區塊產生的速率比10分鍾快則增加難度,比10分鍾慢則降低難度。
PoW其實在比特幣中是做了以下的三件事情。
這樣可以防止一台高性能機器同時跑上萬個節點,因為每完成一個工作都要有足夠的算力。
有經濟獎勵就會加速整個系統的去中心化,也鼓勵大家不要去作惡,要積極地按照協議本來的執行方式去執行。(所以說,無幣區塊鏈其實是不可行的,無幣區塊鏈一定導致中心化。)
也就是說,每個節點都不能以自身硬體條件去控制出快速度。現在的比特幣上平均10分鍾出一個塊,性能再好的機器也無法打破這個規則,這就能夠保證 區塊鏈是可以收斂到共同的主鏈上的 ,也就是我們所說的共識。
綜上,共識只是PoW三個作用中的一點,事實上PoW設計的作用有點至少有這么三種。
默克爾樹的概念其實很簡單,如圖所示
這樣,我們區塊的結構就大致完整了,這里分成了區塊頭和區塊體兩部分。
區塊鏈的每個節點,都保存著區塊鏈從創世到現在的每一區塊,即每一筆交易都被保存在節點上,現在已經有幾百個GB了。
每當比特幣系統中有一筆新的交易生成,就會將新交易廣播到所有的節點。每個節點都把新交易收集起來,並生成對應的默克爾根,拼接完區塊頭後,就開始調整區塊頭里的隨機數值,然後就開始算數學題
將算出的result和網路中的目標值進行比對,如果是結果是小於的話,就全網廣播答案。其他礦工收到了這個信息後,就會立馬放下手裡的運算,開始下一個區塊的計算。
舉個例子,當前A節點在挖38936個區塊,A挖礦節點一旦完成計算,立刻將這個區塊發給它的所有相鄰節點。這些節點在接收並驗證這個新區塊後,也會繼續傳播此區塊。當這個新區塊在網路中擴散時,每個節點都會將它作為第38936個區塊(前一個區塊為38935)加到自身節點的區塊鏈副本中。當挖礦節點收到並驗證了這個新區塊後,它們會放棄之前對構建這個相同高度區塊的計算,並立即開始計算區塊鏈中下一個區塊的工作。
整個流程就像下一張圖所展示的這樣:
簡單來說,雙花問題是一筆錢重復花了兩次。具體來講,雙花問題可分為兩種情況:
1.同一筆錢被多次使用;
2.一筆錢只被使用過一次,但是通過黑客攻擊或造假等方式,將這筆錢復制了一份,再次使用。
在我們生活的數字系統中,由於數據的可復制性,使得系統可能存在同一筆數字資產因不當操作被重復使用的情況,為了解決雙花問題,日常生活中是依賴於第三方的信任機構的。這類機構對數據進行中心化管理,並通過實時修改賬戶余額的方法來防止雙重支付的出現。而作為去中心化的點對點價值傳輸系統,比特幣通過UTXO、時間戳等技術的整合來解決雙花問題。
UTXO的英文全稱是 unspent transaction outputs ,意為 未使用的交易輸出 。UTXO是一種有別於傳統記賬方式的新的記賬模型。
銀行里傳統的記賬方式是基於賬戶的,主要是記錄某個用戶的賬戶余額。而UTXO的交易方式,是基於交易本身的,甚至沒有賬戶的概念。在UTXO的記賬機制里,除了貨幣發行外,所有的資金來源都必須來自於前面某一個或幾個交易。任何一筆的交易總量必須等於交易輸出總量。UTXO的記賬機制使得比特幣網路中的每一筆轉賬,都能夠追溯到它前面一筆交易。
比特幣的挖礦節點獲得新區塊的挖礦獎勵,比如 12.5 個比特幣,這時,它的錢包地址得到的就是一個 UTXO,即這個新區塊的幣基交易(也稱創幣交易)的輸出。幣基交易是一個特殊的交易,它沒有輸入,只有輸出。
當甲要把一筆比特幣轉給乙時,這個過程是把甲的錢包地址中之前的一個 UTXO,用私鑰進行簽名,發送到乙的地址。這個過程是一個新的交易,而乙得到的是一個新的 UTXO。
這就是為什麼有人說在這個世界上根本沒有比特幣,只有 UTXO,你的地址中的比特幣是指沒花掉的交易輸出。
以Alice向Bob進行轉賬的過程舉例的話:
UTXO 與我們熟悉的賬戶概念的差別很大。我們日常接觸最多的是賬戶,比如,我在銀行開設一個賬戶,賬戶里的余額就是我的錢。
但在比特幣網路中沒有賬戶的概念,你可以有多個錢包地址,每個錢包地址中都有著多個 UTXO,你的錢是所有這些地址中的 UTXO 加起來的總和。
中本聰發明比特幣的目標是創建一個點對點的電子現金,UTXO 的設計正可以看成是借鑒了現金的思路:我們可能在這個口袋裡裝點現金,在那個櫃子角落裡放點現金,在這種情況下不存在一個賬戶,你放在各處的現金加起來就是你所有的錢。
採用 UTXO 設計還有一個技術上的理由,這種特別的數據結構可以讓雙重花費更容易驗證。對比一下:
❹ 「雙花」是什麼
POW演算法是唯一經過時間檢驗運行較為穩定的演算法,這從比特幣誕生到現在的較穩定的運行就可以看出。
上次說到POW的共識演算法的部分運作原理。把上次所講的內容簡單總結一下,那就是POW通過哈希加密演算法解決了「憑什麼幫你記賬」的問題。
其實,POW共識演算法的目的,是可以保證任意節點被入侵、篡改,其數據信息不會被其它節點所接受,換句話說,POW要通過運行機制保障主鏈的安全性。
因此,僅僅解決「憑什麼幫你記賬」的問題對一個成熟穩定的共識演算法來講還是遠遠不夠的,它還需要解決其它一些問題,比如雙花問題。
雙花問題(Double Spending)即雙重支付,是指一筆數字現金在交易中被重復使用的現象。我們都知道,數字現金的走向只能是線性的,也就是同一筆錢一次只能轉給一個人,不能同時轉給兩個或者以上的人。一旦數字現金的走向發生了偏差,離開了線性軌道的約束,成為發散狀態,那麼雙花問題就會出現。
舉個例子,小明一早出門只帶了10元錢,他來到肯德基吃早餐,點了10元的套餐,把錢付給了肯德基的收銀員,這10元錢得到收銀員的確認。小明吃完早餐出門,發現自己並沒有吃飽(小明飯量有點大),抬頭一看有個麥當勞,於是他走進麥當勞,想再點一個10元的漢堡。這時候,如果小明想用之前買肯德基套餐的那10元錢買麥當勞漢堡,可能嗎?當然不可能。因為那10元錢是獨一無二的(有編號),已經被花出去了。
但如果小明使用的不是現金,而是數字貨幣呢?這就另當別論。這是因為現金的復製成本太高(法律成本、製作成本等等),而數字貨幣則不然,它具有十分經濟的可復制性,使得系統可能存在同一筆數字資產因不當操作被重復利用的問題。
雙花問題在有中介的前提下是不容易發生的,因為每次消費都要經過第三方(中介方)的確認才會完成,比如支付寶。
而比特幣作為一個去中心化的點對點現金系統,是沒有中介和第三方的,它主要依靠未花費的交易輸出(UTXO)和時間戳兩大利器來解決雙花問題。
未花費的交易輸出(UTXO)可以被簡單地理解為一個用戶擁有的比特幣的余額。這個余額是無法偽造的,因為一個用戶擁有的比特幣實際上會被當作UTXO分散到數百個交易和數百個區塊中。
雙花問題是這樣解決的:
首先每筆交易都要先確認對應的比特幣之前的情況,要檢查它是否存在於付款人的UTXO中。
其次,同一筆UTXO付出去,系統節點按照時間戳只會確認先接收到的那一筆。
最後,當兩筆時間上很近的交易被不同節點確認,區塊鏈將發生分叉。當其中一筆交易被6個節點確認後,它將獲得最終的確認,成為最長鏈。
本文僅供學習參考之用,不構成任何投資建議。
❺ 潛藏在貨幣流轉特性中的秘密,DCEP如何優雅地解決「雙花問題」
上一篇文章我們已經談過,賬戶體系可以完美地解決數據作為貨幣會產生的雙花問題,但由於這種賬戶機制,會使得貨幣的流轉喪失並行的特徵,很難在一個獨立的系統當中容納大量的交易同時進行。
那麼,我們如何才能讓這些賬戶可以實現數據的並行化處理呢?
換一個思路來思考賬戶結構。
我們之前的賬戶體系當中,不同的用戶賬戶所記錄的是一個數字,我們利用一個數字來表示一個用戶手中所持有的貨幣的數量。但現在我們不再使用一個數字來表示賬戶的貨幣數額了,而是將每個貨幣都變為一個獨立的數據段記錄在賬本當中。
當用戶要進行交易的時候,只需要選擇一部分貨幣,並將這這些貨幣復制給新的用戶,同時將原本用戶手裡的貨幣標記為作廢即可。
假設張三的賬戶中存在著100張代表著一元的貨幣,每一個一元貨幣都有著獨一無二的編號,那麼當張三向李四轉移50塊錢的時候,張三隻需要在自己的賬戶當中選擇出這50張貨幣,告訴賬戶的管理者,我要把這50張貨幣轉移給李四。而賬戶的管理者在收到這樣的一個信息請求之後,他就會把這50張貨幣在賬戶當中標記為作廢。與此同時,在李四的賬戶當中產生50張新的一元貨幣。
這種處理方法也就是現在所謂比特幣UTXO結構所採用的一種方式。它的優點在於可以允許貨幣同時由多個賬戶轉向多個賬戶。交易過程中系統會自動加上時間戳,如果用戶用同一筆UTXO付給兩個人,系統中的節點只確認先接收到的那一筆。
然而,實際上比特幣的交易實現,並沒有採用 50 張一元這種做法,而是讓每一個貨幣都有自己的面額。
這也很好理解,因為既然貨幣是可以被生成和銷毀的,那麼為什麼不直接生成一張50元呢,更加簡單便捷。
在比特幣賬戶賬本中,貨幣是以一個字元串的形式來進行記錄的。每一個貨幣都有自己的獨立ID。這個ID是由UTXO交易哈希值與UTXO中的位置索引決定。
這種記賬方式的優勢在於交易邏輯清晰。它可以通過演算法分析出交易之間的依賴關系,並將可以實現一定程度上的交易並行化處理。
盡管並行化的問題得以解決,系統中也存在了真實貨幣的概念,然而用戶並沒有真實擁有這些貨幣,它們被存儲在區塊鏈上。
既然如此,為什麼我們不讓用戶 「拿著」 這些貨幣呢?
聽起來這似乎只是一個簡單的操作,只要將這個貨幣的數據記錄從我們的賬本上拿到用戶手中即可。
但這一個小小的變化,卻能使我們整個系統實現了質的飛躍。
實際上,這就是 DCEP 的設計邏輯。
讓用戶手中真實持有代表貨幣的字元串。這些字元串數據通過數字簽名技術進行簽名,保證貨幣確實由央行發行。
如此,整個DCEP體系擺脫了原有的賬本。體系中流轉的不僅僅是價值,而是現金。用戶的所有交易行為都會被表達為加密字元串的交換過程。通過這樣的方式,真正的實現了貨幣的流轉流程與現金的等價關系。
這種方式可以真正讓數字貨幣的流轉方式模擬了真實貨幣的流轉方式,與現有的任何一種賬本記錄的方式有著本質的區別。
在原本的賬本形式中,用戶所擁有的只是一個證明你身份的字元串,並不是現金。現金是被放在賬本管理機構手中的。換言之,用戶擁有的僅僅是貨幣的價值,而不是貨幣的物理屬性。用戶永遠不知道管理機構利用自己的現金做了什麼。
另外,生活中用戶也並不關注儲存在銀行中的貨幣的編號。他們只需要在使用時,考慮貨幣的面額即可。而這樣的設計會使得貨幣展現出與真實現金的不同特徵。
例如,賬戶中記錄的貨幣是可以被分割的,理論上這種劃分是可以無限進行下去的。賬戶系統中兩個相同的一元並無區別,他們都只是一個在系統中記錄的數字。
說到這里,不得不提及一個來自於區塊鏈行業的概念——NFT。
這個概念與銀行賬戶的價值記錄方式有所不同。它的全稱是非同質化代幣。
簡單來說,就是每一張貨幣都不一樣。如同現金,雖然兩張一百元貨幣的價值都是一百元,但是他們在物理上卻是不相同的。
現實中,每張真實的貨幣都是可以被任何人真實拿在手中的。錢的物理屬性與價值被統一管理。每張貨幣也都擁有一個唯一的編號,這個編號可以用於追蹤貨幣,同時也保證了貨幣本身的獨立性。每一張貨幣都是不可分的。我們不能把一樣百元大鈔撕成兩半,把其中的一半當作五十元來用。那麼,如果我們需要調整貨幣的面額,就要把手中的貨幣進行兌換。
以上這兩種系統的區別,本質上是現金與賬戶的區別。
從這個角度來講,DCEP的設計模式,說明了它就是一種真實的現金。
它的任何屬性,包括流通特性都與真實的現金是一模一樣的。
而在此基礎上,由於數據可以被遠程傳輸和管理,DCEP又比現金有了更大的優勢。
DCEP作為現金的一種表現形式,它的技術設計當然不可能是賬戶機制完成的。
盡管數字貨幣在到達用戶的手中後,可以實現貨幣流通的並行化,但是考慮到由於數據本身是可以被復制的,而用於保證DCEP真實性的數字簽名即使是在被復制之後,也能被正確的驗證,我們仍然需要解決數字貨幣「雙花問題」。
解決這種問題的方法就潛藏在現金貨幣的流轉特性中。
之前已經說過,每一張現金上都是存在一個唯一的編號。
事實上,這個編號就是解決DCEP雙花問題的關鍵。通過編號,我們就能很優雅地解決「雙花問題」。
「雙花問題」問題簡單來說就是,支付方已經將一筆錢付給接收方,但卻依舊擁有被轉移貨幣的支配權。換言之,這筆錢同時被兩個人所擁有了。
從這個角度上來講,避免貨幣「雙花」的核心點,就是保證同一時間,一個貨幣只能被一個人擁有。
在DCEP場景下,通過DCEP本身所具有的編號,我們就可以成功實現追蹤每一張貨幣的所有者。
因此,在 DCEP 體系下,解決問題的方式就是構造一個登記中心,記錄 DCEP 字元串編號與所有者身份編號的映射關系。
正如圖中所述的流程,當Alice向Bob發送一筆數字貨幣時,Alice先向Bob發送自己所擁有的數字貨幣字元串。同時 Alice 也會向數字貨幣登記中心通知,告知數字貨幣登記中心自己的這張貨幣0x001的所有權已經發生了轉移。數字貨幣登記中心會根據Alice所發送的數字簽名信息驗證Alice的身份,確保Alice真實確實是貨幣0x001的所有者的情況下,把這張貨幣的所有權記錄修改為Bob。
雖然我們使用了一個登記中心用於記錄所有貨幣轉移過程的身份變化,但是這個中心並不會限制整個數字貨幣的性能。因為數字貨幣的登記中心所管理的每一張貨幣都是相互獨立的,天然滿足成為 Stateless 的特性。在這個基礎上,整個系統是可以無限並行化擴展的,這也就意味著DCEP的核心系統理論上是可以對外提供無限擴展的高性能支持的。
至於Stateless,這是一個計算機術語。
Stateless的設計可以保證整個系統中不存在性能瓶頸。任何一個系統的設計只要滿足Stateless的特性,那麼這個系統的性能便可以被無限的擴展。
在整個數字貨幣登記中心系統中,每一張貨幣的所有權記錄都是獨立的,正如同真實的現金在社會中流轉的過程。
某種意義上,DCEP的設計目標是為了全國乃至全世界的貨幣流轉過程提供支持。這對整個系統的性能有很高的要求。
而DCEP所採用模擬真實現金流轉過程的技術方案,既能巧妙地解決數字貨幣可能產生的雙花問題,同時又藉助於貨幣流轉的並行化特徵,保證貨幣的流轉結算過程可以被完美地並行化處理。
無論從區塊鏈上加密貨幣的形態上來看,還是從實現的技術特性上來看,DCEP 的設計模式可以說是與區塊鏈完全不相同的設計模式。
本質上,區塊鏈無論採取什麼樣的形式,它都是一種賬本的形態,而 DCEP 的實現則是一種真實的現金。
顯然,DCEP 的設計更加符合數字貨幣這個場景的需求。
❻ 入門科普:什麼是雙花
想要了解區塊鏈,首先要熟悉區塊鏈相關的各種名詞。就比如我們今天講到的「雙花」,可能有人就要問,雙花是什麼花?哈哈哈,開玩笑,讓我們來學習一下什麼是「雙花」吧。
01
「雙花」是什麼?
雙重支付又名「雙花」,也就是雙重花費的意思。 舉個例子:如果我錢包裡面有100元,我可以去購買等值的物品。當我去商店後,發現台燈和桌子都是100元,那我只能買其中一樣東西。而我們所說的雙花問題,正好與之相反,同樣的100元,我可以購買兩樣東西。
在加密貨幣系統中,由於數據的可復制性,使得系統可能存在同一筆數字資產被重復使用的情況 ,這也稱之為雙花,又叫雙重消費攻擊。
02
雙花問題是如何發生的?
在區塊鏈系統中,雙花問題會在以下情況下出現:
1、由於共識機制導致區塊確認時間長,用一個數字貨幣去進行一次交易,可以在這筆交易還未被確認完成前,進行第二筆交易。
2、 控制算力來實現雙花 ,第一次交易被驗證通過並被記錄入區塊後,在該網路中有更高的算力驗證出新的更長鏈條,在該鏈條中這筆錢被第二次花費,由於第二次花費的區塊鏈條更長使第一次交易區塊所在鏈條為無效鏈條,這樣一來,第一次交易所在的區塊鏈被區塊鏈網路放棄,第一次花費的錢就又回到自己賬戶了,就導致了雙花問題。
03
比特幣如何避免雙花問題?
為了解決雙花問題,我們日常的數字資產使用依賴於第三方信任機構進行。這類機構對數據進行中心化管理,並通過實時修改賬戶余額的方法來防止雙重支付的出現。而作為去中心化的點對點價值傳輸系統, 比特幣通過UTXO、時間戳等技術的整合來解決雙花問題。
1、首先每筆交易都要先確認對應比特幣之前的情況,要檢查它是否存在於用戶的UTXO中。如果不在,那麼該交易會被系統拒絕。
2、如果用戶用同一筆UTXO付給兩個人,系統中的節點只確認先接收到的那一筆。
3、當兩筆時間上很接近的交易被不同節點確認,區塊鏈將發生分叉。剩餘節點選擇在他們認為的最長鏈上構建新的區塊。
4、當其中一筆交易被6個節點確認後,它將成為系統最長鏈,可以認為這筆交易獲得了最終的確認。
❼ 區塊鏈中的時間戳是什麼
為了防止雙花問題,系統會給每一個區塊的交易信息都自動加上時間戳,給它打上時間烙印,這個時間你花了多少錢,花了就是花了,已經記錄上了,不能再用它買別的東西了。
具體怎麼記錄的呢?其實還是通過計算,把時間戳和區塊上的其他交易信息,通過復雜的計算,得出一個加密數值,這個加密數值叫作「哈希值」,每一個新區塊都包含前一個區塊的哈希值,由此形成一條區塊鏈。
所以我們說:比特幣系統,實際上是一個層層嵌套、永不停歇的、非常強大的時間戳
系統,它利用的是時間戳,保證每一個區塊按照時間順序鏈接成「鏈」(也就是區塊鏈)。
從這里我們這樣理解,時間戳,字面意思是給區塊打上時間印記,它的實際作用在於:為之後計算哈希值提供一個重要參數,是計算和核對過程中一個必不可少、非常重要的信息。
最後,我們總結本節的內容。本節主要介紹了兩個名詞:UTXO和時間戳,這兩個概念呢,是解決「雙花問題」的重要手段,能夠保證比特幣可以在沒有第三方機構的情況下,不被多次使用。
❽ 小巴成長記-比特幣的技術來源
我們經常說比特幣具有去中心化、不可篡改、不可偽造等特點。這是為什麼呢?當然下面的文字其實並沒有看起來那麼嚇人,姑且從三個方面來講講,你也要耐著性子聽聽吧。
1、非對稱加密是比特幣去中心化的來源
中心化是需要一個類似銀行的中心機構來驗證交易的。去中心化本質上是讓所有的節點都能驗證交易的真偽,中本聰用了非對稱加密的技術來解決中心化的問題。
非對稱加密技術是什麼?是指加密和解密的時候使用不同的密鑰的加密演算法。比如:A要向B發送信息,A和B都要產生一對用於加密的公鑰和私鑰顧名思義,私鑰就是不能公開的,公鑰就是要公開的。A發送信息給B時,A就用B的公鑰對信息加密,B收到後,B用B的私鑰解密A的消息,而其他所有收到這個信息的人都無法解密,因為只有B才擁有這個私鑰。
簡單的說,公鑰和私鑰在非對稱加密機制里是成對存在的,公鑰和私鑰可以去相互驗證對方,我們可以把地址理解為公鑰,把簽名輸密碼的過程理解為私鑰的簽名。每個礦工在拿到一筆轉賬交易時,都可以時都可以驗證公鑰和私鑰到底是不是匹配的,如果是匹配的,這筆交易就合法。這樣,我們每個人只需要保管好自己的私鑰,自己的公鑰和對方的公鑰就可以安全地進行轉賬,不需要中心的機構來驗證對方發來的比特幣是不是真的。
2、工作量證明機制是比特幣不可篡改的技術來源
工作量證明 機制,是一種對在差不多時間內發生的事物的先後順序達成共識的一種演算法。監測工作的整個過程通常是效率非常低的,而通過對工作的結果進行認證來證明完成了一定工作的工作量,是一種非常高效的方式。比如我們日常中的各種證 駕駛證 學位證 結婚證就是這樣一種有結果獲悉完成工作量的證明。
工作量證明 的特點,對於執行方來說難度是適中的,對於驗證方來說是非常容易被驗證的。礦工們通過哈希計算,最先算出結果,獲得記賬權,其他節點經過非常簡單的驗證之後,就可以同樣其記賬,並同步賬本。打上時間戳後,緊接著進行下一輪計算。
如果這時候有人想把某個信息進行修改,他需要做什麼呢?他需要從這個區塊開始把之後所有的區塊都重新計算一遍,把賬本再同步給其他人。而在他進行計算的同時,其他礦工們已經在原來的的鏈上繼續往前進行計算了。因為在比特幣的網路里,大家認為最長的鏈才是正確的鏈。所以,這個惡意篡改的人,需要在很短的時間內趕上現有區塊的高度度,讓自己的這條鏈成為最長的鏈,並讓其他礦工誤以為自己的這條鏈是正確的,這基本上是一件不可能的事,除非這個惡意篡改的人擁有超強的算力,至少超過全網的50%。那麼我們來算算,現在全網的算力是8億哈希每秒,也就是每秒進行8乘10的18次方計算,現在市場上流行的主流礦機每台的算力是10T左右,如果你想擁有全網51%的算力,你最少需要40萬台最新礦機,如果按1萬元每台礦機計算,僅設備就需投入40億元人民幣,加上礦機的供不應求,老礦機算力下降,全網算力的不斷上漲等因素,如果不是為了60億以上的利潤回報並有強大的技術做支撐,一般人很難有這個動機和能力。
3、「UTXO」結構是比特幣不可偽造的技術來源
先問個問題,如果我發給你1個比特幣,你怎麼知道這個比特幣是真的而不是我偽造出來的,或者我已經同時轉給了其他人了呢,這就要說到UTXO結構了。
UTXO(Unspend Transaction Output)是個什麼鬼?意思是未花費的交易輸出。來個栗子,假設我要給你100元,其中有兩張張50元紙鈔,一張是隔壁老王給我的,另外一張是小賣部小麗找零給我的,拿到這兩張張鈔票我需要拿在手上並還未花出去時才能交易給你,這就是未花費的交易輸出。而通過這兩張鈔票往前追溯可以知道是誰交給了老王和小麗,並最終追溯到是由哪家銀行發行,什麼時候央行批准發行的源頭,比特幣里也有這樣一個原理。在比特幣世界裡的每一筆轉賬,都能夠追溯到上一筆交易。每一筆付款,都可以追溯到上一筆的收款。一直往上追溯到它誕生時礦工挖出來的那個區塊。
這個機制就保證了在比特幣網路里,比特幣是不可以偽造和重復交易的。在比特幣世界裡,重復支付被叫做「雙花」,就是花費了兩次的意思。
❾ 區塊鏈是什麼意思
區塊鏈(Blockchain)是由節點參與的分布式資料庫系統[1],它的特點是不可更改,不可偽造,也可以將其理解為賬簿系統(ledger)。它是比特幣的一個重要概念,完整比特幣區塊鏈的副本,記錄了其代幣(token)的每一筆交易通過這些信息,我們可以找到每一個地址,在歷史上任何一點所擁有的價值。
區塊鏈是由一串使用密碼學方法產生的數據塊組成的,每一個區塊都包含了上一個區塊的哈希值(hash),從創始區塊(genesis block)開始連接到當前區塊,形成塊鏈。每一個區塊都確保按照時間順序在上一個區塊之後產生,否則前一個區塊的哈希值是未知的。這些特徵使得比特幣的雙花(double-spending)非常困難。區塊鏈是比特幣的核心創新。
區塊鏈概念的出現,首先是在中本聰的比特幣白皮書[2]中提到的,但是以工作量證明鏈(proof-of-work chain)的形式而存在,以下是中本聰對區塊鏈概念的描述: 時間戳伺服器通過對以區塊(block)形式存在的一組數據,實施隨機散列而加上時間戳,並將該隨機散列進行廣播,就像在新聞或世界性新聞組網路(Usenet)的發帖一樣 。顯然,該時間戳能夠證實特定數據必然於某特定時間是的確存在的,因為只有在該時刻存在了才能獲取相應的隨機散列值。
❿ 在區塊鏈中,雙花問題是什麼問題呢
什麼是雙花問題呢?
雙花問題,簡單講就是一筆錢能被花兩次三次很多次。為什麼雙花問題會成為比特幣系統裡面一個這么重要的問題呢?
原因就在於:比特幣,是虛擬貨幣,它是虛擬的,通過代碼形式呈現出來的,是可以被復制下來的。一旦被攻破了代碼漏洞,那麼就可以循環使用同一筆比特幣,這樣一來,比特幣這種「錢」就會變得很雞肋。
我們想一下,要是一筆錢可以花很多次,你有500塊錢,你去買一件500塊錢的衣服,還能循環使用,再去買一雙500塊錢的鞋,這樣一來,錢還能叫錢嗎?
所以,中本聰在設定比特幣系統的時候,他所有的技術手段基本上都是圍繞著解決
「雙花問題」的,來保護比特幣作為一種貨幣,它自身的一個支付手段職能。
其實,這個雙花問題在我們現在的中心化世界裡面根本不是問題,因為有銀行,錢的交易結算都是通過銀行,很安全,有問題直接找銀行。
但是,在去中心化世界裡面呢,沒有銀行這樣一個中心機構,還必須保證一筆錢只能花一次,怎麼樣實現在去中心化的前提下,杜絕「雙花問題」呢,這是一個難題。
這里插一句,中本聰為什麼如此執著的追求「去中心化」呢,自找煩惱嗎?不是,他希望能夠通過去中心化,來解決一些社會問題,其中最主要的問題就是:因為權力機構過量發行貨幣造成的通貨膨脹。
所以,我們總結一下他的邏輯:中心化的貨幣增發導致通貨膨脹——所以我們要實現去中心化——去中心化要面臨很多問題,最大的問題是雙花問題——所以我們要解決雙花問題——怎麼解決雙花問題?
這里,中本聰就引入了UTXO和「時間戳」概念,依靠這兩種手段來解決雙花問題。