File specifica di input

Il comando di inizializzazione di Blockchain App Builder legge il file delle specifiche di input e genera il progetto impalcato, che include strumenti per assistere nel processo di sviluppo del codice concatenato.

Nel file di specifica è possibile specificare più definizioni e comportamento degli asset, la dichiarazione del metodo CRUD e non CRUD, i metodi personalizzati, la convalida degli argomenti, il marshalling automatico/unmarshalling, la capacità di persistenza trasparente e la possibilità di completare query Rich Data utilizzando istruzioni SQL SELECT o il linguaggio di query CouchDB. Queste funzioni vengono generate automaticamente.

Per informazioni sulla specifica degli asset token, vedere gli argomenti riportati di seguito.
Il file di specifica può essere scritto in formato YAML o JSON. Puoi vedere file di specifiche di esempio in entrambi i formati nel download del pacchetto Blockchain App Builder:
  • Fabcar-Typescript.yml
  • Marbles-Go.yml

Nota

In conformità con le convenzioni Go, i nomi esportati iniziano con una lettera maiuscola. Pertanto, tutte le proprietà e i metodi dell'asset devono avere nomi che iniziano con lettere maiuscole nel file di specifica.

Struttura del file di specifica

In genere, è possibile strutturare un file di specifica nel modo seguente:

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

Blockchain App Builder supporta due tipi di asset speciali, asset incorporati e asset token, oltre ad asset generici senza un tipo specificato. Gli asset speciali sono definiti come type: embedded o type: token nella sezione assets: del file di specifica.

Tabella 3-2 Descrizioni ed esempi dei parametri del file di specifica

Voce Descrizione Esempi
assets:

Questa proprietà accetta la definizione e il funzionamento dell'asset. È possibile definire più asset.

 
name:

Il nome del cespite.

I nomi seguenti sono riservati. Non utilizzare questi nomi per gli asset.
  • account
  • role
  • hold
  • token
  • authorization
  • tokenAdmin
  • Account
  • Role
  • Hold
  • Token
  • Authorization
  • TokenAdmin
name: owner # Information about the owner
type:

Tipi cespite

Sono supportati i seguenti tipi di asset speciali:
  • embedded
  • token

Se non si specifica un parametro type nella sezione assets, l'asset è di tipo generico.

 
type:

tipo: incorporato

Se questa proprietà è impostata su embedded, l'asset viene definito come asset incorporato. Gli asset incorporati non dispongono di metodi CRUD e devono far parte di un altro asset da memorizzare nel libro contabile.

Nell'esempio, la proprietà address è incorporata ed è definita in un altro asset.

Gli asset incorporati non supportano riferimenti circolari. Ad esempio, nell'esempio precedente l'asset address non può contenere un riferimento all'asset employee.

Asset: 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
Asset: address
name: address

type: embedded

properties:
   name: street
   type: string

   name: city
   type: string

   name: state
   type: string

   name: country
   type: string
properties:

Descrive tutte le proprietà di un asset.

 
name:

Il nome della proprietà.

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

Specifica l'identificativo di questo asset. Questa proprietà è obbligatoria.

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:

Tipi di proprietà

Sono supportati i seguenti tipi di proprietà di base:
  • number
  • float
  • string
  • boolean
  • date
  • array
Per i codici concatenati Go, number è mappato a int e float è mappato a float64. Al momento non sono supportati altri tipi, inclusi i seguenti:
  • 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:

Questa proprietà specifica che la proprietà ID deriva da altre chiavi. Le proprietà dipendenti devono essere del tipo di dati string e non di un asset incorporato.

Questa proprietà dispone di due parametri obbligatori:
  • strategy: accetta i valori concat o hash.
  • format: accetta un array di stringhe e valori di specifica da utilizzare dalla strategia.
Esempio 1:
  • La proprietà employeeID dipende dalle proprietà firstName e lastName.
  • Questa proprietà è una concatenazione dei valori elencati nell'array format.
  • IND%1#%2%tIND è l'indice 0 dell'array e descrive il formato finale.
  • %n è un specificatore di posizione che prende i valori dagli altri indici dell'array.
  • %t indica che il valore è il valore stub.timestamp dell'intestazione del canale.
  • Se è necessario utilizzare il segno di percentuale (%) nella stringa format, è necessario utilizzare un altro segno di percentuale (%).
  • Il formato finale in questo esempio sarebbe: INDfirstName#lastName1606885454916IND
