最新內容會更新在主站深刻淺出區塊鏈社區
原文連接:比特幣腳本及交易分析 - 智能合約雛形php
你們都有轉過帳,每筆交易是這樣的:張三帳上減¥200,李四帳上加¥200。
在比特幣區塊鏈中,交易不是這麼簡單,交易實際是經過腳原本完成,以承載更多的功能個,這也是爲何比特幣被稱爲是一種「可編程的貨幣」。
本文就來分析一下交易是如何實現可編程的。編程
先引入一個概念:未花費的交易輸出——UTXO(Unspent Transaction Output)數組
其實比特幣的交易都是基於UTXO上的,即交易的輸入是以前交易未花費的輸出,這筆交易的輸出能夠被當作下一筆新交易的輸入。服務器
挖礦獎勵屬於一個特殊的交易(稱爲coinbase交易),能夠沒有輸入。
UTXO是交易的基本單元,不能在分割。
在比特幣沒有餘額概念,只有分散到區塊鏈裏的UTXO數據結構
隨着錢從一個地址被移動到另外一個地址的同時造成了一條全部權鏈,像這樣:
區塊鏈
比特幣交易是首先要提供一個用於解鎖UTXO(用私鑰去匹配鎖定腳本)的腳本(常稱爲解鎖腳本:Signature script),這也叫交易輸入,
交易的輸出則是指向一個腳本(稱爲鎖定腳本:PubKey script),這個腳本表達了:誰的簽名(簽名是常見形式,並不必定必須是簽名)能匹配這個輸出地址,錢就支付給誰。加密
每個比特幣節點會經過同時執行這解鎖和鎖定腳本(不是當前的鎖定腳本,是指上一個交易的鎖定腳本)來驗證一筆交易,腳本組合結果爲真,則爲有效交易。設計
當解鎖版腳本與鎖定版腳本的設定條件相匹配時,執行組合有效腳本時纔會顯示結果爲真繼承
如最爲常見類型的比特幣交易腳本(支付到公鑰哈希:P2PKH(Pay-to-Public-Key-Hash))組合是這樣:
ip
比特幣交易腳本語言是一種基於逆波蘭表示法的基於棧的執行語言(不知道逆波蘭和棧的同窗去翻大學數據結構課本,你也可跳過這個部分)。
比特幣腳本語言包含基本算數計算、基本邏輯(好比if…then)、報錯以及返回結果和一些加密指令,不支持循環。想了解更多語言細節可參考:
腳本語言經過從左至右地處理每一個項目的方式執行腳本。
下面用兩個圖說明下常見類型的比特幣交易腳本驗證執行過程:
上圖爲解鎖腳本運行過程(主要是入棧)
上圖爲鎖定腳本運行過程(主要是出棧),最後的結果爲真,說明交易有效。
實際上比特幣的交易被設計爲能夠歸入多個輸入和輸出。
咱們來看看完整的交易結構,
交易的鎖定時間定義了能被加到區塊鏈裏的最先的交易時間。在大多數交易裏,它被設置成0,用來表示當即執行。
若是鎖定時間不是0而且小於5億,就被視爲區塊高度,意指在這個指定的區塊高度以前,該交易不會被包含在區塊鏈裏。
若是鎖定時間大於5億,則它被看成是一個Unix紀元時間戳(從1970年1月1日以來的秒數),而且在這個指定時間以前,該交易不會被包含在區塊鏈裏。
交易的數據結構沒有交易費的字段,交易費經過全部輸入的總和,以及全部輸出的總和之間的差來表示,即:
交易費 = 求和(全部輸入) - 求和(全部輸出)
剛剛咱們提過輸入須要提供一個解鎖腳本,如今來看看一個交易的輸入結構:
咱們結合整個交易的結構裏看輸入結構就是這樣子:
剛剛咱們提過輸出是指向一個解鎖腳本,具體交易的輸出結構爲:
咱們結合整個交易的結構裏看輸出結構就是這樣子:
在比特幣區塊結構Merkle 樹及簡單支付驗證分析 講到區塊結構,區塊結構包含多個交易的哈希。
那麼交易哈希是怎麼計算的呢?
瞭解詳情可進一步參考如何計算交易Hash?及如何建立Hash?
如今是否是對完整的交易到區塊有了更清晰的認識。
因爲交易是經過腳原本實現,腳本語言能夠表達出無數的條件變種。
比特幣的腳本目前經常使用的主要分爲兩種,一種是常見的P2PKH(支付給公鑰哈希),另外一種是P2SH(Pay-to-Script-Hash支付腳本哈希)。
P2SH支付中,鎖定腳本被密碼學哈希所取代,當一筆交易試圖支付UTXO時,要解鎖支付腳本,它必須含有與哈希相匹配的腳本。
這裏不展開技術細節,下面說明一些應用場景,以便你們有更直觀的認識。
用於擔保和爭端調解,一個買家想和他不認識或不信任的某人交易,在通常狀況交易正常進行時,買家不想任何第三方參與。那交易雙方能夠發起支付,但若是交易出現問題時,那第三方就能夠根據裁定,使用本身的簽名和裁定承認的一方共同簽名來兌現這筆交易。
相信隨着區塊鏈的普及,會對將來的交易模式和商業結構帶來巨大的影響。不過因爲比特幣的腳本語言不是圖靈完備的,交易模式依舊有限,以太坊就是爲解決這一問題而出現,後面咱們會有大量介紹以太坊的文章。