File specifica di input

Il comando di inizializzazione Blockchain App Builder legge il file di specifica di input e genera il progetto impalcato con diversi strumenti per assistere nel processo di sviluppo del codice concatenato.

Con il file di specifica è possibile specificare più definizioni e comportamento degli asset, dichiarazione dei metodi CRUD e non CRUD, metodi personalizzati, convalida degli argomenti, marshalling/unmarshalling automatico, funzionalità di persistenza trasparente e richiamo di query Rich Data utilizzando SQL SELECTs o CouchDB Query Language. Queste funzioni verranno generate automaticamente.

Il file di specifica può essere scritto in 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

Conformemente alle 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, un file di specifica viene strutturato 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 agli asset generici senza alcun tipo specificato. Gli asset speciali sono definiti come type: embedded o type: token nella sezione assets: del file di specifica.

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

Voce Descrizione Esempi
assets:

Questa proprietà accetta la definizione e il funzionamento dell'asset. Qui è possibile fornire più definizioni di asset.

 
name:

Il nome dell'asset.

I seguenti nomi 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:

Tipo di asset

Sono supportati i tipi di asset speciali seguenti:
  • 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. I cespiti incorporati non dispongono di metodi CRUD e devono far parte di un altro cespite 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.

Cespite: 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:

Descrivere 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 tipi di proprietà di base seguenti:
  • 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 viene derivata da altre chiavi. Le proprietà dipendenti devono essere di tipo dati string e non un asset incorporato.

Questa proprietà ha due parametri obbligatori:
  • strategy: accetta i valori concat o hash.
  • format: accetta un array di stringhe e valori di specifica che devono essere utilizzati 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 indicatore di posizione che prende i valori dagli altri indici dell'array.
  • %t indica che il valore deve essere stub.timestamp dall'intestazione del canale.
  • Se è necessario utilizzare il carattere % nella stringa format, deve essere preceduto da un altro carattere di escape %.
  • Il formato finale in questo esempio è: 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 indicatore di posizione che prende i valori dagli altri indici dell'array.
  • %t indica che il valore deve essere stub.timestamp dall'intestazione del canale.
  • Se è necessario utilizzare il carattere % nella stringa format, deve essere preceduto da un altro carattere di escape %.
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 ignorata 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:

Viene fornito il valore predefinito di questa proprietà.

 
validate:

La proprietà specificata viene convalidata in base ad alcune convalide predefinite fornite da Blockchain App Builder. È possibile concatenare le convalide se si garantisce che la catena sia valida.

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

 
validate:

type: number

  • positivo()
  • negativo()
  • 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 che contengono determinati caratteri riservati o spazi vuoti devono essere precedute correttamente.

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 si basa sul tipo stesso (boolean)

name: active
type: boolean
validate:

tipo: array

Per tipo, nella forma di type: number[], questo indica che l'array è di tipo numero.

È possibile immettere limiti all'array nel formato number[1:5], ovvero la lunghezza minima è 1, la lunghezza massima è 5. Se uno dei due viene evitato, viene considerato solo min/max.

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 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 deve essere generato.

Per impostazione predefinita, se non viene immesso alcun valore, vengono generati tutti i metodi CRUD e altri metodi.

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 utilizzato affatto, 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 questo array viene lasciato vuoto, non verranno creati altri metodi.

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

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 del controller principale. Prende la firma del metodo e crea la dichiarazione di funzione nel file del controller.

Qui è possibile fornire dichiarazioni di funzione specifiche della lingua.

Viene fornito un metodo personalizzato denominato executeQuery. Se viene aggiunto al file di specifica, viene descritto in dettaglio come eseguire le query rich SQL e CouchDB di Berkeley DB. 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)"