/
transaction-io.rkt
32 lines (27 loc) · 1.18 KB
/
transaction-io.rkt
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
#lang racket
(require (only-in sha sha256))
(require (only-in sha bytes->hex-string))
(require racket/serialize)
(struct transaction-io (hash value owner timestamp) #:prefab)
; Procedure for calculating the hash of a transaction-io object
(define (calculate-transaction-io-hash value owner timestamp)
(bytes->hex-string (sha256 (bytes-append
(string->bytes/utf-8 (number->string value))
(string->bytes/utf-8 (~a (serialize owner)))
(string->bytes/utf-8 (number->string timestamp))))))
; Make a transaction-io object with calculated hash
(define (make-transaction-io value owner)
(let ([timestamp (current-milliseconds)])
(transaction-io
(calculate-transaction-io-hash value owner timestamp)
value
owner
timestamp)))
; A transaction-io is valid if...
(define (valid-transaction-io? t-in)
; the hash is correct
(equal? (transaction-io-hash t-in)
(calculate-transaction-io-hash (transaction-io-value t-in)
(transaction-io-owner t-in)
(transaction-io-timestamp t-in))))
(provide (struct-out transaction-io) make-transaction-io valid-transaction-io?)