🚀 三句話總結

  1. 理解什麼是區塊練
  2. 理解區塊練使用的理論,這些理論實作的原理
  3. 理解區塊練是如何實現去中心並且是可靠的理論

☘️ 為什麼我要了解

因為去中心僅僅只是一連串簡單的東西合再一起,難度不高,其中很多隻是在軟體其他方面都會運用到,尤其是雜湊的運用,非常有趣。

🎨 改變了什麼

知道這一切的實作原理後,可以把一些概念運用在軟體上面,像是密碼儲存的方案,可以運用雜湊實現加密並且也能驗證對方的密碼是不是輸入正確。

✍️ 總結和心得

從古至今主流的交易系統都是採用「中心化」方式,但區塊鏈是採用「去中心化」方式。

中心化的交易系統,銀行就是中心化的代表,當你轉帳給家人時,你相信銀行記帳不會記錯,而你家人的帳本也會確實添加這筆紀錄,但一切都是你「相信」,你相信銀行背後的工作人員不會把1萬輸入成2萬,但萬一發生「雷曼兄弟事件」將會導致信任他的人血本無歸,所以區塊練的去中心化方式才會被廣為人知。

P2P帳本:

在區塊練世界中,沒有中心角色(銀行)幫你記帳,而是所有人手上都有數本記載著這貨幣從創始至今的所有交易帳本,而交易帳本在區塊練世界中名稱叫做「Block」,把從古至今的所有帳本鏈在一起稱為「區塊練」。

當有筆交易被記帳後,該筆交易內容就會透過廣播給所有人,而每個人都可以馬上核實你的金額是否足夠交易以及這筆轉帳是不是你本人發起的(電子簽章),如果都合法,就會添加到自己手上的帳本。

但這又引起其他問題。

  • 誰來記帳?
  • 如何確保帳本不會造假?
  • 如何確認這筆交易請求是妳本人的?

誰來記帳?

  1. 如果每個人都可以記帳,那如何確保大家帳本都一樣呢?
  2. 萬一記帳的人做假帳的話,那怎麼辦?
  3. 如果網路先後順序因為線路問題,導致接收順序不一致
    1
    2
    3
    4
    5
    6
    7
    8
    我有100元。
    我收到A 200元 // 100 + 200 = 300
    我付給B 300元 // 300 - 300 = 0

    // 如果順序顛倒
    我有100元
    我付給B 300元 // 100-300 = -200
    我收到A 200元 // -200 + 200 = 0
    解決方法是,記帳的人得採用某種方法讓所有人接受帳本,而這稱為「共識機制」,中本聰提出使用「POW」來形成共識機制。

POW (Proof-of-Work)

POW,就是用工作量去當作證明,假設有一個很難的題目,如果要回答出答案,就必須付出很大量的工作量,這就是POW的概念,而題目的設計就至關重要。

POW的技術原理就是「雜湊函數」,雜湊函數有個特性,

  1. 任意內容丟入該函數,就會輸出完全不一樣的二進制數據。
  2. 內容輕微的改動,輸出結果都會產生截然不同的二進制數據,且毫無規律。
  3. 沒有辦法從輸出的二進制數據反推輸入的內容。

SHA256演算法就是一種雜湊函數,

而題目就是:

誰先計算出隨機數誰就能記帳,並且隨機數要符合以下
SHA(上筆帳本) + 這筆帳本 + 隨機數 = 輸入內容,而SHA(輸入內容) = 前N個數字是0

  1. N是多少則是代表著「難度」,當前比特幣難度為76個0。
  2. SHA(上筆帳本)和這筆帳本為固定值。

PS:計算幾個0的工作,顯示卡是最擅長這方面的計算,所以顯卡價格才會居高不下。

難度控制與獎勵

中本聰認為難度不可以太難,不然沒有人記帳,但也不能太簡單不然到時候算力強的眾多人都可以記帳,所以中本聰希望每10分鐘就會有一個帳本被記賬,如果不到10分鐘就算出來,那麼下次N就會越大,而如果大於10分鐘以上才算出來,N就會變小,以此來動態調整難度。

  • BitCoin 第 10 筆 區塊內容

  • BitCoin 第 714660 筆 區塊內容

