入力仕様ファイル

ブロックチェーン・アプリケーション・ビルダー初期化コマンドは、入力仕様ファイルを読み取り、チェーンコード開発プロセスを支援する複数のツールを使用してスキャフォールディング済プロジェクトを生成します。

仕様ファイルを使用すると、SQL SELECTまたはCouchDB問合せ言語を使用して、複数のアセット定義と動作、CRUDと非CRUDメソッド宣言、カスタム・メソッド、引数の検証、自動整列化/非整列化、透過的永続性機能、およびリッチ・データ問合せの呼出しを指定できます。これらの機能は自動的に生成されます。

トークン・アセットの指定の詳細は、次のトピックを参照してください。
仕様ファイルは、yamlまたはjsonのいずれかで記述できます。ブロックチェーン・アプリケーション・ビルダー・パッケージのダウンロードでは、次の両方の形式のサンプル仕様ファイルを参照できます:
  • Fabcar-Typescript.yml
  • Marbles-Go.yml

ノート:

Go表記規則に従って、エクスポートされる名前は大文字で始まります。したがって、すべてのアセット・プロパティおよびメソッドには、仕様ファイル内で大文字で始まる名前が必要です。

仕様ファイルの構造

通常は、次の方法で仕様ファイルを構造化します。

assets: 
    name:
    type:
    properties:
        name:
        type:
        id:
        derived:
           strategy:
           algorithm:
           format:
        mandatory:
        default:
        validate:
    methods:
        crud:
        others:
customMethods:

ブロックチェーン・アプリケーション・ビルダーでは、タイプが指定されていない汎用アセットに加えて、埋込みアセットとトークン・アセットの2つの特別なアセット・タイプがサポートされています。特別なアセットは、仕様ファイルのassets:セクションでtype: embeddedまたはtype: tokenとして定義されます。

表7-2仕様ファイルのパラメータの説明および例

開始時 説明
assets:

このプロパティは、アセットの定義および動作を使用します。ここで複数のアセット定義を指定できます。

 
name:

アセットの名前。

次の名前は予約されています。これらの名前はアセットには使用しないでください。
  • account
  • role
  • hold
  • token
  • authorization
  • tokenAdmin
  • Account
  • Role
  • Hold
  • Token
  • Authorization
  • TokenAdmin
name: owner # Information about the owner
type:

アセット・タイプ

次の特別なアセット・タイプがサポートされています。
  • embedded
  • token

assetsセクションでtypeパラメータを指定しない場合、アセットは汎用タイプになります。

 
type:

タイプ: 埋込み

このプロパティがembeddedに設定されている場合、アセットは埋込みアセットとして定義されます。埋込みアセットにはCRUDメソッドがなく、レジャーに格納する別のアセットの一部である必要があります。

この例では、プロパティaddressが組み込まれており、別のアセットで定義されています。

埋込みアセットは循環参照をサポートしていません。たとえば、前述の例では、addressアセットにemployeeアセットへの参照を含めることはできません。

アセット: employee
name: employee
  properties:
     name: employeeId
     type: string
     mandatory: true
     id: true

     name: firstName
     type: string
     validate: max(30)
     mandatory: true

     name: lastName
     type: string
     validate: max(30)
     mandatory: true

     name: age
     type: number
     validate: positive(),min(18)

     name: address
     type: address
アセット: address
name: address

type: embedded

properties:
   name: street
   type: string

   name: city
   type: string

   name: state
   type: string

   name: country
   type: string
properties:

アセットのすべてのプロパティを記述します。

 
name:

プロパティの名前

name: ownerId # Unique ID for each owner
id:
  • true

これは、このアセットの識別子を指定します。このプロパティは必須です。

name: owner            # Information about the owner
properties:
     name: ownerId    # Unique ID for each owner
     type: string
     mandatory: true
     id: true
     name: name        # Name of the owner
     type: string
     mandatory: true
type:

プロパティのタイプ

次の基本プロパティ・タイプがサポートされています。
  • number
  • float
  • string
  • boolean
  • date
  • array
Goチェーンコードの場合、numberintにマップされ、floatfloat64にマップされます。次のタイプを含むその他のタイプは、現在サポートされていません。
  • complex
  • unsigned/signed int
  • 8/16/32/64 bits
name: year        # Model year
                    type: number
                    mandatory: true
                    validate: min(1910),max(2020)
                    name: color       # Color - no validation as color names are innumerable
                    type: string
                    mandatory: true
derived:

このプロパティーは、idプロパティーがほかの鍵から派生することを指定します。依存プロパティは、埋込みアセットではなく、stringデータ型である必要があります。

このプロパティには、次の2つの必須パラメータがあります:
  • strategy: concatまたはhashの値を使用します。
  • format: 戦略で使用される仕様文字列と値の配列を使用します。
例1:
  • プロパティemployeeIDは、firstNameおよびlastNameプロパティに依存します。
  • このプロパティは、format配列にリストされた値を連結します。
  • IND%1#%2%tINDは配列内の0番目のインデックスで、最終的な形式を記述します。
  • %nは、配列内の他の索引から値を取得する位置識別子です。
  • %tは、チャネル・ヘッダーからの値がstub.timestampであることを示します。
  • format文字列で文字%を使用する必要がある場合は、別の%でエスケープする必要があります。
  • この例の最後の形式は、INDfirstName#lastName1606885454916INDです
例2:
  • hashを使用する場合は、algorithmパラメータも参照してください。デフォルトはsha256で、md5もサポートされています。
  • IND%1#%2%tは配列内の0番目の索引で、最終的な形式を記述します。
  • %nは、配列内の他の索引から値を取得する位置識別子です。
  • %tは、チャネル・ヘッダーからの値がstub.timestampであることを示します。
  • format文字列で文字%を使用する必要がある場合は、別の%でエスケープする必要があります。
例1
name: employee
  properties:
     name: employeeId
     type: string
     mandatory: true
     id: true
     derived:
         strategy: concat
         format: ["IND%1#%2%tIND","firstName","lastName"]

     name: firstName
     type: string
     validate: max(30)
     mandatory: true

     name: lastName
     type: string
     validate: max(30)
     mandatory: true

     name: age
     type: number
     validate: positive(),min(18)
例2
name: account
  properties:
     name: accountId
     type: string
     mandatory: true
     id: true
     derived:
         strategy: hash
         algorithm: 'sha256'
         format: ["IND%1#%2%t","bankName","ifsccode"]

     name: bankName
     type: string
     validate: max(30)
     mandatory: true

     name: ifsccode
     type: string
     mandatory: true
mandatory:
  • true
  • false

対応するプロパティは必須であり、アセットの作成時にスキップできません。

name: phone       # Phone number - validate as (ddd)-ddd-dddd where dashes could also be periods or spaces
type: string
mandatory: true
validate: /^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/
name: cars        # The list of car VINs owned by this owner
type: string[]
mandatory: false
default:

これにより、このプロパティのデフォルト値が設定されます。

 
validate:

指定されたプロパティは、ブロックチェーン・アプリケーション・ビルダーによって提供される即時利用可能な検証の一部に対して検証されます。チェーンが有効であることを確認した場合は、検証を連鎖できます。

validateプロパティが指定されていない場合、検証はプロパティtypeに対してのみ実行されます。

 
validate:

タイプ: 数値

  • ポジティブ()
  • ネガティブ()
  • 分()
  • max()

これらの検証は、カンマで区切ることができます。

name: offerApplied
type: number
validate: negative(),min(-4)
name: year  # Model year
type: number
mandatory: true
validate: min(1910),max(2020)
validate:

タイプ: 文字列

  • min()
  • max()
  • email()
  • url()
  • /regex/ - PHP正規表現をサポートしています

