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
2021-07-08 09:21:30 +00:00
previous: ?AckHash
transactions: seq[TxHash]
validator: PublicKey
2021-06-30 15:32:24 +00:00
signature: ?Signature
2021-06-30 15:18:19 +00:00
func init*(_: type Ack,
2021-07-08 09:21:30 +00:00
transactions: openArray[TxHash],
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,
2021-07-08 09:21:30 +00:00
previous: AckHash,
transactions: openArray[TxHash],
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
2021-07-08 09:21:30 +00:00
func previous*(ack: Ack): ?AckHash =
2021-06-30 15:18:19 +00:00
ack.previous
2021-07-08 09:21:30 +00:00
func transactions*(ack: Ack): seq[TxHash] =
2021-06-30 15:18:19 +00:00
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] =
2021-07-08 09:21:30 +00:00
let previous = ack.previous |? AckHash.default
2021-06-30 15:18:19 +00:00
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
2021-07-08 09:21:30 +00:00
func hash*(ack: Ack): AckHash =
AckHash.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)