Esempio 2:
  • Quando si utilizza hash, è necessario utilizzare anche il parametro algorithm. L'impostazione predefinita è sha256; è supportato anche md5.
  • IND%1#%2%t è l'indice 0 dell'array e descrive il formato finale.
  • %n è un specificatore di posizione che prende i valori dagli altri indici dell'array.
  • %t indica che il valore è il valore stub.timestamp dell'intestazione del canale.
  • Se è necessario utilizzare il segno di percentuale (%) nella stringa format, è necessario utilizzare un altro segno di percentuale (%).
Esempio 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)
Esempio 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

La proprietà corrispondente è obbligatoria e non può essere saltata durante la creazione di un asset.

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:

Il valore predefinito di questa proprietà.

 
validate:

La proprietà specificata viene convalidata in base ad alcune delle convalide pronte all'uso fornite da Blockchain App Builder. È possibile concatenare le convalide se si è certi che la catena sia valida.

Se la proprietà validate non viene fornita, la convalida viene eseguita solo sulla proprietà type.

 
validate:

tipo: numero

  • positivo()
  • negativa()
  • min()
  • max()

Queste convalide possono essere concatenate, separate da virgole.

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

tipo: stringa

  • min()
  • max()
  • email()
  • url()
  • /regex/ supporta l'espressione regolare PHP

Per i codici concatenati Go, le espressioni regolari contenenti determinati caratteri riservati o spazi vuoti devono essere sottoposte a escape.

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:

tipo: booleano

  • true
  • false

Nell'esempio, la convalida della proprietà active dipende dal tipo stesso (boolean)

name: active
type: boolean
validate:

tipo: array

Per tipo stesso, nel formato type: number[], indica che l'array è di tipo number.

È possibile immettere limiti all'array nel formato number[1:5], ovvero la lunghezza minima è 1 e la massima è 5. Puoi ometterne uno.

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

tipo: data

  • min()
  • max()
La data deve essere uno dei seguenti formati:
  • YYYY-MM-DD
  • YYYY-MM-DDTHH:MM:SSZ, dove T separa la data dall'ora e Z indica UTC. Gli offset di fuso orario possono sostituire Z, come in -05:00 per l'ora legale centrale.
name: expiryDate
type: date
validate: max('2020-06-26')
name: completionDate
type: date
validate: min('2020-06-26T02:30:55Z')
methods:

Utilizzare questa opzione per indicare quale dei metodi CRUD (Create/Read/Update/Delete) o aggiuntivi da generare.

Per impostazione predefinita vengono generati tutti i metodi CRUD e altri.

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

Se questo array viene lasciato vuoto, non verrà creato alcun metodo CRUD.

Se il parametro crud non viene specificato, verranno creati tutti e quattro i metodi per impostazione predefinita.

Il parametro crud non è applicabile agli asset token e embedded.

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

getHistoryById restituisce la cronologia dell'asset in un elenco.

getByRange restituisce tutti gli asset in un determinato intervallo. Per ulteriori informazioni, vedere "getByRange" (TypeScript) e "GetByRange" (Vai).

Se l'array viene lasciato vuoto, non verranno creati altri metodi.

Se il parametro others non viene utilizzato per niente, entrambi i metodi verranno creati per impostazione predefinita.

Il parametro others non è applicabile agli asset token e embedded.

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

Questa proprietà crea modelli di metodo personalizzati richiamabili nel file controller principale. Prende la firma del metodo e crea la dichiarazione della funzione nel file del controller.

È possibile fornire dichiarazioni di funzione specifiche della lingua qui.

Viene fornito un metodo personalizzato denominato executeQuery. Se si aggiunge questo metodo al file di specifica, vengono descritte in dettaglio le modalità di esecuzione delle query RTF Berkeley DB SQL e CouchDB. Questo metodo può essere richiamato solo quando si è connessi a Oracle Blockchain Platform Cloud o 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)"

Vai

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