Urko Larrañaga Piedra Head of Blockchain

Hyperledger Fabric ¿por qué implantar esta blockchain en tu negocio?

Sí, es cierto, Blockchain es una de las palabras de moda. En consecuencia, por miedo a quedarse atrás o perder competitividad, “todas” las empresas están volviéndose locas por entenderla y agarrarse a ella.

Sin embargo, ¿hasta qué punto tiene esta tecnología encaje en nuestros negocios? ¿Podrá dar respuesta a los retos y desafíos de los mercados?

En una entrada anterior listábamos una serie de criterios a valorar antes de decidirse o no por la adopción de esta tecnología. No obstante, la relación diaria con nuestros clientes nos ha demostrado que se necesita una aproximación más cercana que permita conocer de manera más directa lo que aporta. Es por ello que, en las siguientes líneas profundizaremos en una implementación específica de Blockchain, ahondando en las ventajas que su aplicación puede aportar a nuestros negocios.

Nueva visión

Blockchain nace de la mano de Bitcoin. Tras ello, empezaron a surgir nuevas criptomonedas y aplicaciones, construidas sobre esta tecnología, siempre siguiendo las bases de un sistema abierto y público. Sin embargo, las necesidades específicas de los mercados dieron pie al desarrollo de otro tipo de implementaciones. (En un artículo anterior explicábamos y comparábamos los distintos tipos que existen).

Hyperledger Fabric es una implementación privada que permite construir redes Blockchain personalizadas con nuevas características. Fabric soporta múltiples transacciones por segundo, además de garantizar su validez de manera (casi) inmediata, lo que es un gran avance cualitativo.

Gestión de la identidad y privacidad

Por otra parte, cabe destacar que esta solución está diseñada para dar respuesta a escenarios en los que se conoce e identifica a los participantes, pero estos no tienen por qué confiar entre sí. Fabric permite crear redes privadas en las que se limita el acceso, es decir, se gestiona y controla quiénes participan en nuestro sistema.

Una serie de actores que comparten negocio pueden implantar su propia cadena de bloques. Aquellos usuarios previamente autenticados y que estén autorizados son los únicos que podrán acceder a este sistema. Fabric gestiona todo ello por medio de operaciones criptográficas.

Roles y confidencialidad

Además, dentro de un mismo sistema es posible limitar el acceso a la información registrada. De esta manera, se consigue que las organizaciones puedan tener canales privados entre algunas de ellas, garantizando así la confidencialidad de la información que no quieran compartir con el resto de organizaciones.

Por último, cabe remarcar la variedad de roles y posibilidades de aplicación de los mismos que ofrece esta solución. Es posible definir a aquellos usuarios que tendrán que validar todas las transacciones, incluso limitar las operaciones que se pueden realizar en el sistema en función de la identidad de cada cual.

Conclusión

Hyperledger Fabric es una solución que ha venido para quedarse. Aunque los retos a los que se enfrenta son muchos, son mayores su potencial y el abanico de posibilidades que ofrece. Todo ello, sin la necesidad de un tercero de confianza y con total garantía de la confianza que otorgan los sistemas Blockchain.

Whitepaper
¿Cómo funciona Blockchain?
Descarga gratuita
Se ha producido un error al procesar la plantilla.
The following has evaluated to null or missing:
==> link  [in template "20099#20135#190900" at line 41, column 47]

----
Tip: If the failing expression is known to be legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

----
FTL stack trace ("~" means nesting-related):
	- Failed at: #if !currentUrl?contains(link + "/") ...  [in template "20099#20135#190900" at line 41, column 21]
