mirror of
https://github.com/hackku21/loc-chain-backend.git
synced 2026-03-02 03:40:09 +00:00
Implemented transaction verification check
This commit is contained in:
65
src/app/units/rtdb/Transaction.ts
Normal file
65
src/app/units/rtdb/Transaction.ts
Normal file
@@ -0,0 +1,65 @@
|
||||
import {FirebaseUnit} from "../FirebaseUnit"
|
||||
import {TransactionResource, TransactionResourceItem} from "../../rtdb/TransactionResource"
|
||||
import {Singleton, Inject} from "@extollo/di"
|
||||
import {Unit, Logging} from "@extollo/lib"
|
||||
import * as openpgp from "openpgp"
|
||||
/**
|
||||
* Transaction Unit
|
||||
* ---------------------------------------
|
||||
* Put some description here.
|
||||
*/
|
||||
@Singleton()
|
||||
export class Transaction extends Unit {
|
||||
@Inject()
|
||||
protected readonly firebase!: FirebaseUnit
|
||||
|
||||
public async compareTransactions(transaction1: TransactionResourceItem, transaction2: TransactionResourceItem){
|
||||
// verify signature
|
||||
const result1 = await openpgp.verify({
|
||||
publicKeys: await openpgp.readKey({
|
||||
armoredKey: transaction2.partnerPublicKey
|
||||
}),
|
||||
message: openpgp.Message.fromText(transaction1.combinedHash),
|
||||
signature: await openpgp.readSignature({
|
||||
armoredSignature: transaction1.validationSignature // parse detached signature
|
||||
})
|
||||
})
|
||||
const result2 = await openpgp.verify({
|
||||
publicKeys: await openpgp.readKey({
|
||||
armoredKey: transaction1.partnerPublicKey
|
||||
}),
|
||||
message: openpgp.Message.fromText(transaction2.combinedHash),
|
||||
signature: await openpgp.readSignature({
|
||||
armoredSignature: transaction2.validationSignature // parse detached signature
|
||||
})
|
||||
})
|
||||
return await (result1.signatures[0].verified) && await (result2.signatures[0].verified);
|
||||
}
|
||||
|
||||
public async up() {
|
||||
this.firebase.ref("transaction").on("value", async () => {
|
||||
// array of pairs of tranaction resource items
|
||||
const groupedTransactions: [TransactionResourceItem, TransactionResourceItem][] = []
|
||||
// collection of transaction resource items
|
||||
let transactions = await TransactionResource.collect().collect()
|
||||
// compare each item
|
||||
transactions.each(transaction1 => {
|
||||
// for each item that is not itself
|
||||
transactions.where("combinedHash", "!=", transaction1.combinedHash)
|
||||
// get a second item
|
||||
.each(transaction2 => {
|
||||
//if the item matches
|
||||
if (this.compareTransactions(transaction1, transaction2)) {
|
||||
// and remove the two matching items
|
||||
transactions = transactions.whereNotIn("combinedHash", [transaction1.combinedHash, transaction2.combinedHash])
|
||||
// insert grouped items into groupedTransactions
|
||||
groupedTransactions.push([transaction1, transaction2]);
|
||||
}
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
public async down() {
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user