本系列內容包含:基本概念及原理、密碼學、共識演算法、錢包及節點原理、挖礦原理及實現。
轉賬流程
大家都知道,我們日常使用銀行卡進行轉賬的時候,一般需要填入戶名、對方的賬號、轉賬金額以及一些轉賬附言,接著輸入密碼以後,就把資金轉到對方的賬戶了。
那這個流程背後的整個系統是如何運轉的呢?
假如張三在招商銀行開的戶,他要將一筆資金轉到李四在工商銀行的開戶行。
那麼張三提交轉賬申請後,其轉賬卡所在招商銀行支行,驗證了使用者名稱和密碼以後,會將這筆交易提交給招商銀行的總行,然後由招商銀行的總行將這筆交易,傳送給中國人民銀行大額或小額的支付系統。
最後,這筆轉賬交易到達了李四開戶的銀行工商銀行總行,並逐級向下,最終到達李四開戶的網點支行。
區塊鏈轉賬系統又是如何運轉的呢?拿比特幣系統來說,它是一種點對點的電子現金系統,我們具體看一下整個過程是如何運轉的,大家看一下比特幣白皮書中的流程圖。
假如張三需要向李四轉10個比特幣,
首先張三需要開啟自己的數字貨幣錢包,然後掃描或者輸入李四的錢包地址,接著張三填入需要轉賬的金額,以及選擇對應的手續費之後(手續費高低對應轉賬速度),最後輸入支付密碼,點選傳送,就完成了。
這整個過程和傳統轉賬的交易是很類似的,都是需要輸入對方的賬戶、轉賬金額以及支付密碼,然後點選傳送,最後資金到達對方賬號或錢包,交易完成。
區別
兩者之間關鍵是中間資金流轉部分的區別。
首先,張三的錢包透過其私鑰對交易進行簽名,錢包將簽名的交易廣播到所有這個錢包連線的比特幣節點上。
第二步,這些節點,廣播到比特幣的其他節點,所有節點都將對這個交易的合法性進行驗證。
第三步,如果這個交易是合法的,那麼這個交易將會放到待打包的交易序列中,也可以稱之為記憶體池或者交易池,列表中的交易被稱為未確認交易。
第四步,比特幣礦工會從節點中獲得待打包的交易,並開始構建下一個區塊,也就是挖礦。
第五步,當礦工挖出一個符合要求的區塊後,礦工會將這個區塊第一時間廣播給系統的所有節點。
第六步,所有節點對廣播過來的區塊進行驗證。如果驗證透過,將這個區塊新增到本地的賬本。
最後,李四的錢包連線到新的節點,新節點的區塊中包含了張三的轉賬資訊,這時李四就透過自己錢包就看到了這筆轉賬成功。
運轉原理
請大家思考兩個問題:
1.為什麼使用張三的私鑰進行簽名,就可以被全網的所有節點接?。
2.這筆交易中已經包含了張三簽名,也就是別人都有了張三的簽名,那是否後續別人也可以用這個簽名仿張三的簽名,把張三的資金偷走?例如模仿一張支票的簽名來偽造其它支票。
這裡就涉及到密碼學中的一個非對稱加密的相關知識,後續我們再詳細講解這部分的知識。今天主要簡單介紹一下非對稱加密演算法在這裡的用法。
大家常常聽到的加密演算法一般是對稱加密,也就是通訊雙方都具有雙重的鑰匙。
舉個例子,對稱加密就好比給一個門裝上鎖,只有有鑰匙的人才能開門,但是所有人的鑰匙都是一樣的,這就是對稱加密。
而非對稱加密與對稱加密最大的不同就是:通訊雙方不需要有相同的鑰匙。
就好比甲用了鑰匙A把門鎖上,乙可以用鑰匙B把門開啟,這兩把鑰匙對應非對稱加密中的私鑰和公鑰。
私鑰和公鑰是一一對應的,由私鑰可以產生公鑰,但是由公鑰不能反推回私鑰。
非對稱加密的流程。
1.傳送方生成公鑰和私鑰;
2.使用私鑰對資料進行簽名;
3.得到簽名後的密文;
4.將密文和公鑰傳送給接收方;
5.接收方透過公鑰對密文進行解密。
6.證明密文是經過傳送方的私鑰簽名的。
其實這裡就解答了第一個問題,因為張三使用私鑰對交易資料進行了簽名,同時全網都可以有張三的公鑰,透過公鑰和簽名就可以驗證交易的合法性。
我們再來看一下第二個問題。
如果李四收到了張三轉的10個比特幣,他是否可以把這個交易繼續廣播到比特幣網路中,從而不斷的從張三的賬戶中轉出10個比特幣呢?
這個答案是:肯定不行。我們可以看一下交易結構。
在每個比特幣交易結構中都包括:輸入(input)以及輸出(output)兩部分。
輸出中包括了收款方的資訊,比如上面的數量和鎖定指令碼。鎖定指令碼指定了接收者的比特幣地址,以及什麼情況下,這個比特幣可以被花費。
而上面的輸入,包括了前序交易的ID,前序交易的序號決定了輸入在交易中排第幾,以此解鎖指令碼。
前去交易的這些資訊被稱為 UTXO(未花費交易)。
由於每個 UTXO 只能被使用一次,所以即使張三需要繼續給李四轉10個比特幣,由於前面的input已經變化了,所以簽名內容也會完全不同。從而,即使相同的交易,也不能被重複的廣播到比特幣的網路中。
我們繼續看一下 UTXO,有人可能會問,如果我這一個 UTXO 都用完了,後面我怎麼轉賬呢?
其實我們日常生活中大家常用的,比如說銀行、支付寶、微信這些,大家比較熟悉的是一個賬戶模型:我有一個賬戶,賬戶裡有一個餘額,我轉出多少,賬戶就剩多少,每個人有一個或者多個賬戶。
這種模型是大家非常容易理解的,但是 UTXO 模型與賬戶模型有很大的不同。
個人理解 UTXO 模型更像是支票,就好比在比特幣網路中是一張張比特幣支票在不斷的流轉,當有一筆比特幣轉入的時候,就產生了一個新的 UTXO,當向外轉賬的時候,錢包將會選擇一個足夠金額的 UTXO 作為交易的輸入。
然後將找零金額和找零地址,作為交易的輸出,構建在這筆交易中,當這筆交易被比特幣網路確認的時候,這個交易中使用的一個 UTXO 就失效了。
同時因為有一個作為找零的輸出,所以這個錢包就得到了一個新的 UTXO,就相當於又得到了一個新的支票。
由於前面的 UTXO 已經失效了,所以說對應的簽名肯定也是失效,因此也就不能被重複使用。
這裡問大家一個問題:既然我知道了張三的地址和公鑰,那為什麼不能從這個地址和公鑰反推回他的私鑰呢?
假如李四有張三的地址和公鑰以後,反推回張三的私鑰,李四不就可以把張三的錢花掉了嗎?是什麼機制保證保證了這個不可逆呢?
請往下看
公、私鑰的轉換過程
私鑰是透過橢圓曲線的演算法得到了公鑰,公鑰經過多次的雜湊運算,得到了這個公鑰的雜湊,之後再透過 Base58 的編碼得到了地址。
整個過程中,從私鑰到公鑰,以及公鑰到雜湊的過程資訊多次被壓縮,都是單向的,也都是不可逆的。所以說,透過公鑰的雜湊是無法得到公鑰的,也同時無法得到私鑰。
而私鑰從何而來的呢?私鑰其實就是一個隨機數。這個隨機數的範圍是1~2的256次冪,範圍大約是10的77次方。目前宇宙中可見的粒子大約是10的80次方。
拿比特幣來說,比特幣全網已經使用過的粒子,也就是全球的地址大約是2400萬,也就是10的8次方。大家可以想象一下這兩個空間之間數量級差了多少,所以說比特幣地址的空間是非常非大的,發生碰撞或重名的機會微乎其微。
有的朋友也聽說過一件事情,就是某一個人註冊了一個新的數字貨幣錢包,但是這個錢包建立完成以後,他看到這個錢包有過交易記錄。簡單的說就是他建立的這個個錢包曾經被別人使用過。
那是到底什麼情況會發生這種事情呢?
一種情況是真的發生了碰撞,就好像高能粒子對撞機,每幾十億次實驗就會發生幾個粒子的碰撞。雖然碰撞的概率非常小,但並不是不能發生。
另一種情況就是由於錢包開發者或供應方的原因,錢包的隨機數生成模組有問題,導致了錢包的隨機數空間非常小。這樣會指數級的提高發生碰撞的概率。
(後面我們會在錢包的分類應用中詳細的介紹這些知識。)
我們透過下面的圖來總結一下:
首先是私鑰產生一個隨機數;這個隨機數透過橢圓曲線的轉換得到公鑰;公鑰經過 SHA-256 以及 RIPEMD-160轉換得到公鑰雜湊;最後經過 Base58 編碼得到比特幣的地址。
大家可以看到從私鑰-公鑰-公鑰雜湊-地址這個流程,資訊被多次壓縮,除了最後一步 Base58 是可逆的以外,其餘只要資料壓縮,就會造成資料的丟失。所以說這個過程是絕對不可逆的,這也保證了數字貨幣的安全。
這裡大家可以預先思考一個問題:既然從私鑰到公鑰是不可逆的,那為什麼我們不使用公鑰來做數字貨幣的接收地址,而必須把公鑰轉成公鑰雜湊,之後再經過 Base58 轉換成接收地址呢?
我們將在下期進行解答