flocore/test/transaction.js
Ryan X. Charles c07d509623 initialize transaction
In order to add convenience methods to a transaction, such as pushing new
inputs and outputs, we need to first have the notion of an initialized
transaction, which is actually not blank. An initialized transaction just has
default values for everything, such as no inputs and no outputs, and default
version and nlocktime.
2014-09-23 22:01:30 -07:00

172 lines
5.7 KiB
JavaScript

var Varint = require('../lib/varint');
var Transaction = require('../lib/transaction');
var Txin = require('../lib/txin');
var Txout = require('../lib/txout');
var should = require('chai').should();
var BufferReader = require('../lib/bufferreader');
var BufferWriter = require('../lib/bufferwriter');
describe('Transaction', function() {
var txin = Txin().fromBuffer(new Buffer('00000000000000000000000000000000000000000000000000000000000000000000000001ae00000000', 'hex'));
var txout = Txout().fromBuffer(new Buffer('050000000000000001ae', 'hex'));
var tx = Transaction().set({
version: 0,
txinsvi: Varint(1),
txins: [txin],
txoutsvi: Varint(1),
txouts: [txout],
nlocktime: 0
});
var txhex = '000000000100000000000000000000000000000000000000000000000000000000000000000000000001ae0000000001050000000000000001ae00000000';
var txbuf = new Buffer(txhex, 'hex');
var tx2idhex = '8c9aa966d35bfeaf031409e0001b90ccdafd8d859799eb945a3c515b8260bcf2';
var tx2hex = '01000000029e8d016a7b0dc49a325922d05da1f916d1e4d4f0cb840c9727f3d22ce8d1363f000000008c493046022100e9318720bee5425378b4763b0427158b1051eec8b08442ce3fbfbf7b30202a44022100d4172239ebd701dae2fbaaccd9f038e7ca166707333427e3fb2a2865b19a7f27014104510c67f46d2cbb29476d1f0b794be4cb549ea59ab9cc1e731969a7bf5be95f7ad5e7f904e5ccf50a9dc1714df00fbeb794aa27aaff33260c1032d931a75c56f2ffffffffa3195e7a1ab665473ff717814f6881485dc8759bebe97e31c301ffe7933a656f020000008b48304502201c282f35f3e02a1f32d2089265ad4b561f07ea3c288169dedcf2f785e6065efa022100e8db18aadacb382eed13ee04708f00ba0a9c40e3b21cf91da8859d0f7d99e0c50141042b409e1ebbb43875be5edde9c452c82c01e3903d38fa4fd89f3887a52cb8aea9dc8aec7e2c9d5b3609c03eb16259a2537135a1bf0f9c5fbbcbdbaf83ba402442ffffffff02206b1000000000001976a91420bb5c3bfaef0231dc05190e7f1c8e22e098991e88acf0ca0100000000001976a9149e3e2d23973a04ec1b02be97c30ab9f2f27c3b2c88ac00000000';
var tx2buf = new Buffer(tx2hex, 'hex');
it('should make a new transaction', function() {
var tx = new Transaction();
should.exist(tx);
tx = Transaction();
should.exist(tx);
Transaction(txbuf).toBuffer().toString('hex').should.equal(txhex);
//should set known defaults
tx.version.should.equal(1);
tx.txinsvi.toNumber().should.equal(0);
tx.txins.length.should.equal(0);
tx.txoutsvi.toNumber().should.equal(0);
tx.txouts.length.should.equal(0);
tx.nlocktime.should.equal(0xffffffff);
});
describe('#initialize', function() {
it('should set these known defaults', function() {
var tx = new Transaction();
tx.initialize();
tx.version.should.equal(1);
tx.txinsvi.toNumber().should.equal(0);
tx.txins.length.should.equal(0);
tx.txoutsvi.toNumber().should.equal(0);
tx.txouts.length.should.equal(0);
tx.nlocktime.should.equal(0xffffffff);
});
});
describe('#set', function() {
it('should set all the basic parameters', function() {
var tx = Transaction().set({
version: 0,
txinsvi: Varint(1),
txins: [txin],
txoutsvi: Varint(1),
txouts: [txout],
nlocktime: 0
});
should.exist(tx.version);
should.exist(tx.txinsvi);
should.exist(tx.txins);
should.exist(tx.txoutsvi);
should.exist(tx.txouts);
should.exist(tx.nlocktime);
});
});
describe('#fromJSON', function() {
it('should set all the basic parameters', function() {
var tx = Transaction().fromJSON({
version: 0,
txinsvi: Varint(1).toJSON(),
txins: [txin.toJSON()],
txoutsvi: Varint(1).toJSON(),
txouts: [txout.toJSON()],
nlocktime: 0
});
should.exist(tx.version);
should.exist(tx.txinsvi);
should.exist(tx.txins);
should.exist(tx.txoutsvi);
should.exist(tx.txouts);
should.exist(tx.nlocktime);
});
});
describe('#toJSON', function() {
it('should recover all the basic parameters', function() {
var json = tx.toJSON();
should.exist(json.version);
should.exist(json.txinsvi);
should.exist(json.txins);
should.exist(json.txoutsvi);
should.exist(json.txouts);
should.exist(json.nlocktime);
});
});
describe('#fromBuffer', function() {
it('should recover from this known tx', function() {
Transaction().fromBuffer(txbuf).toBuffer().toString('hex').should.equal(txhex);
});
it('should recover from this known tx from the blockchain', function() {
Transaction().fromBuffer(tx2buf).toBuffer().toString('hex').should.equal(tx2hex);
});
});
describe('#fromBufferReader', function() {
it('should recover from this known tx', function() {
Transaction().fromBufferReader(BufferReader(txbuf)).toBuffer().toString('hex').should.equal(txhex);
});
});
describe('#toBuffer', function() {
it('should produce this known tx', function() {
Transaction().fromBuffer(txbuf).toBuffer().toString('hex').should.equal(txhex);
});
});
describe('#toBufferWriter', function() {
it('should produce this known tx', function() {
Transaction().fromBuffer(txbuf).toBufferWriter().concat().toString('hex').should.equal(txhex);
});
});
describe('#hash', function() {
it('should correctly calculate the hash of this known transaction', function() {
var tx = Transaction().fromBuffer(tx2buf);
var txhashbuf = new Buffer(Array.apply([], new Buffer(tx2idhex, 'hex')).reverse());
tx.hash().toString('hex').should.equal(txhashbuf.toString('hex'));
});
});
describe('#id', function() {
it('should correctly calculate the id of this known transaction', function() {
var tx = Transaction().fromBuffer(tx2buf);
tx.id().toString('hex').should.equal(tx2idhex);
});
});
});