1. 程式人生 > >Corda技術核心概念之交易(Transaction)

Corda技術核心概念之交易(Transaction)

概要

  • 交易是應該提議更新到賬單
  • 一個可以被更新到賬單的交易,需要滿足如下條件:
    • 不能包含雙花。(在Corda中,雙花問題是通過公證人(Notary)解決的)
    • 合約一定是有效的
    • 參與方一定是簽名了的

概覽

Corda使用UTXO(unspent transaction output)模型機制操作狀態,並且賬單上的狀態是不可改變的。一般來說,每一次合法的交易都會把賬單上的零個或者多個已經存在的賬單狀態標記為歷史狀態,然後建立零個或者多個新的賬單狀態。因此隨著時間的流動,交易在不停地發生,賬單也在不停地進化。交易代表著一條單一的狀態序列。

這兒有個更新賬單的例子,帶有兩個輸入和輸出:

一個交易包含任何型別任意數量的輸入和輸出:

  • 他們可以包括許多不同狀態型別,比如同時包含現金和證券
  • 他們可以釋出(有零個輸入)或者已經存在的狀態(有另個輸出)。
  • 他們能融合或者拆分可以替代的資產,比如把狀態為2美元和狀態為5美元變成狀態為7美元

交易是原子的:要麼全部接受一個交易所提議的改變,要麼拒絕所有。 

這兒有交易的兩個基本型別:

  • 公證人改變的交易(用於改變狀態的公證人)
  • 常規交易(在任何地方使用)

交易鏈

當建立一個新交易的時候,這個交易的輸出狀態是不存在的,因此必須給這個交易建立一個輸出狀態。然而,一個交易的輸入狀態是上一個交易的輸出狀態。因此,我們通過引用

來包含被提議的交易。

這些輸入狀態的引用是一個結合體:

  • 這個現金的交易建立輸入
  • 輸入的索引是上個交易的輸出

這種場景可以被解釋成如下:

隨著時間的流動,這些輸入狀態的引用把交易連線起來,形成我們所知道的交易鏈。

提交交易

開始,一個交易僅僅是一個提議,然後更新到賬單。它代表著賬單上狀態的未來,也是交易的建立者所期望的。也就是說,我想建立一個交易,這個交易包含著我想要的狀態,這些狀態也是自己所期望的,然後提議更新到賬單。

為了變得真實,交易接收到需要簽名者的簽名,簽名都放在Commands中。每一個簽名者附加他們的簽名到一個交易上,以此表達他們同意這個提議。

如果一個交易聚集了所有必須的簽名,這個交易將會被提交:

這也就意味著:

  • 這個交易的輸入將會標記為歷史狀態,不能夠被將來任何交易使用
  • 這個交易的輸出將會成為賬單的當前狀態

交易有效性

只有當交易滿足如下兩種條件的時候,簽名者才可以簽名:

交易的有效性:交易鏈上的每一個交易都會建立一個被提議的交易的輸入:

        交易被所有需要的參與方進行數字簽名

        交易是合約有效的

交易的唯一性:對被提議的交易來說,它的輸入是不存在被消費了的。(保證輸入不是雙花)

如果交易聚集了所有簽名,但是不滿足上面兩個條件,則這個交易的輸出是無效的,這個輸出也不會成為下個交易的輸入。

其他交易元件

交易有輸入狀態和輸出狀態,也可能包含如下元件:

  • 指令(Commands)
  • 附件(Attachments)
  • 時間戳(Timestamps)

比如,一個Alice支付Bob5美元現金的交易,就包含兩個附件和一個時間戳,如下展示:

我們下面探索交易元件的角色功能扮演:

指令(Commands)

假如我們有一個現金狀態和一個債券狀態作為輸入,和一個現金狀態和債券狀態作為輸出的交易。這個交易可能代表兩個不同場景:

  • 一個證券購買
  • 用贈券支付債券(A coupon payment on a bond)

我們能夠想象,在不同的支付場景中,增強一個有效交易的規則,它是依賴現金購買還是贈券支付。比如,在一個購買的場景中,我們需要當前債券的擁有者有變化,然而在贈券支付的場景中,我們需要債券的擁有者沒有變化。

因為這樣,所有我們就有了指令(commands)。一個交易中包含一個指令允許我們表明這個交易的意圖,也影響著我們怎樣去驗證一個交易的有效性。

每一個指令也與一個或者多個簽名者有關聯。在指令中通過聚集多有的公匙,我們可以得到交易的簽名者。在我們的例子中,我們或許可以想象:

  • 贈券進行支付,僅僅需要這個債券的擁有者進行簽名,前提是需要他簽名
  • 現金支付,僅僅需要現金的擁有者進行簽名,前提是需要他簽名

我們可以視覺化成如下:

附件

有時,我們有大量的實踐可以被用在需許多不同的交易中。比如:

  • 一個公開假期的日曆
  • 支援合法文件
  • 現金編碼的表格

對於這些使用場景,我們有附件。每一個交易涉及到零個或者多個附件,這些附件都有唯一的hash標識。這些附件是壓縮檔案(zip/jar)包含任何資料內容。這些檔案的資訊可以被用作驗證交易的有效性。 

時間視窗(Time-windows)

在一些使用場景中,我們希望一個交易是有效的,僅僅在某個具體的時間視窗中(在某一段時間內)。比如:

  • An option can only be exercised after a certain date
  • 債券過期之前應該償還

在這樣的案例當中,我們可以在交易中加上時間視窗。時間視窗具體指出了交易可以被提交的時間段。