06.20 比特幣的交易原理(四):證明交易確由發送方發起

這一篇,我們看看如何證明交易確實是由發送方發起的。

仍然是這張圖。

比特幣的交易原理(四):證明交易確由發送方發起

昨天,我們驗證了第一步,也就是驗證了A擁有4億聰,但還沒驗證A是不是真的要把3億聰發給B,1億聰發給C。這個驗證就是靠之前我們說的“簽名”了,童鞋們如果忘記了簽名原理的話,趕緊翻過去看看。 這個簽名藏在解鎖腳本里。 解鎖腳本里除了有昨天我們說的A自己的公鑰外,還有一段用A的私鑰加密的簽名,當然,這裡只是存儲了簽名的結果,簽名的過程就要借用0617的那幅圖了。

比特幣的交易原理(四):證明交易確由發送方發起

整個過程如下(把下面的所有者1看作A,所有者2看作B):

第一步:1對本次交易的所有信息(包括髮送數量是多少、發給誰等,這裡特別把所有者2的公鑰加上了,因為它其實就指明瞭發給誰)進行散列(哈希),散列出一串數據;

第二步:再用1的私鑰對這串數據加密,這就是前面所說的“簽名”;

第三步:1把這個新的交易和簽名信息向比特幣網絡廣播,網絡上的節點收到這個廣播後,就拿1的公鑰去驗證簽名,驗證通過就說明這筆交易確實是1主動發給2的,那大家就“同意”2擁有了這筆比特幣,既然整個比特幣網絡的人都認為2擁有了這筆比特幣,那2當然就擁有了這筆比特幣,交易也就完成了。

這樣,既驗證了A擁有這4億聰,又驗證了A真的是要把這4億聰發給B和C,這時候,這個交易就確定無疑了。當然,它發給B和C也會構造一個鎖定腳本,B和C要拿到比特幣,當然也要拿他們的解鎖腳本去對一對。比特幣的所有交易就是以這種方式全部串了起來。

最後,我們來回答0618留下的問題: 為什麼比特幣不直接用公鑰轉換成地址,而是要哈希一下?

其實答案的一半在0618裡提到過,因為從公鑰反推私鑰,雖然難,但以後不一定不可行。所以,應該儘量不暴露公鑰。在比特幣的交易過程中,A發送比特幣給B,我們必須要知道B的地址才能發送,如果以公鑰或等價於公鑰的數據做地址,那公鑰肯定要暴露。哈希一下,就不會了,因為哈希是不可能反推的。這樣做,避免了B暴露了公鑰,但A在交易過程中必須要提供自己的公鑰啊,那怎麼辦呢?

比特幣用了一個奇特的找零機制,叫做UTXO。 我們來看看。

假如地址A上有4個比特幣,現在要轉3個比特幣給地址B,這個過程可不是簡單地在地址A扣掉3個,在地址B加上3個。A上面的4個比特幣,在轉了3個給B之後,剩下的1個也不在A上了,而是轉到了A所在的錢包自動生成的另外一個新地址C上了,就好像我拿100塊買東西,商家又找回我50塊。 所以,雖然A的公鑰暴露了,但只要進行一筆交易,A上的比特幣就全沒了,剩下的比特幣會轉到屬於同一個主人的地址C。

因此,為了安全起見,我們不應該重複使用同一個比特幣地址,也就是說,A地址用過了,A的公鑰暴露了,就不要再用A的地址來收款。當然,目前要從公鑰反推私鑰,現實中還是不可能的。所以現在大家並沒有嚴格做到這一點,比如在交易所充值,交易所給每個用戶基本都是一個固定地址不變。


分享到:


相關文章: