Evmcodegen
A synthetic evm bytecode generation library and cmdline utility to fuzz the ethereum stack machine
Install / Use
/learn @ethereum/EvmcodegenREADME
evmcodegen
Ever wanted to generate and manipulate ethereum evm bytecode? This is your chance.
Use various strategies to generate Instructions, fix the stack layout, fix jump addresses, balance the stack and manipulate the code before serializing Instruction objects to bytecode.
library
import evmdasm
# import distribution and random codegen strategy
from evmcodegen.distributions import EVM_CATEGORY
from evmcodegen.generators.distribution import GaussDistrCodeGen
# import main codegen class
from evmcodegen.codegen import CodeGen
# prepare random number generators for stack arg generator
# Rnd is just a utility class providing random byte and number generators. see codegen.py
VALUEMAP ={
evmdasm.argtypes.Address: lambda: Rnd.byte_sequence(20),
evmdasm.argtypes.Word: lambda: Rnd.byte_sequence(32),
evmdasm.argtypes.Timestamp: lambda: Rnd.byte_sequence(4),
evmdasm.argtypes.Data: lambda: Rnd.byte_sequence(Rnd.uni_integer(0, Rnd.opcode())),
evmdasm.argtypes.CallValue: lambda: Rnd.uni_integer(0,1024),
evmdasm.argtypes.Gas: lambda: Rnd.uni_integer(0,1024),
evmdasm.argtypes.Length: lambda: Rnd.small_memory_length_1024(),
evmdasm.argtypes.MemOffset: lambda: Rnd.small_memory_length_1024(),
evmdasm.argtypes.Index256: lambda: Rnd.uni_integer(1,256),
evmdasm.argtypes.Index64: lambda: Rnd.uni_integer(1,64),
evmdasm.argtypes.Index32: lambda: Rnd.length_32(),
evmdasm.argtypes.Byte: lambda: Rnd.byte_sequence(1),
evmdasm.argtypes.Bool: lambda: Rnd.byte_sequence(1),
evmdasm.argtypes.Value: lambda: Rnd.uni_integer(),
#evmdasm.argtypes.Label: lambda: 0xc0fefefe, # this is handled by fix_code_layout (fix jumps)
}
# create random number generator
rnd_codegen = GaussDistrCodeGen(distribution=EVM_CATEGORY)
# generate code, fix stack arguments, make jumps land on jumpdests, fix stack balance
evmcode = CodeGen()\
.generate(generator=rnd_codegen, length=None, min_gas=20)\
.fix_stack_arguments(valuemap=VALUEMAP)\
.fix_jumps().fix_stack_balance()
# print evmcode as string
print("0x%s" % evmcode.assemble().as_hexstring)
# disassemble and print listing
print(evmcode.reassemble().instructions.as_string)
# print some stats
print(CodeGen.stats(evmcode))
cmdline
python -m evmcodegen [--disassemble] [--count 1] [--stats]
Usage: __main__.py [options]
Options:
-h, --help show this help message and exit
-v VERBOSITY, --verbosity=VERBOSITY
available loglevels:
critical,fatal,error,warning,warn,info,debug,notset
[default: critical]
-g GENERATOR, --generator=GENERATOR
select generator (default: DistrCategory)
-d, --disassemble show disassembly
-c COUNT, --count=COUNT
number of evmcodes to generate
-m MIN_GAS, --min-gas=MIN_GAS
generate instructions consuming at least this amount
of gas
-l LENGTH, --length=LENGTH
instructions per generated code
-s, --stats show statistics
-b, --balance balance the stack
#> python3 -m evmcodegen --disassemble --stats
0x614e7e674fb87cc2d90eda346716ddb46d033b432f1677e1183a7c67c851296d5e7665ca56e7dd2158341bdb43fac760af6103486101546102dc73f9be0ce6ff661facc3be2288534765a056c1ac81610169f46e8d4b95ce3bd940e60687688ec7d9b6771bb0d8b79e269479c5828966eb6449d66f267a852493302062d35abc7c9b12b8365060660f8462edfefc847086df38ccd44a9d262a1dd50555b8692e2eddd62e1cbb07c9a66b9a237026291f95884b8fe26673544d46c8936bea177da53e3c1312bda38f4f3ba068f5e8a91c3bc73e67097af9f36c4e149ef38103c0552d7e092461a137d5c499717f923f5f2f65b6f992507ee17c0b6c470b9a437ad922daacd9285ef18b6edd4eab3613ab326052e3c80268e0b0d6226bb814137a6ac1987fc7638244c9442b4766d5a92878349dd88d67b6eef9a072a2abcd67a13f347c0bb492090a767b52cecf065119c1819a817d07ee8cc663a26ec09c089b682696cf5a850c1df1956fe90bff18d0ff36bfa6f2cc25b1b6084973dacbe5081a45f170b8743ed31da4d868e7932dd672c767f9ac5e9d68488912397af74cf68c291efe6d95e3d53d0037474e40edd89d6800756622c06f5860c016f8a9bbddb445a54a6ea769cc97d77382e2f2409561485dbfc9d3932cdd0fb9eac8151d6705bb89ddcd62ce987295c6dd56a8576d09e0cf2c6f3cc6fdf304d8f46e402e6f145a4c4a18e3cbeb7d6e687c997fc1efa359cdbae6d6e94c6744813fce07d2a7f3383cddb72a4c2023a8f9b13f2160111a672eff1825f5f63a7060381b7ec873b9effc596d42b79b14c4cef32881f60d56d1b91327bd9f6a028fb7f368677d1cfb92b27e2c4567cddfd280cc1ddbe005669629f47fd4dad6716783221dc1365aab2ae1e7bc159e34ec7b5a7ef5cb22fa8d05b913633446eef412e7d0223ec9d074b394243cb6bffe50480964bc6cb6ddf466c8e538144689ea7211c96372ebc885616f7dd41fd042a7ba43924b60326d3acd754d74fa71b796af1a31242865a44b109783b1693c3d2328e1087053765777466acf1d7452e1afb94c796ab44aa15e0de41a68794244498a610175610234605660f4737ddfeaa60e0f7c11a55b0b9ecb916a20b4440321610232fa7616c7d32909fda17ea5607c092368f5688aa4f467419d2a7614af7b38397918168266194e2434a26ea778325032e92f694bc64af97e6a90cd99307286a57fa21f7ed5e4aeb515fa0767cada6e24417c55aec3ab25899625c0ad520fe7bf5677ac7a22c2354b9bc9532bbe3eae77eea0ab6970e7e5428c0e7b512d34d3b6e2de69d16b508c6c6572d362e053e37e0f9f52e65303c6ff3971bb8b7dbd5a625d7242adeaf416ac2456373c1ab8876f9409961b905c1611140503c2e7b9f704643739a023d76e275efe1c6251b587abddcfaeb7deb37790db00fa123831109180c415126d9262c00f769776116be071792053dc741d6e73e636af254454fe9a6e399b725a8485c58eb2878c36f17a310f639dac7f21006724b580b8325975a567d7ca284dbc23d4d3016466dbe5ca2368cfa91172680d19d4136caef0be5d7ed702b37255abd4aa772857ae2297daad62f07a6063ae30908b740a3ac8e2691665799482d82cc63b3b2daed9c2f21957ecff0cd85216892d2e0af5556c0e331fca8ff6e733c2e8a4b7a07a19846867032e5c38a4c5056b055709854d2993b7cd8e697789efeb7d1d7a65f900cf089325cfb8121835a9816eda7549edc1abe985e221e28f0c786d345c855814c11a2abd676c33a780214952e878ec45572302653abe579a1c937063d8bf40b064442432e4cbb9b74d1f132473f771f13bc5f84a7b41096d5401047ba6aa334c39723f03e6e653a59d306946c884c09483c672d14d75abee3419c0f7fa908d937873a33ced37d9d80f8cb3938cb06235121e6f8df92a829997b46037fe84191e5062ce63e4f720cb605d70e48d647f383d36b4133b7d314cc0b326536a46925961523d9ea5334f9c7abde8e68ad35da5b588b3ee872f45e29e6bdeec35cee0b5e2a02efe7657045b3a15e3caba15477789cdfb96faa1e8dc247e81c57a5b7c1018dc480354c9d78bf90d4dbea5d8276a05001bb9757e61858878620ae1d95f3f20137d9ad620d6ec3259229f7e7bbc6a25387a64416c4fdc2c8167a286e57a68fd156667360ca24fc4ef6e6f01586f07a4a68a53095213ac0a1ec4c63b390a67e0702cbc9dd2db4370d1d9c7a5b6c3da0f4b1ef3252f64f631ef70e4b6872c3306d6507bac70dcb6cae75a3d612f81686ac01b77c2385feb636e34578695d41d7fae50b0177d820edb66fa1ae494b0e20f722d7df2f33f71e32b1e492e8c9d7b7029c166108767b7b64cd1d3a5de76676ec74072beacb6d90367d2f8194272b6731167696234bc8e84f3a00a7249c17b5dc6863addf72a8324c58cc01340108171d40d90699aea0adba797accae7e6616c35537ee43b5a12488c9416d52e0f76c8fbc332ef5f3850507d04fcf102d651bb44c66236eaa1658f48355516de7d2c34f78a8cc7862d3fa05b9f8f6852fcd36482d7da0d425b40b215b4573a726ceba7698bf0c62ada3b724ad31ea661f42104657b5370035e108668a88a98c8bc18bb6db678abf4ff881f53f9e3c7a4c7fbe482ab330c98ce7a9eeb2102d06bded846d30d932e36c2ecac02742fbd160a8990ced7c66cc38a83d5bf21ec0e96ceb46ba2dd9b5fdec8c0c7969da667788fab6ab68b7cb6479878e0bcd69adc11fe7ec5c18c5b447b52857ea959de88411e12fa0908f9807461e3fed1116129096a767b492a5fbc958b8275eb0fc381e5604161cebe13effb66844c3030018a47e87b9008ea24ec51ad6e95cb40e61365f2e80e47898ad8749788af7ced6f7ab6b62f9cf38da85bb1e8ea46a7640a4754fcba282e29b9ac24cfdf79342d504c84e11afd0ed5de832538537e0c750ca9855719cf7962606a61b15863a159e3237d5bd94d2d674e3fbf4ccd30b099cb9240745a6715a253216cec32d688251b662fbabe3b84f6b174b1c2a915041018e0238607eb112e0586179759ef676ef04c21885a6d2f480d9bce417bef0c6bf45265629bdc2a1adf86bed5638c6ecdbd648621d8c0597dc818794b717d627ac4eeb85e9e2a9b46560ebd30fec878fd3d5e4649bbd27224415f91cd46fd7c093953fb0c27e86947a5f87c5c7e6ebb18a6b1e471f27fa66459e9474e3c819a9d96b534fd903618b18f7f92c89f3ec163fd638b111005482a5b72a5014bb492f5c5ff747ccf49f41d63e26102ae526965f40937e340da863f81722087d5b5a516f0658563fdd66cbe0fa4e13c08639a31ad4f62d8f9b77597034e0361d3e171443b1e2b3083303e76663431c8c37d453f0cd493f6b9f17e8cd17a058112fc1a20dd0ece0716971afa605b349d7d9c6f785d0400507952790f320d0194a495169976cf5250eefeb4a04113c86ce4b62979b0e9a6dcb70caab216867938c8922d460de3dbcee01ffd7d4f4f551de52b20b75c9862b10861568f61417f72e044009acb3fb9a5fd63413263f22d665683817483729635b6d26dfcaed800ae61c8e8789b5ee2c5006e35ccfc07243e42e6b0fe3c406f15d36766a591da19351ac161997e6a916f3ebfde35c08852ab10701766c26963cc764b44077b54c9ef2413556074782a4492bc74ca6bac70815334e890b5ac92372e6ec9f0506d949a7bb3cd34a9aeb9f5b294c180a5a848007158848c4f666c5a95b9680c6460656cea6adc8128cf52dd2e84bae842768fa76642dc01f2d3a05ac2063028d23d708199fde458b27276475ebf33ec30842bcc380b1279978f166dc17ce4ef2b78f042ee40f6f648f2156e3a5d70d8cd45bd5aeaf00a0fdaccca6ea0546dd6255bd023e3d0c4349feb41768202b9dfdebb598076629896f396f7617bcabd871c4a6f705d7c1a2dbba290c5f78d33e00f984db8f06e5928a2a036dcf8d9847c19329008385b6b8875d837c071af125e4689fa6fabeb05d59f99d91235c9498d9f0b6840612ea7674d3181eb93d392056b0f4fcd6cdfc6c3b52dd7bae577acecb7b89afb3bfa649eb54556c46965c8dd03e2694bf2918f675d56fa78678618b967ede7294a785b8bd50a6439c11e4d4e7564902e8cd1a08463692c006fa0d755fdcb10f41b40446289fbbb77763f4b6e4d4da5f232453836b6d9dda3ec471281995425e369c6e8fe3fa3770b9e1ec47cd694cd5c180e0441808788e7725ff2922f886dfef2d30e3648a3188dec85674c7bca12d270cf0660271d6d8138f0eeef0762bcb3bf6128cb35637864aede6eb33318f9f20a99a2e23cb4ff0390f9624cbd436c9124665f674ccd5e00d8266e3671285192746418db51770305278afbcff92a5f6c61e70a1ec48a4b0f33b4074e817e1d14c1c3a4a41981ee6625d76a019784b20cf96b2dd21848df410f820e06c572b3316b4d3dec7371c7b07f5577d24d8042ee146b866c57ace761707ba5973722682b1d089d8dea40dfcf77380cd370fa76126d75d3fe6732b5d785144b5e6f514cbbfb6eb779942d0cd125b32b3f59eefc4fb5646a620f46b87d10a23b5f4c6476bb89c06a648be10188604678b52ba30f1d383314b07acb8e676850d1b8f7bfd82167a04cc598e9a84bad17784c1e3347755cfd8fd26c4c9b70e719948d1cbc0168cbf8160d70abbe68e9dea8e76fec69c0b534b5808ecc73dd2d492b1b10ffa1
