天天看點

Corda技術核心概念之合約(Contracts)

概要

  • 一個有效的交易是一定有輸入和輸出狀态的,可是怎麼知道這個交易是否有呢?合約進行驗證。
  • 合約就是一段驗證邏輯代碼,這個代碼是被JVM程式設計語言所編寫的,比如Java或者Kotlin。
  • 合約的執行的确切的。一個交易可被接收(有效的)是基于交易本身的内容的。

交易的驗證

我們會想一個交易所涉及的所有參與者都進行了數字簽名,那麼這個交易是有效的。然而,事實并不是這樣,隻有合約是有效的這個交易必定有效。因為合約是一串驗證邏輯(就是一串運作在JVM上的代碼),它都驗證通過,則交易必定有效。

合約的有效性定義如下:

  • 每一個狀态指向一個合約
  • 合約是以交易作為輸入的,而交易的有效性是基于合約的驗證規則,而驗證規則又是基于業務邏輯的
  • 如果合約的每個輸入狀态和輸出狀态是有效的,則交易必定是有效的

我們可以捕獲到如下場景:

Corda技術核心概念之合約(Contracts)

合約代碼可以被任何的JVM程式設計語言編寫。并且這段代碼擁有這門程式設計語言的”全部能力“。包括:

  • 驗證大量的輸入,輸出,指令(Commands),時間戳,附件(如果有的話)。
  • 驗證一個交易所涉及的所有元件(Input state, Output state, Commands, Attachment)的内容。
  • 循環結構,變量配置設定,函數調用,幫助方法等。
  • 把相似的狀态分為一個組,并以組為機關進行驗證。比如對所有的現金狀态所關聯的值設定一個規則。

如果一個交易的合約不是有效性的,那麼這個交易是不應該被提議更新到賬單的。用這種方式,合約暴露出狀态随時間進化的規則,但是對于這個交易所涉及到的簽名者,他們是否願意簽名則是獨立于這個合約的。也就是合約你可以進行交易的簽名者驗證,就是驗證需要哪些簽名者,但是簽名與不簽名是這些簽名者表達自己的意願的。

合約沙箱

交易的驗證一定是确定的,一個合約應該是這樣的,要麼總是接收一個交易,要麼總是拒絕一個交易。比如,一個合約的有效性不是某個時間點确定是有效的,它就是有效的;一個合約的有效性也不是某個端(peer)運作着的合約持有大量資訊,它就是有效的。因為一個很有必要的條件就是這個網絡上的所有端(peer)都達成一緻,都認為是有效的,才進行更新到賬單。

為了實作這個,合約在一個确定的沙箱種評估交易。這個沙箱有一個白名單,阻止合約導入一些不确定的第三方源碼庫。這些庫會提供目前時間,随機數産生。這些庫提供檔案系統通路或者網絡庫。最終,當合約驗證交易時,它僅僅可以利用的資訊就是交易它本身,而不是其他的資訊。

合約限制

因為一個合約是不能通路外界資訊的,是以它僅僅驗證交易本身資訊的有效性。比如,合約不能驗證目前這個交易與原始參與方的一緻性,因為某個具體的合約它接收的隻是目前這個交易,根據驗證規則,目前這個交易通過,則通過。

是以,端(peers)應該在簽名一個交易之前就進行驗證,即使這個交易是有效的,這個簽名也是為了表達自己的意願,是否同意把此交易更新到賬單。一個端(peer)是沒有義務簽名一個交易的,僅僅因為它是合約有效性的。比如,他們可能不願意貸一個大額的款,或者不同意一份資産所對應的現金數量。

這些都可以達成一緻規則,寫到合約中去。(有可能之前達成的一緻協定,随着時間的流動,現實也在改變),又将如何應對?先知

先知(oracles)

有時候,交易的有效性是依賴于外部的資訊的,比如交換率。在這樣的情況下,一個先知就是必須的。

法律散文(Legal prose)

每一個合約也有一個合法的文檔,這個文檔陳述着狀态規則,這些規則掌管着狀态随時間流動的進化,這些規則也會與傳統法律法律系統相容。這個文檔依賴法律争端場景。另一種表達方式:隻要存在法律争端,則這個文檔将會起作用。

繼續閱讀