2017-07-13 16 views
3

現在、取引先に送信されない契約書のドラフト版を1つ作成する予定であり、イニシエータはネットワークに送信する前に変更を加えることができます。 1つの "共有されていない事実"として。私たちが知っているように、Cordaとボールトは共有の事実に使われているので、ここで私はまだボールトを使ってこの種の "共有されていない事実"を保存できるかどうかはわかりません。私の考えは以下の通りです。チュートリアルのCorDappでは、他のCordaチーム/エキスパートからのインプットを得たいと思っています。コルダで1つの非共有ファクトを定義する方法

主な変更点は、イニシエータの流れである:

  • 開始するだけで、コマンドのを作成して、イニシエータのキー
  • ので、これは他のものには送信されません「CollectSignaturesFlow」を起動しないでください
  • verify()の後に "FinalityFlow"を呼び出すと、これは元帳にコミットされます

以下は上記のポイントのコードです。

override fun call(): SignedTransaction { 
    // We create a transaction builder 
    val txBuilder = TransactionBuilder() 
    val notaryIdentity = serviceHub.networkMapCache.getAnyNotary() 
    txBuilder.notary = notaryIdentity 

    // We create the transaction's components. 
    val ourIdentity = serviceHub.myInfo.legalIdentity 
    val iou = TemplateState(iouValue, ourIdentity, ourIdentity) 
    val txCommand = Command(TemplateContract.Create(), listOf(ourIdentity.owningKey)) 

    // Adding the item's to the builder. 
    txBuilder.withItems(iou, txCommand) 

    // Verifying the transaction. 
    txBuilder.toWireTransaction().toLedgerTransaction(serviceHub).verify() 

    // Signing the transaction. 
    val partSignedTx = serviceHub.signInitialTransaction(txBuilder) 

    // Finalising the transaction. 
    return subFlow(FinalityFlow(partSignedTx)).single() 
} 

答えて

3

実際にコルダで共有されていない事実を作成することができます!ここの鍵は州のparticipantsリストにあります。参加者リストに自分自身を追加し、コマンドの公開鍵だけを追加してください。 FinalityFlowが呼び出されると

//Contract and State. 
class UnsharedFact: Contract { 
    override val legalContractReference: SecureHash = SecureHash.zeroHash 
    override fun verify(tx: TransactionForContract) = Unit // Stubbed out. 
    class Create: CommandData 

    data class State(val parties: Set<Party>): ContractState { 
     override val contract: Contract get() = UnsharedFact() 
     override val participants: List<AbstractParty> get() = parties.toList() 
     fun addParty(newParty: Party) = copy(parties = parties + newParty) 
    } 
} 

// Create flow. 
@InitiatingFlow 
@StartableByRPC 
class CreateUnsharedFact(): FlowLogic<SignedTransaction>() { 
    @Suspendable 
    override fun call(): SignedTransaction { 
     val me = serviceHub.myInfo.legalIdentity 
     val notary = serviceHub.networkMapCache.getAnyNotary() 
     val state = UnsharedFact.State(setOf(me)) 
     val command = Command(UnsharedFact.Create(), listOf(me.owningKey)) 
     val utx = TransactionBuilder(notary = notary).withItems(state, command) 
     val stx = serviceHub.signInitialTransaction(utx) 
     return subFlow(FinalityFlow(stx)).single() 
    } 
} 

、あなたは出力状態を受ける唯一のノードになります。ここでは簡単な例です。

その後、別の関係者が関与する場合は、UnsharedFact.StateaddPartyメソッドを使用して新しいバージョンの状態を作成することができます。次に、オリジナルの状態を入力として追加し、新しいバージョン(新しいパーティを含む)を出力として追加して、新しいトランザクションを作成します。この取引が確定される(公示されない)場合、両当事者はそれぞれの金庫にコピーを持ちます。今、私は 'UnsharedFact'という名前が不適切だと思います:)

同様の方法でパーティーを削除することもできます。

+0

このコメントはありがとうございます。だから、たとえこれが共有の事実ではないが、ボールトに格納されている事実だから、それを更新したり削除したりするには、入力と出力を使うべきだがVaultから元のデータを更新または削除しないでください.Corda自体は、物理的に状態を更新/削除する機能も提供していません。私は正しいですか? –

+0

Roger氏は、Cordaの中核プロジェクトであるコマーシャル・ペーパーのデモの流れで、トランザクションとその出力状態をボールトに記録するために 'serviceHub.recordTransactions(listOf(tx)) 'を使用する' selfIssueSomeCommercialPaper'機能を持っていることに気付きました。 'FinalityFlow'の代わりに、このもう一つのアプローチが使えますか? –

+0

あなたの最初のコメントに - はい!更新したり削除したりするには、トランザクションを使用します。 2番目のコメントに。 'recordTransactions'より' FinalityFlow'を使うことをお勧めします。 'FinalityFlow'は、必要ならば公証人をつかんで、' BroadcastTransactionFlow'を呼び出すことによってtxを必要な全てのパーティーに分配します。受信側は(BroadcastTransactionFlowに応答して)NotifyTransactionHandlerを実行し、tx依存関係を解決し、トランザクションを保存する。 –

関連する問題