Archivo de especificación de entrada

El comando de inicialización Blockchain App Builder lee el archivo de especificación de entrada y genera el proyecto andamio con varias herramientas para ayudar en el proceso de desarrollo de código de cadenas.

Con el archivo de especificación puede especificar varias definiciones y comportamientos de activos, declaraciones de métodos CRUD y no CRUD, métodos personalizados, validación de argumentos, canalización/anulación de canalización automática de datos, capacidad de persistencia transparente y llamada a consultas de datos enriquecidas mediante SQL SELECTs o lenguaje de consulta CouchDB. Estas funciones se generarán para usted.

El archivo de especificación se puede escribir en yaml o json. Puede ver archivos de especificación de ejemplo en ambos formatos en la descarga del paquete Blockchain App Builder:
  • Fabcar-Typescript.yml
  • Marbles-Go.yml

Note:

Según las convenciones de Go, los nombres exportados comienzan con una letra mayúscula. Por lo tanto, todas las propiedades y métodos de activos deben tener nombres que empiecen por letras mayúsculas en el archivo de especificación.

Estructura del archivo de especificación

Normalmente, un archivo de especificación se estructura de la siguiente manera:

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

Blockchain App Builder soporta dos tipos de activos especiales, activos embebidos y activos de token, además de activos genéricos sin ningún tipo especificado. Los activos especiales se definen como type: embedded o type: token en la sección assets: del archivo de especificación.

Tabla 7-2 Descripciones y ejemplos de parámetros del archivo de especificación

Entrada Descripción Ejemplos
assets:

Esta propiedad toma la definición y el comportamiento del activo. Puede proporcionar varias definiciones de activos aquí.

 
name:

El nombre del activo.

Los siguientes nombres están reservados. No utilice estos nombres para los activos.
  • account
  • role
  • hold
  • token
  • authorization
  • tokenAdmin
  • Account
  • Role
  • Hold
  • Token
  • Authorization
  • TokenAdmin
name: owner # Information about the owner
type:

Tipo de activos

Están soportados los siguientes tipos de activos especiales:
  • embedded
  • token

Si no especifica un parámetro type en la sección assets, el activo es del tipo genérico.

 
type:

type: incrustado

Si esta propiedad se define en embedded, el activo se define como un activo embebido. Los activos embebidos no tienen métodos CRUD y tienen que formar parte de otro activo para almacenarlo en el libro mayor.

En el ejemplo, la propiedad address está embebida y se define en otro activo.

Los activos embebidos no soportan referencias circulares. Por ejemplo, en el ejemplo anterior, el activo address no puede contener una referencia al activo employee.

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

type: embedded

properties:
   name: street
   type: string

   name: city
   type: string

   name: state
   type: string

   name: country
   type: string
properties:

Describir todas las propiedades de un activo.

 
name:

Nombre de la propiedad.

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

Especifica el identificador de este activo. Esta propiedad es obligatoria.

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:

Tipos de Propiedades

Están soportados los siguientes tipos de propiedades básicas:
  • number
  • float
  • string
  • boolean
  • date
  • array
Para los códigos de cadena Go, number se asigna a int y float a float64. Actualmente no se admiten otros tipos, incluidos los siguientes:
  • 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:

Esta propiedad especifica que la propiedad id se deriva de otras claves. Las propiedades dependientes deben ser del tipo de dato string y no un activo embebido.

Esta propiedad tiene dos parámetros obligatorios:
  • strategy: toma valores de concat o hash.
  • format: toma una matriz de cadenas y valores de especificación que utilizará la estrategia.
Ejemplo 1:
  • La propiedad employeeID depende de las propiedades firstName y lastName.
  • Esta propiedad es una concatenación de los valores mostrados en la matriz format.
  • IND%1#%2%tIND es el 0o índice de la matriz y describe el formato final.
  • %n es un especificador de posición que toma sus valores de los otros índices de la matriz.
  • %t indica que el valor debe ser stub.timestamp de la cabecera del canal.
  • Si necesita utilizar el carácter % en la cadena format, se debe identificar con otro %.
  • El formato final de este ejemplo sería: INDfirstName#lastName1606885454916IND
