ethereumjs/ethereumjs-block-3-tests
之前可以先了解一下另一个模块,看本博客的ethereumjs/ethereumjs-common部分内容
通过tests测试文件能够帮助更好了解API的使用
ethereumjs-block/tests/header.js
const tape = require('tape')
const Common = require('ethereumjs-common')
const utils = require('ethereumjs-util')
const rlp = utils.rlp
const Header = require('../header.js')
const Block = require('../index.js')
tape('[Block]: Header functions', function (t) {
t.test('should create with default constructor', function (st) {
function compareDefaultHeader (st, header) {
st.deepEqual(header.parentHash, utils.zeros())
st.equal(header.uncleHash.toString('hex'), utils.SHA3_RLP_ARRAY_S)
st.deepEqual(header.coinbase, utils.zeros())
st.deepEqual(header.stateRoot, utils.zeros())
st.equal(header.transactionsTrie.toString('hex'), utils.SHA3_RLP_S)
st.equal(header.receiptTrie.toString('hex'), utils.SHA3_RLP_S)
st.deepEqual(header.bloom, utils.zeros())
st.deepEqual(header.difficulty, Buffer.from([]))
st.deepEqual(header.number, utils.intToBuffer())
st.deepEqual(header.gasLimit, Buffer.from('ffffffffffffff', 'hex'))
st.deepEqual(header.gasUsed, Buffer.from([]))
st.deepEqual(header.timestamp, Buffer.from([]))
st.deepEqual(header.extraData, Buffer.from([]))
st.deepEqual(header.mixHash, utils.zeros())
st.deepEqual(header.nonce, utils.zeros())
}
var header = new Header()
compareDefaultHeader(st, header)
var block = new Block()
header = block.header
compareDefaultHeader(st, header)
st.end()
})
t.test('should test header initialization', function (st) {
const header1 = new Header(null, { 'chain': 'ropsten' }) //初始化,一种是提供chain/hardfork
const common = new Common('ropsten')
const header2 = new Header(null, { 'common': common })//另一种则是使用common,common和chain不能同时提供,会报错
header1.setGenesisParams()//就是将该区块头设置为规范初始区块头
header2.setGenesisParams()
st.strictEqual(header1.hash().toString('hex'), header2.hash().toString('hex'), 'header hashes match')//因为两个都设置为规范初始区块头,所以相应的值是相同的
st.throws(function () { new Header(null, { 'chain': 'ropsten', 'common': common }) }, /not allowed!$/, 'should throw on initialization with chain and common parameter') // eslint-disable-line
st.end()
})
t.test('should test validateGasLimit', function (st) {//对gasLimit进行验证
const testData = require('./bcBlockGasLimitTest.json').tests
const bcBlockGasLimigTestData = testData.BlockGasLimit2p63m1
Object.keys(bcBlockGasLimigTestData).forEach(key => {
var parentBlock = new Block(rlp.decode(bcBlockGasLimigTestData[key].genesisRLP)) //使用genesisRLP初始化block得到的是父区块
var block = new Block(rlp.decode(bcBlockGasLimigTestData[key].blocks[].rlp)) //使用blocks[0].rlp初始化block得到的是本区块
st.equal(block.header.validateGasLimit(parentBlock), true)
})
st.end()
})
t.test('should test isGenesis', function (st) {
var header = new Header() //查看该区块头是否为初始区块
st.equal(header.isGenesis(), false)
header.number = Buffer.from([]) //通过设置header.number为空buffer数组就能得到是初始区块的结果
st.equal(header.isGenesis(), true)
st.end()
})
const testDataGenesis = require('./genesishashestest.json').test
t.test('should test genesis hashes (mainnet default)', function (st) {
var header = new Header()
header.setGenesisParams()
st.strictEqual(header.hash().toString('hex'), testDataGenesis.genesis_hash, 'genesis hash match')
st.end()
})
t.test('should test genesis parameters (ropsten)', function (st) {
var genesisHeader = new Header(null, { 'chain': 'ropsten' })
genesisHeader.setGenesisParams()
let ropstenStateRoot = '217b0bbcfb72e2d57e28f33cb361b9983513177755dc3f33ce3e7022ed62b77b'
st.strictEqual(genesisHeader.stateRoot.toString('hex'), ropstenStateRoot, 'genesis stateRoot match')
st.end()
})
})
ethereumjs-block/tests/block.js
const tape = require('tape')
const Common = require('ethereumjs-common')
const rlp = require('ethereumjs-util').rlp
const Block = require('../index.js')
tape('[Block]: block functions', function (t) {
t.test('should test block initialization', function (st) {
const block1 = new Block(null, { 'chain': 'ropsten' }) //初始化,一种是提供chain/hardfork
const common = new Common('ropsten')
const block2 = new Block(null, { 'common': common })//另一种则是使用common,common和chain不能同时提供,会报错
block1.setGenesisParams()//就是将该区块设置为规范初始区块
block2.setGenesisParams()
st.strictEqual(block1.hash().toString('hex'), block2.hash().toString('hex'), 'block hashes match')//因为两个都设置为规范初始区块,所以相应的值是相同的
st.throws(function () { new Block(null, { 'chain': 'ropsten', 'common': common }) }, /not allowed!$/, 'should throw on initialization with chain and common parameter') // eslint-disable-line
st.end()
})
const testData = require('./testdata.json')
function testTransactionValidation (st, block) {
st.equal(block.validateTransactions(), true) //验证区块中的交易
block.genTxTrie(function () {//必须要先生成了前缀树后才能调用验证前缀树的操作
st.equal(block.validateTransactionsTrie(), true)
st.end()
})
}
t.test('should test transaction validation', function (st) {
var block = new Block(rlp.decode(testData.blocks[].rlp))
st.plan()
testTransactionValidation(st, block)
})
t.test('should test transaction validation with empty transaction list', function (st) {
var block = new Block()
st.plan()
testTransactionValidation(st, block)
})
const testData2 = require('./testdata2.json')
t.test('should test uncles hash validation', function (st) {
var block = new Block(rlp.decode(testData2.blocks[].rlp))//从区块信息文件生成相同区块
st.equal(block.validateUnclesHash(), true)//验证该区块的叔块hash
st.end()
})
t.test('should test isGenesis (mainnet default)', function (st) {
var block = new Block()
st.notEqual(block.isGenesis(), true) //查看是否为初始区块,为false
block.header.number = Buffer.from([])//决定因素是block.header.number,设置为空数组buffer即可
st.equal(block.isGenesis(), true)
st.end()
})
t.test('should test isGenesis (ropsten)', function (st) {
var block = new Block(null, { 'chain': 'ropsten' })
st.notEqual(block.isGenesis(), true)
block.header.number = Buffer.from([])
st.equal(block.isGenesis(), true)
st.end()
})
const testDataGenesis = require('./genesishashestest.json').test//(初始区块信息)
t.test('should test genesis hashes (mainnet default)', function (st) {
var genesisBlock = new Block()
genesisBlock.setGenesisParams()//设置为初始区块
var rlp = genesisBlock.serialize() //序列化,就是将其生产rlp格式
st.strictEqual(rlp.toString('hex'), testDataGenesis.genesis_rlp_hex, 'rlp hex match')
st.strictEqual(genesisBlock.hash().toString('hex'), testDataGenesis.genesis_hash, 'genesis hash match')
st.end()
})
t.test('should test genesis hashes (ropsten)', function (st) {
var common = new Common('ropsten')
var genesisBlock = new Block(null, { common: common })
genesisBlock.setGenesisParams()
st.strictEqual(genesisBlock.hash().toString('hex'), common.genesis().hash.slice(), 'genesis hash match')
st.end()
})
t.test('should test genesis hashes (rinkeby)', function (st) {
var common = new Common('rinkeby')
var genesisBlock = new Block(null, { common: common })
genesisBlock.setGenesisParams()
st.strictEqual(genesisBlock.hash().toString('hex'), common.genesis().hash.slice(), 'genesis hash match')
st.end()
})
t.test('should test genesis parameters (ropsten)', function (st) {
var genesisBlock = new Block(null, { 'chain': 'ropsten' })
genesisBlock.setGenesisParams()
let ropstenStateRoot = '217b0bbcfb72e2d57e28f33cb361b9983513177755dc3f33ce3e7022ed62b77b'
st.strictEqual(genesisBlock.header.stateRoot.toString('hex'), ropstenStateRoot, 'genesis stateRoot match')
st.end()
})
t.test('should test toJSON', function (st) {
var block = new Block(rlp.decode(testData2.blocks[].rlp))
st.equal(typeof (block.toJSON()), 'object') //返回值为object类型
st.equal(typeof (block.toJSON(true)), 'object')
st.end()
})
})
ethereumjs-block/tests/difficulty.js
const utils = require('ethereumjs-util')
const tape = require('tape')
const Block = require('../')
const BN = utils.BN
function normalize (data) {
Object.keys(data).map(function (i) {
if (i !== 'homestead' && typeof (data[i]) === 'string') {
data[i] = utils.isHexPrefixed(data[i]) ? new BN(utils.toBuffer(data[i])) : new BN(data[i])
}
})
}
tape('[Header]: difficulty tests', t => {
function runDifficultyTests (test, parentBlock, block, msg) {
normalize(test)
var dif = block.header.canonicalDifficulty(parentBlock)//返回区块的规范困难度
t.equal(dif.toString(), test.currentDifficulty.toString(), `test canonicalDifficulty (${msg})`) //从父区块得到的规范困难度与当前区块的困难度应该是相等的
t.assert(block.header.validateDifficulty(parentBlock), `test validateDifficulty (${msg})`) //查看区块头是否符合规范困难度的区块困难度
}
const hardforkTestData = {
'chainstart': require('./difficultyFrontier.json').tests,
'homestead': require('./difficultyHomestead.json').tests,
'byzantium': require('./difficultyByzantium.json').tests,
'constantinople': require('./difficultyConstantinople.json').tests
}
for (let hardfork in hardforkTestData) {
const testData = hardforkTestData[hardfork]
for (let testName in testData) {
let test = testData[testName]
let parentBlock = new Block(null, { 'chain': 'mainnet', 'hardfork': hardfork })
parentBlock.header.timestamp = test.parentTimestamp
parentBlock.header.difficulty = test.parentDifficulty
parentBlock.header.uncleHash = test.parentUncles
let block = new Block(null, { 'chain': 'mainnet', 'hardfork': hardfork })
block.header.timestamp = test.currentTimestamp
block.header.difficulty = test.currentDifficulty
block.header.number = test.currentBlockNumber
runDifficultyTests(test, parentBlock, block, 'fork determination by hardfork param')
}
}
const chainTestData = {
'mainnet': require('./difficultyMainNetwork.json').tests,
'ropsten': require('./difficultyRopstenByzantium.json').tests
}
for (let chain in chainTestData) {
const testData = chainTestData[chain]
for (let testName in testData) {
let test = testData[testName]
let parentBlock = new Block(null, { 'chain': chain })
parentBlock.header.timestamp = test.parentTimestamp
parentBlock.header.difficulty = test.parentDifficulty
parentBlock.header.uncleHash = test.parentUncles
let block = new Block(null, { 'chain': chain })
block.header.timestamp = test.currentTimestamp
block.header.difficulty = test.currentDifficulty
block.header.number = test.currentBlockNumber
runDifficultyTests(test, parentBlock, block, 'fork determination by block number')
}
}
t.end()
ethereumjs/ethereumjs-block-3-tests的更多相关文章
- ethereumjs/ethereumjs-block-1-简介
https://github.com/ethereumjs/ethereumjs-block Encoding, decoding and validation of Ethereum's Block ...
- NGINX Load Balancing – TCP and UDP Load Balancer
This chapter describes how to use NGINX Plus and open source NGINX to proxy and load balance TCP and ...
- CSS动画划入划出酷炫
HTML插入 <!DOCTYPE html> <html class="no-js iarouse"> <head> <meta char ...
- ethereumjs/ethereumjs-vm-4-tests
根据代码发现还要了解的模块有: ethereumjs/merkle-patricia-tree -对应数据存储的数据结构 ethereumjs-blockchain —— 区块链 ethereumjs ...
- ethereumjs/ethereumjs-block-2-api
https://github.com/ethereumjs/ethereumjs-block/blob/master/docs/index.md 详细的调用代码可见本博客的ethereumjs/eth ...
- ethereumjs/ethereumjs-blockchain-2-test
https://github.com/ethereumjs/ethereumjs-blockchain/tree/master/test 'use strict' const test = requi ...
- ethereumjs/ethereumjs-blockchain-1-简介和API
https://github.com/ethereumjs/ethereumjs-blockchain SYNOPSIS概要 A module to store and interact with b ...
- ethereumjs/ethereumjs-wallet
Utilities for handling Ethereum keys ethereumjs-wallet A lightweight wallet implementation. At the m ...
- ethereumjs/ethereumjs-common-1-简介
为了了解ethereumjs/ethereumjs-block-3-代码的使用需要了解的一个模块 https://github.com/ethereumjs/ethereumjs-common Com ...
随机推荐
- SOA(面向服务架构)——踩坑后反思:这样值得吗?
SOA(面向服务架构)——踩坑后反思:这样值得吗?
- [PHP] 试题系统研究
考试科目: 添加考试科目,填写科目名称,选择科目题型(复选框/单选题,多选题,判断题,问答题,填空题) 添加科目章节,填写章节名称,添加章节知识点,填写知识点以英文逗号分隔,直接插入多条记录 开通考场 ...
- HDU 2680(最短路)(多个起始点)
这道题也是死命TLE.. http://acm.hdu.edu.cn/showproblem.php?pid=2680 /* 使用pair代替结构 */ #include <iostream&g ...
- Tomcat中使用commons-io-2.5发生的错误java.lang.ClassNotFoundException: org.apache.commons.io.IOUtils
关键词:IntelliJ IDEA.Tomcat.commons-io-2.5.jar.java.lang.ClassNotFoundException: org.apache.commons.io. ...
- Angular中引入Bootstrap部分样式失效以及Jquery的$无法识别
大多数同学在模仿慕课网的时候可能会遇到引入bootstrap和jquery样式部分失效以及$符号报错,这里为大家提供正确的解决方案. 可能大家在引入试过col-md之后觉得bootstrap是ok的, ...
- 在 Ubuntu上使用 MySQL
MySQL 安装配置 https://help.ubuntu.com/12.04/serverguide/mysql.html MySQL Manual http://dev.mysql.com/do ...
- 【vue入门】日志demo,增删改查的练习(无vuex版本)
安装 1. 确定电脑已装node和npm 出现版本号则说明电脑已经安装好node和npm2. 创建一个基于webpack的项目 3. 在项目里安装依赖 4. 运行 配置路由为了动态渲染各个页面的组 ...
- Anjular中的路由配置以及服务等模块的一些基本操作
1.路由的配置: 在Angular.js中,我们可以根据自己的需求来配置路由,以达到当url中的地址改变时,会跳转不同的页面 <script> //一开始的url:"http:/ ...
- 在 O(1) 时间删除链表结点(C 和 Python 实现)
(说明:本博客中的题目.题目详细说明及参考代码均摘自 “何海涛<剑指Offer:名企面试官精讲典型编程题>2012年”) 题目 给定单向链表的头指针和一个结点指针,定义一个函数在 O(1) ...
- .net core系列之《对AOP思想的理解及使用AspectCore实现自定义日志拦截》
对于AOP这个名词,相信对于搞过MVC开发的人来说,都很熟悉,里面各种各样的Filter简直是将AOP体现到了极致. 那么什么是AOP呢? AOP(Aspect Oriented Programmin ...