feat: add transaction signature verification
This commit is contained in:
committed by
Michael Vines
parent
fd00571b0a
commit
d9a271742f
81
web3.js/test/get-confirmed-block.test.js
Normal file
81
web3.js/test/get-confirmed-block.test.js
Normal file
@@ -0,0 +1,81 @@
|
||||
// @flow
|
||||
import {Account} from '../src/account';
|
||||
import {SystemProgram} from '../src/system-program';
|
||||
import {Transaction} from '../src/transaction';
|
||||
|
||||
test('verify getConfirmedBlock', () => {
|
||||
const account0 = new Account();
|
||||
const account1 = new Account();
|
||||
const account2 = new Account();
|
||||
const account3 = new Account();
|
||||
const recentBlockhash = account1.publicKey.toBase58(); // Fake recentBlockhash
|
||||
|
||||
// Create a couple signed transactions
|
||||
const transfer0 = SystemProgram.transfer(
|
||||
account0.publicKey,
|
||||
account1.publicKey,
|
||||
123,
|
||||
);
|
||||
|
||||
const transaction0 = new Transaction({recentBlockhash}).add(transfer0);
|
||||
transaction0.sign(account0);
|
||||
const transfer1 = SystemProgram.transfer(
|
||||
account2.publicKey,
|
||||
account3.publicKey,
|
||||
456,
|
||||
);
|
||||
|
||||
let transaction1 = new Transaction({recentBlockhash}).add(transfer1);
|
||||
transaction1.sign(account2);
|
||||
|
||||
// Build ConfirmedBlock, with dummy data for blockhashes, balances
|
||||
const confirmedBlock = {
|
||||
blockhash: recentBlockhash,
|
||||
previousBlockhash: recentBlockhash,
|
||||
transactions: [
|
||||
{
|
||||
transaction: transaction0,
|
||||
meta: {
|
||||
fee: 0,
|
||||
preBalances: [100000, 100000, 1, 1, 1],
|
||||
postBalances: [99877, 100123, 1, 1, 1],
|
||||
status: {Ok: 'null'},
|
||||
},
|
||||
},
|
||||
{
|
||||
transaction: transaction1,
|
||||
meta: {
|
||||
fee: 0,
|
||||
preBalances: [100000, 100000, 1, 1, 1],
|
||||
postBalances: [99544, 100456, 1, 1, 1],
|
||||
status: {Ok: 'null'},
|
||||
},
|
||||
},
|
||||
],
|
||||
rewards: [],
|
||||
};
|
||||
|
||||
// Verify signatures in ConfirmedBlock
|
||||
for (const transactionWithMeta of confirmedBlock.transactions) {
|
||||
expect(transactionWithMeta.transaction.verifySignatures()).toBe(true);
|
||||
}
|
||||
|
||||
const bogusSignature = {
|
||||
signature: Buffer.alloc(64, 9),
|
||||
publicKey: account2.publicKey,
|
||||
};
|
||||
transaction1.signatures[0] = bogusSignature;
|
||||
|
||||
let badConfirmedBlock = confirmedBlock;
|
||||
badConfirmedBlock.transactions[1].transaction = transaction1;
|
||||
|
||||
// Verify signatures in ConfirmedBlock
|
||||
const verifications = badConfirmedBlock.transactions.map(
|
||||
transactionWithMeta => transactionWithMeta.transaction.verifySignatures(),
|
||||
);
|
||||
expect(
|
||||
verifications.reduce(
|
||||
(accumulator, currentValue) => accumulator && currentValue,
|
||||
),
|
||||
).toBe(false);
|
||||
});
|
Reference in New Issue
Block a user