1. 程式人生 > >區塊鏈之比特幣篇(一)

區塊鏈之比特幣篇(一)

什麼是比特幣?
比特幣並不是真正的幣,而是一種虛擬的加密數字貨幣,是電腦裡一串虛擬的數字,由比特幣軟體通過一定的機制發行。比特幣並不存在於任何地方,即使是硬碟上。有人如果持有比特幣,那麼他們其實是擁有特定比特幣的地址,但是其實所謂的幣並不是直接就存在於這個地址中的,地址就相當於你的銀行賬戶。
如何像使用現金一樣使用比特幣呢?
答案是建立一筆交易。在一筆交易中,比特幣的所有者(比特幣的所有者是比特幣地址)將所有權轉移到一個新的比特幣地址。所有的交易只記錄資金的來源和去向。
一個交易長成啥樣?
一筆比特幣交易是一個含有輸入值和輸出值的資料結構,其中包含了將一筆資金從初始地址(輸入)轉移至目標地址(輸出)的程式碼資訊:版本規則、輸入&其數量、輸出&其數量、時間戳。
每一筆比特幣交易創造輸出,輸出都會被比特幣賬簿記錄下來。所有的輸出都能創造一定數量的可用於支付的比特幣(也就是UTXO)。這些UTXO會被整個網路所識別記錄,其所有者可在未來的交易中使用它們。給隔壁老王傳送比特幣實際上是創造新的UTXO,並且能被他用於新的支付。
由於比特幣採用的是 UTXO 模型,並非賬戶模型,並不直接存在“餘額”這個概念,餘額需要通過遍歷整個交易歷史得來。
比特幣中的交易過程是怎樣的?
需要兩個東西,一個是比特幣地址另一個是對應的私鑰。
比特幣地址是隨機生成的,就是一串由字母和數字組成的字串。比特幣地址就好像一個透明的存錢罐,每個人都可以看到裡面有什麼,但是隻有擁有私鑰的人才能開啟它。
私鑰也是類似的一個字串,但是這個是要嚴格保密的。
當 Alice 想要給 Bob 轉幣的時候,就用私鑰來簽署一段資訊。這樣,資訊廣播到比特幣網路上,礦工就可以驗證這次交易,把交易加入區塊鏈中了。
輸入和輸出中的數額不相等怎麼辦?
因為比特幣只是以交易記錄的形式存在,所以很多時候你的一個地址上面其實是對應很多個交易的。可能 Jane 傳送給了 Alice 40個比特幣,Lucy 給了40個,Eve 給了20個,這些都是不同時間的不同的交易,他們並沒有被合成到 Alice 的一個錢包裡形成一個有100個幣的檔案,而是仍然作為獨立的各個交易記錄存在。
當 Alice 想要給 Bob 轉幣的時候,她的錢包就會找到幾個交易,讓它們的數額加起來正好是 Alice 想要轉的數目。 當然,很可能在 Alice 想要給 Bob 轉幣的時候,她沒有辦法找到幾個交易加起來正好是轉賬數額。也許她想要轉 30 個幣,但是錢包中根本沒有一個交易或是多個交易的和正好是這個數目。
同時,她沒有辦法把一個交易切割成小的數額。就是這樣,你沒有辦法切割一個大的交易成為多個小數額,每次都必須花掉整個交易。但是不用擔心,系統會給她把多傳送出去的幣作為找零還給你。
Alice 這時就可以把 Jane 給她傳送過來的40個幣傳送給 Bob,這樣 Jane 就是“輸入”,Bob 就是“輸出”,“數額”是30個幣,這是 Alice 真正想要轉賬的數目。這樣,Alice 的錢包就會自動給她的這次交易建立兩個輸出:把30個幣給 Bob,剩下的10個幣放到一個新的地址中,這個是找回的零錢。
交易過程收費嗎?
交易手續費是綜合多種因素得出的。有些錢包可以讓你手動設定手續費。交易中那部分沒有被對方收到,同時也沒有找零回來的就是手續費。這筆錢最終會被得到記賬權的那個幸運的礦工所得到。
目前,很多礦工都不收手續費。但是隨著每次挖礦成功系統獎勵給礦工的幣不斷減少,未來肯定會有更多的礦工會收取手續費的。
交易中的簽名加密是什麼?
一筆比特幣交易一旦被建立,它就會被資金所有者(可能存在多位所有者)簽名,這個簽名包含了前一個交易的雜湊以及下一個使用者的公鑰。如果它是合法建立並簽名的,則該筆交易現在就是有效的,它包含資金轉移時所需要的所有資訊。使用者的私鑰用於生成支付比特幣所必需的簽名,來證明資金的所有權,這樣的簽名加密是為了確保交易內容不被篡改。
網路中節點收到交易資訊後,會對交易的合法性進行檢查,資金所有者的簽名加密是重要的驗證依據,檢查都通過後,則將交易標記為合法的未確認交易,才會在網路中進行廣播。
UTXO(Unspent Transaction Output)
它是比特幣交易的基本單位,是未經使用的一個交易輸出。UTXO不能再分割,1 個UTXO可以是 1“聰” 的任意倍。
私鑰
一個比特幣錢包中包含一系列的金鑰對,每個金鑰對包括一個私鑰和一個公鑰。私鑰是一個數字,通常是隨機產生的。一個比特幣地址中的所有資金的控制取決於相應私鑰的所有權和控制權。私鑰必須保密,因為一旦被洩露,相當於該私鑰保護下比特幣也就丟失了。
通過在一個密碼學安全的隨機源中取出一串隨機位元組,對其使用SHA256雜湊演算法進行運算,生成了一個256位的數字,這樣的一個數字就可以作為私鑰。以十六進位制格式表示一個隨機生成的私鑰,即:
1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8
公鑰
通過橢圓曲線演算法可以從私鑰計算得到公鑰(512位),這是不可逆轉的過程。由公鑰經過單向的加密雜湊演算法生成的比特幣地址以數字“1”開頭,在交易中比特幣地址就是收款人的地址。
雜湊函式
密碼學中的一種數學函式,比特幣採用的是SHA-256函式。
SHA
是安全雜湊演算法(Secure Hash Algorithm)的縮寫,是一個密碼雜湊函式家族,主要適用於數字簽名標準。SHA256就是這個函式家族中的一個,是輸出值為256位的雜湊演算法。到目前為止,還沒有出現對SHA256演算法的有效攻擊。
錢包
比特幣錢包是私鑰的容器,錢包只包含私鑰而不是比特幣,每一個使用者有一個包含多個私鑰的錢包。錢包中包含成對的私鑰和公鑰,使用者用這些私鑰來簽名交易。