Ejemplo 2:
  • Al utilizar hash, también debe utilizar el parámetro algorithm. El valor por defecto es sha256; md5 también está soportado.
  • IND%1#%2%t es el 0o índice de la matriz y describe el formato final.
  • %n es un especificador de posición que toma sus valores de los otros índices de la matriz.
  • %t indica que el valor debe ser stub.timestamp de la cabecera del canal.
  • Si necesita utilizar el carácter % en la cadena format, se debe identificar con otro %.
Ejemplo 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)
Ejemplo 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 propiedad correspondiente es obligatoria y no se puede omitir al crear un activo.

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:

Esto le proporciona el valor por defecto de esta propiedad.

 
validate:

La propiedad determinada se valida con algunas de las validaciones listas para usar proporcionadas por Blockchain App Builder. Puede encadenar validaciones si se asegura de que la cadena es válida.

Si no se proporciona la propiedad validate, la validación se realiza solo con la propiedad type.

 
validate:

tipo: número

  • positiva()
  • negativo()
  • min()
  • max()

Estas validaciones se pueden encadenar separadas por comas.

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

tipo: cadena

  • min()
  • max()
  • email()
  • url()
  • /regex/: soporta la expresión regular de PHP

Para los códigos de cadenas Go, las expresiones regulares que contengan determinados caracteres reservados o caracteres de espacio en blanco deben identificarse correctamente.

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:

type: boolean

  • true
  • false

En el ejemplo, la validación de la propiedad active es por el tipo en sí (boolean)

name: active
type: boolean
validate:

type: array

Por sí mismo, con el formato type: number[], esto indica que la matriz es de tipo número.

Puede introducir límites en la matriz con el formato number[1:5], lo que significa que la longitud mínima es 1, el máximo es 5. Si uno de ellos se evita, solo se considera el mínimo/máximo.

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

type: date (tipo: fecha)

  • min()
  • max()
La fecha debe tener uno de estos formatos:
  • YYYY-MM-DD
  • YYYY-MM-DDTHH:MM:SSZ, donde T separa la fecha de la hora, y Z indica UTC. Los desfases de zona horaria pueden sustituir a Z como en -05:00 para el horario central de verano.
name: expiryDate
type: date
validate: max('2020-06-26')
name: completionDate
type: date
validate: min('2020-06-26T02:30:55Z')
methods:

Utilice esta opción para indicar cuál de los métodos CRUD (Crear/Lectura/Actualizar/Eliminar) o adicionales se van a generar.

Por defecto, si no se introduce nada, se generan todos los CRUD y otros métodos.

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

Si esta matriz se deja vacía, no se creará ningún método CRUD.

Si el parámetro crud no se utiliza en absoluto, se crearán los cuatro métodos por defecto.

El parámetro crud no se aplica a los activos token y embedded.

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

getHistoryById devuelve el historial del activo en una lista.

getByRange devuelve todos los activos de un rango determinado. Para obtener más información, consulte "getByRange" (TypeScript) y "GetByRange" (Ir).

Si esta matriz se deja vacía, no se creará ningún otro método.

Si el parámetro others no se utiliza en absoluto, ambos métodos se crearán por defecto.

El parámetro others no se aplica a los activos token y embedded.

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

Esta propiedad crea plantillas de métodos personalizados invocables en el archivo de controlador principal. Toma la firma del método y crea la declaración de función en el archivo del controlador.

Puede proporcionar declaraciones de funciones específicas del idioma aquí.

Proporcionamos un método personalizado denominado executeQuery. Si se agrega al archivo de especificación, detalla cómo se pueden ejecutar las consultas enriquecidas de Berkeley DB SQL y CouchDB. Este método solo se puede llamar cuando esté conectado 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)"

Go

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