1. 程式人生 > >林大師講區塊鏈之價值轉移

林大師講區塊鏈之價值轉移

在網際網路的世界裡,我們可以很方便快速的生成資訊,並且將其輕易複製到任何一個地方,所有的資訊在網際網路上都是可以高效傳播的,也正是因為如此,隨著網際網路的高速發展和普及,我們進入到了一個資訊爆炸的時代。而為了滿足人們對各種爆炸式資訊的渴求,資訊傳輸技術開始遍地開花,並且不斷創新,比如我們常見的雲盤、斷點傳輸技術等等。

儘管因為網際網路的發展使得資訊的傳播更加的便捷和快速,而且很多資訊僅僅是通過簡單的複製貼上就可以使用,比如網際網路上常見的音訊、視訊、圖片、文字等等。但是仍然有些資訊是沒有辦法複製的,甚至即使是複製了,也沒有任何實際的意義。比如我們支付寶錢包裡的錢,是沒有辦法直接複製給對方的,而是首先要在一個賬戶裡減去一部分的錢,在另一個賬戶裡才能增加一些錢,進而完成支付的過程。而一個視訊或者圖片則可以通過複製貼上到另外一個網站上,這個時候兩個網站都可以看到相關的內容。而且人和人都可以分享。像支付寶裡的錢這樣只能轉移無法分享的資訊往往需要一個信用背書,傳統的網際網路非常擅長新的處理,但是卻無法解決價值的轉移。

那麼,什麼是價值轉移?

比如想要將一部分的價值從A轉移到B,那麼就必然要求從A減少多少,B就增加多少。在整個轉移的過程中,涉及到A和B這兩個獨立的參與者,那這個過程就必然要求同時得到A和B的認可,而且最終的結果還不能受到A和B任何一方的操控,目前的網際網路協議是不支援這種價值轉移的功能的,因此目前的價值無法直接進行傳輸,而是需要一箇中心化的第三方來做信用背書。現實中的第三方信用機構一般由一些政府組織或者一些大型集團公司來擔任。 參考:https://baijiahao.baidu.com/s?id=1601359028442729329&wfr=spider&for=pc

eg:小明在建設銀行轉賬200人民幣給小張,那麼這其中要進行的大致操作就是,銀行在小明的賬戶上減去200元,然後在小張的賬戶上加200元。其中銀行就是權威的中心化機構。

 

那麼,如果沒有中心化機構,那麼比特幣系統是如何在沒有中心化機構的情況下完成價值轉移的呢?又是如何防止假幣(電子現金領域稱為:雙花攻擊)的呢?

比特幣系統的交易流程簡化來說可以分為以下幾步:

  1. 1.某人發出交易請求

  2. 2.廣播交易請求到 P2P 網路

  3. 3.驗證,miners驗證交易正確性

  4. 4.多個交易組成一個區塊

  5. 5.新的區塊加入到一個已經存在區塊鏈中

  6. 6.交易完成

一筆交易=輸入+數額+輸出

如果 A 給 B 傳送一些比特幣,那麼這個交易就有三項資訊:

  • 輸入。這裡面記錄了最初 A 擁有的這些幣是從哪個地址轉給她的,假設她是從她的朋友 E 那裡得到的幣。

  • 數目。這個就是 A到底給 B轉了多少個比特幣。

  • 輸出。B 的比特幣地址。

  • 比特幣如何傳送呢?

  • 你需要兩個東西,一個是比特幣地址另一個是對應的私鑰。比特幣地址跟銀行賬號不一樣,你不需要簽署一堆檔案去申請,它們是隨機生成的,就是一串由字母和數字組成的字串。私鑰也是類似的一個字串,但是這個是要嚴格保密的。比特幣地址就好像一個透明的存錢罐,每個人都可以看到裡面有什麼,但是隻有擁有私鑰的人才能開啟它。

  • 當 A想要給 B 轉幣的時候,就用私鑰來簽署一段資訊,其中包括輸入,數目和輸出這三項前面已經提過的內容。這樣,資訊廣播到比特幣網路上,礦工就可以驗證這次交易,把交易加入區塊鏈中了。

在轉賬操作提交後,10分鐘的等待時間裡,都發生了什麼?

因為交易需要經過礦工的驗證確認之後才能寫到區塊鏈之中,所以你必須要等待一下,等待他們挖礦成功。

比特幣協議裡面設定了挖礦完成的大概時間是10分鐘。所以商家可能會等到你的交易所在的區塊被確認之後才會給你發貨。但是也有商家不會讓你去等,基於對你的一個信任,相信你不會在交易沒有得到確認之前有去拿同一筆錢花在別的地方。不過一般這隻適用於小額交易。

前面提到,比特幣沒有餘額,他是從過往的交易記錄裡找到足夠支付這筆交易的交易資訊,比如Jane 傳送給了 Alice 40個比特幣,Lucy 給了40個,Eve 給了20個,這些都是不同時間的不同的交易,他們並沒有被合成到 Alice 的一個錢包裡形成一個有100個幣的檔案,而是仍然作為獨立的各個交易記錄存在。

當 Alice 想要給 Bob 轉幣的時候,她的錢包就會找到幾個交易,讓它們的數額加起來正好是 Alice 想要轉的數目。 當然,很可能在 Alice 想要給 Bob 轉幣的時候,她沒有辦法找到幾個交易加起來正好是轉賬數額。也許她想要轉 30 個幣,但是錢包中根本沒有一個交易或是多個交易的和正好是這個數目。

