區塊鏈深度學習系列|區塊鏈進階原理:轉賬

買賣虛擬貨幣

本系列內容包含:基本概念及原理、密碼學、共識演算法、錢包及節點原理、挖礦原理及實現。

轉賬流程

大家都知道,我們日常使用銀行卡進行轉賬的時候,一般需要填入戶名、對方的賬號、轉賬金額以及一些轉賬附言,接著輸入密碼以後,就把資金轉到對方的賬戶了。

那這個流程背後的整個系統是如何運轉的呢?

假如張三在招商銀行開的戶,他要將一筆資金轉到李四在工商銀行的開戶行。

那麼張三提交轉賬申請後,其轉賬卡所在招商銀行支行,驗證了使用者名稱和密碼以後,會將這筆交易提交給招商銀行的總行,然後由招商銀行的總行將這筆交易,傳送給中國人民銀行大額或小額的支付系統。

最後,這筆轉賬交易到達了李四開戶的銀行工商銀行總行,並逐級向下,最終到達李四開戶的網點支行。

區塊鏈轉賬系統又是如何運轉的呢?拿比特幣系統來說,它是一種點對點的電子現金系統,我們具體看一下整個過程是如何運轉的,大家看一下比特幣白皮書中的流程圖。

假如張三需要向李四轉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 轉換成接收地址呢?

我們將在下期進行解答

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;