-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathTraceability
More file actions
150 lines (104 loc) · 4.91 KB
/
Traceability
File metadata and controls
150 lines (104 loc) · 4.91 KB
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
/* Cette solution simple de traçabilité repose sur un contrat principal (Traceability)
et un contrat ad hoc par objet à tracer (Tracking).
Le contrat principal se comporte comme une liste blanche associant les identifiants
des objets et les contrats de traçabilité.
Une version plus avancée intègrera le déploiement du contrat Tracking à l'intérieur
de Traceability
*/
contract Traceabilityv1 {
mapping ( address => bytes32) public TrackList;
/* Ce mapping associe une adresse à un identifiant (bytes32)
Il est commode pour cet identifiant de le générer en hachant l'ensemble des
informations importantes relatives via une fonction comme sha3-256.
Par exemple pour l'objet à tracer:
"numéro de série: 0001; date de fabrication: 09082016;Lieu de fabrication: 75017PARIS"
sha3(00010908201675017PARIS)=
15905d14d04be568d5e263a664721065a484ffe9c94b474947d601468b2ea744
L'adresse à laquelle sera associée ce haché sera l'adresse de son contrat de traçabilité
*/
address public Admin;
modifier onlyAdmin() {
if (msg.sender != Admin) throw;
_
}
/* Ces lignes définissent l'administrateur du contrat, c'est-à-dire la
personne en charge du mapping TrackList. Le modifier permet de restreindre
l'accès à certaines fonctions.
*/
event Trackchange(address TrackAddress, bytes32 identifier);
/* cet event fait la publicité de l'attribution d'un identifiant à une adresse
de contrat de traçabilité
*/
function Traceabilityv1() {
Admin = msg.sender;
}
/* La fonction Traceabilityv1 est le constructeur du contrat, elle s'exécute à la
création du contrat et définie par défaut Admin comme étant l'adresse déployant
le contrat*/
function Track(address TrackAddress, bytes32 identifier) onlyAdmin() {
TrackList[TrackAddress] = identifier;
Trackchange(TrackAddress, identifier);
}
/* la fonction Track ne peut être appelée que par l'Admin, elle modifie le mapping
associant les identifiants à leur contrat de traçabilité et en fait la publicité.
Si le contrat associé à un identifiant devient caduque, par exemple en cas de
rupture, il est possible pour l'Admin d'associer à cette adresse caduque une
alerte au format bytes32 et d'attribuer l'identifiant concerné à une nouvelle adresse */
function changeAdmin(address _newAdmin) onlyAdmin()
{
Admin = _newAdmin;
}
function kill() onlyAdmin() {
selfdestruct(Admin); }
/* La fonction changeAdmin permet comme son nom l'indique de changer l'Admin,
tandis que la fonction kill permet de retirer le code de la blockchain quand
le contrat n'est plus utilisé*/
}
*** Fin du contrat Traceability***
*** Début du contrat Tracking***
/* Cette solution simple de traçabilité repose sur un contrat principal (Traceability)
et un contrat supplémentaire par objet à tracer (Tracking).
Le contrat principal se comporte comme une liste blanche associant les identifiants
des objets et les contrats de traçabilité..
Une version plus avancée intègrera le déploiement du contrat Tracking à l'intérieur
de Traceability
*/
contract Trackingv1 {
address public Owner;
bytes public identifier;
/* Ce contrat de traçabilité expose publiquement l'identifiant surveillé ainsi
que le propriétaire actuel "Owner". D'autres informations peuvent être ajoutées
Notez que l'idenfier sera un bytes32 si produit par sha3-256 comme suggéré dans
le contrat Traceability*/
event Trackchange(address Owner);
/* Cet event fait la publicité du changement de propriétaire. On peut définir
autant d'event qu'il y a d'information à tracer */
function Trackingv1() {
Owner = msg.sender;
identifier = msg.data;
}
/* La fonction TrackId est le constructeur du contrat, elle s'exécute à la
création du contrat et définie par défaut Owner comme étant l'adresse déployant
le contrat, elle définit également l'identifier comme les données (msg.data en
bytes) ajoutées à la transaction de déploiement. Remarquez que le contrat peut
être déployé par n'importe qui et avec n'importe quel identifiant, l'authenticité
est subordonnée à l'association de l'adresse du contrat Tracking avec l'identifiant
dans le mapping de Traceability. Cette association ne peut être faite que par
l'Admin du contrat Traceability.*/
modifier onlyOwner() {
if (msg.sender != Owner) throw;
_
}
function changeOwner(address _newOwner) onlyOwner()
{
Owner = _newOwner;
Trackchange(Owner);
}
/* La fonction changeOwner réalise la traçabilité du propriétaire "Owner" et en
fait la publicité par l'even Trackchange.*/
function kill() onlyOwner() {
selfdestruct(Owner); }
/* La fonction changeOwner permet comme son nom l'indique de changer l'Owner,
tandis que la fonction kill permet de retirer le code de la blockchain quand
le contrat n'est plus utilisé*/
}