Goチェーンコードでは、特定の予約文字または空白文字を含む正規表現を適切にエスケープする必要があります。

name: website 
type: string
mandatory: false
validate: url()
name: phone  # Phone number - validate as (ddd)-ddd-dddd where dashes could also be periods or spaces
type: string
mandatory: true
validate: /^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/
name: Color #Color can be red, blue, or green
type: string
mandatory: true
validate: /^\\s*(red|blue|green)\\s*$/
validate:

型: boolean

  • true
  • false

この例では、プロパティactiveの検証は型自体(boolean)によって行われます

name: active
type: boolean
validate:

タイプ: 配列

型自体によって、type: number[]の形式で、配列が数値型であることを示します。

配列には、最小長が1、最大長が5であることを意味するnumber[1:5]の形式で配列に対する制限を入力できます。どちらか一方を回避する場合、最小/最大のみを考慮します。

name: items
type: number[:5]
validate:

タイプ: date

  • min()
  • max()
日付は次のいずれかの書式にする必要があります:
  • YYYY-MM-DD
  • YYYY-MM-DDTHH:MM:SSZ。ここで、Tは日付と時刻を区切り、ZはUTCを示します。タイムゾーン・オフセットは、中部夏時間の-05:00としてZを置き換えることができます。
name: expiryDate
type: date
validate: max('2020-06-26')
name: completionDate
type: date
validate: min('2020-06-26T02:30:55Z')
methods:

これを使用して、生成するCRUD (作成/読取り/更新/削除)または追加のメソッドを指定します。

デフォルトでは、何も入力されていない場合、すべてのCRUDおよびその他のメソッドが生成されます。

methods:
    crud: [create, getById, update, delete]
    others: [getHistoryById, getByRange]
crud:
  • create
  • getByID (読取り)
  • update
  • delete

この配列を空のままにすると、CRUDメソッドは作成されません。

crudパラメータをまったく使用しない場合は、デフォルトで4つのメソッドがすべて作成されます。

crudパラメータは、tokenアセットおよびembeddedアセットには適用されません。

methods:
    crud: [create, getById, delete]
    others: [] # no other methods will be created
others:
  • getHistoryById
  • getByRange

getHistoryByIdは、リスト内のアセットの履歴を返します。

getByRangeは、指定された範囲のすべてのアセットを返します。詳細は、「getByRange」(TypeScript)および「GetByRange」(Go)を参照してください。

この配列を空のままにすると、他のメソッドは作成されません。

othersパラメータをまったく使用しない場合は、デフォルトで両方のメソッドが作成されます。

othersパラメータは、tokenアセットおよびembeddedアセットには適用されません。

methods:
    crud: [create, delete]
    others: [] # no other methods will be created
      methods:
        crud: [create, getById, update, delete]
        others: [getHistoryById, getByRange]
customMethods:

このプロパティは、メイン・コントローラ・ファイルに呼出し可能なカスタム・メソッド・テンプレートを作成します。メソッド・シグネチャを取得し、コントローラ・ファイルに関数宣言を作成します。

ここでは、言語固有の関数宣言を指定できます。

executeQueryという名前のカスタム・メソッドが用意されています。仕様ファイルに追加すると、Berkeley DB SQLおよびCouchDBリッチ問合せの実行方法の詳細が示されます。このメソッドを呼び出すことができるのは、Oracle Blockchain Platform CloudまたはEnterprise Editionに接続している場合のみです。

TypeScript

customMethods:
    - executeQuery
    - "buyCar(vin: string, buyerId: string, sellerId: string, price: number, date: Date)"
    - "addCar(vin: string, dealerId: string, price: number, date: Date)"

移動

customMethods:
    - executeQuery
    - "BuyCar(vin string, buyerId string, sellerId string, price int)"
    - "AddCar(vin string, dealerId string, price int)"