2017-12-19 10 views
0

銀行のフローの出力を入力として取得し、値を更新しました。しかし、私は、ボールトの状態状態を「消費」に更新する方法を知らない。私はそれがflowlogicに基づいて自動的に起こると思った。ボールト状態のステータスが未契約/コンシューマ

銀行ノードがフローを開始し、銀行と顧客の両方の元帳にコミットしました。 顧客ノードは別のフローを開始し、銀行の状態を入力として取り込み、値を更新し、顧客および銀行の元帳に新しい状態としてコミットしました。 私はこのレベルまで、サンプルコードの下に行っています。

@Suspendable 
    override fun call(): SignedTransaction { 
     // Obtain a reference to the notary we want to use. 
     val notary = serviceHub.networkMapCache.notaryIdentities[0] 
     // Stage1. 
     progressTracker.currentStep = GENERATING_TRANSACTION 
     // Extract state from ledger as input for Customer node 
     val criteria = QueryCriteria.VaultQueryCriteria(status = Vault.StateStatus.UNCONSUMED) 
     val results = serviceHub.vaultService.queryBy<POCState>(criteria) 
     val pocState = results.states.last().state.data 
     // Customer reset the approval status 
     val ourOtherOutputStateVB: POCState = pocState.copy(stateCode = pocStateCodeVB, stateCodeMessage = pocStateStringVB) 
     // Generate an unsigned transaction. 
     val txCommand = Command(BankContract.Commands.Create(), pocState.participants.map { it.owningKey }) 
     val txBuilder = TransactionBuilder(notary).withItems(StateAndContract(ourOtherOutputStateVB, POC_CONTRACT_ID), txCommand) 

     // Stage 2. 
     progressTracker.currentStep = VERIFYING_TRANSACTION 
     // Verify that the transaction is valid. 
     txBuilder.verify(serviceHub) 

     // Stage 3. 
     progressTracker.currentStep = SIGNING_TRANSACTION 
     // Sign the transaction. 
     val partSignedTx = serviceHub.signInitialTransaction(txBuilder) 

     // Stage 4. 
     val otherPartyFlow = initiateFlow(otherParty) 
     progressTracker.currentStep = GATHERING_SIGS 
     // Send the state to the counterparty, and receive it back with their signature. 
     val fullySignedTx = subFlow(CollectSignaturesFlow(partSignedTx, setOf(otherPartyFlow), GATHERING_SIGS.childProgressTracker())) 

     // Stage 5. 
     progressTracker.currentStep = FINALISING_TRANSACTION 
     // Notarise and record the transaction in both parties' vaults. 
     return subFlow(FinalityFlow(fullySignedTx, FINALISING_TRANSACTION.childProgressTracker())) 
    } 

さて、私の質問は次のとおりです。 「消費」するために銀行の状態を変更するためにどのように顧客のノードの後に​​入力として使用されていること。そのため、顧客ノードは同じ銀行状態で再びフローを開始できません。これにより、常に銀行がフローを開始し、顧客がそのフローに応答できるようになります。

答えて

0

FinalityFlowの一部として、トランザクションは取引のすべての州のすべての参加者(またはすべての州の所有者がOwnableStateの場合)に送信されます。トランザクションを受信すると、各ノードは、それが有効で完全に署名されていることを確認し、それをボールトに記録する。この時点で、ノードのボールトは、消費されたトランザクションの入力状態をすべてマークします。

フローを実行した後で入力状態の1つが銀行ノードで消費されていないことがわかっている場合は、銀行ノードがFinalityFlowの一部として取引を受けているかどうかを確認する必要があります。

+0

正しい方法で説明していないようです... 1)銀行ノードが状態を作成してクライアントに送信します(つまり、FinalityFlowを使用して両方の元帳にコミットしました)。 2)クライアントノードのコピーは、(UNCONSUMED)状態になり、値を変更して銀行と顧客の元帳に送り返します。ここでは合計2つの銀行が顧客に、顧客は銀行にそれぞれ流れます。クライアントノードが2回目のフローを開始しようとすると、クライアントがバンクから入力された入力状態が不明なので、許可してはいけません。 – Omganesh

+0

銀行ノードがトランザクションを受け取ったことを確認しました。しかし、私はその入力状態が消費されるのを見ません。ボールトの状態を手動で消費するように変更する方法を教えてください。 – Omganesh

+0

状態は自動的に消費されたとマークされます。これはあなたが手動で行うことではありません。与えられた状態を消費するトランザクションをノードが認識するとすぐに、その状態は消費されたものとしてマークされます。 – joel

関連する問題