[toc]java
錢包在比特幣中是作什麼的呢?比特幣的交易又有什麼特色呢?怎麼才能僞造比特幣的交易呢?今天和你們一塊兒學習一下比特幣中的錢包和交易。git
以前咱們提到過比特幣使用的並非什麼新技術,只是對於老的技術好比:P2P網絡,分佈式系統,密碼學,共識算法的從新而又巧妙的應用。程序員
在錢包和交易生成驗證的過程當中,都須要使用到密碼學的計算。這裏咱們先介紹一下比特幣中會使用到的幾種密碼學技術。算法
更多精彩內容且看:spring
在介紹單向散列函數以前,咱們先了解一下什麼狀況下須要使用到單向散列函數。數據庫
若是你須要從國外的網站上下載一個軟件,可是由於種種緣由,國外的網絡太慢了,下載幾個G的數據幾乎是不可能的。恰好國內有鏡像網站,能夠從國內下載數據。可是如何保證國內的鏡像不是被篡改事後的呢?這個時候就須要單向散列函數了。通常來講網站會提供MD5或者SHA的值做爲驗證值。編程
單向散列函數有一個輸入和輸出。輸入稱爲消息,輸出稱爲散列值。安全
散列值的長度跟消息的長度無關,不論多少大小的長度的消息,都會計算出固定長度的散列值。網絡
hash算法有下面幾個特色:編程語言
這就意味着,若是僅僅是一點點的變更都會引發整個散列值的巨大變化。
由於散列值的大小是固定的,因此有可能會出現不一樣的消息產生相同散列值的狀況。這種狀況叫作碰撞。
難以發現碰撞的性質被稱爲抗碰撞性。當給定某條消息的散列值時,必須保證很難找到和該消息具備相同散列值的另外一條消息。
比特幣使用的散列算法是SHA256,他是安全散列算法SHA(Secure Hash Algorithm)系列算法的一種(另外還有SHA-一、SHA-22四、SHA-384 和 SHA-512 等變體),SHA是美國國家安全局 (NSA) 設計,美國國家標準與技術研究院(NIST) 發佈的,主要適用於數字簽名標準(DigitalSignature Standard DSS)裏面定義的數字簽名算法(Digital Signature Algorithm DSA)。
RIPEMD(RACE Integrity Primitives Evaluation Message Digest,RACE原始完整性校驗消息摘要),是Hans Dobbertin等3人在md4,md5的基礎上,於1996年提出來的。
非對稱加密算法也叫公鑰密碼算法,經過生成的公私鑰來對明文密文進行加密解密。
非對稱加密算法須要兩個密鑰:公開密鑰(publickey)和私有密鑰(privatekey)。公開密鑰與私有密鑰是一對,若是用公開密鑰對數據進行加密,只有用對應的私有密鑰才能解密;若是用私有密鑰對數據進行加密,那麼只有用對應的公開密鑰才能解密。由於加密和解密使用的是兩個不一樣的密鑰,因此這種算法叫做非對稱加密算法。
同態加密是一種加密形式,它容許人們對密文進行特定的代數運算獲得仍然是加密的結果,將其解密所獲得的結果與對明文進行一樣的運算結果同樣。換言之,這項技術使人們能夠在加密的數據中進行諸如檢索、比較等操做,得出正確的結果,而在整個處理過程當中無需對數據進行解密。其意義在於,真正從根本上解決將數據及其操做委託給第三方時的保密問題,例如對於各類雲計算的應用。
比特幣的全部權是經過數字密鑰、比特幣地址和數字簽名來確立的。數字密鑰實際上並非存儲在網絡中,而是由用戶生成並存儲在一個文件或簡單的數據庫 中,稱爲錢包。存儲在用戶錢包中的數字密鑰徹底獨立於比特幣協議,可由用戶的錢包軟件生成並管理,而無需區塊鏈或網絡鏈接。密鑰實現了比特幣的許多有趣特性,包括去中心化信任和控制、全部權認證和基於密碼學證實的安全模型。
比特幣錢包只包含私鑰而不是比特幣。每個用戶有一個包含多個私鑰的錢包。錢包中包含成對的私鑰和公鑰。用戶用這些私鑰來簽名交易,從而證實它們擁有交易的輸出(也就是其中的比特幣)。比特幣是以交易輸出的形式來儲存在區塊鏈中(一般記爲vout或txout)。
若是錢包只包含私鑰,那麼錢包地址是什麼呢?錢包地址是從公鑰的hash值的出來的,以下圖所示:
因此私鑰,公鑰和錢包地址的關係以下圖所示:
你們看到錢包地址1A1zP1eP5QGefi2DMPTfTL5TTmv7DivfNa有什麼想法呢?
確定有人在想,這麼一大長串字母和數字實在是太很差記憶了。能不能生產一個比較好記的錢包地址呢? 好比MyNameIsHanMeiMei....這樣開頭的地址呢?
固然能夠,這叫作靚號地址,只不過須要大量的算力才行。
簡單來講,交易就是告知全網:比特幣的持有者已受權把比特幣轉賬給其餘人。而新持有者可以再次受權,轉移給該比特幣全部權鏈中的其餘人。
注意, 在比特幣的世界裏既沒有帳戶,也沒有餘額,只有分散到區塊鏈裏的UTXO(Unspent Transaction Outputs)。
怎麼理解這個UTXO呢?沒有帳戶也沒有餘額,那麼錢包裏面的金額是怎麼計算出來的呢?
別急,讓咱們一一道來。
話說,在比特幣中,比特幣錢包間的轉帳是經過交易(Transaction)實現的。
咱們看一個標準的交易流程。
那麼問題來了,世界上第一個比特幣是哪裏來的呢?
答,是挖礦來的。好了,咱們的001交易表示的就是一個挖礦的過程,在這個交易中,輸入就是挖礦,輸出編號1,BTC數目是50,目的地址是A,表示這50個BTC給A了。
接下來,A想發25個BTC給B,怎麼構造這個交易呢?
一樣的,咱們須要一個輸入,這個輸入就是001交易的1號輸出,咱們用001.1來表示。輸出分爲兩個,第一個輸出編號1,表示要付25個BTC給B。第二個輸出編號2,表示剩下的BTC要還給A。
你們可能會問了,輸入是50BTC,兩個輸出加起來才45個BTC,好像還少了5個BTC?沒錯,這個5個BTC就是給礦工的挖礦所得。
接下來,A又繼續轉帳給C,一樣的道理,把一個一個的交易鏈接起來。
從上面的例子咱們能夠看到,實際上錢是存在一個一個的交易記錄裏面的,那些未被花費的輸出,就叫作UTXO(Unspent Transaction Outputs)。
那麼怎麼保證轉帳給B的錢,不會被其餘的人消費呢?這就涉及到交易的加密過程了。
咱們以單個輸入和輸出爲例來詳細瞭解一下交易的構成:
上圖中,交易的輸入就是txid,也就是以前生成的還有未花費暑輸出的交易ID。output index就是交易的輸出id。
一個很是重要的ScriptSig是輸入交易的驗證,代表這個用戶擁有這個帳戶的轉帳權限。
輸出是一個腳本,只有知足腳本運行條件的人才能花費這個output。這也就是ScriptSig須要驗證的腳本。
咱們看下腳本是怎麼作認證的吧。
比特幣的標準輸出形式有兩種。Pay To Public Key Hash (P2PKH) 和 Pay To Script Hash (P2SH)。二者的區別在於,一個是輸出到public key的hash,一個是輸出到任意的一個腳本輸出hash。
爲了保證輸出只能由特定的人來花費,通常的狀況下是直接輸出到對方的public key hash。因爲只有對方擁有的私鑰可以生成這個public key hash,也就是說只有對方纔可以對這個輸出進行驗證。
但每次都須要知道對方的public key hash仍是比較麻煩的,更簡單的作法就是,發送者直接輸出到一個特定的hash值就好了,只要對方可以生成這個hash就能夠。
下面的例子是一個P2PKH的腳本形式。
P2PKH的輸出是一個腳本,裏面一個重要的值就是PK hash。
怎麼驗證呢?
驗證方提供兩個值,一個是sig,一個是PubKey。由於比特幣的虛擬機是棧結構的,咱們先把這兩個值入棧。
而後調用OP_DUP對最上層的PubKey進行拷貝,而後調用OP_HASH160算法來計算Pk Hash,而後將發送方保存的Pk Hash入棧。接下來調用OP_EQUALVERIFY對兩個PK Hash進行對比。
若是對比成功,最後一步就是驗證Sig和PubKey是否匹配。
若是都成功,說明接收方的確是這個PK Hash的擁有者。那麼對方就能夠盡情使用了。
和馮·諾伊曼同爲現代計算機奠定人的阿蘭·圖靈(AlanTurin)在1950年提出了斷定計算機可否像人那般實際「思考」的標準,也就是著名的「圖靈檢驗」。
他設想一臺超級計算機和一我的躲藏在幕後回答提問者的問題,而提問者則試圖分辨哪一個是人哪一個是計算機。
圖靈爭辯說,假如計算機假裝得如此巧妙,以至沒有人能夠在實際上把它和一個真人分辨開來的話,那麼咱們就能夠聲稱,這臺計算機和人同樣具有了思考能力,或者說,意識(他的原詞是「智慧」)。
在可計算性理論裏,若是一系列操做數據的規則(如指令集、編程語言、細胞自動機)按照必定的順序能夠計算出結果,被稱爲圖靈完備(turing complete)。
比特幣腳本語言不是圖靈完備的,具備必定的侷限性,它沒有循環語句和複雜的條件控制語句。
本文介紹了比特幣的錢包和交易的概念,但願你們可以喜歡。
本文做者:flydean程序那些事本文連接:http://www.flydean.com/bitcoin-transactions/
本文來源:flydean的博客
歡迎關注個人公衆號:程序那些事,更多精彩等着您!