nim-abc/abc/acks.nim

69 lines
1.6 KiB
Nim
Raw Normal View History

2021-06-30 15:18:19 +00:00
import pkg/questionable
import ./hash
2021-06-30 15:32:24 +00:00
import ./keys
2021-06-30 15:18:19 +00:00
export hash
2021-06-30 15:32:24 +00:00
export keys
2021-06-30 15:18:19 +00:00
type
Ack* = object
previous: ?Hash
transactions: seq[Hash]
validator: PublicKey
2021-06-30 15:32:24 +00:00
signature: ?Signature
2021-06-30 15:18:19 +00:00
func init*(_: type Ack,
transactions: openArray[Hash],
validator: PublicKey): ?Ack =
2021-06-30 15:18:19 +00:00
if transactions.len == 0:
return none Ack
some Ack(transactions: @transactions, validator: validator)
2021-06-30 15:18:19 +00:00
func init*(_: type Ack,
previous: Hash,
transactions: openArray[Hash],
validator: PublicKey): ?Ack =
without var ack =? Ack.init(transactions, validator):
2021-06-30 15:18:19 +00:00
return none Ack
ack.previous = previous.some
some ack
func previous*(ack: Ack): ?Hash =
ack.previous
func transactions*(ack: Ack): seq[Hash] =
ack.transactions
func validator*(ack: Ack): PublicKey =
ack.validator
2021-06-30 15:32:24 +00:00
func signature*(ack: Ack): ?Signature =
ack.signature
func `signature=`*(ack: var Ack, signature: Signature) =
ack.signature = signature.some
2021-06-30 15:18:19 +00:00
func toBytes*(ack: Ack): seq[byte] =
let previous = ack.previous |? Hash.default
result.add(previous.toBytes)
result.add(ack.transactions.len.uint8)
for transaction in ack.transactions:
result.add(transaction.toBytes)
result.add(ack.validator.toBytes)
2021-06-30 15:18:19 +00:00
func hash*(ack: Ack): Hash =
hash(ack.toBytes)
2021-06-30 15:32:24 +00:00
func sign*(key: PrivateKey, ack: var Ack) =
ack.signature = key.sign(ack.hash.toBytes).some
func hasValidSignature*(ack: Ack): bool =
without signature =? ack.signature:
return false
let message = ack.hash.toBytes
let signee = ack.validator
signee.verify(message, signature)