forked from brunoolimpio/blockchain-smv-model
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathblockchain-model.smv
87 lines (63 loc) · 2.04 KB
/
blockchain-model.smv
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
MODULE createNode(nodeId)
VAR
IPSent: boolean;
IPReceived: boolean;
connectSeed: boolean;
versionSent: boolean;
verack: boolean;
networkOK: boolean;
lastBlockId: 0..10;
ASSIGN
init(IPSent) := TRUE;
init(IPReceived) := FALSE;
init(connectSeed) := FALSE;
init(versionSent) := FALSE;
init(verack) := FALSE;
init(networkOK) := FALSE;
init(lastBlockId) := 0;
next(IPSent) := TRUE;
next(IPReceived) := IPSent = TRUE ? TRUE : FALSE;
next(connectSeed) := (IPSent = TRUE & IPReceived = TRUE) ? TRUE : FALSE;
next(versionSent) := connectSeed = TRUE ? TRUE : FALSE;
next(verack) := versionSent = TRUE ? TRUE : FALSE;
next(networkOK) := verack = TRUE ? TRUE : FALSE;
MODULE createUser(idUser, initBalance)
VAR
balance : 0..400;
busy : boolean;
ASSIGN
init(balance) := initBalance;
TRANS !update -> conserve ;
DEFINE
conserve := (next(balance) = balance);
MODULE createTransaction(idTrans, from, to, amount)
FROZENVAR
blockId : 0..10;
DEFINE
validTransaction := !from.busy & !to.busy & from.balance >= amount; --- Does the sender user have enough balance?
newFromBalance := from.balance - amount;
newToBalance := to.balance + amount;
TRANS
validTransaction -> (next(from.balance)= newFromBalance) &
(next(to.balance)=newToBalance) &
(next(from.busy)=!from.busy) &
(next(to.busy)=!to.busy);
MODULE createBlock(idBloco, txa, txb)
FROZENVAR
id : 0..10;
ASSIGN
init(id) := idBloco;
init(txa.blockId) := validBlock ? id : 0;
init(txb.blockId) := validBlock ? id : 0;
DEFINE
validBlock := txa.validTransaction & txb.validTransaction;
nonce := signed word[32](190);
--hash := validBlock ? (nonce :: signed word [32](txa.to) :: signed word [32](txb.to) :: signed word[32](previousBlock))
-- : unsigned word[128](0);
MODULE updateNode(node, block)
DEFINE
lastNodeBlock := node.lastBlockId;
blockToUpdate := block.validBlock ? block.id : -1;
shouldUpdate := lastNodeBlock <= blockToUpdate;
ASSIGN
next(node.lastBlockId) := shouldUpdate ? lastNodeBlock : block.id;