而為了讓大家有動力做題記帳,第一個算出來的人能獲得獎勵,並且可以在帳本上添加這一筆「獎勵訊息」,而計算過程我們又稱為「挖礦」,反之記帳的人就稱「礦工」。

而這個獎勵會根據已經打包的數量越來越少形成收斂

造就了總BTC的數量為:

這樣好處就像是政府不會在偷印鈔票,讓這貨幣變得更穩定。而且貨幣是固定的,這過程就像挖金礦一樣,故得名「挖礦」

而除了系統獎勵以外,還有小費機制(FEE),這是BTC的第 714660 筆區塊,交易發起人給予打包者小費為 0.017 BTC


而礦工們為了利益,也會優先選擇小費最高的交易請求,而小費低的交易請求則會放到「交易池」中直到天荒地老。

如何確保帳本不會造假和竄改?

還記得記帳人的目標嗎?

SHA(上筆帳本) + 這筆帳本 + 隨機數 = 輸入內容,而SHA(輸入內容) = 前N個數字是0

而帳本內容就是避免被竄改的關鍵。
帳本內容是由很多資訊組成,其中有交易內容以及「SHA(上筆帳本)」。這「上筆」就是精隨所在,如果你修改其中一個區塊的內容

1
2
3
4
5
Lucas Pay Jimmy 200 BTC

你將他改成

Lucas Pay Jimmy 500 BTC

那麼根據雜湊函數的特性,這會直接導致輸出完全不一樣,SHA(上筆帳本) 這東西就會完全不一樣
所以你必須算出新的輸出答案,而當你算完新答案後,把新答案寫入下一筆區塊,而下一筆區塊因為被變更,所以你又要算出新的輸出答案,依此類推。

PS:根據這特性,上一級區塊的輸出會是下一級區塊的輸入,我們稱為「鏈」,而帳本就是「區塊鏈」。

而區塊鏈的規則之一是,誰長聽誰的,如果攻擊者自己竄改了區塊串起了1萬塊區塊,那們當他廣播它的計算結果給所有人時,如果當前主鏈的長度比它短就會把攻擊者的1萬鏈當成主鏈。

但是除非攻擊者擁有這個區塊鏈的51%計算資源的話,不然他的計算長度永遠不會高過主鏈,因為大部分的人會在主鏈後續串接,而BTC的規模如果要擁有51%的計算能力,那金額數字就是天文數字,估計沒有任何一個人能實現這攻擊手法。

51%攻擊:

由於區塊鏈是誰長聽誰的,在BTC這種大規模很難實現,但如果是其他小幣參與者不多的「比特黃金」該幣就發生51%攻擊,攻擊者向交易所說「我要把100 比特黃金 買你的 1 比特幣」

  1. 攻擊者事先準備兩條「比特黃金鏈」,分別為真鏈和假鏈

    1
    2
    1. 真鏈:攻擊者 Pay 交易所 100BTG
    2. 假鏈:攻擊者 沒有Pay 交易所 100BTG
  2. 攻擊者把真鏈串在「比特黃金 主鏈」,交易所實拿 100 比特黃金

  3. 交易所根據約定在「比特主鏈」轉帳給攻擊者

    1
    1. 交易所 Pay 攻擊者 1BTC
  4. 而「比特主鏈」在打包完這個交易請求後

  5. 攻擊者立刻廣播事先準備的假鏈

  6. 因為假鏈比主鏈長,所以假鏈取代真鏈變成主鏈。

  7. 攻擊者則沒損失任何 BTG ,反而倒賺 1 BTC


由於攻擊者的算力高於全網的51%,所以只要攻擊者在假鏈後面串接,遲早有一天會假鏈能夠取代真鏈,變成主鏈。

怎麼知道這筆交易是由你提出的?

