各位同學大家好 我是李永樂老師 經常有小朋友問我比特幣到底是什麽 我們準備通過兩期節目給大家介紹一下比特幣的基本原理 那今天我們首先來介紹一下挖礦到底是怎麽回事 比特幣是什麽呢 比特幣實際上是一種電子貨幣或者叫數字貨幣 它是基於密碼學的一種貨幣 這種貨幣跟我們以前用銀行卡裏面那個貨幣它不太一樣 它的出現是一種傳奇 在2008年的時候金融危機 2008年11月1日的時候有一個網絡極客 他化名叫中本聰 這個中本聰我們到目前為止也不知道他到底是誰 他在網絡上發表的一篇文章 這篇文章我們現在管它叫《白皮書》 全名叫比特幣一種點對點的電子現金系統 他在這個白皮書裏面提出了這樣一種構想 就是說我們可以設計一種去中心化的電子記賬系統 去中心化的電子記賬系統 我們在進行交易的時候最重要的一件事就是記賬 比如說我付給你多少多少錢 我要檢查我自己的銀行卡裏還有沒有這麽多錢 我付給你之後還剩多少錢這就叫記賬 那現在的記賬是誰來記呢 是銀行記 我們不管是用信用卡還是用這個支付寶或者微信都是銀行來記賬 我們信任銀行 因為銀行的背後是國家的信用 對不對 那麽這個中本聰就說 其實我們並不需要一種中心化的這個記賬系統 我們可以去中心化 每一個人的賬本都是讓別人去看 都是公開的 這就叫去中心化電子記賬系統 舉個例子來說 比如說有這麽幾個小朋友 這幾個小朋友分別叫A B C D 他們進行交易買東西賣東西之類的 那所以相互之間就要進行支付 支付的時候比如說有一次A先支付了10個比特幣給B 這件事情要記賬 記賬了之後你不能自己留著 因為你自己留著別人不信 所以你要把這個賬單要廣播出去要告訴所有人 所以說A把這賬單告訴B 告訴C 又告訴D 廣播到網絡上所有人 過了一會B也要進行支付 比如說B支付了5個比特幣給C 同時B把這個賬單告訴D 告訴A 再告訴C 然後這個C又支付 比如支付了2個比特幣給D 同時C也要把這個賬單告訴其余的所有的人 這樣 那麽這個賬單我們會把它進行打包 打包成一個塊 這個塊我們就叫它區塊 這一個區塊裏面它大小大概是一兆 我們可以存4000條左右的交易記錄 有時候多一點 有時候少一點 是取決於每一條記錄的大小 好了 這個塊打包完了之後 我們再把這個塊鏈接到以前的交易記錄上形成了一條鏈 就把這個塊接到以前的塊上 然後過一會再把新的塊接到它後面 就叫區塊鏈 就這麽回事 對吧 那好 我們有了這麽一個系統之後就要解決幾個問題 什麽問題呢 比如說賬單以誰為準 這就是一個問題 以誰為準 因為每個人的賬單可能是不一樣的 比如說A他可能會先記錄A把10個比特幣給B這件事 後記錄B把5個比特幣給C這件事 但是因為網絡的延遲效應 D這邊可能不是這樣 D的順序可能是先記錄的B付5個比特幣給C 然後A又付了10個比特幣給B 每個人的賬單可能不太一樣 你到底是以誰為準 第二個就是我們為何要記賬 憑什麽你廣播給我 我就要收著呢 憑什麽我要去花我自己的電腦資源 記錄一個跟我無關的這個賬目呢 對不對 為什麽要記賬 第二個問題 第三個問題就是如何防偽 什麽叫防偽呢 比如說B廣播的一條消息說A支付了10個比特幣給他 但實際上A並沒有支付給他 那這就是一個偽造的記錄 我們怎麽去防偽怎麽去防止篡改 之前的記錄我把它改掉這個怎麽辦 如何去防止篡改 還有很多很多其他的問題 比如說如何防止雙重支付 一個人同時發給兩個人10個比特幣 但它實際上一共就只有10個比特幣 還有就是如何進行保密 你這個信息都是公開的 那別人不就知道你有多少錢了嘛 怎麽去保密等等一系列問題 我們今天主要就研究前兩個 以誰的賬單為準 還有我為什麽要記賬 我們首先來說一下為什麽要記賬 記賬是因為記賬有獎勵 記賬的獎勵 那麽每一個比特幣系統中的這個用戶他都可以去記賬 如果他記了帳第一個他有手續費的收益 手續費什麽意思 就是A付10個比特幣給B的話 A必須要多付出那麽一點點 這一點點就是給這個打包的這個人 他記賬的這個人他的一個手續費 如果你要是用銀行卡的話其實也有手續費 而且還其實挺高的 那如果你用比特幣手續費就低了 這就是第一個他的收益 第二個他的收益就是打包的那個人 他有一個打包獎勵 打包的獎勵 只能是一個人打包 這一個人他會獲得獎勵 獎勵是多少 中本聰在2008年提出這個系統的時候 他設計了這樣一個方案 就是每十分鐘打一個包 每十分鐘打一個包 最開始這一個包會獎勵打包者50個比特幣 過了四年之後每打一個包會獎勵你25個比特幣 如果你要是再過四年就獎勵12.5 也就是每過四年之後它會減半 咱們來算一算比特幣一共有多少個 首先每過十分鐘你會打一個包 這一個包有50個比特幣的獎勵 一個小時六個10分鐘 可以打包六次 然後每天有24個小時 每年有365天 前四年的時候都是這樣 我再乘個四年 但是第二個四年就不是這樣 第二個四年會減半 所以我再乘個第一個四年 第二個四年會乘個1/2 第三個四年會乘1/2的平方 第四個四年(1/2)^3 這樣一直加下去 如果我們把都算出來 最後結果大概是2100萬個 也就是說這個比特幣一共就只有2100萬個 它是通過打包獎勵這種方式把它擴散出去的 就是這樣的一個問題 那正因為有的這個手續費和打包獎勵這兩條 所以大家都搶著去打包 你搶著去打包那以誰為準 下一個問題以誰為準 只能是一個人打包 以誰為準 只能是一個人打包 這個權利給誰 中本聰想到一個辦法叫工作量證明 這個工作量證明是什麽意思 就是說每一個參與的用戶他都要去做一個很難的數學題 這個很難的數學題你把它做出來了 那你就可以有權利進行打包 你如果要進行打包了 你就會獲得手續費以及打包獎勵 這個很難的數學題難到什麽程度 難到沒有任何一個人能夠直接通過腦子把它做出來 我們必須一個一個數去嘗試 直到你把它嘗試出來了 那麽你就獲得這個獎勵 所以這個過程我們就稱之為挖礦 如果你把這個數學題做出來了 你就獲得了這個打包的獎勵 而這個打包的獎勵就是幾十個比特幣 你就稱之為挖礦成功了 這就是挖礦的含義 那麽具體這個數學題到底是怎麽回事 咱們來往下繼續說 我們下面來講一下挖礦的具體原理是什麽 挖礦的原理 挖礦我們剛才說過它是做一個很難的數學題 但是這個數學題並不是看你腦子聰明不聰明 而是看你CPU的速度如何 因為沒有人能夠通過腦子把它算出來 大家的方法只能是一個一個試 具體的原理是什麽 首先我們回憶一下 以前我們曾經講過一種叫做哈希函數的東西 這個哈希函數它的意思呢也可以叫數字摘要或者散列函數 它的意思是說我們可以把一個字符串通過一定的運算 轉化成一個摘要的形式 而且你正著算比較容易 反著算很難 比如說哈希算法裏面有一個很著名的哈希算法叫SHA256 SHA256這是美國國家安全局發明的一種算法 如果我把一個字符串輸入到這個SHA256函數裏邊 比如這個字符串叫apple apple輸出了多少呢 輸出的是一個二進制數 這個二級數有256位 比如說101011010… 沒有什麽規律 一共有多少位呢 一共有256位 所以就叫SHA256 而且這個算法就是不管你前面輸入的是什麽 那後面它結果都是256位的一個二進制數 你把一個10個G的電影放進去 它最後輸出的還是256位的數 而且如果你改一點點它這個數字都不一樣 比如我在apple這我加一個點 多了一個點 最後這每一位的數字都有可能會發生變化 這就是它的一個特點 而且哈希算法的難度就在於它正向… 有趣之處 它正向算比較容易 正向算比較容易 但是它反向算非常的困難 這就是它算法的一個特點 我們舉個例子比如說有這麽一個函數 就是x^3+log2(x)+sin(x)=y 我是舉個例子 你給我一個x讓我算出y來 其實這個並不難 但是你給我一個y問我x是幾 這就很困難 哈希函數比這個還要復雜得多所以它反算基本上是不可能的 我們只能怎麽辦 我們只能一個一個去試 假如你告訴我一個結果 你問我什麽結果是這個 那我就只能一個一個試 一直把它試出來為止 這個就是哈希算法的一個基本的問題 那麽這個挖礦其實就是基於這個SHA256的這麽一個運算 我們來說一下挖礦的具體的原理是什麽 剛才我們說到這個區塊鏈其實是一大堆的交易信息 一大堆的交易信息 比如說這個區塊鏈已經鏈接到了某一個位置 從最開始第一個塊開始鏈 一直鏈 鏈到了某一個位置 這是目前的情況 這個塊裏並不只有交易信息 它實際上是有一個塊的頭部 有一個塊的頭部 還有它裏邊有一些內容 這個內容其實就是信息 就是我們交易的這個記錄賬單 現在有很多的人說我現在都想進行打包 為什麽呢 因為打包有獎勵還有手續費 每一個人都有自己的一個賬單 這個賬單是他收集了周圍一大堆人造成的賬單 每一個人都拿著賬單準備去網上接塊 但是在接塊的時候他必須要算一個數學題 什麽數學題呢 首先它會有一個字符串 它會有一個字符串 這個字符串裏邊的內容非常多 但是我們說一些主要的 這個字符串包含哪些內容呢 首先包含目前的這個塊 目前已有的這個塊 也就是前塊 這個前塊的頭部 這個前塊的頭部 這是第一個部分 第二個部分就是它現在已經有了這個賬單的信息 你已經有打包好的這個賬單的信息 還有比如說像時間之類的 時間戳之類的 還有一大堆亂七八糟的 然後還有一個很重要的就是有一個隨機數 這是你的一個字符串 現在你對這個字符串做兩次SHA256運算 它的哈希值等於什麽呢 等於SHA256 然後SHA256 然後字符串 你把這個字符串做兩次這個哈希運算 這個速度其實非常快 你一下子能算出來這個數是幾 但是你算出來之後會發現它是一個256位的數 這個256位的數我們要求什麽呢 要求它的前n位必須是0 比如說你算出來的這麽個數 這個數結果是00000000… 比如說有這個九個0 這有九個0 然後後面是什麽1011…..1 一直到最後一共有256位 你算出這麽一個數來 假如我的要求就是前九個位數是0 那你就算對了 你就算對了 你算對了你就有資格去打包 你就有資格打包的意思是說 你要把你算出來的這個哈希值 作為一個新塊的頭部 然後你算出來這麽一個數 對吧 然後作為一個新塊的頭部打一個包 打完了這個包之後再把你這個包幹嘛 接到後面去 於是你就接出一個新塊來 接出個新塊來你就獲得了什麽 獲得了你想要的獎勵 就這樣 那麽我們怎麽能算出來前面這幾位都是0呢 就要改變一個內容 就是改變這個隨機數 其他的內容你是改不了的 對吧 所以你就改變這個隨機數 隨機數最開始從0開始 從0開始 0算一次 看看是不是滿足條件 不滿足好算1 1不行算2 2不行算3 它都是二進制的 你就不停這麽試 直到你把它試出來為止 而且大家要註意 每個人在計算的時候它的這個題目難度是不一樣的 為什麽呢 因為每一個人雖然前塊的頭部大家都一樣 但是你所打包的這個賬單可能是不一樣的 對吧 你的時間 開始時間可能是不一樣的 還有你的個人信息也是不一樣的 所以造成了這個隨機數大小不同 有人運氣好他第一個數就算出來了 那直接就打包起來了 對吧 有人運氣不好 他雖然計算能力強 算得好長時間最後也算不出來 不過平均來講是這樣的 誰的計算能力更強 誰就更有希望打包這個塊 誰就更有可能去挖到這個礦 就是這樣子的 你說大家為什麽拼命的去買這個礦機 對不對 好 那我們繼續往下說 說這個 我們有一個難度的設置 這個難度的設置 也就是這個n位 這個n是怎麽確定的 難度n的確定 顯而易見 前面的這個0它個數越多 這個問題它就越難 為什麽個數多就難 咱們想象說在這個問題中你不可能反算 只能是一個一個隨機去試 每一位上出現0的概率和出現1的概率各是50% 所以第一個是0的話 你概率是多少 概率是1/2 對吧 概率是1/2 第二位是0的話 概率多少 概率也是1/2 第三位是0 概率也是1/2 一直到最後一位是0 概率也是1/2 這樣乘起來結果得多少 得(1/2)^n 顯而易見 這個n越大 這個難度就越高 n越小難度就越低 對吧 那中本聰當時在設計的時候 就是保證每十分鐘 每十分鐘他需要出一個塊 需要出一個塊 然後打包幾千條信息 那怎麽去保證 就是調整這個n的難度 調整這個n的數字 我們舉個例子 比如說 比如說世界上有1萬臺礦機 1萬臺礦機 這個1萬臺礦機每一臺的計算能力是14個T每秒 也就是每秒鐘可以計算14T次哈希運算 14T是多少 1T是10的12次方 所以這個數是1.4×10^13次每秒 好 那麽十分鐘你到底能算多少次 咱們算一下 這個10分鐘應該是600秒 對吧 1.4×10^13 這是每一個礦機一秒鐘算的 再乘以10的4次方 這表示有1萬臺礦機 然後你還得乘以10分鐘大概是600秒 對吧 這個數字大概是8×10^19 也就是說十分鐘大家可以進行這麽多次運算 這麽多次運算 那我們再想一下 你如果概率是(1/2)^n 你想出來這個塊的話 你需要計算的次數就是2^n吧 你概率1/64的話 你出的這個塊平均你要算64次 同樣道理你算了這麽多次 對不對 那麽它大概相當於是2的多少次冪 我們可以通過計算發現 如果這個n等於66的話 這個時候你的出現概率 能夠算出概率是(1/2)^66 然後你平均需要算的次數 平均的次數就是2^66 大概也是8×10^19 所以在這種情況下礦機就會把難度設置成n等於66 第一個能夠算出來前66位全都是0的人 就成功打包這個塊 就成功地挖到了礦 你沒有辦法讓自己運氣變得更好 你能夠做得就是買更多的礦機 然後拼命的去挖礦 這樣你就有可能會得到這個比特幣 大概就是這樣一個原理 是吧 好 我們這次解釋的到底區塊鏈這個塊到底是怎麽形成 但實際上還有很多問題沒有解決 比如說我們如何去防止這個雙重支付的問題就沒有解決 我們還沒有解決說我們怎麽防止偽造的問題 那這些問題我們會在下一回再給大家做介紹 大家如果喜歡我的視頻 可以在西瓜視頻和YouTube帳號李永樂老師裏關註我