iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 26
0

交易透過流程(Flow)傳遞及處理,會經過幾個階段,完成交易的執行。

  • Initiator:交易流程發起者
  • Acceptor:交易流程接收者
  • NotaryFLow Service:公證人節點提供的驗證服務

https://ithelp.ithome.com.tw/upload/images/20181110/20103635hHwB9HbFWt.png

Flows

流程分為 2 種:

  • Flows:允許 2 方交易者,發起者(Initiator)與接收者(Acceptor)
  • Subflows:允許 3 方以上交易者

壅塞程式(Blocking Code)

流程中為了增強整體的容錯性,避免機器故障造成的交易失敗,提供了暫停(Suspended)機制作為檢查點(Check-pointed)。

流程定義:

abstract class FlowLogic<out T>

@Suspendable
@Throws(FlowException::class)
abstract fun call(): T

open fun <R> subFlow
(
    subLogic: FlowLogic<R>
    ,shareParentSessions: Boolean = false
):R

ServiceHub

節點的主要服務,提供節點資訊,同時也作為流程傳遞的接口。

  • vaultService:提供節點的資料庫(vault)
  • identityService:查詢節點標識(identity)
  • myInfo:節點資訊

PluginServiceHub
流程傳遞處裡的 ServiceHub 實體(Instance)

object ExampleService
{
    class Service(services: PluginServiceHub) 
    {
        init 
        {
            services.registerFlowInitiator(ExampleFlow.Initiator::class)
            { 
                ExampleFlow.Acceptor(it) 
            } 
	    }
    }
}

流程開始

流程處理(Handle)定義:

@RPCReturnsObservables
fun<T:Any> startFlowDynamic
(logicType:Class<out FlowLogic<T>>,vararg args:Any?):FlowHandle<T>

執行流程:

ExampleFlowLogic.call()

ProgressTracker:進度追蹤,用以查詢流程執行的階段及狀態。

open val progressTracker: ProgressTracker? = null

class ProgressTracker(vararg steps: Step)
open class Step(open val label: String)

progressTracker.currentStep = myStep

FlowException:用以處理流程(Flow)執行發生錯誤的情況

open class FlowException @JvmOverloads 
constructor(message: String? = null, cause: Throwable? = null)
:Exception(message, cause)

https://ithelp.ithome.com.tw/upload/images/20181110/201036354d9MM5yx0L.png


上一篇
R3 Corda:合約(Contract)
下一篇
R3 Corda:共識(Consensus)
系列文
區塊鏈開發(Blockchain/DLT Application Development)30

尚未有邦友留言

立即登入留言