# Documentación General
## 1. Introducción
CERTO es una web-API descentralizada que otorga al registro de activos digitales (documentos, archivos, contenidos…) protección criptográfica, trazabilidad e inmutabilidad gracias a la tecnología blockchain.
Está consolidada como una red blockchain privada y consta de dos servicios para gestionar el registro de documentos en la blockchain, CERTO Manager API y CERTO API.
Esta documentación sirve para que los clientes de CERTO integren fácilmente dentro de su solución el API de CERTO y así tengan activos digitales seguros, trazables e inalterables.
## 2. ¿Cómo funciona?

### A. Conectar
Cualquier aplicación generadora de contenido del lado del cliente, se conectará al API Manager el cual se encarga de firmar las transacciones y calcular el hash (identificador único) del activo digital mediante IPFS.
### B. 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.
### C. Enviar
Una vez realizada la certificación y el resgistro 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.
### D. 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.
# QUICKSTART
## 1 . Requerimientos
### Sugerencias de servidores
1. Backend
- Descripción: Servidor de operaciones internas de la compañía, aloja el Manager API 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.
## 2. Conectar
Certo consta de dos servicios para gestionar el registro de documentos en la blockchain.
* **Manager 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 poder interactuar con Certo se debe interactuar con ambos servicios.
Ejemplo del flujo para crear un contrato controlador:
1. Se consulta a **Certo API** por los parámetros necesarios para armar la transacción de creación de controlador.
`GET https://api.certo.digital/controller/params/{accountAddress}`.
2. Se utiliza **Manager API** con el resultado previo para firmar y armar la transacción.
`POST http://Manager API_URL/sign`, el resultado es la transacción firmada.
3. Se envia la transacción firmada a **Certo API** para que haga el registro en la blockchain.
`POST https://api.certo.digital/controller`
Ejemplo de flujo para crear un proceso y registrar el documento:
1. Se utiliza **Manager API** para obtener el hash del documento a registrar
`POST http://Manager API_URL/hash`, se envia el documento como parámetro. Esto retorna el hash deseado para realizar el registro.
2. Se consulta a **Certo API** por los parámetros necesarios para armar la transacción de creación de un proceso.
`POST https://api.certo.digital/process/params`.
3. Se utiliza **Manager API** con el resultado previo para firmar y armar la transacción.
`POST http://Manager API_URL/sign`, el resultado es la transacción firmada.
4. Se envia la transacción firmada a **Certo API** para que haga el registro en la blockchain.
`POST https://api.certo.digital/process`
## Flujo a detalle con ejemplos de código
Detalle de **Manager API**
1. Manager API
2. IPFS standalone
Para utilizar Certo es necerio configurar el **Manager API**
1. Copiar y guardar esta configuración en un file ***docker-compose.yml***. Esta configuración creará 2 contenedores, uno con el **Manager API** y otro con una instancia de **IPFS**.
```
version: '3.8'
services:
certo-Manager:
image: trugrouptech/certo-Manager:v2.1
container_name: certo-Manager
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 **Manager API**.
---
## 3. Certificar
### 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 *Manager API*)
```
# Ejemplo de consumo de Manager API y creación de cuenta usando Python
import requests
url = "<URL_Manager>" # Especificar la ruta correcta
account_url = f'{url}/account'
response = requests.request("GET", Manager_url)
print(response.text)
'''
{
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 *Manager 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 Manager para firmar la transacción
{
"to": "0x",
"nonce": "0x9",
"gasLimit": "0x1ab48e",
"gasPrice": "0x0",
"data": "0x608060405234801561001057600080fd5b5060405161191138038061191...""
}
*/
// CERTO Manager: Firmar Transacción
const ManagerAPI = '<INSERTAR Manager API URL>';
const signURL = `${ManagerAPI}/sign`;
const params = { ...controllerParams, password: accountPassword };
const sign = await axios.post(signURL, params, options);
console.log(sign.data);
/*
Transacción firmada con el Manager
{
"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"
}
*/
```
**IMPORTANTE**: Una vez creada la cuenta y el contrato controlador es importante diligenciar el siguiente formulario con estos valores: https://forms.gle/1TxDwY5MSHS1EBh28 Es necesario completar este formulario para poder interactuar y certificar contenidos en la blockchain de CERTO. Por favor revise muy bien los valores ingresados.
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/Manager
- Hash de documento
- Detalles del documento a registrar
- Address del contrato controlador
Utilizaremos el *Manager 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 Manager: Obtener hash del documento
const signHashAPI = '<URL_Manager>/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 Manager: Firmar Transacción
const ManagerAPI = '<INSERTAR Manager API URL>';
const signURL = `${ManagerAPI}/sign`;
const params = { ...txParams, password: accountPassword };
const sign = await axios.post(signURL, params, options);
console.log(sign.data);
/*
Transacción firmada con el Manager
{
"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)
# DOCUMENTACIÓN A DETALLE DE SERVICIOS
## 1. API Manager
### 1.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'
};
```
---
### 1.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 *Manager*.
| 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 |
---
### 1.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 |
---
## 2. API CERTO
### 2.1. Obtener parámetros de contrato Controlador
### Definición
Obtener parámetros para firmar una transacción con el *Manager* y crear un contrato **Controlador**.
| Method | Path |
|---|---|
| GET | /controller/{accountAddress} |
### Parámetros de ruta
| Name | Type | Description |
|---|---|---|
| acountAddress | string | Address de la cuenta *Manager* |
### 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 |
---
### 2.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 *Manager* |
```
{
"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 |
---
### 2.3. Obtener parámetros para creación de Parámetros
### Definición
Obtener parámetros para firmar una transacción con el *Manager* 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 *Manager* |
| ipfsHash | string | Hash de Ipfs obtenido del *Manager* |
| 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 |
---
### 2.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 *Manager* |
```
{
"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 |
---
### 2.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 *Manager* 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 *Manager* |
| ipfsHash | string | Hash de Ipfs obtenido del *Manager* |
| 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 |
---
### 2.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 *Manager* |
```
{
"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 |
---
### 2.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 |
---
### 2.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 |
---
### 2.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 |
# GLOSARIO
* **Blockchain**
Es una tecnología que almacena información en bloques que están vinculados entre sí de forma criptográfica y ordenados cronológicamente para formar una línea continua. Si se realiza un cambio en la información registrada en un bloque en particular este no se sobrescribe, sino que el cambio se almacena en un nuevo bloque que muestra la fecha y hora en el que se realizó. Esta forma de dar trazabilidad a la información se basa en el método utilizado desde hace siglos del libro mayor financiero general, una forma no destructiva de realizar un seguimiento de los cambios de datos a lo largo del tiempo. Pero, a diferencia de este antiguo método de contabilidad, originalmente un libro y luego un archivo de base de datos almacenado en un único sistema, blockchain fue diseñado para ser descentralizado y distribuido a través de una gran red de computadoras. Esta descentralización de la información reduce la capacidad de manipulación de datos, facilita el acceso a estos y crea confianza en la información digital.
* ### 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. Un ejemplo es `ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad`
* ### 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.
* ### IPFS
Son las siglas en inglés de InterPlanetary File System. Se trata de un protocolo diseñado para interconectar sistemas a través de P2P. Es una red para distribuir contenidos, totalmente libre. En certo sirve para obtener el hash del documento que se registrará en la blockchain.