什么是数字签名?区块链共识指的是啥?用物理学理解共识机制

上一期視頻咱們把比特幣當中最基本的數學原理和各位做了一番介紹我們不難發現不論是基於橢圓函數的非對稱加密還是哈希函數這些都不是新鮮事物它們分別在自己的領域都已經有很成熟的應用了但一旦把它們結合在一起就有可能會碰撞出奇妙的火花今天咱們就主要來研究這麼兩個問題一個是如何交易以及數字簽名的數學原理另外一個所謂的共識機制到底是啥意思呢媽咪說 知識就是力量 下面開始正題到目前為止咱們賬號和密碼終於是創建完了現在就可以來搞事情了 就是看看都能幹點啥之前說了這個遊戲就能幹兩件事兒一個是交易
另外一個是打Boss挖礦的過程好咱們先來說交易生活當中的交易是什麼樣的過程呢?比如說我給你轉兩塊錢 那你就把卡號告訴我然後我去趟銀行一填單子 這事就成了可是這種交易有一個信任前提就是我們都相信銀行是不會轉錯賬的當我把銀行的回單發給你之後你即使不去查餘額也已經放心一大半了那可是假設沒有銀行呢?
比如說我給你寫了一張欠條「我欠你張三兩塊錢,一個月之後還清」寫完了 你拿走保證不食言你把欠條揣兜里肯定還是不放心萬一一個月之後這小子不承認了怎麼辦呢?所以你要求我需要在欠條下面簽上名按上手印 或者蓋個章這就是上期咱們說的我得證明這句話是我說的
不能抵賴可是呢簽了名之後你放心了 我又不放心了咋的呢 我怕你偷偷的在2後面加一個0然後你說我欠你20或者李四不小心撿到了這個欠條 把張三改成李四自己了把張三改成李四自己了那咱倆就都虧了
那怎麼解決這個問題呢?這件事就可以通過數字簽名來完成了比如說Alice發起一個申請說Alice想要轉給Bob5個比特幣怎麼對這句話進行簽名呢?首先 任何消息我們都可以把它們看成是數字因為只要編碼成二進制就是1010嘛這樣我們就可以把這串消息看成是數字m它就代表了這個轉賬申請的具體內容然後我們需要這樣兩個函數一個是簽名函數
一個是驗證函數所謂函數就是說只要我給定一個輸入那麼這個函數就會為我生成一個輸出結果簽名函數的作用就是我要證明這句話是我說的所以首先肯定得把這句話放進來然後再把我的身份放進來代表這是我簽的不是別人簽的那什麼可以代表我的身份啊?私鑰 因為私鑰不僅代表我的身份同時還代表我對這個賬號的控制權所以我們把Alice的私鑰也放進來OK了 sign函數就會輸出一個字符串這個內容就叫做消息的簽名它就和我們在紙上寫的姓名、按的手印起到的作用是一樣的好那現在就遇到剛才說的問題了就是你是可以證明這句話是我說的了但是我怕別人把這句話改了要做到防篡改
怎麼辦呢?上期咱們說了哈希函數剛好有這個作用啊內容稍稍有點不同 結果就會面目全非所以我們不對消息本身進行簽名了我要對消息的哈希值進行簽名這樣即便改動了一個字符那都不是我簽的了然後我就可放心的把這個消息m以及我的簽名這個Sign函數(的結果)還需要我的公鑰Pa把這三個東西一起發給Bobbob只需要把這三個內容放進一個驗證函數Verify里就可以了系統就會自動返回一個布爾值true or
false其中真值具有兩個含義第一 表示這個簽名的所有者和這個公鑰的所有者是同一個私鑰第二 表示這個簽名是對消息m的簽名 沒有經過篡改當且僅當一二都滿足時
則返回true 否則返回false注意這個整體邏輯啊下面呢 這兩個函數具體的實現原理同樣我們也給出一個簡化的版本不喜歡數學的同學可以跳過這一部分上期咱們只是說了個大概說Alice擁有自己的私鑰Ka和公鑰PaBob擁有自己的私鑰Kb和公鑰Pb發送的消息咱們假設就是m對於Sign函數它的實現原理是這樣的第一步 系統需要隨機再生成一對公私鑰K和P注意這對公私鑰不屬於任何人
只是為了計算使用的其實就是隨機生成私鑰K然後公鑰P的計算方法是和用戶是一致的就是K乘以基準點G第二步 我們需要把隨機公鑰P的x坐標單拿出來記作r第三步 計算這樣一個數s=K^-1(hash(m)+Ka*r)注意其中K^-1是K的逆元但是理解方式是一樣的 就是它和K相乘結果等於1這個式子各位可以不用管為什麼要這樣計算你只需要知道sign函數輸出的結果其實就是由(r,s)構成的二元數組就行了那驗證函數是咋回事呢?
需要計算這麼幾個數值第一 計算一個α使其等於s^-1hash(m)第二 計算一個β等於s^-1rr就是隨機公鑰P的x坐標第三 計算αG+βPa的值其中Pa就是Alice的公鑰注意驗證函數是其他人使用的所以其他人是有權獲得Alice的公鑰的
這個沒毛病我們來看這個值等於什麼=αG+βKaG把G提出來=(α+βKa)G再把α和β代進來所以這個式子就等於s^-1(hash(m)+r*Ka)G你看這部分和Sign函數是不是有點像啊?那我們來看這個式子等於啥我們把這個式子兩邊同時乘以K*s^-1於是就會得到K=s^-1(hash(m)+Ka*r)你看這不就是這個式子嘛所以這一堆等於啥啊?等於K*G 這是啥啊?
就是系統生成的隨機公鑰P啊所以Verify函數驗證的其實就是這個式子是否等於隨機公鑰P如果它等於P 則返回真 否則返回假或者說一旦這個消息m被篡改了或者簽名者的公鑰Pa不是同一個人那麼驗證就不能通過當然這只是基本原理實際情況需要用到模運算 咱們省去了但需要注意一點每一次調用簽名函數都會重新隨機生成一個私鑰K就是為了保證簽名者私鑰就是這個Ka的安全性好
那這一部分就說這麼多有了數字簽名技術我就不用怕錢轉到別人的手裏了你也不用怕我食言了這樣就解決了交易的信任問題那下面咱們就來說區塊鏈的共識是如何體現的隨着每一筆交易越來越多整體這個系統總得有個賬本吧而且為了做到去中心化賬本還需要是分佈式的所謂分佈式簡單說就是人手一份具體的實現方式其實就是各位常用的p2p技術peer to peer比如說電驢、BT種子你下載一個資源並不是從一個中心服務器下載的而是從你附近的節點下載的 這些節點都有資源這一點是比特幣系統的核心中本聰的論文名稱就是A
Peer-to-Peer Electronic Cash System一種點對點的電子現金系統這樣的好處就是實際上還是只有一套賬本只不過所有人隨着p2p同步更新之後這個賬本就被複製的人手一份了所以如果你想要修改賬本
你可以修改自己的但是沒用 很快又會和大多數賬本同步成一致的了這也算是一種防篡改的手段吧其次使用p2p的好處還有比如說剛才說的交易 Alice想要給Bob轉賬Alice簽名之後的消息是向全網廣播出去的所有節點都會參與到這個驗證的工作中來這樣一旦你的簽名有問題 或者說Alice餘額不足了那第一個收到這個請求的節點就自動把這個消息退回給Alice就不會再繼續傳播了
Bob也收不到了這都是p2p的好處但是那你一定會問 所有人的賬本是同步的那我電腦里的比特幣系統不會越來越大嗎?是的 就是會越來越大的我為了給大家演示特意同步了一下現在所有的區塊一共280多個G這裏面就包含了從09年開始比特幣的每一筆交易但是顯然一般的手機是裝不下這麼多數據的所以並不是所有人都需要下載全數據像這種下載了完整版的節點叫做全節點手機版的錢包或者其他網絡錢包都叫做輕節點這就像是有的遊戲你不用完全下載也可以玩但是如果想體驗全部功能畫質全開那麼就得全部下載了到這呢咱們又遇到一個問題就是這個賬本是有了
可是賬本是誰來記的呢?是所有人都記 還是指定的人來記 然後我們都同步他的另外一個問題賬本要記成什麼樣的是我整體就一套賬本從開始到現在
還是怎麼着首先 顯然不能所有人都記賬第一 我憑什麼記第二 如果所有人都記賬那必將導致每個人記錄的賬本很可能不一樣最簡單的每條交易的記錄順序很可能就不一樣那我最終的賬本以誰為準呢?
這就是所謂的不能達成共識其實這背後有一個計算機領域的深刻原理叫做FLP定理這是三個人的首字母簡單說就是對於一個分佈式系統而言是不存在可以達成共識的確定性算法的當然這只是理論層面所以其實在比特幣之前有很多人都在嘗試研究分佈式共識機制 直到區塊鏈出現了咱們先來設想生活中如果想要讓一些人達成共識該怎麼辦呢?一般我們的機制就是通過投票 少數服從多數那如果是兩個人呢?
那就通過說服 直到達成意見統一為止那你看這種事像不像是物理學裏邊的一個定律啊什麼啊?熵增定律每個人的觀點本應該是不一樣的 這是一個熵增的過程但是如果你想讓大家達成共識
那系統的熵就會必將減小注意啊我們說熵只增不減這是針對於封閉式系統來說的如果想讓熵減小也不是不行 怎麼辦呢?那就得需要外部做功就是你得組織人投票 或者浪費嘴皮子去說服這一點對於一個分佈式系統來說同樣適用比如說我可以投票選舉幾個有威望的節點
或者是股東節點讓他們來記賬 其他人都認可這種共識機制就叫做PoS(Proof of Stake)權益證明再比如說比特幣當中使用的共識機制就是簡單粗暴的你不是需要外部做功嗎?
那我乾脆就引入額外的算力 用算力來選舉記賬人這種機制就叫做PoW(Proof of work)工作量證明所以為什麼挖礦要浪費資源呢?
從物理學角度來看就會更加清晰了因為你想要熵減達成共識就必須有外部做功可是我如何心甘情願的讓一些人拿出資源拿出算力來競爭這個記賬的名額呢?很好辦 給點誘惑就行了比如說誰搶到記賬權就獎勵一定的比特幣這就是為什麼好多人擠破腦袋也要參與挖礦的原因這一切都是設計好的就是為了讓你浪費算力來對系統做功從而達成系統的共識好吧 時間關係下期我們再來看具體是如何達成共識的呢?
以及挖礦到底是怎麼一回事我是媽咪叔 一個較真兒的理工男下期見 拜拜