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 andamiaje con varias herramientas para ayudar en el proceso de desarrollo de código de cadena.

Con el archivo de especificación puede especificar varias definiciones y comportamientos de activos, declaración de método CRUD y no CRUD, métodos personalizados, validación de argumentos, canalización/anulación de canalización automática, capacidad de persistencia transparente y llamada a consultas de datos enriquecidos mediante SQL SELECT o CouchDB Query Language. 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 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 comiencen con letras mayúsculas en el archivo de especificación.

Estructura del Archivo de Especificación

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

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

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

tipo: embebido

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 almacenarlos 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 Propiedad

Se admiten los siguientes tipos de propiedades básicas:
  • number
  • float
  • string
  • boolean
  • date
  • array
Para los códigos de cadenas Go, number se asigna a int y float a float64. Otros tipos no son compatibles actualmente, 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 de un activo embebido.

Esta propiedad tiene dos parámetros obligatorios:
  • strategy: toma los 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 de 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 de 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 proporciona el valor por defecto de esta propiedad.

 
validate:

La propiedad dada 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 sea válida.

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

 
validate:

tipo: número

  • positivo()
  • negativa()
  • 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 contienen determinados caracteres reservados o caracteres de espacios en blanco se deben identificar 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:

tipo: boolean

  • true
  • false

En el ejemplo, la validación de la propiedad active se realiza por el tipo (boolean)

name: active
type: boolean
validate:

tipo: matriz

Por tipo en sí, 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 y el máximo es 5. Si se evita cualquiera de los dos, solo se considera min/max.

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

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. Las desviaciones de zona horaria pueden reemplazar Z como en -05:00 para el horario de verano central.
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/Leer/Actualizar/Suprimir) o adicionales se va a generar.

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

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, los cuatro métodos se crearán 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án otros métodos.

Si el parámetro others no se utiliza en absoluto, se crearán ambos métodos 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étodo personalizado invocables en el archivo de controlador principal. Toma la firma del método y crea la declaración de función en el archivo de 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 Berkeley DB SQL y CouchDB. Este método solo se puede llamar cuando está conectado a Oracle Blockchain Platform Cloud o a 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)"