miner mines continuously,

moved to an account model,
transactions working,
querying working,
more checking of valid data
This commit is contained in:
Josip Milovac 2023-01-10 17:11:56 +11:00
parent 59bb42be11
commit 9847b2056b
12 changed files with 663 additions and 365 deletions

View file

@ -5,9 +5,9 @@ const ChainUtil = require('../chain-util');
class Wallet {
constructor(keyPair) {
this.balance = INITIAL_BALANCE;
this.keyPair = keyPair;
this.publicKey = this.keyPair.getPublic().encode('hex');
this.counter = 0;
}
toString() {
@ -20,63 +20,72 @@ class Wallet {
return this.keyPair.sign(dataHash);
}
createTransaction(recipient, amount, blockchain, transactionPool) {
this.balance = this.calculateBalance(blockchain);
createTransaction(recipient, amount, blockchain) {
const balance = blockchain.getBalanceCopy(this.publicKey);
if (amount > this.balance) {
console.log(`Amount: ${amount} exceceds current balance: ${this.balance}`);
if (balance.counter > this.counter) {
this.counter = balance.counter;
}
if (amount > balance.balance) {
console.log(`Amount: ${amount} exceceds current balance: ${balance.balance}`);
return null;
}
return Transaction.newTransaction(this, recipient, amount);
const counterToUse = this.counter + 1;
this.counter++;
const newTransaction = new Transaction(this.publicKey, counterToUse, [Transaction.createOutput(recipient, amount)]);
newTransaction.addSignature(this.sign(Transaction.hashToSign(newTransaction)));
return newTransaction;
}
createMetadata(SSNmetadata) {
return Metadata.newMetadata(this, SSNmetadata);
}
calculateBalance(blockchain) {
let balance = this.balance;
let transactions = [];
blockchain.chain.forEach(block => block.data.forEach(transaction => {
transactions.push(transaction);
}));
console.log("transactions of balance")
console.log(transactions);
const PaymentTransactions = transactions[0];
console.log("Payment transactions ")
console.log(PaymentTransactions);
const walletInputTs = PaymentTransactions.filter(transaction => transaction.input.address === this.publicKey);
//calculateBalance(blockchain) {
// let balance = this.balance;
// let transactions = [];
// blockchain.chain.forEach(block => block.data.forEach(transaction => {
// transactions.push(transaction);
// }));
// console.log("transactions of balance")
// console.log(transactions);
// const PaymentTransactions = transactions[0];
// console.log("Payment transactions ")
// console.log(PaymentTransactions);
// const walletInputTs = PaymentTransactions.filter(transaction => transaction.input.address === this.publicKey);
let startTime = 0;
// let startTime = 0;
if (walletInputTs.length > 0) {
const recentInputT = walletInputTs.reduce(
(prev, current) => prev.input.timestamp > current.input.timestamp ? prev : current
);
// if (walletInputTs.length > 0) {
// const recentInputT = walletInputTs.reduce(
// (prev, current) => prev.input.timestamp > current.input.timestamp ? prev : current
// );
balance = recentInputT.outputs.find(output => output.address === this.publicKey).amount;
startTime = recentInputT.input.timestamp;
}
// balance = recentInputT.outputs.find(output => output.address === this.publicKey).amount;
// startTime = recentInputT.input.timestamp;
// }
PaymentTransactions.forEach(transaction => {
if (transaction.input.timestamp > startTime) {
transaction.outputs.find(output => {
if (output.address === this.publicKey) {
balance += output.amount;
}
});
}
});
// PaymentTransactions.forEach(transaction => {
// if (transaction.input.timestamp > startTime) {
// transaction.outputs.find(output => {
// if (output.address === this.publicKey) {
// balance += output.amount;
// }
// });
// }
// });
return balance;
}
// return balance;
//}
static blockchainWallet() {
const blockchainWallet = new this(ChainUtil.genKeyPair());
blockchainWallet.address = 'blockchain-wallet';
return blockchainWallet;
}
//static blockchainWallet() {
// const blockchainWallet = new this(ChainUtil.genKeyPair());
// blockchainWallet.address = 'blockchain-wallet';
// return blockchainWallet;
//}
}
module.exports = Wallet;