UNPKG

vaporyjs-vm

Version:
109 lines (105 loc) 3.27 kB
const async = require('async') const testUtil = require('./util.js') const vapUtil = require('vaporyjs-util') const Trie = require('@vaporyjs/merkle-patricia-tree/secure') const Block = require('vaporyjs-block') const Blockchain = require('vaporyjs-blockchain') const BlockHeader = require('vaporyjs-block/header.js') const VM = require('../') const Level = require('level') var cacheDB = new Level('./.cachedb') module.exports = function runBlockchainTest (options, testData, t, cb) { var blockchainDB = new Level('', { db: require('memdown') }) var state = new Trie() var blockchain = new Blockchain(blockchainDB) blockchain.vapash.cacheDB = cacheDB var vm = new VM(state, blockchain) var genesisBlock = new Block() if (testData.homestead) { vm.on('beforeTx', function (tx) { tx._homestead = true }) vm.on('beforeBlock', function (block) { block.header.isHomestead = function () { return true } }) } async.series([ // set up pre-state function (done) { testUtil.setupPreConditions(state, testData, function () { done() }) }, function (done) { // create and add genesis block genesisBlock.header = new BlockHeader(formatBlockHeader(testData.genesisBlockHeader)) t.equal(state.root.toString('hex'), genesisBlock.header.stateRoot.toString('hex'), 'correct pre stateRoot') if (testData.genesisRLP) { t.equal(genesisBlock.serialize().toString('hex'), testData.genesisRLP.slice(2), 'correct genesis RLP') } blockchain.putGenesis(genesisBlock, function (err) { done(err) }) }, function (done) { async.eachSeries(testData.blocks, function (raw, cb) { try { var block = new Block(Buffer.from(raw.rlp.slice(2), 'hex')) // forces the block into thinking they are homestead if (testData.homestead) { block.header.isHomestead = function () { return true } block.uncleHeaders.forEach(function (uncle) { uncle.isHomestead = function () { return true } }) } blockchain.putBlock(block, function (err) { cb(err) }) } catch (err) { cb() } }, function () { done() }) }, function runBlockchain (done) { vm.runBlockchain(function () { done() }) }, function getHead (done) { vm.blockchain.getHead(function (err, block) { t.equal(block.hash().toString('hex'), testData.lastblockhash, 'last block hash') // make sure the state is set beofore checking post conditions state.root = block.header.stateRoot done(err) }) }, function (done) { if (options.debugging) { testUtil.verifyPostConditions(state, testData.postState, t, done) } else { done() } } ], function () { t.equal(blockchain.meta.rawHead.toString('hex'), testData.lastblockhash, 'correct header block') cb() }) } function formatBlockHeader (data) { var r = {} var keys = Object.keys(data) keys.forEach(function (key) { r[key] = vapUtil.addHexPrefix(data[key]) }) return r }