同時,她沒有辦法把一個交易切割成小的數額。就是這樣,你沒有辦法切割一個大的交易成為多個小數額,每次都必須花掉整個交易。但是不用擔心,系統會給她把多傳送出去的幣作為找零還給你。

Alice 這時就可以把 Jane 給她傳送過來的兩個幣傳送給 Bob,這樣 Jane 就是“輸入”,Bob 就是“輸出”,“數額”是30個幣,這時 Alice 真正想要轉賬的數目。這樣,Alice 的錢包就會自動給她的這次交易建立兩個輸出:把30個幣給 Bob,剩下的30放到一個新的地址中,這個是找回的零錢。

 

如何防止雙花攻擊? 參考:http://www.sohu.com/a/225010836_100116865

在比特幣系統中本聰使用UTXO技術防止雙重支付。

先翻譯UTXO是什麼意思:

TX : Transaction 翻譯為:交易

O:Output 翻譯為:輸出 TXO : TX output 翻譯為:交易輸出比特幣系統中TXO包含一個value(價值)值和一段指令碼,該指令碼規定了誰有權使用這筆交易(比如需要私鑰簽名)。 UTXO:Unspent TXO 翻譯為:未花費的交易輸出比特幣系統規定:只有對“尚未使用過”的交易簽名才能是有效簽名。

我們通過之前的文章知道,比特幣系統中所有的每一筆交易資訊都以統一固定的機制以固定的時間戳被寫在區塊上。

我們把每一筆交易理解為一張匯款單,把比特幣系統上每個區塊比如成一本賬簿。那麼賬簿上就會貼滿所有每一筆交易的匯款單。每一筆交易的匯款單簡單理解就是UTXO。

說白了,UTXO就是一個數據結構,包含交易資料和執行指令碼(Pubkey s)。這個資料結構包含每一筆的交易資訊和未花費的交易輸出。

以現實的錢包舉例,一個錢包中有一個10元、1個5元,1個1元,一共16元。比特幣一個賬戶的餘額,也是根據這個賬戶UTXO計算的。

當花12元買東西時,可以把10元和5元拿出去,然後得到找零的3元, 那這個時候之前的10元和5元因為已經花出去了就不再是UTXO了,新找零的3元成為新的UTXO,再加上之前未動的1元UTXO,目前的餘額是4元。這次新的交易記錄在了新的區塊上,但沒有改變歷史區塊的資料。

比特幣使用前後連結的區塊鏈記錄所有交易記錄,當之前的UTXO出現在後續交易的輸入時,就會被檢查這筆交易的來源已經不在UTXO列表中,也就是說這筆錢已經被花過,這個UTXO已花費掉,不再是UTXO了。 如果你用同一筆UTXO構造了兩筆分別付給A和B的交易。那麼bitcoin-core客戶端(比特幣系統節點)的規則是隻轉發先偵聽到的那個。但至於哪筆交易會被包含進未來的區塊,則取決於礦工。

礦工的挖礦程式一般是定製開發的,礦工可以自主任意選擇這兩筆交易裡的一筆。比如有的礦工會選擇先看到的交易,有的礦工會選擇交易手續費更高的那個。

當這兩筆相矛盾的交易中的一筆被寫入區塊鏈,並且深度達到6後(6個確認後),可以認為這筆交易獲得了最終的確認。等待6個確認的情況下,比特幣是幾乎絕對不可能被雙花的。每筆交易都有若干交易輸入,也就是資金來源,也都有若干筆交易輸出,也就是資金去向。一般來說,每一筆交易都要花費(spend)一筆輸入,產生一筆輸出,而其所產生的輸出,就是“未花費過的交易輸出”,也就是 UTXO。所有的資金來源都必須來自前面某一個或者幾個交易的 UTXO,就像接水管一樣,一個接一個,此出彼入,此入彼出,生生不息,錢就在交易之間流動起來了。

 

其實比特幣系統曾經頁遭受過雙花攻擊,攻擊過程大致如下:  

 

 

名惡意礦工正在利用雙花漏洞從加密貨幣交易所竊取資金。

為了實施雙花攻擊,這名礦工獲得了至少51%的BTG網路總算力,這讓他能夠臨時控制BTG區塊鏈。即使在像BTG這樣的小型網路上,獲得這麼大的雜湊算力也是非常昂貴的,但他可以通過雙花攻擊來獲利。

在獲得對網路的控制之後,攻擊者開始向加密貨幣交易所充值BTG,同時也試圖將這些BTG傳送到他們控制下的錢包。通常情況下,區塊鏈僅把第一筆交易加上鍊來解決此問題,但現在攻擊者能夠撤銷交易,因為他們擁有網路的多數控制權。

因此,他們能夠向交易所充值後再迅速提幣,然後撤回初始交易,以便他們可以將原先存入的BTG傳送給另一個錢包。

bitcoin-gold-double-spend-51-percent-attack.jpg

涉及此次攻擊的比特幣黃金地址 來源:BTG Explorer

自從5月16日以來,涉及此次攻擊的比特幣黃金地址已收到超過388200個 BTG(絕大部分是它傳送給自己的交易)。假設所有這些交易都與雙花相關,攻擊者可能已經從交易所竊取了價值高達1860萬美元的資金。

最後一筆交易發生在5月18日,但攻擊者理論上可以恢復它,如果他們仍然有足夠的算力來獲得對區塊鏈的控制權。

比特幣黃金的開發者建議交易所可以通過將資金轉入客戶賬戶前增加確認次數來解決此類攻擊。區塊鏈資料表明,攻擊者成功逆轉了22個區塊,導致開發者建議將需要確認的次數提高到50個區塊。參考:http://www.bitcoin86.com/news/22846.html