1. 程式人生 > >《詳解比特幣白皮書》-Transaction(交易)

《詳解比特幣白皮書》-Transaction(交易)

該部分比較難理解,如有疑問可以給我留言,詳細交流。

Transactions

We define an electronic coin as a chain of digital signatures. 

我們定義一個電子貨幣它是一個數字簽名鏈。

注:define coin as chain看起來很奇怪,我們潛意識裡幣應該是一個一個的,但是鏈是一個長條狀,直覺中很難把coinchain聯絡到一起。但是比特幣本質卻是是一個鏈條,這個鏈是由一條一條交易記錄時間順序串在一起。Coin其實並不存在,一個人都多少個幣(coin)其實是遍歷鏈上所有交易記錄推算出來的。

Each owner transfers the coin to the next by digitally signing a hash of the previous transaction and the public key of the next owner and adding these to the end of the coin. 

每個所有者(收款人,下一筆交易的付款者)將幣交易給下一個所有者(收款人)的方式是,將前一筆交易和收款人的公鑰進行雜湊變化並數字簽名,然後加到這個幣(一連串數字簽名<鏈>)的末尾。

A payee can verify the signatures to verify the chain of ownership. 

收款人可以通過驗證簽名來驗證所有權的變化。

雜湊函式:可以把人意長度的資料對映為固定長度資料的函式。

非對稱加密演算法:非對稱加密演算法需要兩個密匙,公鑰和私鑰。如果用公鑰加密,只有對應的私鑰才能解開,如果用私鑰加密,只有對應的公鑰才能解開。因為加密和解密是兩個不同金鑰,所以這種演算法叫非對稱加密演算法。

非對稱加密過程:甲方生成一對金鑰,並將其中一把作為公鑰向其他方公開;得到該公鑰的乙方使用公鑰對資訊加密後再發送給甲方;甲方再用自己儲存的另一把金鑰進行解密。或者,甲方可以使用乙方的公鑰對資訊簽名後再發送給乙方;甲方再用自己的私鑰對乙方傳送回來的資料就行驗籤。

摘要:檔案-(匯入雜湊函式)->得到摘要

數字簽名:摘要-(私鑰加密)->生成數字簽名

把簽名附加在檔案後面傳送給某人,某人收到後,把數字簽名用公鑰解密,得到摘要。證明檔案傳送人是本人。

某人再對檔案內容使用雜湊函式,把得到的摘要進行比對,如果兩者一致,證明檔案未被修改。

交易流程:下圖中的中間的Transaction,付款者是Owner 1 ,收款者是Owner 2。那麼假如現在Owner1要給Owner2支付5個比特幣,那麼交易流程為:把Owner2的公鑰和Owner1的前一筆交易進行雜湊運算(得到摘要),然後Owner1用自己的私鑰對這個摘要進行加密,從而得到數字簽名。然後加在這條交易資訊的末尾。

Owner2收到以後,拿著這筆交易裡公佈的Owner1的公鑰來解密,則可以判斷出這筆交易來自於Owner1。私鑰只會存在於A那裡。(私鑰加密公鑰解密,或者公鑰加密,私鑰解密)。

私鑰數字簽名,公鑰驗證資料。公鑰確定錢包地址,私鑰確定所有權。

The problem of course is the payee can't verify that one of the owners did not double-spend the coin. 

當然這個問題依然存在,收款人還不能驗證之前的付款人是否將幣雙重支付。

A common solution is to introduce a trusted central authority, or mint, that checks every transaction for double spending. 

一種常見的解決方案就是引入可信的中心化權威機構,或者發幣中心,來檢查每筆交易是否存在雙重支付。

After each transaction, the coin must be returned to the mint to issue a new coin, and only coins issued directly from the mint are trusted not to be double-spent. 

每筆交易產生後,幣必須由發幣中心回收併發布新幣,並且只有直接從發幣中心釋出的幣才是被相信沒有雙重支付的。

The problem with this solution is that the fate of the entire money system depends on the company running the mint, with every transaction having to go through them, just like a bank. 

這種解決方案的缺陷在於,整個貨幣體系的命運全依靠充當發幣中心的公司,因為每筆交易都要通過他們來完成,就像銀行。

We need a way for the payee to know that the previous owners did not sign any earlier transactions.

我們需要一種方法來讓收款人知道,之前的持有人並沒有簽名其他(比記錄上)更早的交易記錄。

