本文首發於深刻淺出區塊鏈社區 原文連接:比特幣全部權及隱私問題-非對稱加密應用原文已更新,請讀者前往原文閱讀python
比特幣系統是如何肯定某個帳戶的比特幣是屬於誰的?誰能夠支付這個帳戶比特幣? 若是你對這個問題還不是很明白,那就一塊兒來看看吧。算法
咱們先來回顧下現實的銀行系統:json
同時銀行會對帳戶信息進行保密(這點其實不能保證)。數組
那麼比特幣如何在沒有第三方銀行的參與下,在確保隱私的同時如何肯定帳戶全部權的呢?安全
實際上比特幣的帳戶是用地址來表示,帳本上不顯示我的信息,轉帳是把比特幣從一個地址轉移到另外一個地址。 轉帳記錄如這樣:學習
{ "付款地址":"2A39CBa2390FDe" "收款地址":"AAC9CBa239aFcc" "金額":"0.2btc" }
接下來問題就變爲了 誰有權用某個地址進行付款。區塊鏈
支付和全部權 實際是同一個問題,若是此比特幣只有我能夠用來支付,那麼說明我擁有全部權編碼
比特幣的解決方案是,誰擁有某個地址的私鑰(若是徹底沒有加密概念的人,能夠簡單的把私鑰看成密碼),誰就能用這個地址進行支付。(因此私鑰必定保管好,若是私鑰泄漏,比特幣就可能丟失)加密
比特幣地址和私鑰是一個非對稱的關係,私鑰通過一系列運算(其中有兩次Hash)以後,能夠獲得地址, 可是沒法從地址反推獲得私鑰。code
地址: 2A39CBa2390FDe 私鑰: sdgHsdniNIhdsgaKIhkgnakgaihNKHIskdgal Hash(Hash(fun(sdgHsdniNIhdsgaKIhkgnakgaihNKHIskdgal))) -> 2A39CBa2390FDe
銀行系統銀行帳號和密碼是徹底獨立的,沒法互相推導,轉出時須要同時驗證帳號和密碼
仍是上面交易的例子:
{ "付款地址":"2A39CBa2390FDe", "收款地址":"AAC9CBa239aFcc", "金額":"0.2btc" }
只有擁有地址2A39CBa2390FDe的私鑰才能進行支付。
這個時候問題就變爲了,如何證實你擁有某個地址的私鑰(在不泄漏私鑰的狀況下)。
實際在簽名以前,會先對交易信息進行Hash運算獲得摘要信息,而後對摘要信息進行簽名。過程大概是這樣: 1.對交易進行hash, 獲得一個摘要信息(Hash值)
hash(' {"付款地址":"2A39CBa2390FDe", "收款地址":"AAC9CBa239aFcc", "金額":"0.2btc" }') -> 8aDB23CDEA6
2.用私鑰對交易摘要進行簽名(付款方在安全的環境下進行,以免私鑰泄密), 用代碼表示大概是這樣。
#參數1爲交易摘要 #參數2爲私鑰 #返回簽名信息 sign("8aDB23CDEA6", "J78sknJhidhLIqdngalket") -> "3cdferdadgadg"
在簽名運算以後,付款節點就開始在全網進行廣播:我支付了0.2btc到AAC9CBa239aFcc,簽名信息是3cdferdadgadg,大家來確認一下吧。
廣播過程其實是發信息到相連的其它節點,其它節點在驗證經過後再轉發到與之相連的節點,這樣的擴散過程。
廣播的信息包含了交易原始信息和簽名信息
其它節點在收到廣播信息以後,會驗證簽名信息是否是付款方用私鑰對交易原始信息簽名產生的,若是驗證經過說明確實是付款方本人發出的交易,說明交易有效,纔會記錄到帳本中去。 (實際還會驗證付款帳號有沒有足夠的餘額,咱們暫時忽略這點) 驗證過程實際是簽名過程的逆運算,用代碼表示大概過程是這樣的:
#參數1爲簽名信息 #參數2爲付款方地址 #返回交易摘要 verify("3cdferdadgadg", "2A39CBa2390FDe") -> "8aDB23CDEA6"
若是驗證輸出的信息和原始交易信息的hash一致,則驗證經過,記錄帳本,用代碼表示大概是這樣:
if(verify("3cdferdadgadg", "2A39CBa2390FDe") == hash('{"付款地址":"2A39CBa2390FDe", "收款地址":"AAC9CBa239aFcc", "金額":"0.2btc"}')) : # 寫入帳本 # 廣播 else: # donothing
你們能夠理解爲付款地址爲公鑰,簽名過程即爲用私鑰對交易摘要的加密過程,驗證過程爲用公鑰解密的過程(爲方便你們理解,嚴格來說是不許確的)。
上面爲了更好的理解,我對一些信息進行了簡化。
比特幣系統使用了橢圓曲線簽名算法,算法的私鑰由32個字節隨機數組成,經過私鑰能夠計算出公鑰,公鑰通過一序列哈希算法和編碼算法獲得比特幣地址,地址也能夠理解爲公鑰的摘要。
☛ 深刻淺出區塊鏈 - 系統學習區塊鏈,打造最好的區塊鏈技術博客。
☛ 個人知識星球爲各位解答區塊鏈技術問題,歡迎加入討論。
☛ 關注公衆號「深刻淺出區塊鏈技術」第一時間獲取區塊鏈技術信息。