----
1<#if entries?has_content> 
2 
3    <#assign journalArticleExtLocalService = serviceLocator.findService("com.izertis.internet.journal.ext.service.service.JournalArticleExtLocalService")> 
4    <#assign currentUrl = themeDisplay.getURLCurrent() + "/" /> 
5    <!-- Configuración hardcoded --> 
6    <#assign delta = 4> 
7 
8    <div class="row related-content"> 
9        <div class="col-xxl-11 px-5 pl-xxl-100px pl-xl-5 py-5"> 
10            <div class="title"><@liferay.language key="related-contents-title" /></div> 
11            <div class="row"> 
12            <#assign cont = 0> 
13            <#list entries as curEntry> 
14                 
15                <#assign renderer = curEntry.getAssetRenderer()> 
16                <#assign className = renderer.getClassName()> 
17 
18                <#if className == "com.liferay.journal.model.JournalArticle"> 
19                    <#assign journalArticle = renderer.getArticle()> 
20                    <#assign document = saxReaderUtil.read(journalArticle.getContent())> 
21                    <#assign rootElement = document.getRootElement()> 
22                    <#assign defaultLanguageId = parseXml ("@default-locale", rootElement)> 
23                    <#attempt> 
24                        <#assign xPathSelector = saxReaderUtil.createXPath("dynamic-element[@name='miniatureimage']")> 
25                        <#assign img = xPathSelector.selectSingleNode(rootElement).getStringValue()> 
26                        <#if isJson(img)> 
27                            <#assign imgJson = jsonFactoryUtil.createJSONObject(img)> 
28                            <#assign imgUrl = "/documents/" + imgJson.groupId + "/" + imgJson.uuid > 
29                        <#else> 
30                            <#assign imgUrl = "/o/portal-izertis-theme/images/publications/" + journalArticle.getArticleId()[journalArticle.getArticleId()?length-1] + ".jpg"> 
31                        </#if> 
32                    <#recover> 
33                        <#assign imgUrl = "/o/portal-izertis-theme/images/publications/" + journalArticle.getArticleId()[journalArticle.getArticleId()?length-1] + ".jpg"> 
34                    </#attempt> 
35 
36                    <#assign title = getField("title", locale, defaultLanguageId, rootElement)!> 
37                    <#attempt> 
38                        <#assign link = "/-/" + journalArticleExtLocalService.getFriendlyUrl(journalArticle, themeDisplay.getLocale()) /> 
39                    <#recover> 
40                    </#attempt> 
41                    <#if !currentUrl?contains(link + "/") && (cont < delta)> 
42                        <#if title != ""> 
43                            <div class="col-sm-6 col-lg-3 pr-5 pb-5 pb-lg-0"> 
44                                <div class="img-cont"> 
45                                    <img alt="" src="${imgUrl}" /> 
46                                </div> 
47                                <#if title != ""> 
48                                    <div class="info"><a href="${link}">${title}</a></div> 
49                                </#if> 
50                            </div> 
51                            <#assign cont = cont + 1 /> 
52                        </#if> 
53                    </#if> 
54                </#if> 
55            </#list> 
56            </div> 
57         
58        </div> 
59    </div> 
60</#if> 
61 
62<#function getField field languageId defaultLanguageId xml> 
63    <#local defaultSelector = "//dynamic-content[@language-id='" + defaultLanguageId + "' and ancestor-or-self::*[@name='" + field + "']]"> 
64    <#local localeSelector = "//dynamic-content[@language-id='" + languageId + "' and parent::*[@name='" + field + "']]"> 
65 
66    <#local selector = saxReaderUtil.createXPath(localeSelector)> 
67    <#local value = selector.selectSingleNode(xml)!> 
68 
69    <#if value?has_content> 
70        <#return value.getText()> 
71    </#if> 
72 
73    <#local selector = saxReaderUtil.createXPath(defaultSelector)> 
74    <#local value = selector.selectSingleNode(xml)!> 
75 
76    <#if value?has_content> 
77        <#return value.getText()> 
78    </#if> 
79 
80    <#return ""> 
81</#function> 
82 
83<#function parseXml xpath xml> 
84    <#local selector = saxReaderUtil.createXPath(xpath)> 
85    <#local result = selector.selectSingleNode(xml)!> 
86 
87    <#if result?has_content> 
88        <#return result.getStringValue()> 
89    </#if> 
90 
91    <#return ""> 
92</#function> 
93 
94<#function isJson json> 
95    <#local value = json?trim> 
96    <#return value?has_content && value?starts_with("{") && value?ends_with("}")> 
97</#function>