金融模型

原文地址:https://docs.corda.net/financial-model.html

Corda 提供了大量的在金融应用中使用的数据类型的标准库和合约 state 对象。这个对于 states 和 合约提供了一个通用的语言。

数量 Amount

Amount 类被用来代表某种 fungible asset 的数量。这是一个 generic 类,被提升成为一种类型来定义底层的叫做 token 的产品。例如他可以是标准的 JDK 的 Currency 类型,或者是一个被发行(Issued)的实例,或者是一个更复杂的类型,比如作为一个债务合约发行的定义(这反过来包括了一个 token 类型的定义,这个 token 会用来结算这笔债务)。自定义的 token 类型应该实现 TokenizableAssetInfo 来允许 Amount 转换 helpers fromDecimaltoDecimal 来计算正确的 displayTokenSize

注意:这里的 fungible 代表着能够跟其他的唯一的实例进行互换,并且他们还可以被拆分/合并。例如一个 £5 的纸币(note)可以被合理地转换成任何其他的 £5 纸币,并且一个 £10 的纸币还可以被换成两个 £5 的纸币,反过来也可以。

下边是一些例子:

// A quantity of some specific currency like pounds, euros, dollars etc.
Amount<Currency>
// A quantity of currency that is issued by a specific issuer, for instance central bank vs other bank dollars
Amount<Issued<Currency>>
// A quantity of a product governed by specific obligation terms
Amount<Obligation.Terms<P>>

Amount 会以整数的形式来代表数量。你不可以用 Amount 来表示一个负的数量:如果你想要这么做的话那你比需要使用另外一种类型,通常应该是 BigDecimal。对于货币来说,数量代表着便士(pennies),美分(cents)或者任何对于该货币是最小的整数数量,但是对于其他类型的资产,这可能会代表任何东西,比如 1000 公吨的煤,或者是千瓦小时。对于可显示的数量的精确转换率是要通过 displayTokenSize 属性来实现的,它是 BigDecimal 对于一个单独的 token 的数字展现。Amount 也定义了方法来对 overflow/underflow checked 加法和减法(这个在 Kotlin 中是操作符重载 operator overloads,在 Java 追踪可以向常规方法那样被使用)。更复杂的计算通常应该使用 BigDecial 来做然后再转换回来,以确保进位(rounding)的考虑和确保 token 的转换。

Issued 指的是一个产品(这个产品可以是现金、和现金类似的事物,资产或者任何可以用整数来代表的可数量化的事物)和一个相关的 PartyAndReference,这个 reference 代表了该合约的发行者。一个被发行的产品通常会遵循一个生命周期,其中会包括发行,转移和从账本中消除(比如,查看 Cash 合约和它相关的 state 和 commands)

为了展现数量的转移,tokens 使用 'AmountTransfer类型,它记录了数量和一个转移的目的。正数的数量值表示 tokens 从一个source(比如一个Party或者CompositeKey)转移到了destination。负数值可以用来表示从destinationsource的一个颠倒的转移。apply方法可以用来处理在一个List中定义好的Amount` 对象列表来开始真正的转移。

金融 states

在常见的 state 类型以外,还有很多扩展了 ContractState 的接口来作为金融 state,比如:

下边的图表展示了整个 Contract State 的结构: Financial Contract State Model

注意当前有两个包,一个核心类库和一个金融模型特殊的类库。开发者可以直接重用或者扩展金融类型,或者通过从核心类库中扩展基本的类型来编写自己的类型。