《Master Bitcoin》學習筆記02——比特幣的交易模型

 

比特幣的交易模型

模型基本描述

  前面一篇學習筆記01提到了一個交易模型(第三章的內容),在第五章中,除了對這個模型作個詳細介紹以外,其實和我上一篇理解的交易模型差很少,一個交易包含輸入與輸出,比特幣是在各個地址之間轉移,不想中心化系統例如銀行有個服務器,記錄了每一個人的帳戶,帳戶這個結構體包含:交易記錄,帳戶餘額等一切信息,可是在比特幣交易網絡這種去中心化的體系中,比特幣的交易記錄,一個帳戶擁有多少比特幣等信息存儲在了區塊鏈中,要像銀行帳戶同樣,查詢本身帳戶的相關信息,只能經過查區塊鏈中的區塊獲取,就像從數據庫裏查詢數據同樣,就像下面比特幣的交易模型描述。
html

  模型圖有幾個重點:數據庫

  • 我的可用的比特幣是以帳單形式存在的,在發起交易時,查詢區塊鏈中我的可用帳單(帳單輸出帳戶是你),使用帳單來支付相應比特幣,產生輸出,實際上,是比特幣在比特幣地址之間的轉移。
  • 本次交易的輸入就是上次交易輸出,比特幣帳戶(地址)查詢餘額和交易,就是對區塊鏈裏帳單裏對你帳戶輸出的查詢(上圖中,對A可支配比特幣的查詢帳單輸出:退給A的金額,對B可支配比特幣的查詢帳單輸出:轉帳給B的金額)
  • 本次交易的輸入能夠只有一張帳單的輸出(若是這張帳單上的比特幣足夠),也能夠包含幾張帳單的輸出(幾張帳單加起來比特幣>=這次須要支付金額),注意到,上面的>=比交付,由於不太可能利用已有帳單徹底無偏差地湊出本次需支付對應金額,由於帳單裏的輸出金額是不可拆分的,只能利用帳單來支付,要將銀行裏控制的我的帳戶餘額(一串數字)與比特幣我的帳戶餘額(帳戶下的帳單輸出)區分開來。
  • 生成的帳單三中有給礦工的獎勵,這個獎勵是你自定的,給不給,給多少都行,這個獎勵影響的是交易的優先級,獎勵越多,越能儘早地將帳單加入區塊鏈中,以保證交易的完成。帳單將會被保存在礦工的礦池中,按照獎勵優先級來處理帳單。

交易輸出的鎖定與解鎖(重點)——鎖定腳本與解鎖腳本

  上面提到了,一個帳戶可支配的比特幣來源於帳單的輸出,而帳單是公開的,每一個比特幣帳戶都能知道這筆交易以及交易的輸出,那麼怎麼保證輸出只有對應的比特幣的帳戶能用呢?編程

  比特幣的鎖機制是經過一種類Forth語言腳本來,該腳本語言是種非圖靈完備的語言,什麼是圖靈完備的語言呢,當一門編程語言在不限制內存和不限制時間下,可以解決全部問題,就稱爲圖靈完備的,例如:C/C++,JAVA都是圖靈完備語言,反之就是圖靈非完備,比特幣腳本里沒有循環,因此這個腳本不能解決:在知足某種條件下退出循環,不然無限制地循環的問題。比特幣的腳本語言是一種簡單、低級的語言,它的不少功能已經被編譯成立二進制文件,即便咱們不瞭解這種語言,只要可以調用接口就好了,或者能夠直接使用C/C++,JAVA這樣的語言來完成鎖定和解鎖的功能。那麼爲何不直接用C++等圖靈完備的語言呢?這是出於安全考慮的,由於C++,JAVA等語言與內存、操做系統等運行環境,息息相關,而比特幣腳本不須要任何運行環境都能運行,這就能抵抗基於內存的攻擊或者其餘透過系統漏洞的攻擊(書上是這樣解釋的,我以爲,比特幣腳本更像一串機器語言的0-1串,因爲低級機器語言的限制,很難進行高級編程,一樣的,也保證了安全性,由於0-1機器語言很難入侵更改)。安全

  下面是鎖定腳本與解鎖腳本的例子,以說明鎖的交互機制。服務器

  假設這筆交易爲A向B支付比特幣,在交易雙方完成交易,生成帳單時(非礦工加的解鎖和鎖定腳本),A向這個帳單加上了鎖定腳本,這個鎖定腳本包含B的比特幣地址C,由於B只公開了通過對公鑰HASH後的比特幣地址C,由於HASH函數的性質,比特幣網絡上的任何人,都不能經過C逆向獲得B的公鑰,也就是說,只有B知道本身的公鑰可以構建解鎖腳本,即只有B的公鑰,才能經過HASH運算出地址C,只有能運算出地址C的比特幣帳戶,才能支配這筆比特幣。網絡

腳本語言運行

  該腳本語言僅由常數以及操做構成,從前日後遍歷腳本,若遇到常數,則將常數入棧,若遇到操做,根據操做的具體要求,對棧頂元素進行彈出,或者彈出兩個元素進行運算,再入棧,當一句腳本運行完畢後,僅只剩下棧頂元素,其取值爲True\False,很清楚地,True表明驗證成功,表明執行腳本的用戶具備該帳單輸出比特幣的支配權,用戶可以使用該帳單做爲下筆交易(帳單)的輸入,下面是個具體例子編程語言

鎖定/解鎖腳本類型

1)P2PKH (Pay-to-Public-Key-Hash)——比特幣網絡上大多數交易都屬於此類型函數

  解鎖腳本鎖定腳本學習

2)P2PK(Pay-to-Public-Key)區塊鏈

  寫成收款方的公鑰,收款方經過本身的私鑰生成相應公鑰來獲取支配權。

3)P2SH(Pay-to-Script-Hash)

  這個腳本類型用於多重簽名才能支付,好比,一個公司的帳戶,由5我的支配,但只要有2我的以上的簽名就能進行比特幣支付。

  咱們考慮使用2)的方式來寫多重簽名命令:

  就是說,再使用上圖方式多重簽名的時候,須要將全部人的公鑰都加在鎖定腳本里,由於Attorney Public Key時是全部人的公鑰運算的結果,而Public Key(公鑰)有260bit長,這樣下來,在人不少的狀況下,甚至會使鎖定腳本容量超過帳單自己,並且這樣的腳本也難以維護,並暴露全部人之間的聯繫(儘管比特幣地址是匿名的)。

  P2SH很好地解決了這個問題,P2SH分爲除了鎖定腳本、解鎖腳本以外,多出了贖回腳本:

  使用方法是分兩步:①使用贖回腳本確認用戶能在屬於定義好的羣組;②使用解鎖腳本解鎖(Sig1 Sig2是2個羣組用戶的簽名)

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息