比特幣腳本及交易分析 - 智能合約雛形

本文首發於深刻淺出區塊鏈社區 原文連接:比特幣腳本及交易分析 - 智能合約雛形原文已更新,請讀者前往原文閱讀php

你們都有轉過帳,每筆交易是這樣的:張三帳上減¥200,李四帳上加¥200。 在比特幣區塊鏈中,交易不是這麼簡單,交易實際是經過腳原本完成,以承載更多的功能個,這也是爲何比特幣被稱爲是一種「可編程的貨幣」。 本文就來分析一下交易是如何實現可編程的。編程

未花費的交易輸出(UTXO)

先引入一個概念:未花費的交易輸出——UTXO(Unspent Transaction Output)數組

其實比特幣的交易都是基於UTXO上的,即交易的輸入是以前交易未花費的輸出,這筆交易的輸出能夠被當作下一筆新交易的輸入。服務器

挖礦獎勵屬於一個特殊的交易(稱爲coinbase交易),能夠沒有輸入。 UTXO是交易的基本單元,不能再分割。 在比特幣沒有餘額概念,只有分散到區塊鏈裏的UTXO數據結構

隨着錢從一個地址被移動到另外一個地址的同時造成了一條全部權鏈,像這樣: own_chain學習

比特幣腳本

比特幣交易是首先要提供一個用於解鎖UTXO(用私鑰去匹配鎖定腳本)的腳本(常稱爲解鎖腳本:Signature script),這也叫交易輸入, 交易的輸出則是指向一個腳本(稱爲鎖定腳本:PubKey script),這個腳本表達了:誰的簽名(簽名是常見形式,並不必定必須是簽名)能匹配這個輸出地址,錢就支付給誰。區塊鏈

每個比特幣節點會經過同時執行這解鎖和鎖定腳本(不是當前的鎖定腳本,是指上一個交易的鎖定腳本)來驗證一筆交易,腳本組合結果爲真,則爲有效交易。加密

當解鎖版腳本與鎖定版腳本的設定條件相匹配時,執行組合有效腳本時纔會顯示結果爲真設計

如最爲常見類型的比特幣交易腳本(支付到公鑰哈希:P2PKH(Pay-to-Public-Key-Hash))組合是這樣: script繼承

常見交易腳本驗證過程

比特幣交易腳本語言是一種基於逆波蘭表示法的基於棧的執行語言(不知道逆波蘭和棧的同窗去翻大學數據結構課本,你也可跳過這個部分)。

比特幣腳本語言包含基本算數計算、基本邏輯(好比if…then)、報錯以及返回結果和一些加密指令,不支持循環。想了解更多語言細節可參考:比特幣腳本

腳本語言經過從左至右地處理每一個項目的方式執行腳本。

下面用兩個圖說明下常見類型的比特幣交易腳本驗證執行過程: script_run1

上圖爲解鎖腳本運行過程(主要是入棧) script_run2

上圖爲鎖定腳本運行過程(主要是出棧),最後的結果爲真,說明交易有效。

交易分析

實際上比特幣的交易被設計爲能夠歸入多個輸入和輸出。

交易結構

咱們來看看完整的交易結構, image

交易的鎖定時間定義了能被加到區塊鏈裏的最先的交易時間。在大多數交易裏,它被設置成0,用來表示當即執行。 若是鎖定時間不是0而且小於5億,就被視爲區塊高度,意指在這個指定的區塊高度以前,該交易不會被包含在區塊鏈裏。 若是鎖定時間大於5億,則它被看成是一個Unix紀元時間戳(從1970年1月1日以來的秒數),而且在這個指定時間以前,該交易不會被包含在區塊鏈裏。

交易的數據結構沒有交易費的字段,交易費經過全部輸入的總和,以及全部輸出的總和之間的差來表示,即:

交易費 = 求和(全部輸入) - 求和(全部輸出)

交易輸入結構

剛剛咱們提過輸入須要提供一個解鎖腳本,如今來看看一個交易的輸入結構: image

咱們結合整個交易的結構裏看輸入結構就是這樣子: image

交易輸出結構

剛剛咱們提過輸出是指向一個解鎖腳本,具體交易的輸出結構爲: image 咱們結合整個交易的結構裏看輸出結構就是這樣子: image

交易哈希計算

比特幣區塊結構Merkle 樹及簡單支付驗證分析 講到區塊結構,區塊結構包含多個交易的哈希。 那麼交易哈希是怎麼計算的呢?

  1. 交易結構各字段序列化爲字節數組
  2. 把字節數組拼接爲支付串
  3. 對支付串計算兩次SHA256 獲得交易hash

瞭解詳情可進一步參考如何計算交易Hash?如何建立Hash?

如今是否是對完整的交易到區塊有了更清晰的認識。

智能合約雛形 - 應用場景說明

因爲交易是經過腳原本實現,腳本語言能夠表達出無數的條件變種。

比特幣的腳本目前經常使用的主要分爲兩種,一種是常見的P2PKH(支付給公鑰哈希),另外一種是P2SH(Pay-to-Script-Hash支付腳本哈希)。 P2SH支付中,鎖定腳本被密碼學哈希所取代,當一筆交易試圖支付UTXO時,要解鎖支付腳本,它必須含有與哈希相匹配的腳本。

這裏不展開技術細節,下面說明一些應用場景,以便你們有更直觀的認識。

  • 多重簽名應用 合夥經營中,如只有一半以上的的股東贊成簽名就能夠進行支付,可爲公司治理提供管控便利,同時也能有效防範盜竊、挪用和遺失。

用於擔保和爭端調解,一個買家想和他不認識或不信任的某人交易,在通常狀況交易正常進行時,買家不想任何第三方參與。那交易雙方能夠發起支付,但若是交易出現問題時,那第三方就能夠根據裁定,使用本身的簽名和裁定承認的一方共同簽名來兌現這筆交易。

  • 保證合同 保證合同是建造公衆商品時的集資辦法,公衆商品是指一旦建成,任何人均可以避免費享受到好處。標準的例子是燈塔,全部人都認同應該建造一個,可是對於我的航海者來講燈塔太貴了,燈塔同時也會方便其餘航海者。 一個解決方案是向全部人集資,只有當籌集的資金超過所需的建形成本時,每一個人才真正付錢,若是集資款不足,則誰都不用付錢。
  • 依靠預言 假如老人想讓他孫子繼承遺產,繼承時間是在他死後或者在孫子年滿18歲時(也是一個帶鎖定時間交易),不管哪一個條件先知足,他的孫子均可以獲得遺產。 由於比特幣節點可依靠預言對死亡條件進行判斷,預言是指具備密鑰對的服務器,當用戶自定義的表達式被證實是真的,它能按照要求對交易簽名。

相信隨着區塊鏈的普及,會對將來的交易模式和商業結構帶來巨大的影響。不過因爲比特幣的腳本語言不是圖靈完備的,交易模式依舊有限,以太坊就是爲解決這一問題而出現,後面咱們會有大量介紹以太坊的文章。

參考文獻 & 補充閱讀

  1. 精通比特幣
  2. 廖雪峯的深刻理解比特幣交易的腳本
  3. 比特幣合同

深刻淺出區塊鏈 - 系統學習區塊鏈,打造最好的區塊鏈技術博客。

☛ 個人知識星球爲各位解答區塊鏈技術問題,歡迎加入討論。

☛ 關注公衆號「深刻淺出區塊鏈技術」第一時間獲取區塊鏈技術信息。

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