主要是使用加密方式來驗證這筆交易就是我提的,而這邊提一下關於加密一些知識點

對稱加密:

所謂對稱加密就是共用一套加密方式,舉例來說:
在第二次大戰時候,英國截獲了一則 納粹士兵寄給家裡的一封「家書」

1
2
士兵:媽媽,今天家裡煮了什麼?
媽媽:炸魚薯條。

這封看起來不起眼的信,但其中蘊含很深的意思,因為這是一封戰略信件,只是把一些詞替換了,替換成事先約定好的單字。

1
2
士兵:空軍總部,今天攻擊目標是誰?
總部:英國

由上述的關係我們知道,對稱加密就是提前約定好一個加密方式,像是

原文 譯文
媽媽 空軍總部
爸爸 陸軍總部
家裡煮了 攻擊目標
天氣如何 支援目標
炸魚薯條 英國
麥當勞 美國

而在軟體中要實現對稱加密,就必須先傳送給對方一個「對照表」,但是這操作非常危險,萬一在這過程有人竊聽到這「對照表」,別人可以冒充媽媽跟士兵對話。

所以針對上面提到的問題,我們可以使用非對稱加密方式實現。

非對稱加密:

主要使用這兩個東西實現。

  1. 私鑰
  2. 公鑰

私鑰是系統隨機生成的,一輩子都不會給別人看到的一串密碼。
公鑰則是透過私鑰生成的,其生成的演算法叫做:ECDSA(橢圓曲線算法)。

而這ECDSA算法非常複雜這裡不講述,但是就結論來說,透過這算法生成的公鑰具有兩點特色:

  1. 如果公鑰被別人竊聽,對方無法透過公鑰反推出私鑰。
  2. 透過公鑰加密的資料,可以透過私鑰反推出資料。

Ex:

1
2
319 = x * y
29 * 11 = 319 ?
  1. 請列出319中的x和y 有多少種可能
  2. 319是不是等於 29 * 11

上述第一題,非常難計算,你可能會花很多時間驗證,但是第二題,就非常好計算,所以類似這種:知道結果卻「很難反推」的情況,就是非對稱加密的核心。

而我們再舉一個例子,A要和B溝通,這時A和B都各自產生自己的「公私鑰」,他們溝通要怎麼溝通呢?

Ex:
A 對 B 說「我愛你」

  1. A => A私鑰 * B公鑰 = A私鑰 * B私鑰 * ECDSA演算法 = keyA
  2. B => B私鑰 * A公鑰 = B私鑰 * A私鑰 * ECDSA演算法 = keyB
  3. A => keyA * 「我愛你」 = 封包
  4. B => 封包 = keyA * Message
  5. 而keyB == keyA,所以B可以知道訊息就是「我愛你」

在上述A和B的 keyA 和 keyB 是不是完全一致,也就是說 A和B 通訊時候只用採用key 當作對稱加密,不就行了。

假如這時候有個竊聽者不懷好意,他冒充A跟B說「我討厭你」我們來看結果如何:

  1. C => C私鑰 * B公鑰 = C私鑰 * B私鑰 * ECDSA演算法 = keyC
  2. B => B私鑰 * A公鑰 = B私鑰 * A私鑰 * ECDSA演算法 = keyB

發現 keyB != keyC,於是這時候就抓包,你根本不是A,所以就預防了冒充人的問題。

數字簽章:

根據非對稱加密的原理,我們可以運用在數字簽章上,用於代表我對這份文件的簽名,也就是我對這筆交易的簽名

假設交易數據 M,我要對這筆交易做簽名。
M * 我的私鑰 = N
別人要驗證這交易是否真的為我所發出,於是檢查簽名數據 N
M * 我的公鑰 = M * 我的私鑰 * ECDSA
也就是說
M * 我的公鑰 = N * ECDSA
那麼我只要進行把 N透過ECDSA生成,就知道是否相等為M * 我的公鑰,相等即認可,不相等即偽造。


以上的相乘是群乘法,可以把它當作一種運算。