---
# System prepended metadata

title: Documentación General

---

# Documentación General
## 1. Introducción
CERTO es una plataforma que te permite gozar de las bondades que ofrece una red blockchain privada, al registrar y verificar la autenticidad de tus activos digitales. Integra fácilmente dentro de tu solución el API de CERTO y descubre cómo tus activos digitales se vuelven más seguros e inalterables. 
## 2. ¿Cómo funciona?
![](https://i.imgur.com/EghV3Hl.png)
### 2.1. Conectar
Cualquier aplicación generadora de contenido del lado del cliente, se conectará al API Signer el cual se encarga de firmar las transacciones y calcular el hash (identificador único) del activo digital mediante IPFS. 
### 2.2. Certificar
La certificación de los activos digitales se realiza mediante el API de CERTO, el cual se encarga de envíar las transacciones a blockchain privada de CERTO. 
### 2.3. Enviar
Una vez realizada la certificación y el registro de los activos ditales en la blockchain de CERTO,se hace envío al usuario final del *hash* y/o el contenido orginal con el fin de realizar la verificación correspondiente.
### 2.4. Verificar
El usuario final, podrá verificar la autenticidad del contenido a través la aplicación descentralizada (DApp), en la que podrá hacer uso del hash entregada o del contenido original.

## 3. Pre-requisitos API Signer

**Artefactos de software:**

1. Signer
2. IPFS standalone

**Sugerencias de servidores**

* Descripción: Servidor de operaciones internas de la compañía, aloja el Signer y una instancia de IPFS standalone.
* Requerimientos mínimos:
        - RAM: 4 GB+ (si el disco duro es SSD), o 8 GB+ (si el disco es HDD)
        - Disco: 80 GB (SSD o HDD)
        - CPU: 4 vCPUs+ @2.00GHz x86_64
        - S.O.: Ubuntu 20.04+ o compatible con Linux 5.4.0-56-generic #62 o superior
        - Puertos abiertos: 
            - 22 TCP/UDP
            - 3000 TCP/UDP
            - 5001 TCP/UDP
        
**Requerimientos:**
* Cada servidor debe tener instalado Docker y docker-compose.
* Tener logs de inicio de sesión para el usuario que hace instalación
* Permitir que el usuario de instalación sea parte del grupo docker y sudoer.
* Garantizar la entrada de los usuarios a través de SSH con su llave pública.

**Consideraciones:**
* Cada empresa se debe encargar de los elementos internos de seguridad como instalaciones dentro de VPCs, o VPNs. Desde Certo no se consideran estos aspectos como necesarios para las instalaciones, pero se asumen desde los contextos corporativos.



## 4. Quick Start
Certo consta de dos servicios para gestionar el registro de documentos en la blockchain.

* **Signer API**, es el encargado de crear la cuenta que será utilizada para firmar las transacciones. De igual forma, permite calcular el hash ipfs de un documento dado.

* **Certo API**, es el encargado de retornar los parámetros necesarios para la creación de una transacción y para hacer el registro de las mismas en la blockchain.

Para utilizar CERTO es necesario configurar el **Signer API**

2. Copiar y guardar esta configuración en un file ***docker-compose.yml***. Esta configuración creará 2 contenedores, uno con el **Signer API** y    otro con una instancia de **IPFS**.
    ```
    version: '3.8'
    services:
     certo-signer:
       image: trugrouptech/certo-signer:v2.1
       container_name: certo-signer
       ports:
         - 3001:3001 # API Rest Services - expose if needed/wanted
       environment: 
         - IPFS_PORT=5001
         - IPFS_HOST=18.217.132.126 # IMPORTANT - Change this IP
         - IPFS_PROTOCOL=http
     ipfs:
       image: trugrouptech/ipfs
       container_name: ipfs
       ports:
         - '4001:4001' # IPFS swarm - expose if needed/wanted
         - '5001:5001' # IPFS api - expose if needed/wanted
         - '8080:8080' # IPFS gateway - expose if needed/wanted
    ```

2. Ejecutar el siguiente comando para crear los contenedores docker previamente configurados.
    ```
    docker-compose up -d
    ```
    Una vez tengamos los contenedores corriendo, podremos hacer las consultas respectivas al **Signer API**. 

---

### 4.1. Creación de un proceso en Certo

1. Crearemos la cuenta que será la encargada de firmar las transacciones (Este paso solo se realiza una vez y la cuenta queda registrada en el *Signer API*)


```
# Ejemplo de consumo de Signer API y creación de cuenta usando Javascript

// CERTO API: Obtener parámetros necesarios para crear la
// transacción de creación de contrato controlador
import axios from 'axios';
const url = '<URL_SIGNER>' # Especificar la ruta correcta
const accountURL = `${url}/account`;
const response = await axios.get(accountUrl);
console.log(response.data);

'''
{
  version: 3,
  id: 'c8843162-474c-4d47-9bce-2f9842d1b833',
  address: 'a24406d8dde54140976df25b98aade5583450604',
  crypto: {
    ciphertext: '1ec134bc02de07a7309073a67e5ffc8024c8271a9186372009967c4c60fdd323',
    cipherparams: {iv: '48c5044636f4cb28db91c679aa657b97'},
    cipher: 'aes-128-ctr',
    kdf: 'scrypt',
    kdfparams: {
      dklen: 32,
      salt: 'ad4d20102ff1d69a051132e750eea692bde2da113690603447b4814777f9ff0e',
      n: 8192,
      r: 8,
      p: 1,
    },
    mac: 'bf0733445a3243e5e021917e5699a8b0ef0091d3226ba28ac18d3074439f94bb',
  }
}
'''
```

La propiedad *'address'* es la que nos servirá para idenficar el *Address de la cuenta*, para esto tenemos que agregarle un '0x' quedando '0xa24406d8dde54140976df25b98aade5583450604'
```
address: 'a24406d8dde54140976df25b98aade5583450604' // Antes
address: '0xa24406d8dde54140976df25b98aade5583450604' // Después
```

2. Con la cuenta creada en el *SIGNER API*, utilizaremos el *CERTO API* que se encuentra en la ruta (revisar todos los endpoints en la documentación para más detalle)

```
https://api.certo.digital
```

3. Creación de un un contrato controlador (Este paso se realiza una sola vez)

```
import axios from 'axios';

const options = {
  headers: {
    'Content-Type': 'application/json',
  },
};

// CERTO API: Obtener parámetros necesarios para crear la
// transacción de creación de contrato controlador
const certoAPI = 'https://api.certo.digital';
const accountAddress = '0x1b3f2191c51af95f1691c5011685e6e045c0976e';
const accountPassword = 'pwd';
const controllerParamsURL = `${certoAPI}/controller/params/{accountAddress}`;
const controllerParams = await axios.get(controllerParamsURL);
console.log('createController Params', controllerParams.data);
/*
Parametros que se usarán en el signer para firmar la transacción
{
    "to": "0x",
    "nonce": "0x9",
    "gasLimit": "0x1ab48e",
    "gasPrice": "0x0",
    "data": "0x608060405234801561001057600080fd5b5060405161191138038061191...""
}
*/

// CERTO SIGNER: Firmar Transacción
const signerAPI = '<INSERTAR SIGNER API URL>';
const signURL = `${signerAPI}/sign`;
const params = { ...controllerParams, password: accountPassword };
const sign = await axios.post(signURL, params, options);
console.log(sign.data);
/*
Transacción firmada con el signer
{
    "sign": "0xf901680b808304907094c8a270d9e8a67b2dd51925..."
}
/*

// CERTO API: Crear contrato controlador en la blockchain
const deployControllerURL = `${certoAPI}/controller`
const deployTx = await axios.post(deployControllerURL, sign.data, options;
console.log('deployController', deployTx.data);
/*
Respuesta a la creación del contrato controlador en la blockchain de Certo
IMPORTANTE: Guardar el valor de 'controllerAddress'
{
    "controllerAddress": "0xc8a270D9e8A67b2Dd51925a3602C900A24C925D5",
    "transactionHash": "0x50eb6a1ce8bbd9a0e2d011e39ade18f7f9e17a221324966ad0eca85ed7841312",
    "blockHash": "0xf4d21a9a37ac3848eab90215757056e93d76a3afa92caba925949c31395b80ec"
}
*/
```

4. Creación de un proceso dentro del contrato controlador previamente creado

Utilizaremos el contrato controlador creado "0xc8a270D9e8A67b2Dd51925a3602C900A24C925D5" para la creación de un proceso con un hito inicial. Para lograr esto necesitamos:

- Address de la cuenta/signer
- Hash de documento
- Detalles del documento a registrar
- Address del contrato controlador

Utilizaremos el *Signer API* para obtener el hash del documento

```
// Lectura de archivo
...
const docFile = '<File Input>';
const data = new FormData();
data.append('file', docFile);

const optionsForm = {
  headers: {
    'Content-Type': 'multipart/form-data',
  },
};

// CERTO SIGNER: Obtener hash del documento
const signHashAPI = '<URL_SIGNER>/hash';
const documentInfo = await axios.post(signHashAPI, formData, optionsForm);
console.log(documentInfo.data);
/*
{
    "name": "file3.txt",
    "hash": "Qme2SPkiDqQHiSSNmXWxVK5EuxkVzAq1ryGHq7McEwvPKh",
    "size": "40"
}
*/

// Detalles del documento que se desea registrar
const obj = {
    name: 'Andre',
    country: 'PE',
    date: '17 Jan'
};

// Payload para el registro y creación del proceso
const payload = {
    accountAddress: accountAddress, // 0x1b3f2191c51af95f1691c5011685e6e045c0976e
    controllerAddress: deployTx.controllerAddress, //0xc8a270D9e8A67b2Dd51925a3602C900A24C925D5
    ipfsHash: documentInfo.hash, //Qme2SPkiDqQHiSSNmXWxVK5EuxkVzAq1ryGHq7McEwvPKh
    description: obj    
};

// CERTO API: Obtener los parámetros para firmar la transacción y crear un proceso
const processParamsURL = `${certoAPI}/process/params`;
const paramsResponse = await axios.post(processParamsURL, payload, options);
console.log(paramsResponse.data);

/*
{
    "processAddress": "0x056b62faaf82df03cc529a24477172891615eece",
    "txParams": {
        "to": "0xc8a270D9e8A67b2Dd51925a3602C900A24C925D5",
        "nonce": "0xa",
        "gasLimit": "0xa38d2",
        "gasPrice": "0x0",
        "data": "0xbf77d1b05bf38f4d704db9a303f5c773f343e...,
        "value": "0x0"
    }
}
*/
const { txParams, processAddress } = paramsResponse.data;

// CERTO SIGNER: Firmar Transacción
const signerAPI = '<INSERTAR SIGNER API URL>';
const signURL = `${signerAPI}/sign`;
const params = { ...txParams, password: accountPassword };
const sign = await axios.post(signURL, params, options);
console.log(sign.data);
/*
Transacción firmada con el signer
{
    "sign": "0xf901680b808304907094c8a270d9e8a67b2dd51925..."
}
/*
// CERTO API: Crear proceso con un hito inicial en la blockchain
const deployProcessURL = `${certoAPI}/process`
const deployProcessTx = await axios.post(deployProcessURL, sign.data, options;
console.log(deployProcessTx.data);
/*
Respuesta a la creación del proceso en la blockchain de Certo
{
    "transactionHash": "0x50eb6a1ce8bbd9a0e2d011e39ade18f7f9e17a221324966ad0eca85ed7841312",
    "blockHash": "0xf4d21a9a37ac3848eab90215757056e93d76a3afa92caba925949c31395b80ec"
}
*/

```

Con estos pasos podemos registrar un documento en la red blockchain de Certo. Si deseamos verificar los documentos simplemente hacemos la busqueda por el hash del documento en la página web principal de certo en la sección de validación https://certo.digital/ o utilizamos los endpoints para obtener la información directamente desde el API (revisar documentación de CERTO API)
## 5. API Signer
### 5.1. Creación de cuenta

### Definición
Crear la cuenta criptográfica (keystore) y deployar el contrato Controllador

| Method | Path |
|---|---|
| POST | /account |

###  Parámetros de petición

| Name | Type | Description |
|---|---|---|
| accountPassword | string | Password para crear Keystore |

```
JSON

{
    "accountPassword": "pwd"
}
```

### Resultado

Se retorna el keystore en formato JSON
```
 {
  version: 3,
  id: 'c8843162-474c-4d47-9bce-2f9842d1b833',
  address: 'a24406d8dde54140976df25b98aade5583450604',
  crypto: {
    ciphertext: '1ec134bc02de07a7309073a67e5ffc8024c8271a9186372009967c4c60fdd323',
    cipherparams: {iv: '48c5044636f4cb28db91c679aa657b97'},
    cipher: 'aes-128-ctr',
    kdf: 'scrypt',
    kdfparams: {
      dklen: 32,
      salt: 'ad4d20102ff1d69a051132e750eea692bde2da113690603447b4814777f9ff0e',
      n: 8192,
      r: 8,
      p: 1,
    },
    mac: 'bf0733445a3243e5e021917e5699a8b0ef0091d3226ba28ac18d3074439f94bb',
  },
  contractAddress: '0x1C0a58E3d7B55e48fb329Ae7e2ADE837b2411df6'
};
```
---
### 5.2. Creación y firma de transacción

### Definición
Se crea una transacción y se realiza la firma de la misma con la cuenta dentro *Signer*.

| Method | Path |
|---|---|
| POST | /sign |

###  Parámetros de petición

| Name | Type | Description |
|---|---|---|
| password | string | Password de la Keystore  |
| to | string | Address del receptor |
| nonce | string | Número de transacciones enviadas desde el addres emisor |
| gasLimit | string | Límite de gas |
| gasPrice | string | Precio del gas |
| data | string | Información de llamado de metodos en el contrato inteligente|
| value | string | Monto de ethers enviados |

```
{
    "password": "pwd",
    "to": "0xC231ccFC2C68cba980bC2FB684e39a9AD53681CB",
    "nonce": "0x7",
    "gasLimit": "0xa38d2",
    "gasPrice": "0x0",
    "data": "0xbf77d1b05bf38f4d704db9a303f5c773f343edb40f9466fa386898878238f491a86f3e0f0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000007e3078376232323665363136643635323233613232343136653634373236353232326332323633366637353665373437323739323233613232353036353732373532323263323236333666366336663732323233613232373236353634323232633232363436313734363532323361323234613735366532303336323237640000",
    "value": "0x0"
}
```

### Resultado

```
{
    "contractAddress": "0x7f65c4d8a188e3c83a488a50dfe988f25db8f79c",
    "ipfsHash": "Qma3fbh6ssJ5JGqqBkDZesVJ7ABykSGVJ8Zj324GbDaPWb"
}
```
###  Parámetros de resultado
| Name | Type | Description |
|---|---|---|
| contractAddress | string | Address del proceso |
| ipfsHash | string | hash del documento registrado dentro de un hito |

---

### 5.3. Obtener hash de un documento

### Definición
Se obtiene el hash del documento que será utilizado para hacer el registro en la blockchain de Certo.

| Method | Path |
|---|---|
| POST | /hash |

###  Parámetros de petición

| Name | Type | Description |
|---|---|---|
| file | FILE | Formato original de documento dentro de un hito |

```
form-data

file: file
```


### Resultado

```
{
    "name": "file.txt",
    "hash": "Qme2SPkiDqQHiSSNmXWxVK5EuxkVzAq1ryGHq7McEwvPKh",
    "size": "40"
}
```
###  Parámetros de resultado

| Name | Type | Description |
|---|---|---|
| name | string | Nombre del documento |
| hash | string | Hash del documento|
| size | string | Tamaño del documento |

---

## 6. API CERTO
### 6.1. Obtener parámetros de contrato Controlador

### Definición
Obtener parámetros para firmar una transacción con el *Signer* y crear un contrato **Controlador**.

| Method | Path |
|---|---|
| GET | /controller/{accountAddress} |

###  Parámetros de ruta

| Name | Type | Description |
|---|---|---|
| acountAddress | string | Address de la cuenta *Signer* |


### Resultado

```
{
    "to": "0x",
    "nonce": "0x9",
    "gasLimit": "0x1ab48e",
    "gasPrice": "0x0",
    "data": "0x608060405234801561001057600080fd5b50604051611911...",
    "value": "0x0"
}
```
###  Parámetros de resultado

| Name | Type | Description |
|---|---|---|
| to | string | Address del receptor |
| nonce | string | Número de transacciones enviadas desde el addres emisor |
| gasLimit | string | Límite de gas |
| gasPrice | string | Precio del gas |
| data | string | Información de llamado de metodos en el contrato inteligente|
| value | string | Monto de ethers enviados |

---

### 6.2. Creación de contrato controlador

### Definición
Se crea un contrato **Controlador** en la red blockchain de Certo

| Method | Path |
|---|---|
| POST | /controller |

###  Parámetros de petición

| Name | Type | Description |
|---|---|---|
| sign | string | Transacción firmada por el *Signer* |


```
{
    "sign": "0xf919810980831ab48e8080b91931608060405234801561001057...
}
```

### Resultado

```
{
    "controllerAddress": "0xc8a270D9e8A67b2Dd51925a3602C900A24C925D5",
    "transactionHash": "0x50eb6a1ce8bbd9a0e2d011e39ade18f7f9e17a221324966ad0eca85ed7841312",
    "blockHash": "0xf4d21a9a37ac3848eab90215757056e93d76a3afa92caba925949c31395b80ec"
}
```
###  Parámetros de resultado

| Name | Type | Description |
|---|---|---|
| controllerAddress | string | Address del contrato creado |
| transactionHash | string | Hash de la transacción en la que se creo el contrato |
| blockHash | string | Hash del bloque en el que se creo el contrato |

---
### 6.3. Obtener parámetros para creación de Parámetros

### Definición
Obtener parámetros para firmar una transacción con el *Signer* y crear un proceso con un hito inicial.

| Method | Path |
|---|---|
| POST | /process/params |

###  Parámetros de petición

| Name | Type | Description |
|---|---|---|
| accountAddress | string | Address de la cuenta *Signer* |
| ipfsHash | string | Hash de Ipfs obtenido del *Signer* |
| controllerAddress | string | Address del contrato Controlador |
| description | object | Objecto con multiples atributos según requerimiento |


### Ejemplo de la petción
```
{
    "accountAddress": "0x1b3f2191c51af95f1691c5011685e6e045c0976e",
    "ipfsHash": "QmUXbDTJwiLwsnFovUqXscDXfXSLxzrDxMGNC5MyxAvqK4",
    "controllerAddress": "0xc8a270D9e8A67b2Dd51925a3602C900A24C925D5", 
    "description": { 
        "name":"Andre", 
        "country": "Peru", 
        "color":"red",
        "date": "Jun 6"
    }
}
```


### Resultado

```
{
    "processAddress": "0x056b62faaf82df03cc529a24477172891615eece",
    "txParams": {
        "to": "0xc8a270D9e8A67b2Dd51925a3602C900A24C925D5",
        "nonce": "0xa",
        "gasLimit": "0xa38d2",
        "gasPrice": "0x0",
        "data": "0xbf77d1b05bf38f4d704db9a303f5c773f343edb40f9466fa38689887...",
        "value": "0x0"
    }
}
```
###  Parámetros de resultado

| Name | Type | Description |
|---|---|---|
| processAddress | string | Address del proceso creado |
| txParams | object | Parametros para la creación de un proceso |


| Name | Type | Description |
|---|---|---|
| to | string | Address del receptor |
| nonce | string | Número de transacciones enviadas desde el addres emisor |
| gasLimit | string | Límite de gas |
| gasPrice | string | Precio del gas |
| data | string | Información de llamado de metodos en el contrato inteligente|
| value | string | Monto de ethers enviados |

---

### 6.4. Creación de proceso

### Definición
Se crea un proceso con un hito inicial en la red blockchain de Certo

| Method | Path |
|---|---|
| POST | /process |

### Parámetros de petición

| Name | Type | Description |
|---|---|---|
| sign | string | Transacción firmada por el *Signer* |


```
{
    "sign": "0xf919810980831ab48e8080b91931608060405234801561001057...
}
```

### Resultado

```
{
    "transactionHash": "0x50eb6a1ce8bbd9a0e2d011e39ade18f7f9e17a221324966ad0eca85ed7841312",
    "blockHash": "0xf4d21a9a37ac3848eab90215757056e93d76a3afa92caba925949c31395b80ec"
}
```
###  Parámetros de resultado

| Name | Type | Description |
|---|---|---|
| transactionHash | string | Hash de la transacción en la que se creo el proceso |
| blockHash | string | Hash del bloque en el que se creo el proceso |

---

### 6.5. Obtener parámetros para la creación de un hito dentro de un proceso

### Definición
Obtener parámetros para firmar una transacción con el *Signer* y crear un proceso con un hito inicial.

| Method | Path |
|---|---|
| POST | /process/milestone/params |

###  Parámetros de petición

| Name | Type | Description |
|---|---|---|
| accountAddress | string | Address de la cuenta *Signer* |
| ipfsHash | string | Hash de Ipfs obtenido del *Signer* |
| controllerAddress | string | Address del Controlador |
| processAddress | string | Address del Proceso |
| description | object | Objecto con multiples atributos según requerimiento |


### Ejemplo de la petición
```
{
    "accountAddress": "0x1b3f2191c51af95f1691c5011685e6e045c0976e",
    "ipfsHash": "QmUXbDTJwiLwsnFovUqXscDXfXSLxzrDxMNC5MyxAvqK4",
    "controllerAddress": "0xc8a270D9e8A67b2Dd51925a3602C900A24C925D5", 
    "processAddress": "0x056b62faaf82df03cc529a24477172891615eece",
    "description": { 
        "name":"Juan", 
        "country": "Argentina", 
        "color":"green",
        "date": "Jun 10"
    }
}
```


### Result

```
{
    "to": "0xc8a270D9e8A67b2Dd51925a3602C900A24C925D5",
    "nonce": "0xb",
    "gasLimit": "0x49070",
    "gasPrice": "0x0",
    "data": "0x939d0ef5000000000000000000000000056b62faaf82df03cc529a2447...",
    "value": "0x0"
}
```
###  Parámetros de resultado

| Name | Type | Description |
|---|---|---|
| to | string | Address del receptor |
| nonce | string | Número de transacciones enviadas desde el addres emisor |
| gasLimit | string | Límite de gas |
| gasPrice | string | Precio del gas |
| data | string | Información de llamado de metodos en el contrato inteligente|
| value | string | Monto de ethers enviados |

---

### 6.6. Creación de hito dentro de un proceso

### Definición
Se crea un proceso con un hito inicial en la red blockchain de Certo

| Method | Path |
|---|---|
| POST | /process/milestone |

###  Parámetros de petición

| Name | Type | Description |
|---|---|---|
| sign | string | Transacción firmada por el *Signer* |


```
{
    "sign": "0xf919810980831ab48e8080b91931608060405234801561001057...
}
```

### Resultado

```
{
    "transactionHash": "0x50eb6a1ce8bbd9a0e2d011e39ade18f7f9e17a221324966ad0eca85ed7841312",
    "blockHash": "0xf4d21a9a37ac3848eab90215757056e93d76a3afa92caba925949c31395b80ec"
}
```
###  Parámetros de resultado

| Name | Type | Description |
|---|---|---|
| transactionHash | string | Hash de la transacción en la que se creo el hito |
| blockHash | string | Hash del bloque en el que se creo el hito |

---

### 6.7. Buscar hito por hash dentro de un contrato Controlador

### Definición
Se listan los detalles de un hito perteneciente a un proceso utilizando el hash del documento asignado y el contrato controlador donde se realizó el registro.

| Method | Path |
|---|---|
| GET | /process/{controllerAddress}/dochash/{ipfsHash} |

###  Parámetros de ruta

| Name | Type | Description |
|---|---|---|
| controllerAddress | string | Address del contrato controlador |
| ipfsHash | string | Hash de documento dentro de un hito |



### Result

```
{
    "index": 1,
    "milestones": [
        {
            "description": "description 1",
            "hash": "hash 1",
            "timestamp": "timestamp 1",
            "blockNumber": "101"
        },
        {
            "description": "description 2",
            "hash": "hash 2",
            "timestamp": "timestamp 2",
            "blockNumber": "102"
        },
    ]
}
```
###  Parámetros de resultado

| Name | Type | Description |
|---|---|---|
| index | number | Indice del hito dentro de un proceso |
| milestones| array(obj) | Arreglo de hitos dentro de un proceso |
| description | string | Descripción de un hito en hexadecimal |
| hash | string | Hash de un documento dentro de un hito |
| timestamp | string | Timestamp de un hito |

---

### 6.8. Buscar hito por documento/formato original dentro de un contrato Controlador

### Definición
Se listan los detalles de un hito perteneciente a un proceso utilizando el formato original del documento asignado.

| Method | Path |
|---|---|
| POST | /process/docfile |

###  Parámetros de petición

| Name | Type | Description |
|---|---|---|
| file | FILE | Formato original de documento dentro de un hito |

```
form-data

file: file
```

### Resultado

```
{
    "index": 1,
    "milestones": [
        {
            "description": "description 1",
            "hash": "hash 1",
            "timestamp": "timestamp 1",
            "blockNumber": "101"
        },
        {
            "description": "description 2",
            "hash": "hash 2",
            "timestamp": "timestamp 2",
            "blockNumber": "102"
        },
    ]
}
```
###  Parámetros de resultado

| Name | Type | Description |
|---|---|---|
| index | number | Indice del hito dentro de un proceso |
| milestones| array(obj) | Arreglo de hitos dentro de un proceso |
| description | string | Descripción de un hito en hexadecimal |
| hash | string | Hash de un documento dentro de un hito |
| timestamp | string | Timestamp de un hito |


---


### 6.9. Buscar hito de forma global

### Definición
Se listan los detalles de un hito perteneciente a todos los procesos y contratos controladores, utilizando el hash del documento.

| Method | Path |
|---|---|
| POST | /global/docHash/{ipfsHash} |

###  Parámetros de ruta

| Name | Type | Description |
|---|---|---|
| ipfsHash | string | Hash del documento |

### Resultado

```
[
    {
        "controllerAddress": "0x3D28BCddB63D036D932978Ee1979Ee469e2065a2",
        "index": 0,
        "milestones": [
            {
                "description": "0x7b226e616d65223a224a75616e222c22636f756e747279223a22417267656e74696e61222c22636f6c6f72223a22726564222c2264617465223a224a756e2036227d",
                "hash": "0x5bf38f4d704db9a303f5c773f343edb40f9466fa386898878238f491a86f3e0f",
                "timestamp": "1623857583",
                "blockNumber": "1058568"
            }
        ]
    },
    {
        "controllerAddress": "0xdeFeD81210CCF2B5184F26FC75688B344947D4b9",
        "index": 0,
        "milestones": [
            {
                "description": "0x7b226e616d65223a224a75616e222c22636f756e747279223a22417267656e74696e61222c22636f6c6f72223a22726564222c2264617465223a224a756e2036227d",
                "hash": "0x5bf38f4d704db9a303f5c773f343edb40f9466fa386898878238f491a86f3e0f",
                "timestamp": "1623857748",
                "blockNumber": "1058579"
            }
        ]
    }
]
```
###  Parámetros de resultado

| Name | Type | Description |
|---|---|---|
| controllerAddress | string | Address del contrato controlador |
| index | number | Indice del hito dentro de un proceso |
| milestones| array(obj) | Arreglo de hitos dentro de un proceso |
| description | string | descripción de un hito en hexadecimal |
| hash | string | hash de un documento dentro de un hito |
| timestamp | string | timestamp de un hito |
## 7. Glosario
* **Blockchain**
    También conocido cómo cadena de bloques es una tecnología emergente perteneciente a la cuarta revolución industrial que se compone por un libro mayor de registros de transacciones en un orden cronológico. Este libro mayor, se comparte con cada uno de los usuarios pertenecientes a la red con el fin de transferir valores de un lado a otro sin la necesidad de recurrir a terceros. Lo anterior, hace que blockchain sea una tecnología descentralizada la cual permite que cada activo digital registrado sea inmutable, trazable y seguro. 
* ### Hash
    Es la identificación y el resumen matemático único de un dato, representado mediante caracteres de texto que son codificados con el fin de brindar seguridad e integridad de los datos. Un hash consiste de un valor hexadecimal que es denotado como una combinación de números del 0 al 9 y letras de la a a la f.
* ### Transacción
    Una transacción es la operación que realizan dos partes para la transferencia de valores (intercambio de criptomonedas o activos digitales) dentro de una red de blockchain. Cada una de las transacciones realizadas son agrupaciones de datos acompañados de una firma digital que permite su validación dentro de la red. 
* ### Activo digital
    Cualquier archivo intangible que se encuentre almacenado en algún dispositivo digitalmente, se le conoce como activo digital. Los archivos pueden ser imágenes, documentos, vídeos, entre otros que son propiedad de empresas, usuarios o consumidores. 