diff --git a/src/app/rtdb/BlockResource.ts b/src/app/rtdb/BlockResource.ts index 2a26900..2a087d4 100644 --- a/src/app/rtdb/BlockResource.ts +++ b/src/app/rtdb/BlockResource.ts @@ -53,6 +53,7 @@ export interface BlockResourceItem extends FirebaseResourceItem { lastBlockHash: string; lastBlockUUID: string; proof: string; + timestamp: number; } @Injectable() diff --git a/src/app/units/Blockchain.ts b/src/app/units/Blockchain.ts index 42c6195..3911c7b 100644 --- a/src/app/units/Blockchain.ts +++ b/src/app/units/Blockchain.ts @@ -15,6 +15,7 @@ export class Block implements BlockResourceItem { seqID: number; uuid: string; transactions: BlockTransaction[]; + timestamp: number; lastBlockHash: string; lastBlockUUID: string; proof: string; @@ -27,6 +28,7 @@ export class Block implements BlockResourceItem { this.lastBlockHash = rec.lastBlockHash this.lastBlockUUID = rec.lastBlockUUID this.proof = rec.proof; + this.timestamp = rec.timestamp; } /** Returns true if this is the genesis block. */ @@ -52,6 +54,7 @@ export class Block implements BlockResourceItem { lastBlockHash: this.lastBlockHash, lastBlockUUID: this.lastBlockUUID, proof: this.proof, + timestamp: this.timestamp, } } @@ -139,10 +142,10 @@ export class Blockchain extends Unit { * @param group */ public async submitTransactions(group: [TransactionResourceItem, TransactionResourceItem]) { - let lastBlock = await this.getLastBlock() - if ( !lastBlock ) await this.getGenesisBlock() + const lastBlock = await this.getLastBlock() const block: BlockResourceItem = { + timestamp: (new Date).getTime(), uuid: uuid_v4(), transactions: group.map(item => this.getEncounterTransaction(item)), lastBlockHash: lastBlock!.hash(), @@ -162,6 +165,7 @@ export class Blockchain extends Unit { */ public getGenesisBlock(): Block { return new Block({ + timestamp: (new Date).getTime(), uuid: '0000', transactions: [], lastBlockHash: '', @@ -173,11 +177,15 @@ export class Blockchain extends Unit { } /** - * Get the last block in the blockchain. + * Get the last block in the blockchain, or push the genesis if one doesn't already exist. */ - public async getLastBlock(): Promise { + public async getLastBlock(): Promise { const rec: BlockResourceItem | undefined = await BlockResource.collect().last() - return rec ? new Block(rec) : undefined + if ( rec ) return new Block(rec) + + const genesis = this.getGenesisBlock().toItem() + await ( this.app().make(BlockResource)).push(genesis) + return this.getLastBlock() } /**