Está en la página 1de 5

Verificación y validación de un modelo PIM de la tecnología

blockchain especificado con Alloy

Accattoli, Mario Luis


Argañaraz, Mauro César

Abstract los ambientes donde se despliegan. Nuestra


En este trabajo planteamos la creación de un propuesta consiste en construir un modelo
modelo PIM de la tecnología blockchain que reúne
las características esenciales y sienta las bases para
PIM de la tecnología blockchain que reúna
futuras implementaciones (PSM). El modelo se los conceptos y características básicas
refina con una serie de requisitos formales deseadas con el objetivo de que sea
especificados en el lenguaje Alloy, donde se utilizado en futuras referencias para la
destacan los aspectos estáticos y estructurales y los construcción e implementación de modelos
aspectos dinámicos de la tecnología considerando la
propiedad de integridad, uno de los tres principios
PSM y código. Además del modelo PIM, el
rectores de la seguridad de la información. También trabajo incluye una serie de requisitos
se incluye un caso de test que se depuró con las formales que se especifican con el lenguaje
técnicas de chequeo y simulación de la herramienta Alloy, donde destacamos los aspectos
SAT. estáticos y estructurales y los aspectos
Palabras Clave
dinámicos del modelo construido sobre la
MDA, PIM, Alloy, formal verification, propiedad de integridad de los datos.
cryptocurrency, blockchain, block, transaction,
bitcoin. Este documento se organiza de la siguiente
manera: en la Sección 1 se introducen los
Introducción conceptos relacionados a la tecnología
blockchain y se propone un modelo básico
En el marco de la Arquitectura Dirigida por PIM. En la segunda y tercera sección se
Modelos (MDA) presentamos un caso de presentan los aspectos estáticos y
estudio basado en la tecnología blockchain. estructurales y los aspectos dinámicos
La cadena de bloques (blockchain) es uno especificados en Alloy, respectivamente. En
de los pilares sobre los que se fundaron las la Sección 4 se incluye el caso de test
criptomonedas en un primer momento y analizado. La Sección 5 replantea el caso de
que ahora se ha extendido a otros ámbitos. estudio especificado con la inclusión de
estructuras avanzadas de Alloy. Por último,
La blockchain nació con el propósito de en las conclusiones, se esbozan los
resolver el problema del doble gasto en un resultados obtenidos.
sistema descentralizado, que tanto había
desvelado a economistas y programadores. Modelo PIM Blockchain
Es la estructura subyacente que da soporte
al libro contable público donde se En una cadena de bloques las principales
encadenan las pruebas de trabajo requeridas estructuras son los bloques, las
por los protocolos que implementan las transacciones y las cuentas. En la Figura 1
criptomonedas. se muestra un diagrama de clases que
representa estos conceptos junto con los
Cada criptomoneda tiene su propia atributos y asociaciones que las relacionan.
estructura de blockchain, dando origen a
distintas implementaciones dependientes de
sig Block {
En términos simples, una cadena de bloques
está compuesta por una serie de bloques transactions: some Transaction,
prevBlock: lone Block,
encadenados de manera secuencial, y cada secuence: Int
uno de los bloques contiene n transacciones }
y un enlace al bloque anterior. sig Transaction {
sender: one BitcoinAccount,
Una transacción es una transferencia de recipient: one BitcoinAccount,
amount: Int
dinero de una cuenta remitente a un
destinatario. }
sig Saldo {
0..1 -prevBlock
saldo:Int
«singleton»Blockchain
-block Block }
+initTransaction() -secuence : int
+addBlock() 1 * sig BitcoinAccount {
+addTransaction()
1 available: Saldo
}
BitcoinAccount -sender Transaction *
1 *
Figura 2: Signaturas y campos en Alloy
-available : decimal -amount : decimal
1 * -transactions
-recipient Las especificaciones también se componen
Figura 1: Modelo PIM blockchain de hechos que representan restricciones o
invariantes que se deben cumplir en todo
En este primer acercamiento al modelado momento. En la Figura 3 se detallan una
PIM de la blockchain se priorizó la serie de hechos definidos para nuestro caso
propiedad de integridad de los datos, uno de de estudio.
los principios rectores de seguridad de la
fact { all tx: Transaction |
información. Las especificaciones que se #tx.~transactions = 1 }
tuvieron en cuenta son: fact { no tx: Transaction | tx.sender =
tx.recipient }
1. Los datos solo se pueden insertar en fact { no b: Block | b.prevBlock = b }
la cadena de bloques si son válidos. fact { all tx: Transaction | tx.amount > 0 }
2. Un bloque debe ser único y no una fact { all b: Block | b.secuence >
duplicación de un bloque anterior. b.prevBlock.secuence }
3. Un bloque debe tener un fact { one b: Block | #b.prevBlock = 0 &&
Blockchain.blocks = b}
identificador único, así como un
enlace a un bloque válido anterior. fact { all b: Block | (#b.prevBlock = 0 &&
Blockchain.blocks = b) || (#b.prevBlock =
1)}
Aspectos estáticos y estructurales fact { no disj b, c: Block | c.prevBlock =
b.prevBlock }
Los aspectos estáticos y estructurales se fact { all disj b,b': BitcoinAccount, a:
Saldo | a !in b.available & b'.available }
modelan en Alloy con signaturas y campos,
cada clase del diagrama de la Figura 1 se fact { all disj b,b': BitcoinAccount, a:
Saldo | a in b.available + b'.available }
representa con una signatura. Cada atributo
se mapea con un campo decorado con la Figura 3: Hechos
multiplicidad. En la Figura 2 podemos
En el siguiente listado se enumeran con
apreciar las equivalencias especificadas con
lenguaje natural cada uno de estos hechos:
Alloy.
one sig Blockchain { 1. Cada una de las transacciones debe
blocks: one Block
pertenecer a un solo bloque.
}
2. No puede existir una transacción donde Aspectos dinámicos
la cuenta remitente y destinataria sean
iguales. Los aspectos dinámicos permiten el
3. No puede existir un enlace a un bloque modelado del cambio de estado a medida
previo que sea igual al mismo bloque. que pasa el tiempo y en Alloy se
4. Todas las transacciones deben ser de especifican con predicados.
importe mayor a 0.
5. Todos los bloques deben tener un valor Antes de pasar a los predicados definidos
de secuencia mayor que el bloque en el caso de estudio, tenemos que remarcar
precedente. las adaptaciones que realizamos en el
6. El único bloque que no tiene predecesor modelo para incluir la signatura de Tiempo.
es el bloque inicial.
sig Time {}
7. Todos los bloques deben tener un
predecesor o ser el bloque inicial. sig BitcoinAccount {

8. Dado dos bloques disjuntos no pueden available: Saldo one -> Time
tener el mismo bloque previo. }
9. No puede existir un átomo Saldo que Figura 5: Inclusión de la signatura Time
pertenezca a dos cuentas.
10. No puede existir un átomo Saldo que no También se modificaron algunos de los
pertenezca a ninguna cuenta. hechos planteados originalmente para
incluir la noción de tiempo, quedando de la
Utilizando la especificación Alloy previa, siguiente manera (ver Figura 6):
podemos ejecutar el analizador y obtener
fact { no tx: Transaction, t:Time |
una instancia del modelo realizado como tx.amount > tx.sender.available.t.saldo }
podemos observar en el grafo de la Figura
4. fact { all disj b,b': BitcoinAccount, a:
Saldo, t: Time | a !in b.available.t &
b'.available.t }

fact { all disj b,b' :BitcoinAccount,


a:Saldo, t : Time | a in b.available.t +
b'.available.t }

Figura 6: Hechos refinados

En la Figura 7 se enumeran las 3


operaciones para la blockchain:
pred initTransaction [ disj mario, mauro:
BitcoinAccount, t,t':Time , tran1:
Transaction]
{
mario.available.t.saldo >= tran1.amount
mario.available.t'.saldo =
mario.available.t.saldo.minus[tran1.amount]
mauro.available.t'.saldo =
mauro.available.t.saldo.plus[tran1.amount]
}
pred addBlock [newBlock, lastBlock: Block,
t, t': Time]
{
#lastBlock.~(prevBlock.t) = 0
newBlock.prevBlock.t' = lastBlock
Figura 4: Instancia del modelo propuesto }
pred addTransaction [tx : Transaction, b :
Block, t, t' : Time]
{
#b.~(prevBlock.t) = 0
b.transactions.t' = b.transactions.t + tx
}
Figura 7: Operaciones de la blockchain

El primer predicado se refiere a la


operación mediante la cual se inicia una
transacción en la red blockchain, en la que
intervienen el remitente, el receptor y un
importe. En el segundo caso se trata de la
operación que permite añadir un bloque
adicional a la red blockchain, para lo cual
se debe ubicar el último bloque y agregar el
nuevo bloque al final, estableciendo un
vínculo con el bloque anterior. El último
predicado es para el momento en que una
transacción ya fue validada por la red
(mineros) y se tiene que sumar al último
bloque de la red. Figura 9: Instancia en el tiempo t0

Caso de test

Como parte de los chequeos y simulaciones


de ejecuciones que realizamos al refinar
nuestro caso de estudio, incluimos a
continuación un caso de test especificado
con su correspondiente grafo.

Con las variables de tiempo incluidas en las


operaciones se probó el modelo simulando
una instancia utilizando el siguiente
predicado:
pred Instancia { some disj mario, mauro:
BitcoinAccount, disj t,t': Time, tran1:
Transaction {
mario.available.t.saldo = 3
mauro.available.t.saldo = 2
mario.available.t'.saldo =2
mauro.available.t'.saldo = 3
tran1.amount = 1
Time = t + t'
BitcoinAccount = mario + mauro
Transaction = tran1
initTransaction[mario, mauro, t, t', tran1] Figura 10: Instancia en el tiempo t1
}
}
Figura 8: Caso de test Incorporación de estructura avanzadas
en Alloy
De la ejecución de este caso de test se
obtuvieron las siguientes instancias: A causa de que los bloques forman una
cadena ordenada (secuencial), se optó por
mejorar el modelo propuesto, reemplazando
el campo “secuence” por el uso del módulo
util/ordering que nos proporciona
funcionalidades como primero, siguiente y De la ejecución del modelo mejorado se
último, permitiéndonos representar el orden obtuvo la instancia de la Figura 12.
que deberían tener tanto los bloques como
las transacciones dentro de los bloques. Por
lo cual replanteamos el modelo inicial tanto
en sus definiciones, como sus hechos,
quedando de la siguiente manera:
open util/ordering [Block]
open util/ordering [Transaction]
sig Time {}
one sig Blockchain {
blocks : one Block
}
sig Block {
transactions : some Transaction,
prevBlock : lone Block,
}

sig Transaction {
sender : one BitcoinAccount,
recipient : one BitcoinAccount,
amount : Int
}
sig Saldo {
Figura 12: Instancia del modelo mejorado con
saldo: Int util/ordering
}
sig BitcoinAccount { Conclusión
available : Saldo one -> Time
}
En este ensayo se propuso la creación de un
modelo PIM para la tecnología blockchain
fact {all b:Block | ! next [b] = prev [b]}
donde se formalizaron una serie de
fact { all b:Block | b.prevBlock = prev
[b]} requisitos priorizando la propiedad de
fact {all disj a, b: Block, t: Transaction
integridad de los datos. Para la
| t !in (b.transactions & especificación, verificación y validación se
a.transactions)}
utilizó el lenguaje Alloy y el conjunto de
fact { all tx: Transaction | herramientas que permiten la simulación y
#tx.~transactions = 1 }
chequeo de las propiedades estáticas y
fact { all tx: Transaction | ! tx.sender =
tx.recipient } dinámicas. En una línea de investigación
fact { all t: Transaction | t.amount > 0} futura se debería extender y completar el
fact { all disj a,a' :Saldo | a & a' = none}
modelo PIM con los conceptos que no
fueron incluidos tales como el protocolo de
fact { all disj b,b' :BitcoinAccount,
a:Saldo, t : Time | a !in b.available.t & consenso, el número de mineros o las
b'.available.t }
fact { all disj b,b' :BitcoinAccount, restricciones de tiempo.
a:Saldo, t : Time | a in b.available.t +
b'.available.t }
Figura 11: Especificación Alloy incluyendo
util/ordering

También podría gustarte