
Security News
The Changelog Podcast: Practical Steps to Stay Safe on npm
Learn the essential steps every developer should take to stay secure on npm and reduce exposure to supply chain attacks.
ethereumjs-vm
Advanced tools
Implements Ethereum's VM in JS
npm install ethereumjs-vm
var VM = require('ethereumjs-vm')
//create a new VM instance
var vm = new VM()
var code = '7f4e616d65526567000000000000000000000000000000000000000000000000003055307f4e616d6552656700000000000000000000000000000000000000000000000000557f436f6e666967000000000000000000000000000000000000000000000000000073661005d2720d855f1d9976f88bb10c1a3398c77f5573661005d2720d855f1d9976f88bb10c1a3398c77f7f436f6e6669670000000000000000000000000000000000000000000000000000553360455560df806100c56000396000f3007f726567697374657200000000000000000000000000000000000000000000000060003514156053576020355415603257005b335415603e5760003354555b6020353360006000a233602035556020353355005b60007f756e72656769737465720000000000000000000000000000000000000000000060003514156082575033545b1560995733335460006000a2600033545560003355005b60007f6b696c6c00000000000000000000000000000000000000000000000000000000600035141560cb575060455433145b1560d25733ff5b6000355460005260206000f3'
//code needs to be a buffer
code = new Buffer(code, 'hex')
vm.runCode({
code: code,
gasLimit: new Buffer('ffffffff', 'hex')
}, function(err, results){
console.log('returned: ' + results.return.toString('hex'));
})
Also more examples can be found here
To build for standalone use in the browser install browserify and run npm run build. This will give you a global variable EthVM to use. The standalone file will be at ./dist/ethereumjs-vm.js
new VM([StateTrie], [blockchain])Creates a new VM object
StateTrie - The Patricia Merkle Tree that contains the state. If no trie is given the VM will create an in memory trie.blockchain - an instance of the Blockchain If no blockchain is given a fake blockchain will be used.VM methodsvm.runBlockchain(blockchain, cb)Process a transaction.
blockchain - A blockchain that to processcb - The callback. It is given an err parameter if it failsvm.runBlock(opts, cb)Processes the block running all of the transactions it contains and updating the miner's account.
opts.block - The Block to processopts.generate - a Boolean; whether to generate the stateRoot. If false runBlock will check the stateRoot of the block against the Triecb - The callback. It is given two arguments, an error string containing an error that may have happened or null, and a results object with the following properties:
receipts - the receipts from the transactions in the blockresults - an Array for results from the transactions in the blockvm.runTx(opts, cb)Process a transaction.
opts.tx - A Transaction to run.opts.block - The block to which the tx belongs. If omitted a blank block will be used.cb - The callback. It is given two arguments, an error string containing an error that may have happened or null, and a results object with the following properties:
amountSpent - the amount of ether used by this transaction as a bignumgasUsed - the amount of gas used by the transactionvm - contains the results from running the code, if any, as described in vm.runCode(params, cb)vm.runCode(opts, cb)Runs EVM code
opts.code - The EVM code to run given as a Bufferopts.data - The input data given as a Bufferopts.value - The value in ether that is being sent to opt.address. Defaults to 0opts.block - The Block the tx belongs to. If omitted a blank block will be used.opts.gasLimit - The gas limit for the code given as a Bufferopts.account - The Account that the executing code belongs to. If omitted an empty account will be usedopts.address - The address of the account that is executing this code. The address should be a Buffer of bytes. Defaults to 0opts.origin - The address where the call originated from. The address should be a Buffer of 20bits. Defaults to 0opts.caller - The address that ran this code. The address should be a Buffer of 20bits. Defaults to 0cb - The callback. It is given two arguments, an error string containing an error that may have happened or null and a results object with the following properties
gas - the amount of gas left as a bignumgasUsed - the amount of gas as a bignum the code used to run.gasRefund - a Bignum containing the amount of gas to refund from deleting storage valuessuicides - an Array of accounts that have suicided.suicideTo - the account that the suicide refund should go to.logs - an Array of logs that the contract emitted.exception - a boolean, whether or not the contract encountered an exceptionexceptionError - a String describing the exception if there was one.return - a Buffer containing the value that was returned by the contractvm.stateManager.generateCanonicalGenesis(cb)Generates the Canonical genesis state.
vm.stateManager.generateGenesis(genesisData, cb)Generate the genesis state.
genesisData - an Object whose keys are addresses and values are strings representing initial allocation of ether.cb - The callbackvar genesisData = {
"51ba59315b3a95761d0863b05ccc7a7f54703d99": "1606938044258990275541962092341162602522202993782792835301376",
"e4157b34ea9615cfbde6b4fda419828124b70c78": "1606938044258990275541962092341162602522202993782792835301376"
}
vm.generateGenesis(genesisData, function(){
console.log('generation done');
})
eventsAll events are instances of async-eventemmiter. If an event handler has an arity of 2 the VM will pause until the callback is called
stepThe step event is given an Object and callback. The Object has the following properties.
pc - a Number representing the program counteropcode - the next opcode to be rangas - a bignum standing for the amount of gasLeftstack - an Array of Buffers containing the stack.storageTrie - the storage trie for the accountaccount - the Account which owns the code running.address - the address of the accountdepth - the current number of calls deep the contract ismemory - the memory of the VM as a buffercache - The account cache. Contains all the accounts loaded from the trie. It is an instance of functional red black treebeforeBlockEmits the block that is about to be processed.
afterBlockEmits the results of the processing a block.
beforeTxEmits the Transaction that I about to be processed.
afterTxEmits the result of the transaction.
npm test
if you want to just run the Blockchain tests run
./bin/tester -b
if you want to just run the VM tests run
./bin/tester -v
if you want to just run the State tests run
./bin/tester -s
The VM processes state changes at many levels.
The opFns for CREATE, CALL, and CALLCODE call back up to runCall.
FAQs
An Ethereum VM implementation
The npm package ethereumjs-vm receives a total of 185,174 weekly downloads. As such, ethereumjs-vm popularity was classified as popular.
We found that ethereumjs-vm demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 6 open source maintainers collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Learn the essential steps every developer should take to stay secure on npm and reduce exposure to supply chain attacks.

Security News
Experts push back on new claims about AI-driven ransomware, warning that hype and sponsored research are distorting how the threat is understood.

Security News
Ruby's creator Matz assumes control of RubyGems and Bundler repositories while former maintainers agree to step back and transfer all rights to end the dispute.