記事の概要
Cordaの公式ドキュメントに沿って、CorDappを自作してみた。
この記事では、statesを作成する所までを記載する。
公式ドキュメント
https://docs.corda.net/_static/corda-developer-site.pdf
(主に第5章 「Getting started developing CorDapps」と第6章「KEY CONCEPTS」に沿って実施。)
statesの概要
1.「states」とは?
statesとは、「元帳上の事実」が記録されているオブジェクト。
statesは状態が変わる(金額が移動する、所有権が変わる等)ことで、更新されていく。
また、Cordaプラットフォームに参加している各ノードはそれぞれstatesを保有し、
保管するためのvault(金庫室)を保有している。
2.「states」の更新のシーケンス
「states」事態は、イミュータブル(作成後にその状態を変えることのできないオブジェクト)のため、
直接更新することはできない。その代わり、新しいstatesを表す新しいバージョンのstatesを作成し、
既存のstatesを履歴としてマークする。statesの履歴は各ノードのvaultに蓄積されていく。
statesの実装
CorDappを公式ドキュメントの「5.2.2 Step Two: Creating states」に倣ってコーディングしてみる。
ちなみに、プログラミング言語はKotlin。
package com.template.states
import com.template.contracts.CarContract
import com.template.contracts.TemplateContract
import net.corda.core.contracts.BelongsToContract
import net.corda.core.contracts.ContractState
import net.corda.core.contracts.UniqueIdentifier
import net.corda.core.identity.AbstractParty
import net.corda.core.identity.Party
// *********
// * State *
// *********
@BelongsToContract(CarContract::class)
data class CarState( ※1
val owningBank: Party, ※2
val holdingDealer: Party,
val manufacturer: Party,
val vin: String,
val licensePlateNumber: String,
val make: String,
val model: String,
val dealershipLocation: String,
val linearId: UniqueIdentifier ※3
) : ContractState { ※1
override val participants: List<AbstractParty> = listOf(owningBank, holdingDealer, manufacturer) ※4
}
以下、ソース中の「※」の注釈。
※1:class「CarState」は、用意されているクラス「ContractState」を継承して作成。
※2:class「CarState」にある変数「owningBank」や「holdingDealer」に使われている型「Party」は、
Cordaにて用意されているオブジェクト。ちなみに「party」は法律用語で「当事者」という意味。
ネットワーク上で一意に識別できる名前と公開鍵を保有している。
※3:UniqueIdentifierもCordaにて用意されている型。class(上記の場合だとCarState)が実体化したタイミングで、
linearIdに一意の識別子が付与される。
※4:「ContractState 」のプロパティ「participants」をオーバーライドする。ここでは、「owningBank」、
「holdingDealer」、「manufacturer」のリストを設定している。
終わりに
次回はcontractsの作成から再開する予定。