For our purposes, the earliest transaction is the one that counts, so we don't care about later attempts to double-spend. 

為此,最先(記錄)的交易才是可以信任的,這樣我們就可以不用關心後來的交易是否試圖雙重支付。

The only way to confirm the absence of a transaction is to be aware of all transactions.

能夠確保不漏掉任何交易的唯一方法,就是獲知所有交易。

In the mint based model, the mint was aware of all transactions and decided which arrived first. 

在基於發幣中心(鑄幣廠)的模型當中,發幣中心本身就能獲知所有交易,並判決哪個最先。

注:鑄幣廠遠離其實很簡單比如現在的網上銀行(或者支付寶),當A給B轉賬100塊錢,實際上是銀行開啟了一個transaction,讓A的賬戶上-100塊,然後讓B的賬戶上+100塊。這個-100塊和+100塊實際上就是銀行這個“鑄幣廠”,銷燬了A的100塊錢,然後又生產了100塊錢給了B(只不過整個流程都只是體現在資訊的流動上)。正因為如此,所以才要保證這個“貨幣”只能從這個“鑄幣廠”(銀行)發行,並且這個“鑄幣廠”被雙方都共同信任,每一筆交易都“必須”通過這個“鑄幣廠”而沒有其他途徑。現有的體系也正是由銀行"鑄幣廠"(唯一信任方)來保證A的賬戶-100的同時只有B的賬戶+100而不會同時C的賬戶也+100(雙重支付)。(銀行自身的“監督”體制保證每天的對賬,銀行內部的監管。而這些監督的代價,就是維護這個體系的成本)。

另一方面,之所以銀行能知道一筆錢是否被雙重花費了,是因為這個銀行具備了當前交易之前的所有的“歷史交易”,它驗證一個交易是否合法的方式就是去檢查之前的所有交易的結果是否滿足當前這筆交易的要求。

我們需要給收款人(payee)一個方法去知道之前的擁有者們(owners)沒有簽署過更早的交易。對於這個目的,最早(earliest)的交易才是重要的,所以我們不必關心後面的交易是否嘗試去雙重支付。唯一的確保一個交易存在性的方法就是擁有查詢所有的交易。在基於鑄幣廠模型中,這個鑄幣廠擁有所有的交易並且決定哪一個交易最新到達(which arrived first)。為了在沒有一個可信任方的情況下完成這件事情,交易必須被公開公告,並且我們需要一個系統讓所有參與者對只對在一個單鏈順序歷史(which they were received)上達成共識。收款人需要證明在每一次交易的期間,大多數節點都同意這是他們第一次收到的(was the firstreceived)

這裡指出首先是付款人才會發生雙重支付,而收款人是擔心付款人會不會幹這件事情(廢話,因為利益是由付款人轉移到收款人上的)。“最早的交易才是重要的”這句話是說,雙重支付發生的基礎是,首先要已經發生過一個交易,然後付款人想無視這筆交易,再次使用這個交易已經用過的貨幣發起另一次交易。所以這個最早的交易指代的是“已經發生過的交易”。鑄幣廠並不關心想要發起雙重支付的人的兩筆(或以上)的交易哪筆是這個付款方認為先發生的,他只關心此刻這個付款方發起的這個交易是否“合法”(也就是之前這個人有沒有已經用過這筆錢了)。所以是鑄幣廠確認哪個交易在前,而不是由付款人決定哪個在前的。那麼此時的這個鑄幣廠並不歸屬任何一個第三方,那麼這個交易就必須被“廣而告之”,讓所有參與進來的人都知道這件事情發生了,並且所有人都知道以前發生的所有“歷史事件”來驗證此時被廣播的這個交易是否是合法的。但是我們知道,要讓所有參與的人都保持一致是一件相當相當困難的事情,這也就是區塊鏈所解決的問題。而最後一句話就是說收款人需要大多數人(超過51%)都認為那個交易是合法的了,那麼才能說明這個交易是合法的。

To accomplish this without a trusted party, transactions must be publicly announced [1], and we need a system for participants to agree on a single history of the order in which they were received. 

如果不用可信第三方來實現的話,交易就必須公開通知(廣播)。並且我們需要這樣一個體系,讓參與者共同認可唯一的交易順序歷史記錄。

The payee needs proof that at the time of each transaction, the majority of nodes agreed it was the first received. 

收款人需要證據證明,在交易(完成)的時刻,大多數節點公認這筆交易是最先的。