ethereum-execution 2.18.0rc6.dev2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ethereum/__init__.py +30 -0
- ethereum/assets/blocks/block_1.json +22 -0
- ethereum/assets/blocks/block_1234567.json +22 -0
- ethereum/assets/blocks/block_12964999.json +2720 -0
- ethereum/assets/cache_sizes_2048_epochs.json +329 -0
- ethereum/assets/dataset_sizes_2048_epochs.json +412 -0
- ethereum/assets/mainnet.json +26711 -0
- ethereum/crypto/__init__.py +3 -0
- ethereum/crypto/blake2.py +265 -0
- ethereum/crypto/elliptic_curve.py +170 -0
- ethereum/crypto/hash.py +56 -0
- ethereum/crypto/kzg.py +176 -0
- ethereum/ethash.py +426 -0
- ethereum/exceptions.py +75 -0
- ethereum/fork_criteria.py +205 -0
- ethereum/forks/arrow_glacier/__init__.py +33 -0
- ethereum/forks/arrow_glacier/blocks.py +326 -0
- ethereum/forks/arrow_glacier/bloom.py +87 -0
- ethereum/forks/arrow_glacier/exceptions.py +58 -0
- ethereum/forks/arrow_glacier/fork.py +954 -0
- ethereum/forks/arrow_glacier/fork_types.py +62 -0
- ethereum/forks/arrow_glacier/state.py +644 -0
- ethereum/forks/arrow_glacier/transactions.py +573 -0
- ethereum/forks/arrow_glacier/trie.py +498 -0
- ethereum/forks/arrow_glacier/utils/__init__.py +3 -0
- ethereum/forks/arrow_glacier/utils/address.py +94 -0
- ethereum/forks/arrow_glacier/utils/hexadecimal.py +55 -0
- ethereum/forks/arrow_glacier/utils/message.py +90 -0
- ethereum/forks/arrow_glacier/vm/__init__.py +195 -0
- ethereum/forks/arrow_glacier/vm/exceptions.py +131 -0
- ethereum/forks/arrow_glacier/vm/gas.py +245 -0
- ethereum/forks/arrow_glacier/vm/instructions/__init__.py +353 -0
- ethereum/forks/arrow_glacier/vm/instructions/arithmetic.py +373 -0
- ethereum/forks/arrow_glacier/vm/instructions/bitwise.py +245 -0
- ethereum/forks/arrow_glacier/vm/instructions/block.py +212 -0
- ethereum/forks/arrow_glacier/vm/instructions/comparison.py +177 -0
- ethereum/forks/arrow_glacier/vm/instructions/control_flow.py +171 -0
- ethereum/forks/arrow_glacier/vm/instructions/environment.py +544 -0
- ethereum/forks/arrow_glacier/vm/instructions/keccak.py +63 -0
- ethereum/forks/arrow_glacier/vm/instructions/log.py +88 -0
- ethereum/forks/arrow_glacier/vm/instructions/memory.py +141 -0
- ethereum/forks/arrow_glacier/vm/instructions/stack.py +204 -0
- ethereum/forks/arrow_glacier/vm/instructions/storage.py +126 -0
- ethereum/forks/arrow_glacier/vm/instructions/system.py +694 -0
- ethereum/forks/arrow_glacier/vm/interpreter.py +312 -0
- ethereum/forks/arrow_glacier/vm/memory.py +84 -0
- ethereum/forks/arrow_glacier/vm/precompiled_contracts/__init__.py +37 -0
- ethereum/forks/arrow_glacier/vm/precompiled_contracts/alt_bn128.py +230 -0
- ethereum/forks/arrow_glacier/vm/precompiled_contracts/blake2f.py +42 -0
- ethereum/forks/arrow_glacier/vm/precompiled_contracts/ecrecover.py +64 -0
- ethereum/forks/arrow_glacier/vm/precompiled_contracts/identity.py +39 -0
- ethereum/forks/arrow_glacier/vm/precompiled_contracts/mapping.py +46 -0
- ethereum/forks/arrow_glacier/vm/precompiled_contracts/modexp.py +166 -0
- ethereum/forks/arrow_glacier/vm/precompiled_contracts/ripemd160.py +44 -0
- ethereum/forks/arrow_glacier/vm/precompiled_contracts/sha256.py +41 -0
- ethereum/forks/arrow_glacier/vm/runtime.py +69 -0
- ethereum/forks/arrow_glacier/vm/stack.py +58 -0
- ethereum/forks/berlin/__init__.py +43 -0
- ethereum/forks/berlin/blocks.py +297 -0
- ethereum/forks/berlin/bloom.py +87 -0
- ethereum/forks/berlin/exceptions.py +24 -0
- ethereum/forks/berlin/fork.py +839 -0
- ethereum/forks/berlin/fork_types.py +62 -0
- ethereum/forks/berlin/state.py +644 -0
- ethereum/forks/berlin/transactions.py +456 -0
- ethereum/forks/berlin/trie.py +498 -0
- ethereum/forks/berlin/utils/__init__.py +3 -0
- ethereum/forks/berlin/utils/address.py +94 -0
- ethereum/forks/berlin/utils/hexadecimal.py +55 -0
- ethereum/forks/berlin/utils/message.py +90 -0
- ethereum/forks/berlin/vm/__init__.py +194 -0
- ethereum/forks/berlin/vm/exceptions.py +123 -0
- ethereum/forks/berlin/vm/gas.py +246 -0
- ethereum/forks/berlin/vm/instructions/__init__.py +351 -0
- ethereum/forks/berlin/vm/instructions/arithmetic.py +373 -0
- ethereum/forks/berlin/vm/instructions/bitwise.py +245 -0
- ethereum/forks/berlin/vm/instructions/block.py +212 -0
- ethereum/forks/berlin/vm/instructions/comparison.py +177 -0
- ethereum/forks/berlin/vm/instructions/control_flow.py +171 -0
- ethereum/forks/berlin/vm/instructions/environment.py +521 -0
- ethereum/forks/berlin/vm/instructions/keccak.py +63 -0
- ethereum/forks/berlin/vm/instructions/log.py +88 -0
- ethereum/forks/berlin/vm/instructions/memory.py +141 -0
- ethereum/forks/berlin/vm/instructions/stack.py +204 -0
- ethereum/forks/berlin/vm/instructions/storage.py +126 -0
- ethereum/forks/berlin/vm/instructions/system.py +706 -0
- ethereum/forks/berlin/vm/interpreter.py +308 -0
- ethereum/forks/berlin/vm/memory.py +84 -0
- ethereum/forks/berlin/vm/precompiled_contracts/__init__.py +37 -0
- ethereum/forks/berlin/vm/precompiled_contracts/alt_bn128.py +230 -0
- ethereum/forks/berlin/vm/precompiled_contracts/blake2f.py +42 -0
- ethereum/forks/berlin/vm/precompiled_contracts/ecrecover.py +64 -0
- ethereum/forks/berlin/vm/precompiled_contracts/identity.py +39 -0
- ethereum/forks/berlin/vm/precompiled_contracts/mapping.py +46 -0
- ethereum/forks/berlin/vm/precompiled_contracts/modexp.py +166 -0
- ethereum/forks/berlin/vm/precompiled_contracts/ripemd160.py +44 -0
- ethereum/forks/berlin/vm/precompiled_contracts/sha256.py +41 -0
- ethereum/forks/berlin/vm/runtime.py +69 -0
- ethereum/forks/berlin/vm/stack.py +58 -0
- ethereum/forks/byzantium/__init__.py +50 -0
- ethereum/forks/byzantium/blocks.py +265 -0
- ethereum/forks/byzantium/bloom.py +87 -0
- ethereum/forks/byzantium/fork.py +816 -0
- ethereum/forks/byzantium/fork_types.py +61 -0
- ethereum/forks/byzantium/state.py +583 -0
- ethereum/forks/byzantium/transactions.py +261 -0
- ethereum/forks/byzantium/trie.py +498 -0
- ethereum/forks/byzantium/utils/__init__.py +3 -0
- ethereum/forks/byzantium/utils/address.py +63 -0
- ethereum/forks/byzantium/utils/hexadecimal.py +55 -0
- ethereum/forks/byzantium/utils/message.py +80 -0
- ethereum/forks/byzantium/vm/__init__.py +186 -0
- ethereum/forks/byzantium/vm/exceptions.py +123 -0
- ethereum/forks/byzantium/vm/gas.py +245 -0
- ethereum/forks/byzantium/vm/instructions/__init__.py +337 -0
- ethereum/forks/byzantium/vm/instructions/arithmetic.py +373 -0
- ethereum/forks/byzantium/vm/instructions/bitwise.py +153 -0
- ethereum/forks/byzantium/vm/instructions/block.py +189 -0
- ethereum/forks/byzantium/vm/instructions/comparison.py +177 -0
- ethereum/forks/byzantium/vm/instructions/control_flow.py +171 -0
- ethereum/forks/byzantium/vm/instructions/environment.py +436 -0
- ethereum/forks/byzantium/vm/instructions/keccak.py +63 -0
- ethereum/forks/byzantium/vm/instructions/log.py +88 -0
- ethereum/forks/byzantium/vm/instructions/memory.py +141 -0
- ethereum/forks/byzantium/vm/instructions/stack.py +204 -0
- ethereum/forks/byzantium/vm/instructions/storage.py +88 -0
- ethereum/forks/byzantium/vm/instructions/system.py +601 -0
- ethereum/forks/byzantium/vm/interpreter.py +299 -0
- ethereum/forks/byzantium/vm/memory.py +84 -0
- ethereum/forks/byzantium/vm/precompiled_contracts/__init__.py +36 -0
- ethereum/forks/byzantium/vm/precompiled_contracts/alt_bn128.py +230 -0
- ethereum/forks/byzantium/vm/precompiled_contracts/ecrecover.py +64 -0
- ethereum/forks/byzantium/vm/precompiled_contracts/identity.py +39 -0
- ethereum/forks/byzantium/vm/precompiled_contracts/mapping.py +43 -0
- ethereum/forks/byzantium/vm/precompiled_contracts/modexp.py +168 -0
- ethereum/forks/byzantium/vm/precompiled_contracts/ripemd160.py +44 -0
- ethereum/forks/byzantium/vm/precompiled_contracts/sha256.py +41 -0
- ethereum/forks/byzantium/vm/runtime.py +69 -0
- ethereum/forks/byzantium/vm/stack.py +58 -0
- ethereum/forks/cancun/__init__.py +49 -0
- ethereum/forks/cancun/blocks.py +389 -0
- ethereum/forks/cancun/bloom.py +87 -0
- ethereum/forks/cancun/exceptions.py +109 -0
- ethereum/forks/cancun/fork.py +881 -0
- ethereum/forks/cancun/fork_types.py +63 -0
- ethereum/forks/cancun/state.py +667 -0
- ethereum/forks/cancun/transactions.py +721 -0
- ethereum/forks/cancun/trie.py +508 -0
- ethereum/forks/cancun/utils/__init__.py +3 -0
- ethereum/forks/cancun/utils/address.py +94 -0
- ethereum/forks/cancun/utils/hexadecimal.py +55 -0
- ethereum/forks/cancun/utils/message.py +90 -0
- ethereum/forks/cancun/vm/__init__.py +186 -0
- ethereum/forks/cancun/vm/exceptions.py +139 -0
- ethereum/forks/cancun/vm/gas.py +372 -0
- ethereum/forks/cancun/vm/instructions/__init__.py +365 -0
- ethereum/forks/cancun/vm/instructions/arithmetic.py +373 -0
- ethereum/forks/cancun/vm/instructions/bitwise.py +245 -0
- ethereum/forks/cancun/vm/instructions/block.py +261 -0
- ethereum/forks/cancun/vm/instructions/comparison.py +177 -0
- ethereum/forks/cancun/vm/instructions/control_flow.py +171 -0
- ethereum/forks/cancun/vm/instructions/environment.py +600 -0
- ethereum/forks/cancun/vm/instructions/keccak.py +63 -0
- ethereum/forks/cancun/vm/instructions/log.py +88 -0
- ethereum/forks/cancun/vm/instructions/memory.py +177 -0
- ethereum/forks/cancun/vm/instructions/stack.py +208 -0
- ethereum/forks/cancun/vm/instructions/storage.py +188 -0
- ethereum/forks/cancun/vm/instructions/system.py +708 -0
- ethereum/forks/cancun/vm/interpreter.py +302 -0
- ethereum/forks/cancun/vm/memory.py +84 -0
- ethereum/forks/cancun/vm/precompiled_contracts/__init__.py +39 -0
- ethereum/forks/cancun/vm/precompiled_contracts/alt_bn128.py +230 -0
- ethereum/forks/cancun/vm/precompiled_contracts/blake2f.py +42 -0
- ethereum/forks/cancun/vm/precompiled_contracts/ecrecover.py +64 -0
- ethereum/forks/cancun/vm/precompiled_contracts/identity.py +39 -0
- ethereum/forks/cancun/vm/precompiled_contracts/mapping.py +49 -0
- ethereum/forks/cancun/vm/precompiled_contracts/modexp.py +166 -0
- ethereum/forks/cancun/vm/precompiled_contracts/point_evaluation.py +72 -0
- ethereum/forks/cancun/vm/precompiled_contracts/ripemd160.py +44 -0
- ethereum/forks/cancun/vm/precompiled_contracts/sha256.py +41 -0
- ethereum/forks/cancun/vm/runtime.py +69 -0
- ethereum/forks/cancun/vm/stack.py +58 -0
- ethereum/forks/constantinople/__init__.py +51 -0
- ethereum/forks/constantinople/blocks.py +265 -0
- ethereum/forks/constantinople/bloom.py +87 -0
- ethereum/forks/constantinople/fork.py +816 -0
- ethereum/forks/constantinople/fork_types.py +62 -0
- ethereum/forks/constantinople/state.py +583 -0
- ethereum/forks/constantinople/transactions.py +261 -0
- ethereum/forks/constantinople/trie.py +498 -0
- ethereum/forks/constantinople/utils/__init__.py +3 -0
- ethereum/forks/constantinople/utils/address.py +93 -0
- ethereum/forks/constantinople/utils/hexadecimal.py +55 -0
- ethereum/forks/constantinople/utils/message.py +80 -0
- ethereum/forks/constantinople/vm/__init__.py +186 -0
- ethereum/forks/constantinople/vm/exceptions.py +123 -0
- ethereum/forks/constantinople/vm/gas.py +246 -0
- ethereum/forks/constantinople/vm/instructions/__init__.py +347 -0
- ethereum/forks/constantinople/vm/instructions/arithmetic.py +373 -0
- ethereum/forks/constantinople/vm/instructions/bitwise.py +245 -0
- ethereum/forks/constantinople/vm/instructions/block.py +189 -0
- ethereum/forks/constantinople/vm/instructions/comparison.py +177 -0
- ethereum/forks/constantinople/vm/instructions/control_flow.py +171 -0
- ethereum/forks/constantinople/vm/instructions/environment.py +470 -0
- ethereum/forks/constantinople/vm/instructions/keccak.py +63 -0
- ethereum/forks/constantinople/vm/instructions/log.py +88 -0
- ethereum/forks/constantinople/vm/instructions/memory.py +141 -0
- ethereum/forks/constantinople/vm/instructions/stack.py +204 -0
- ethereum/forks/constantinople/vm/instructions/storage.py +88 -0
- ethereum/forks/constantinople/vm/instructions/system.py +673 -0
- ethereum/forks/constantinople/vm/interpreter.py +300 -0
- ethereum/forks/constantinople/vm/memory.py +84 -0
- ethereum/forks/constantinople/vm/precompiled_contracts/__init__.py +36 -0
- ethereum/forks/constantinople/vm/precompiled_contracts/alt_bn128.py +230 -0
- ethereum/forks/constantinople/vm/precompiled_contracts/ecrecover.py +64 -0
- ethereum/forks/constantinople/vm/precompiled_contracts/identity.py +39 -0
- ethereum/forks/constantinople/vm/precompiled_contracts/mapping.py +43 -0
- ethereum/forks/constantinople/vm/precompiled_contracts/modexp.py +168 -0
- ethereum/forks/constantinople/vm/precompiled_contracts/ripemd160.py +44 -0
- ethereum/forks/constantinople/vm/precompiled_contracts/sha256.py +41 -0
- ethereum/forks/constantinople/vm/runtime.py +69 -0
- ethereum/forks/constantinople/vm/stack.py +58 -0
- ethereum/forks/dao_fork/__init__.py +29 -0
- ethereum/forks/dao_fork/blocks.py +265 -0
- ethereum/forks/dao_fork/bloom.py +87 -0
- ethereum/forks/dao_fork/dao.py +357 -0
- ethereum/forks/dao_fork/fork.py +816 -0
- ethereum/forks/dao_fork/fork_types.py +62 -0
- ethereum/forks/dao_fork/state.py +515 -0
- ethereum/forks/dao_fork/transactions.py +227 -0
- ethereum/forks/dao_fork/trie.py +498 -0
- ethereum/forks/dao_fork/utils/__init__.py +3 -0
- ethereum/forks/dao_fork/utils/address.py +62 -0
- ethereum/forks/dao_fork/utils/hexadecimal.py +55 -0
- ethereum/forks/dao_fork/utils/message.py +78 -0
- ethereum/forks/dao_fork/vm/__init__.py +163 -0
- ethereum/forks/dao_fork/vm/exceptions.py +86 -0
- ethereum/forks/dao_fork/vm/gas.py +212 -0
- ethereum/forks/dao_fork/vm/instructions/__init__.py +329 -0
- ethereum/forks/dao_fork/vm/instructions/arithmetic.py +373 -0
- ethereum/forks/dao_fork/vm/instructions/bitwise.py +153 -0
- ethereum/forks/dao_fork/vm/instructions/block.py +189 -0
- ethereum/forks/dao_fork/vm/instructions/comparison.py +177 -0
- ethereum/forks/dao_fork/vm/instructions/control_flow.py +171 -0
- ethereum/forks/dao_fork/vm/instructions/environment.py +376 -0
- ethereum/forks/dao_fork/vm/instructions/keccak.py +63 -0
- ethereum/forks/dao_fork/vm/instructions/log.py +85 -0
- ethereum/forks/dao_fork/vm/instructions/memory.py +141 -0
- ethereum/forks/dao_fork/vm/instructions/stack.py +204 -0
- ethereum/forks/dao_fork/vm/instructions/storage.py +87 -0
- ethereum/forks/dao_fork/vm/instructions/system.py +457 -0
- ethereum/forks/dao_fork/vm/interpreter.py +274 -0
- ethereum/forks/dao_fork/vm/memory.py +84 -0
- ethereum/forks/dao_fork/vm/precompiled_contracts/__init__.py +27 -0
- ethereum/forks/dao_fork/vm/precompiled_contracts/ecrecover.py +64 -0
- ethereum/forks/dao_fork/vm/precompiled_contracts/identity.py +39 -0
- ethereum/forks/dao_fork/vm/precompiled_contracts/mapping.py +33 -0
- ethereum/forks/dao_fork/vm/precompiled_contracts/ripemd160.py +44 -0
- ethereum/forks/dao_fork/vm/precompiled_contracts/sha256.py +41 -0
- ethereum/forks/dao_fork/vm/runtime.py +69 -0
- ethereum/forks/dao_fork/vm/stack.py +58 -0
- ethereum/forks/frontier/__init__.py +7 -0
- ethereum/forks/frontier/blocks.py +265 -0
- ethereum/forks/frontier/bloom.py +87 -0
- ethereum/forks/frontier/fork.py +789 -0
- ethereum/forks/frontier/fork_types.py +62 -0
- ethereum/forks/frontier/state.py +515 -0
- ethereum/forks/frontier/transactions.py +216 -0
- ethereum/forks/frontier/trie.py +499 -0
- ethereum/forks/frontier/utils/__init__.py +3 -0
- ethereum/forks/frontier/utils/address.py +62 -0
- ethereum/forks/frontier/utils/hexadecimal.py +55 -0
- ethereum/forks/frontier/utils/message.py +77 -0
- ethereum/forks/frontier/vm/__init__.py +162 -0
- ethereum/forks/frontier/vm/exceptions.py +86 -0
- ethereum/forks/frontier/vm/gas.py +212 -0
- ethereum/forks/frontier/vm/instructions/__init__.py +327 -0
- ethereum/forks/frontier/vm/instructions/arithmetic.py +373 -0
- ethereum/forks/frontier/vm/instructions/bitwise.py +153 -0
- ethereum/forks/frontier/vm/instructions/block.py +189 -0
- ethereum/forks/frontier/vm/instructions/comparison.py +177 -0
- ethereum/forks/frontier/vm/instructions/control_flow.py +171 -0
- ethereum/forks/frontier/vm/instructions/environment.py +376 -0
- ethereum/forks/frontier/vm/instructions/keccak.py +63 -0
- ethereum/forks/frontier/vm/instructions/log.py +85 -0
- ethereum/forks/frontier/vm/instructions/memory.py +141 -0
- ethereum/forks/frontier/vm/instructions/stack.py +204 -0
- ethereum/forks/frontier/vm/instructions/storage.py +87 -0
- ethereum/forks/frontier/vm/instructions/system.py +403 -0
- ethereum/forks/frontier/vm/interpreter.py +272 -0
- ethereum/forks/frontier/vm/memory.py +84 -0
- ethereum/forks/frontier/vm/precompiled_contracts/__init__.py +27 -0
- ethereum/forks/frontier/vm/precompiled_contracts/ecrecover.py +64 -0
- ethereum/forks/frontier/vm/precompiled_contracts/identity.py +39 -0
- ethereum/forks/frontier/vm/precompiled_contracts/mapping.py +33 -0
- ethereum/forks/frontier/vm/precompiled_contracts/ripemd160.py +44 -0
- ethereum/forks/frontier/vm/precompiled_contracts/sha256.py +41 -0
- ethereum/forks/frontier/vm/runtime.py +69 -0
- ethereum/forks/frontier/vm/stack.py +58 -0
- ethereum/forks/gray_glacier/__init__.py +34 -0
- ethereum/forks/gray_glacier/blocks.py +326 -0
- ethereum/forks/gray_glacier/bloom.py +87 -0
- ethereum/forks/gray_glacier/exceptions.py +58 -0
- ethereum/forks/gray_glacier/fork.py +954 -0
- ethereum/forks/gray_glacier/fork_types.py +62 -0
- ethereum/forks/gray_glacier/state.py +644 -0
- ethereum/forks/gray_glacier/transactions.py +573 -0
- ethereum/forks/gray_glacier/trie.py +498 -0
- ethereum/forks/gray_glacier/utils/__init__.py +3 -0
- ethereum/forks/gray_glacier/utils/address.py +94 -0
- ethereum/forks/gray_glacier/utils/hexadecimal.py +55 -0
- ethereum/forks/gray_glacier/utils/message.py +90 -0
- ethereum/forks/gray_glacier/vm/__init__.py +195 -0
- ethereum/forks/gray_glacier/vm/exceptions.py +131 -0
- ethereum/forks/gray_glacier/vm/gas.py +245 -0
- ethereum/forks/gray_glacier/vm/instructions/__init__.py +353 -0
- ethereum/forks/gray_glacier/vm/instructions/arithmetic.py +373 -0
- ethereum/forks/gray_glacier/vm/instructions/bitwise.py +245 -0
- ethereum/forks/gray_glacier/vm/instructions/block.py +212 -0
- ethereum/forks/gray_glacier/vm/instructions/comparison.py +177 -0
- ethereum/forks/gray_glacier/vm/instructions/control_flow.py +171 -0
- ethereum/forks/gray_glacier/vm/instructions/environment.py +544 -0
- ethereum/forks/gray_glacier/vm/instructions/keccak.py +63 -0
- ethereum/forks/gray_glacier/vm/instructions/log.py +88 -0
- ethereum/forks/gray_glacier/vm/instructions/memory.py +141 -0
- ethereum/forks/gray_glacier/vm/instructions/stack.py +204 -0
- ethereum/forks/gray_glacier/vm/instructions/storage.py +126 -0
- ethereum/forks/gray_glacier/vm/instructions/system.py +694 -0
- ethereum/forks/gray_glacier/vm/interpreter.py +312 -0
- ethereum/forks/gray_glacier/vm/memory.py +84 -0
- ethereum/forks/gray_glacier/vm/precompiled_contracts/__init__.py +37 -0
- ethereum/forks/gray_glacier/vm/precompiled_contracts/alt_bn128.py +230 -0
- ethereum/forks/gray_glacier/vm/precompiled_contracts/blake2f.py +42 -0
- ethereum/forks/gray_glacier/vm/precompiled_contracts/ecrecover.py +64 -0
- ethereum/forks/gray_glacier/vm/precompiled_contracts/identity.py +39 -0
- ethereum/forks/gray_glacier/vm/precompiled_contracts/mapping.py +46 -0
- ethereum/forks/gray_glacier/vm/precompiled_contracts/modexp.py +166 -0
- ethereum/forks/gray_glacier/vm/precompiled_contracts/ripemd160.py +44 -0
- ethereum/forks/gray_glacier/vm/precompiled_contracts/sha256.py +41 -0
- ethereum/forks/gray_glacier/vm/runtime.py +69 -0
- ethereum/forks/gray_glacier/vm/stack.py +58 -0
- ethereum/forks/homestead/__init__.py +34 -0
- ethereum/forks/homestead/blocks.py +265 -0
- ethereum/forks/homestead/bloom.py +87 -0
- ethereum/forks/homestead/fork.py +798 -0
- ethereum/forks/homestead/fork_types.py +62 -0
- ethereum/forks/homestead/state.py +515 -0
- ethereum/forks/homestead/transactions.py +227 -0
- ethereum/forks/homestead/trie.py +498 -0
- ethereum/forks/homestead/utils/__init__.py +3 -0
- ethereum/forks/homestead/utils/address.py +62 -0
- ethereum/forks/homestead/utils/hexadecimal.py +55 -0
- ethereum/forks/homestead/utils/message.py +78 -0
- ethereum/forks/homestead/vm/__init__.py +163 -0
- ethereum/forks/homestead/vm/exceptions.py +86 -0
- ethereum/forks/homestead/vm/gas.py +212 -0
- ethereum/forks/homestead/vm/instructions/__init__.py +329 -0
- ethereum/forks/homestead/vm/instructions/arithmetic.py +373 -0
- ethereum/forks/homestead/vm/instructions/bitwise.py +153 -0
- ethereum/forks/homestead/vm/instructions/block.py +189 -0
- ethereum/forks/homestead/vm/instructions/comparison.py +177 -0
- ethereum/forks/homestead/vm/instructions/control_flow.py +171 -0
- ethereum/forks/homestead/vm/instructions/environment.py +376 -0
- ethereum/forks/homestead/vm/instructions/keccak.py +63 -0
- ethereum/forks/homestead/vm/instructions/log.py +85 -0
- ethereum/forks/homestead/vm/instructions/memory.py +141 -0
- ethereum/forks/homestead/vm/instructions/stack.py +204 -0
- ethereum/forks/homestead/vm/instructions/storage.py +87 -0
- ethereum/forks/homestead/vm/instructions/system.py +457 -0
- ethereum/forks/homestead/vm/interpreter.py +274 -0
- ethereum/forks/homestead/vm/memory.py +84 -0
- ethereum/forks/homestead/vm/precompiled_contracts/__init__.py +27 -0
- ethereum/forks/homestead/vm/precompiled_contracts/ecrecover.py +64 -0
- ethereum/forks/homestead/vm/precompiled_contracts/identity.py +39 -0
- ethereum/forks/homestead/vm/precompiled_contracts/mapping.py +33 -0
- ethereum/forks/homestead/vm/precompiled_contracts/ripemd160.py +44 -0
- ethereum/forks/homestead/vm/precompiled_contracts/sha256.py +41 -0
- ethereum/forks/homestead/vm/runtime.py +69 -0
- ethereum/forks/homestead/vm/stack.py +58 -0
- ethereum/forks/istanbul/__init__.py +53 -0
- ethereum/forks/istanbul/blocks.py +265 -0
- ethereum/forks/istanbul/bloom.py +87 -0
- ethereum/forks/istanbul/fork.py +816 -0
- ethereum/forks/istanbul/fork_types.py +62 -0
- ethereum/forks/istanbul/state.py +644 -0
- ethereum/forks/istanbul/transactions.py +261 -0
- ethereum/forks/istanbul/trie.py +498 -0
- ethereum/forks/istanbul/utils/__init__.py +3 -0
- ethereum/forks/istanbul/utils/address.py +94 -0
- ethereum/forks/istanbul/utils/hexadecimal.py +55 -0
- ethereum/forks/istanbul/utils/message.py +80 -0
- ethereum/forks/istanbul/vm/__init__.py +186 -0
- ethereum/forks/istanbul/vm/exceptions.py +123 -0
- ethereum/forks/istanbul/vm/gas.py +248 -0
- ethereum/forks/istanbul/vm/instructions/__init__.py +351 -0
- ethereum/forks/istanbul/vm/instructions/arithmetic.py +373 -0
- ethereum/forks/istanbul/vm/instructions/bitwise.py +245 -0
- ethereum/forks/istanbul/vm/instructions/block.py +212 -0
- ethereum/forks/istanbul/vm/instructions/comparison.py +177 -0
- ethereum/forks/istanbul/vm/instructions/control_flow.py +171 -0
- ethereum/forks/istanbul/vm/instructions/environment.py +499 -0
- ethereum/forks/istanbul/vm/instructions/keccak.py +63 -0
- ethereum/forks/istanbul/vm/instructions/log.py +88 -0
- ethereum/forks/istanbul/vm/instructions/memory.py +141 -0
- ethereum/forks/istanbul/vm/instructions/stack.py +204 -0
- ethereum/forks/istanbul/vm/instructions/storage.py +113 -0
- ethereum/forks/istanbul/vm/instructions/system.py +673 -0
- ethereum/forks/istanbul/vm/interpreter.py +306 -0
- ethereum/forks/istanbul/vm/memory.py +84 -0
- ethereum/forks/istanbul/vm/precompiled_contracts/__init__.py +37 -0
- ethereum/forks/istanbul/vm/precompiled_contracts/alt_bn128.py +230 -0
- ethereum/forks/istanbul/vm/precompiled_contracts/blake2f.py +42 -0
- ethereum/forks/istanbul/vm/precompiled_contracts/ecrecover.py +64 -0
- ethereum/forks/istanbul/vm/precompiled_contracts/identity.py +39 -0
- ethereum/forks/istanbul/vm/precompiled_contracts/mapping.py +46 -0
- ethereum/forks/istanbul/vm/precompiled_contracts/modexp.py +168 -0
- ethereum/forks/istanbul/vm/precompiled_contracts/ripemd160.py +44 -0
- ethereum/forks/istanbul/vm/precompiled_contracts/sha256.py +41 -0
- ethereum/forks/istanbul/vm/runtime.py +69 -0
- ethereum/forks/istanbul/vm/stack.py +58 -0
- ethereum/forks/london/__init__.py +48 -0
- ethereum/forks/london/blocks.py +326 -0
- ethereum/forks/london/bloom.py +87 -0
- ethereum/forks/london/exceptions.py +58 -0
- ethereum/forks/london/fork.py +960 -0
- ethereum/forks/london/fork_types.py +62 -0
- ethereum/forks/london/state.py +644 -0
- ethereum/forks/london/transactions.py +573 -0
- ethereum/forks/london/trie.py +498 -0
- ethereum/forks/london/utils/__init__.py +3 -0
- ethereum/forks/london/utils/address.py +94 -0
- ethereum/forks/london/utils/hexadecimal.py +55 -0
- ethereum/forks/london/utils/message.py +90 -0
- ethereum/forks/london/vm/__init__.py +195 -0
- ethereum/forks/london/vm/exceptions.py +131 -0
- ethereum/forks/london/vm/gas.py +245 -0
- ethereum/forks/london/vm/instructions/__init__.py +353 -0
- ethereum/forks/london/vm/instructions/arithmetic.py +373 -0
- ethereum/forks/london/vm/instructions/bitwise.py +245 -0
- ethereum/forks/london/vm/instructions/block.py +212 -0
- ethereum/forks/london/vm/instructions/comparison.py +177 -0
- ethereum/forks/london/vm/instructions/control_flow.py +171 -0
- ethereum/forks/london/vm/instructions/environment.py +544 -0
- ethereum/forks/london/vm/instructions/keccak.py +63 -0
- ethereum/forks/london/vm/instructions/log.py +88 -0
- ethereum/forks/london/vm/instructions/memory.py +141 -0
- ethereum/forks/london/vm/instructions/stack.py +204 -0
- ethereum/forks/london/vm/instructions/storage.py +126 -0
- ethereum/forks/london/vm/instructions/system.py +694 -0
- ethereum/forks/london/vm/interpreter.py +312 -0
- ethereum/forks/london/vm/memory.py +84 -0
- ethereum/forks/london/vm/precompiled_contracts/__init__.py +37 -0
- ethereum/forks/london/vm/precompiled_contracts/alt_bn128.py +230 -0
- ethereum/forks/london/vm/precompiled_contracts/blake2f.py +42 -0
- ethereum/forks/london/vm/precompiled_contracts/ecrecover.py +64 -0
- ethereum/forks/london/vm/precompiled_contracts/identity.py +39 -0
- ethereum/forks/london/vm/precompiled_contracts/mapping.py +46 -0
- ethereum/forks/london/vm/precompiled_contracts/modexp.py +166 -0
- ethereum/forks/london/vm/precompiled_contracts/ripemd160.py +44 -0
- ethereum/forks/london/vm/precompiled_contracts/sha256.py +41 -0
- ethereum/forks/london/vm/runtime.py +69 -0
- ethereum/forks/london/vm/stack.py +58 -0
- ethereum/forks/muir_glacier/__init__.py +38 -0
- ethereum/forks/muir_glacier/blocks.py +265 -0
- ethereum/forks/muir_glacier/bloom.py +87 -0
- ethereum/forks/muir_glacier/fork.py +818 -0
- ethereum/forks/muir_glacier/fork_types.py +62 -0
- ethereum/forks/muir_glacier/state.py +644 -0
- ethereum/forks/muir_glacier/transactions.py +261 -0
- ethereum/forks/muir_glacier/trie.py +498 -0
- ethereum/forks/muir_glacier/utils/__init__.py +3 -0
- ethereum/forks/muir_glacier/utils/address.py +94 -0
- ethereum/forks/muir_glacier/utils/hexadecimal.py +55 -0
- ethereum/forks/muir_glacier/utils/message.py +80 -0
- ethereum/forks/muir_glacier/vm/__init__.py +186 -0
- ethereum/forks/muir_glacier/vm/exceptions.py +123 -0
- ethereum/forks/muir_glacier/vm/gas.py +248 -0
- ethereum/forks/muir_glacier/vm/instructions/__init__.py +351 -0
- ethereum/forks/muir_glacier/vm/instructions/arithmetic.py +373 -0
- ethereum/forks/muir_glacier/vm/instructions/bitwise.py +245 -0
- ethereum/forks/muir_glacier/vm/instructions/block.py +212 -0
- ethereum/forks/muir_glacier/vm/instructions/comparison.py +177 -0
- ethereum/forks/muir_glacier/vm/instructions/control_flow.py +171 -0
- ethereum/forks/muir_glacier/vm/instructions/environment.py +499 -0
- ethereum/forks/muir_glacier/vm/instructions/keccak.py +63 -0
- ethereum/forks/muir_glacier/vm/instructions/log.py +88 -0
- ethereum/forks/muir_glacier/vm/instructions/memory.py +141 -0
- ethereum/forks/muir_glacier/vm/instructions/stack.py +204 -0
- ethereum/forks/muir_glacier/vm/instructions/storage.py +113 -0
- ethereum/forks/muir_glacier/vm/instructions/system.py +673 -0
- ethereum/forks/muir_glacier/vm/interpreter.py +306 -0
- ethereum/forks/muir_glacier/vm/memory.py +84 -0
- ethereum/forks/muir_glacier/vm/precompiled_contracts/__init__.py +37 -0
- ethereum/forks/muir_glacier/vm/precompiled_contracts/alt_bn128.py +230 -0
- ethereum/forks/muir_glacier/vm/precompiled_contracts/blake2f.py +42 -0
- ethereum/forks/muir_glacier/vm/precompiled_contracts/ecrecover.py +64 -0
- ethereum/forks/muir_glacier/vm/precompiled_contracts/identity.py +39 -0
- ethereum/forks/muir_glacier/vm/precompiled_contracts/mapping.py +46 -0
- ethereum/forks/muir_glacier/vm/precompiled_contracts/modexp.py +168 -0
- ethereum/forks/muir_glacier/vm/precompiled_contracts/ripemd160.py +44 -0
- ethereum/forks/muir_glacier/vm/precompiled_contracts/sha256.py +41 -0
- ethereum/forks/muir_glacier/vm/runtime.py +69 -0
- ethereum/forks/muir_glacier/vm/stack.py +58 -0
- ethereum/forks/osaka/__init__.py +55 -0
- ethereum/forks/osaka/blocks.py +405 -0
- ethereum/forks/osaka/bloom.py +87 -0
- ethereum/forks/osaka/exceptions.py +131 -0
- ethereum/forks/osaka/fork.py +1059 -0
- ethereum/forks/osaka/fork_types.py +78 -0
- ethereum/forks/osaka/requests.py +191 -0
- ethereum/forks/osaka/state.py +667 -0
- ethereum/forks/osaka/transactions.py +887 -0
- ethereum/forks/osaka/trie.py +508 -0
- ethereum/forks/osaka/utils/__init__.py +3 -0
- ethereum/forks/osaka/utils/address.py +94 -0
- ethereum/forks/osaka/utils/hexadecimal.py +55 -0
- ethereum/forks/osaka/utils/message.py +90 -0
- ethereum/forks/osaka/vm/__init__.py +191 -0
- ethereum/forks/osaka/vm/eoa_delegation.py +211 -0
- ethereum/forks/osaka/vm/exceptions.py +139 -0
- ethereum/forks/osaka/vm/gas.py +396 -0
- ethereum/forks/osaka/vm/instructions/__init__.py +367 -0
- ethereum/forks/osaka/vm/instructions/arithmetic.py +373 -0
- ethereum/forks/osaka/vm/instructions/bitwise.py +274 -0
- ethereum/forks/osaka/vm/instructions/block.py +261 -0
- ethereum/forks/osaka/vm/instructions/comparison.py +177 -0
- ethereum/forks/osaka/vm/instructions/control_flow.py +171 -0
- ethereum/forks/osaka/vm/instructions/environment.py +600 -0
- ethereum/forks/osaka/vm/instructions/keccak.py +63 -0
- ethereum/forks/osaka/vm/instructions/log.py +88 -0
- ethereum/forks/osaka/vm/instructions/memory.py +177 -0
- ethereum/forks/osaka/vm/instructions/stack.py +208 -0
- ethereum/forks/osaka/vm/instructions/storage.py +188 -0
- ethereum/forks/osaka/vm/instructions/system.py +751 -0
- ethereum/forks/osaka/vm/interpreter.py +324 -0
- ethereum/forks/osaka/vm/memory.py +83 -0
- ethereum/forks/osaka/vm/precompiled_contracts/__init__.py +55 -0
- ethereum/forks/osaka/vm/precompiled_contracts/alt_bn128.py +230 -0
- ethereum/forks/osaka/vm/precompiled_contracts/blake2f.py +42 -0
- ethereum/forks/osaka/vm/precompiled_contracts/bls12_381/__init__.py +622 -0
- ethereum/forks/osaka/vm/precompiled_contracts/bls12_381/bls12_381_g1.py +151 -0
- ethereum/forks/osaka/vm/precompiled_contracts/bls12_381/bls12_381_g2.py +153 -0
- ethereum/forks/osaka/vm/precompiled_contracts/bls12_381/bls12_381_pairing.py +69 -0
- ethereum/forks/osaka/vm/precompiled_contracts/ecrecover.py +64 -0
- ethereum/forks/osaka/vm/precompiled_contracts/identity.py +39 -0
- ethereum/forks/osaka/vm/precompiled_contracts/mapping.py +77 -0
- ethereum/forks/osaka/vm/precompiled_contracts/modexp.py +175 -0
- ethereum/forks/osaka/vm/precompiled_contracts/p256verify.py +89 -0
- ethereum/forks/osaka/vm/precompiled_contracts/point_evaluation.py +72 -0
- ethereum/forks/osaka/vm/precompiled_contracts/ripemd160.py +44 -0
- ethereum/forks/osaka/vm/precompiled_contracts/sha256.py +41 -0
- ethereum/forks/osaka/vm/runtime.py +69 -0
- ethereum/forks/osaka/vm/stack.py +58 -0
- ethereum/forks/paris/__init__.py +43 -0
- ethereum/forks/paris/blocks.py +312 -0
- ethereum/forks/paris/bloom.py +87 -0
- ethereum/forks/paris/exceptions.py +58 -0
- ethereum/forks/paris/fork.py +651 -0
- ethereum/forks/paris/fork_types.py +62 -0
- ethereum/forks/paris/state.py +571 -0
- ethereum/forks/paris/transactions.py +573 -0
- ethereum/forks/paris/trie.py +498 -0
- ethereum/forks/paris/utils/__init__.py +3 -0
- ethereum/forks/paris/utils/address.py +94 -0
- ethereum/forks/paris/utils/hexadecimal.py +55 -0
- ethereum/forks/paris/utils/message.py +90 -0
- ethereum/forks/paris/vm/__init__.py +174 -0
- ethereum/forks/paris/vm/exceptions.py +131 -0
- ethereum/forks/paris/vm/gas.py +245 -0
- ethereum/forks/paris/vm/instructions/__init__.py +353 -0
- ethereum/forks/paris/vm/instructions/arithmetic.py +373 -0
- ethereum/forks/paris/vm/instructions/bitwise.py +245 -0
- ethereum/forks/paris/vm/instructions/block.py +261 -0
- ethereum/forks/paris/vm/instructions/comparison.py +177 -0
- ethereum/forks/paris/vm/instructions/control_flow.py +171 -0
- ethereum/forks/paris/vm/instructions/environment.py +544 -0
- ethereum/forks/paris/vm/instructions/keccak.py +63 -0
- ethereum/forks/paris/vm/instructions/log.py +88 -0
- ethereum/forks/paris/vm/instructions/memory.py +141 -0
- ethereum/forks/paris/vm/instructions/stack.py +204 -0
- ethereum/forks/paris/vm/instructions/storage.py +126 -0
- ethereum/forks/paris/vm/instructions/system.py +689 -0
- ethereum/forks/paris/vm/interpreter.py +298 -0
- ethereum/forks/paris/vm/memory.py +84 -0
- ethereum/forks/paris/vm/precompiled_contracts/__init__.py +37 -0
- ethereum/forks/paris/vm/precompiled_contracts/alt_bn128.py +230 -0
- ethereum/forks/paris/vm/precompiled_contracts/blake2f.py +42 -0
- ethereum/forks/paris/vm/precompiled_contracts/ecrecover.py +64 -0
- ethereum/forks/paris/vm/precompiled_contracts/identity.py +39 -0
- ethereum/forks/paris/vm/precompiled_contracts/mapping.py +46 -0
- ethereum/forks/paris/vm/precompiled_contracts/modexp.py +166 -0
- ethereum/forks/paris/vm/precompiled_contracts/ripemd160.py +44 -0
- ethereum/forks/paris/vm/precompiled_contracts/sha256.py +41 -0
- ethereum/forks/paris/vm/runtime.py +69 -0
- ethereum/forks/paris/vm/stack.py +58 -0
- ethereum/forks/prague/__init__.py +54 -0
- ethereum/forks/prague/blocks.py +405 -0
- ethereum/forks/prague/bloom.py +87 -0
- ethereum/forks/prague/exceptions.py +115 -0
- ethereum/forks/prague/fork.py +1044 -0
- ethereum/forks/prague/fork_types.py +78 -0
- ethereum/forks/prague/requests.py +191 -0
- ethereum/forks/prague/state.py +667 -0
- ethereum/forks/prague/transactions.py +879 -0
- ethereum/forks/prague/trie.py +508 -0
- ethereum/forks/prague/utils/__init__.py +3 -0
- ethereum/forks/prague/utils/address.py +94 -0
- ethereum/forks/prague/utils/hexadecimal.py +55 -0
- ethereum/forks/prague/utils/message.py +90 -0
- ethereum/forks/prague/vm/__init__.py +191 -0
- ethereum/forks/prague/vm/eoa_delegation.py +211 -0
- ethereum/forks/prague/vm/exceptions.py +139 -0
- ethereum/forks/prague/vm/gas.py +379 -0
- ethereum/forks/prague/vm/instructions/__init__.py +365 -0
- ethereum/forks/prague/vm/instructions/arithmetic.py +373 -0
- ethereum/forks/prague/vm/instructions/bitwise.py +245 -0
- ethereum/forks/prague/vm/instructions/block.py +261 -0
- ethereum/forks/prague/vm/instructions/comparison.py +177 -0
- ethereum/forks/prague/vm/instructions/control_flow.py +171 -0
- ethereum/forks/prague/vm/instructions/environment.py +600 -0
- ethereum/forks/prague/vm/instructions/keccak.py +63 -0
- ethereum/forks/prague/vm/instructions/log.py +88 -0
- ethereum/forks/prague/vm/instructions/memory.py +177 -0
- ethereum/forks/prague/vm/instructions/stack.py +208 -0
- ethereum/forks/prague/vm/instructions/storage.py +188 -0
- ethereum/forks/prague/vm/instructions/system.py +751 -0
- ethereum/forks/prague/vm/interpreter.py +324 -0
- ethereum/forks/prague/vm/memory.py +83 -0
- ethereum/forks/prague/vm/precompiled_contracts/__init__.py +53 -0
- ethereum/forks/prague/vm/precompiled_contracts/alt_bn128.py +230 -0
- ethereum/forks/prague/vm/precompiled_contracts/blake2f.py +42 -0
- ethereum/forks/prague/vm/precompiled_contracts/bls12_381/__init__.py +622 -0
- ethereum/forks/prague/vm/precompiled_contracts/bls12_381/bls12_381_g1.py +151 -0
- ethereum/forks/prague/vm/precompiled_contracts/bls12_381/bls12_381_g2.py +153 -0
- ethereum/forks/prague/vm/precompiled_contracts/bls12_381/bls12_381_pairing.py +69 -0
- ethereum/forks/prague/vm/precompiled_contracts/ecrecover.py +64 -0
- ethereum/forks/prague/vm/precompiled_contracts/identity.py +39 -0
- ethereum/forks/prague/vm/precompiled_contracts/mapping.py +74 -0
- ethereum/forks/prague/vm/precompiled_contracts/modexp.py +166 -0
- ethereum/forks/prague/vm/precompiled_contracts/point_evaluation.py +72 -0
- ethereum/forks/prague/vm/precompiled_contracts/ripemd160.py +44 -0
- ethereum/forks/prague/vm/precompiled_contracts/sha256.py +41 -0
- ethereum/forks/prague/vm/runtime.py +69 -0
- ethereum/forks/prague/vm/stack.py +58 -0
- ethereum/forks/shanghai/__init__.py +47 -0
- ethereum/forks/shanghai/blocks.py +360 -0
- ethereum/forks/shanghai/bloom.py +87 -0
- ethereum/forks/shanghai/exceptions.py +64 -0
- ethereum/forks/shanghai/fork.py +686 -0
- ethereum/forks/shanghai/fork_types.py +62 -0
- ethereum/forks/shanghai/state.py +571 -0
- ethereum/forks/shanghai/transactions.py +585 -0
- ethereum/forks/shanghai/trie.py +508 -0
- ethereum/forks/shanghai/utils/__init__.py +3 -0
- ethereum/forks/shanghai/utils/address.py +94 -0
- ethereum/forks/shanghai/utils/hexadecimal.py +55 -0
- ethereum/forks/shanghai/utils/message.py +90 -0
- ethereum/forks/shanghai/vm/__init__.py +179 -0
- ethereum/forks/shanghai/vm/exceptions.py +131 -0
- ethereum/forks/shanghai/vm/gas.py +266 -0
- ethereum/forks/shanghai/vm/instructions/__init__.py +355 -0
- ethereum/forks/shanghai/vm/instructions/arithmetic.py +373 -0
- ethereum/forks/shanghai/vm/instructions/bitwise.py +245 -0
- ethereum/forks/shanghai/vm/instructions/block.py +261 -0
- ethereum/forks/shanghai/vm/instructions/comparison.py +177 -0
- ethereum/forks/shanghai/vm/instructions/control_flow.py +171 -0
- ethereum/forks/shanghai/vm/instructions/environment.py +544 -0
- ethereum/forks/shanghai/vm/instructions/keccak.py +63 -0
- ethereum/forks/shanghai/vm/instructions/log.py +88 -0
- ethereum/forks/shanghai/vm/instructions/memory.py +141 -0
- ethereum/forks/shanghai/vm/instructions/stack.py +208 -0
- ethereum/forks/shanghai/vm/instructions/storage.py +126 -0
- ethereum/forks/shanghai/vm/instructions/system.py +709 -0
- ethereum/forks/shanghai/vm/interpreter.py +299 -0
- ethereum/forks/shanghai/vm/memory.py +84 -0
- ethereum/forks/shanghai/vm/precompiled_contracts/__init__.py +37 -0
- ethereum/forks/shanghai/vm/precompiled_contracts/alt_bn128.py +230 -0
- ethereum/forks/shanghai/vm/precompiled_contracts/blake2f.py +42 -0
- ethereum/forks/shanghai/vm/precompiled_contracts/ecrecover.py +64 -0
- ethereum/forks/shanghai/vm/precompiled_contracts/identity.py +39 -0
- ethereum/forks/shanghai/vm/precompiled_contracts/mapping.py +46 -0
- ethereum/forks/shanghai/vm/precompiled_contracts/modexp.py +166 -0
- ethereum/forks/shanghai/vm/precompiled_contracts/ripemd160.py +44 -0
- ethereum/forks/shanghai/vm/precompiled_contracts/sha256.py +41 -0
- ethereum/forks/shanghai/vm/runtime.py +69 -0
- ethereum/forks/shanghai/vm/stack.py +58 -0
- ethereum/forks/spurious_dragon/__init__.py +38 -0
- ethereum/forks/spurious_dragon/blocks.py +265 -0
- ethereum/forks/spurious_dragon/bloom.py +87 -0
- ethereum/forks/spurious_dragon/fork.py +807 -0
- ethereum/forks/spurious_dragon/fork_types.py +62 -0
- ethereum/forks/spurious_dragon/state.py +583 -0
- ethereum/forks/spurious_dragon/transactions.py +261 -0
- ethereum/forks/spurious_dragon/trie.py +498 -0
- ethereum/forks/spurious_dragon/utils/__init__.py +3 -0
- ethereum/forks/spurious_dragon/utils/address.py +63 -0
- ethereum/forks/spurious_dragon/utils/hexadecimal.py +55 -0
- ethereum/forks/spurious_dragon/utils/message.py +79 -0
- ethereum/forks/spurious_dragon/vm/__init__.py +184 -0
- ethereum/forks/spurious_dragon/vm/exceptions.py +86 -0
- ethereum/forks/spurious_dragon/vm/gas.py +244 -0
- ethereum/forks/spurious_dragon/vm/instructions/__init__.py +329 -0
- ethereum/forks/spurious_dragon/vm/instructions/arithmetic.py +373 -0
- ethereum/forks/spurious_dragon/vm/instructions/bitwise.py +153 -0
- ethereum/forks/spurious_dragon/vm/instructions/block.py +189 -0
- ethereum/forks/spurious_dragon/vm/instructions/comparison.py +177 -0
- ethereum/forks/spurious_dragon/vm/instructions/control_flow.py +171 -0
- ethereum/forks/spurious_dragon/vm/instructions/environment.py +376 -0
- ethereum/forks/spurious_dragon/vm/instructions/keccak.py +63 -0
- ethereum/forks/spurious_dragon/vm/instructions/log.py +85 -0
- ethereum/forks/spurious_dragon/vm/instructions/memory.py +141 -0
- ethereum/forks/spurious_dragon/vm/instructions/stack.py +204 -0
- ethereum/forks/spurious_dragon/vm/instructions/storage.py +87 -0
- ethereum/forks/spurious_dragon/vm/instructions/system.py +491 -0
- ethereum/forks/spurious_dragon/vm/interpreter.py +292 -0
- ethereum/forks/spurious_dragon/vm/memory.py +84 -0
- ethereum/forks/spurious_dragon/vm/precompiled_contracts/__init__.py +27 -0
- ethereum/forks/spurious_dragon/vm/precompiled_contracts/ecrecover.py +64 -0
- ethereum/forks/spurious_dragon/vm/precompiled_contracts/identity.py +39 -0
- ethereum/forks/spurious_dragon/vm/precompiled_contracts/mapping.py +33 -0
- ethereum/forks/spurious_dragon/vm/precompiled_contracts/ripemd160.py +44 -0
- ethereum/forks/spurious_dragon/vm/precompiled_contracts/sha256.py +41 -0
- ethereum/forks/spurious_dragon/vm/runtime.py +69 -0
- ethereum/forks/spurious_dragon/vm/stack.py +58 -0
- ethereum/forks/tangerine_whistle/__init__.py +32 -0
- ethereum/forks/tangerine_whistle/blocks.py +265 -0
- ethereum/forks/tangerine_whistle/bloom.py +87 -0
- ethereum/forks/tangerine_whistle/fork.py +798 -0
- ethereum/forks/tangerine_whistle/fork_types.py +62 -0
- ethereum/forks/tangerine_whistle/state.py +515 -0
- ethereum/forks/tangerine_whistle/transactions.py +227 -0
- ethereum/forks/tangerine_whistle/trie.py +498 -0
- ethereum/forks/tangerine_whistle/utils/__init__.py +3 -0
- ethereum/forks/tangerine_whistle/utils/address.py +63 -0
- ethereum/forks/tangerine_whistle/utils/hexadecimal.py +55 -0
- ethereum/forks/tangerine_whistle/utils/message.py +79 -0
- ethereum/forks/tangerine_whistle/vm/__init__.py +163 -0
- ethereum/forks/tangerine_whistle/vm/exceptions.py +86 -0
- ethereum/forks/tangerine_whistle/vm/gas.py +244 -0
- ethereum/forks/tangerine_whistle/vm/instructions/__init__.py +329 -0
- ethereum/forks/tangerine_whistle/vm/instructions/arithmetic.py +373 -0
- ethereum/forks/tangerine_whistle/vm/instructions/bitwise.py +153 -0
- ethereum/forks/tangerine_whistle/vm/instructions/block.py +189 -0
- ethereum/forks/tangerine_whistle/vm/instructions/comparison.py +177 -0
- ethereum/forks/tangerine_whistle/vm/instructions/control_flow.py +171 -0
- ethereum/forks/tangerine_whistle/vm/instructions/environment.py +376 -0
- ethereum/forks/tangerine_whistle/vm/instructions/keccak.py +63 -0
- ethereum/forks/tangerine_whistle/vm/instructions/log.py +85 -0
- ethereum/forks/tangerine_whistle/vm/instructions/memory.py +141 -0
- ethereum/forks/tangerine_whistle/vm/instructions/stack.py +204 -0
- ethereum/forks/tangerine_whistle/vm/instructions/storage.py +87 -0
- ethereum/forks/tangerine_whistle/vm/instructions/system.py +480 -0
- ethereum/forks/tangerine_whistle/vm/interpreter.py +274 -0
- ethereum/forks/tangerine_whistle/vm/memory.py +84 -0
- ethereum/forks/tangerine_whistle/vm/precompiled_contracts/__init__.py +27 -0
- ethereum/forks/tangerine_whistle/vm/precompiled_contracts/ecrecover.py +64 -0
- ethereum/forks/tangerine_whistle/vm/precompiled_contracts/identity.py +39 -0
- ethereum/forks/tangerine_whistle/vm/precompiled_contracts/mapping.py +33 -0
- ethereum/forks/tangerine_whistle/vm/precompiled_contracts/ripemd160.py +44 -0
- ethereum/forks/tangerine_whistle/vm/precompiled_contracts/sha256.py +41 -0
- ethereum/forks/tangerine_whistle/vm/runtime.py +69 -0
- ethereum/forks/tangerine_whistle/vm/stack.py +58 -0
- ethereum/genesis.py +279 -0
- ethereum/py.typed +0 -0
- ethereum/trace.py +252 -0
- ethereum/utils/__init__.py +18 -0
- ethereum/utils/byte.py +59 -0
- ethereum/utils/hexadecimal.py +221 -0
- ethereum/utils/numeric.py +208 -0
- ethereum_execution-2.18.0rc6.dev2.dist-info/METADATA +113 -0
- ethereum_execution-2.18.0rc6.dev2.dist-info/RECORD +816 -0
- ethereum_execution-2.18.0rc6.dev2.dist-info/WHEEL +5 -0
- ethereum_execution-2.18.0rc6.dev2.dist-info/entry_points.txt +17 -0
- ethereum_execution-2.18.0rc6.dev2.dist-info/licenses/LICENSE.md +35 -0
- ethereum_execution-2.18.0rc6.dev2.dist-info/top_level.txt +3 -0
- ethereum_optimized/__init__.py +78 -0
- ethereum_optimized/fork.py +72 -0
- ethereum_optimized/state_db.py +444 -0
- ethereum_optimized/utils.py +26 -0
- ethereum_spec_tools/__init__.py +6 -0
- ethereum_spec_tools/docc.py +1135 -0
- ethereum_spec_tools/evm_tools/__init__.py +119 -0
- ethereum_spec_tools/evm_tools/__main__.py +7 -0
- ethereum_spec_tools/evm_tools/b11r/__init__.py +143 -0
- ethereum_spec_tools/evm_tools/b11r/b11r_types.py +173 -0
- ethereum_spec_tools/evm_tools/daemon.py +202 -0
- ethereum_spec_tools/evm_tools/loaders/__init__.py +3 -0
- ethereum_spec_tools/evm_tools/loaders/fixture_loader.py +190 -0
- ethereum_spec_tools/evm_tools/loaders/fork_loader.py +320 -0
- ethereum_spec_tools/evm_tools/loaders/transaction_loader.py +208 -0
- ethereum_spec_tools/evm_tools/statetest/__init__.py +291 -0
- ethereum_spec_tools/evm_tools/t8n/__init__.py +402 -0
- ethereum_spec_tools/evm_tools/t8n/env.py +320 -0
- ethereum_spec_tools/evm_tools/t8n/evm_trace/__init__.py +5 -0
- ethereum_spec_tools/evm_tools/t8n/evm_trace/count.py +47 -0
- ethereum_spec_tools/evm_tools/t8n/evm_trace/eip3155.py +333 -0
- ethereum_spec_tools/evm_tools/t8n/evm_trace/group.py +39 -0
- ethereum_spec_tools/evm_tools/t8n/evm_trace/protocols.py +54 -0
- ethereum_spec_tools/evm_tools/t8n/t8n_types.py +393 -0
- ethereum_spec_tools/evm_tools/utils.py +187 -0
- ethereum_spec_tools/forks.py +302 -0
- ethereum_spec_tools/lint/__init__.py +195 -0
- ethereum_spec_tools/lint/__main__.py +11 -0
- ethereum_spec_tools/lint/lints/glacier_forks_hygiene.py +273 -0
- ethereum_spec_tools/lint/lints/import_hygiene.py +145 -0
- ethereum_spec_tools/lint/lints/patch_hygiene.py +161 -0
- ethereum_spec_tools/new_fork/__init__.py +4 -0
- ethereum_spec_tools/new_fork/builder.py +430 -0
- ethereum_spec_tools/new_fork/cli.py +216 -0
- ethereum_spec_tools/new_fork/codemod/__init__.py +3 -0
- ethereum_spec_tools/new_fork/codemod/comment.py +79 -0
- ethereum_spec_tools/new_fork/codemod/constant.py +141 -0
- ethereum_spec_tools/new_fork/codemod/string.py +79 -0
- ethereum_spec_tools/patch_tool.py +78 -0
- ethereum_spec_tools/py.typed +0 -0
- ethereum_spec_tools/sync.py +1016 -0
ethereum/ethash.py
ADDED
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Ethash is a proof-of-work algorithm designed to be [ASIC] resistant through
|
|
3
|
+
[memory hardness][mem-hard].
|
|
4
|
+
|
|
5
|
+
To achieve memory hardness, computing Ethash requires access to subsets of a
|
|
6
|
+
large structure. The particular subsets chosen are based on the nonce and block
|
|
7
|
+
header, while the set itself is changed every [`epoch`].
|
|
8
|
+
|
|
9
|
+
At a high level, the Ethash algorithm is as follows:
|
|
10
|
+
|
|
11
|
+
1. Create a **seed** value, generated with [`generate_seed`] and based on the
|
|
12
|
+
preceding block numbers.
|
|
13
|
+
1. From the seed, compute a pseudorandom **cache** with [`generate_cache`].
|
|
14
|
+
1. From the cache, generate a **dataset** with [`generate_dataset`]. The
|
|
15
|
+
dataset grows over time based on [`DATASET_EPOCH_GROWTH_SIZE`].
|
|
16
|
+
1. Miners hash slices of the dataset together, which is where the memory
|
|
17
|
+
hardness is introduced. Verification of the proof-of-work only requires the
|
|
18
|
+
cache to be able to recompute a much smaller subset of the full dataset.
|
|
19
|
+
|
|
20
|
+
[`DATASET_EPOCH_GROWTH_SIZE`]: ref:ethereum.ethash.DATASET_EPOCH_GROWTH_SIZE
|
|
21
|
+
[`generate_dataset`]: ref:ethereum.ethash.generate_dataset
|
|
22
|
+
[`generate_cache`]: ref:ethereum.ethash.generate_cache
|
|
23
|
+
[`generate_seed`]: ref:ethereum.ethash.generate_seed
|
|
24
|
+
[`epoch`]: ref:ethereum.ethash.epoch
|
|
25
|
+
[ASIC]: https://en.wikipedia.org/wiki/Application-specific_integrated_circuit
|
|
26
|
+
[mem-hard]: https://en.wikipedia.org/wiki/Memory-hard_function
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
from typing import Callable, Tuple
|
|
30
|
+
|
|
31
|
+
from ethereum_types.bytes import Bytes, Bytes8
|
|
32
|
+
from ethereum_types.numeric import U32, Uint, ulen
|
|
33
|
+
|
|
34
|
+
from ethereum.crypto.hash import Hash32, Hash64, keccak256, keccak512
|
|
35
|
+
from ethereum.utils.numeric import (
|
|
36
|
+
is_prime,
|
|
37
|
+
le_bytes_to_uint32_sequence,
|
|
38
|
+
le_uint32_sequence_to_bytes,
|
|
39
|
+
le_uint32_sequence_to_uint,
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
EPOCH_SIZE = Uint(30000)
|
|
43
|
+
"""
|
|
44
|
+
Number of blocks before a dataset needs to be regenerated (known as an
|
|
45
|
+
"epoch".) See [`epoch`].
|
|
46
|
+
|
|
47
|
+
[`epoch`]: ref:ethereum.ethash.epoch
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
INITIAL_CACHE_SIZE = Uint(2**24)
|
|
51
|
+
"""
|
|
52
|
+
Size of the cache (in bytes) during the first epoch. Each subsequent epoch's
|
|
53
|
+
cache roughly grows by [`CACHE_EPOCH_GROWTH_SIZE`] bytes. See [`cache_size`].
|
|
54
|
+
|
|
55
|
+
[`CACHE_EPOCH_GROWTH_SIZE`]: ref:ethereum.ethash.CACHE_EPOCH_GROWTH_SIZE
|
|
56
|
+
[`cache_size`]: ref:ethereum.ethash.cache_size
|
|
57
|
+
"""
|
|
58
|
+
|
|
59
|
+
CACHE_EPOCH_GROWTH_SIZE = Uint(2**17)
|
|
60
|
+
"""
|
|
61
|
+
After the first epoch, the cache size grows by roughly this amount. See
|
|
62
|
+
[`cache_size`].
|
|
63
|
+
|
|
64
|
+
[`cache_size`]: ref:ethereum.ethash.cache_size
|
|
65
|
+
"""
|
|
66
|
+
|
|
67
|
+
INITIAL_DATASET_SIZE = Uint(2**30)
|
|
68
|
+
"""
|
|
69
|
+
Size of the dataset (in bytes) during the first epoch. Each subsequent epoch's
|
|
70
|
+
dataset roughly grows by [`DATASET_EPOCH_GROWTH_SIZE`] bytes. See
|
|
71
|
+
[`dataset_size`].
|
|
72
|
+
|
|
73
|
+
[`DATASET_EPOCH_GROWTH_SIZE`]: ref:ethereum.ethash.DATASET_EPOCH_GROWTH_SIZE
|
|
74
|
+
[`dataset_size`]: ref:ethereum.ethash.dataset_size
|
|
75
|
+
"""
|
|
76
|
+
|
|
77
|
+
DATASET_EPOCH_GROWTH_SIZE = Uint(2**23)
|
|
78
|
+
"""
|
|
79
|
+
After the first epoch, the dataset size grows by roughly this amount. See
|
|
80
|
+
[`dataset_size`].
|
|
81
|
+
|
|
82
|
+
[`dataset_size`]: ref:ethereum.ethash.dataset_size
|
|
83
|
+
"""
|
|
84
|
+
|
|
85
|
+
HASH_BYTES = Uint(64)
|
|
86
|
+
"""
|
|
87
|
+
Length of a hash, in bytes.
|
|
88
|
+
"""
|
|
89
|
+
|
|
90
|
+
MIX_BYTES = Uint(128)
|
|
91
|
+
"""
|
|
92
|
+
Width of mix, in bytes. See [`generate_dataset_item`].
|
|
93
|
+
|
|
94
|
+
[`generate_dataset_item`]: ref:ethereum.ethash.generate_dataset_item
|
|
95
|
+
"""
|
|
96
|
+
|
|
97
|
+
CACHE_ROUNDS = 3
|
|
98
|
+
"""
|
|
99
|
+
Number of times to repeat the [`keccak512`] step while generating the hash. See
|
|
100
|
+
[`generate_cache`].
|
|
101
|
+
|
|
102
|
+
[`keccak512`]: ref:ethereum.crypto.hash.keccak512
|
|
103
|
+
[`generate_cache`]: ref:ethereum.ethash.generate_cache
|
|
104
|
+
"""
|
|
105
|
+
|
|
106
|
+
DATASET_PARENTS = Uint(256)
|
|
107
|
+
"""
|
|
108
|
+
Number of parents of each dataset element. See [`generate_dataset_item`].
|
|
109
|
+
|
|
110
|
+
[`generate_dataset_item`]: ref:ethereum.ethash.generate_dataset_item
|
|
111
|
+
"""
|
|
112
|
+
|
|
113
|
+
HASHIMOTO_ACCESSES = 64
|
|
114
|
+
"""
|
|
115
|
+
Number of accesses in the [`hashimoto`] loop.
|
|
116
|
+
|
|
117
|
+
[`hashimoto`]: ref:ethereum.ethash.hashimoto
|
|
118
|
+
"""
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def epoch(block_number: Uint) -> Uint:
|
|
122
|
+
"""
|
|
123
|
+
Obtain the epoch number to which the block identified by `block_number`
|
|
124
|
+
belongs. The first epoch is numbered zero.
|
|
125
|
+
|
|
126
|
+
An Ethash epoch is a fixed number of blocks ([`EPOCH_SIZE`]) long, during
|
|
127
|
+
which the dataset remains constant. At the end of each epoch, the dataset
|
|
128
|
+
is generated anew. See [`generate_dataset`].
|
|
129
|
+
|
|
130
|
+
[`EPOCH_SIZE`]: ref:ethereum.ethash.EPOCH_SIZE
|
|
131
|
+
[`generate_dataset`]: ref:ethereum.ethash.generate_dataset
|
|
132
|
+
"""
|
|
133
|
+
return block_number // EPOCH_SIZE
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def cache_size(block_number: Uint) -> Uint:
|
|
137
|
+
"""
|
|
138
|
+
Obtain the cache size (in bytes) of the epoch to which `block_number`
|
|
139
|
+
belongs.
|
|
140
|
+
|
|
141
|
+
See [`INITIAL_CACHE_SIZE`] and [`CACHE_EPOCH_GROWTH_SIZE`] for the initial
|
|
142
|
+
size and linear growth rate, respectively. The cache is generated in
|
|
143
|
+
[`generate_cache`].
|
|
144
|
+
|
|
145
|
+
The actual cache size is smaller than simply multiplying
|
|
146
|
+
`CACHE_EPOCH_GROWTH_SIZE` by the epoch number to minimize the risk of
|
|
147
|
+
unintended cyclic behavior. It is defined as the highest prime number below
|
|
148
|
+
what linear growth would calculate.
|
|
149
|
+
|
|
150
|
+
[`INITIAL_CACHE_SIZE`]: ref:ethereum.ethash.INITIAL_CACHE_SIZE
|
|
151
|
+
[`CACHE_EPOCH_GROWTH_SIZE`]: ref:ethereum.ethash.CACHE_EPOCH_GROWTH_SIZE
|
|
152
|
+
[`generate_cache`]: ref:ethereum.ethash.generate_cache
|
|
153
|
+
"""
|
|
154
|
+
size = INITIAL_CACHE_SIZE + (CACHE_EPOCH_GROWTH_SIZE * epoch(block_number))
|
|
155
|
+
size -= HASH_BYTES
|
|
156
|
+
while not is_prime(size // HASH_BYTES):
|
|
157
|
+
size -= Uint(2) * HASH_BYTES
|
|
158
|
+
|
|
159
|
+
return size
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def dataset_size(block_number: Uint) -> Uint:
|
|
163
|
+
"""
|
|
164
|
+
Obtain the dataset size (in bytes) of the epoch to which `block_number`
|
|
165
|
+
belongs.
|
|
166
|
+
|
|
167
|
+
See [`INITIAL_DATASET_SIZE`] and [`DATASET_EPOCH_GROWTH_SIZE`][ds] for the
|
|
168
|
+
initial size and linear growth rate, respectively. The complete dataset is
|
|
169
|
+
generated in [`generate_dataset`], while the slices used in verification
|
|
170
|
+
are generated in [`generate_dataset_item`].
|
|
171
|
+
|
|
172
|
+
The actual dataset size is smaller than simply multiplying
|
|
173
|
+
`DATASET_EPOCH_GROWTH_SIZE` by the epoch number to minimize the risk of
|
|
174
|
+
unintended cyclic behavior. It is defined as the highest prime number below
|
|
175
|
+
what linear growth would calculate.
|
|
176
|
+
|
|
177
|
+
[`INITIAL_DATASET_SIZE`]: ref:ethereum.ethash.INITIAL_DATASET_SIZE
|
|
178
|
+
[ds]: ref:ethereum.ethash.DATASET_EPOCH_GROWTH_SIZE
|
|
179
|
+
[`generate_dataset`]: ref:ethereum.ethash.generate_dataset
|
|
180
|
+
[`generate_dataset_item`]: ref:ethereum.ethash.generate_dataset_item
|
|
181
|
+
"""
|
|
182
|
+
size = INITIAL_DATASET_SIZE + (
|
|
183
|
+
DATASET_EPOCH_GROWTH_SIZE * epoch(block_number)
|
|
184
|
+
)
|
|
185
|
+
size -= MIX_BYTES
|
|
186
|
+
while not is_prime(size // MIX_BYTES):
|
|
187
|
+
size -= Uint(2) * MIX_BYTES
|
|
188
|
+
|
|
189
|
+
return size
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
def generate_seed(block_number: Uint) -> Hash32:
|
|
193
|
+
"""
|
|
194
|
+
Obtain the cache generation seed for the block identified by
|
|
195
|
+
`block_number`. See [`generate_cache`].
|
|
196
|
+
|
|
197
|
+
[`generate_cache`]: ref:ethereum.ethash.generate_cache
|
|
198
|
+
"""
|
|
199
|
+
epoch_number = epoch(block_number)
|
|
200
|
+
|
|
201
|
+
seed = b"\x00" * 32
|
|
202
|
+
while epoch_number != 0:
|
|
203
|
+
seed = keccak256(seed)
|
|
204
|
+
epoch_number -= Uint(1)
|
|
205
|
+
|
|
206
|
+
return Hash32(seed)
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def generate_cache(block_number: Uint) -> Tuple[Tuple[U32, ...], ...]:
|
|
210
|
+
"""
|
|
211
|
+
Generate the cache for the block identified by `block_number`. See
|
|
212
|
+
[`generate_dataset`] for how the cache is used.
|
|
213
|
+
|
|
214
|
+
The cache is generated in two steps: filling the array with a chain of
|
|
215
|
+
[`keccak512`] hashes, then running two rounds of Sergio Demian Lerner's
|
|
216
|
+
[RandMemoHash] on those bytes.
|
|
217
|
+
|
|
218
|
+
[`keccak512`]: ref:ethereum.crypto.hash.keccak512
|
|
219
|
+
[`generate_dataset`]: ref:ethereum.ethash.generate_dataset
|
|
220
|
+
[RandMemoHash]: http://www.hashcash.org/papers/memohash.pdf
|
|
221
|
+
"""
|
|
222
|
+
seed = generate_seed(block_number)
|
|
223
|
+
cache_size_bytes = cache_size(block_number)
|
|
224
|
+
|
|
225
|
+
cache_size_words = cache_size_bytes // HASH_BYTES
|
|
226
|
+
cache = [keccak512(seed)]
|
|
227
|
+
|
|
228
|
+
for index in range(1, cache_size_words):
|
|
229
|
+
cache_item = keccak512(cache[index - 1])
|
|
230
|
+
cache.append(cache_item)
|
|
231
|
+
|
|
232
|
+
for _ in range(CACHE_ROUNDS):
|
|
233
|
+
for index in range(cache_size_words):
|
|
234
|
+
# Converting `cache_size_words` to int as `-1 + Uint(5)` is an
|
|
235
|
+
# error.
|
|
236
|
+
first_cache_item = cache[
|
|
237
|
+
(index - 1 + int(cache_size_words)) % int(cache_size_words)
|
|
238
|
+
]
|
|
239
|
+
second_cache_item = cache[
|
|
240
|
+
U32.from_le_bytes(cache[index][0:4]) % U32(cache_size_words)
|
|
241
|
+
]
|
|
242
|
+
items = zip(first_cache_item, second_cache_item, strict=True)
|
|
243
|
+
result = Bytes([a ^ b for a, b in items])
|
|
244
|
+
cache[index] = keccak512(result)
|
|
245
|
+
|
|
246
|
+
return tuple(
|
|
247
|
+
le_bytes_to_uint32_sequence(cache_item) for cache_item in cache
|
|
248
|
+
)
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
def fnv(a: Uint | U32, b: Uint | U32) -> U32:
|
|
252
|
+
"""
|
|
253
|
+
A non-associative substitute for XOR, inspired by the [FNV] hash by Fowler,
|
|
254
|
+
Noll, and Vo. See [`fnv_hash`], [`generate_dataset_item`], and
|
|
255
|
+
[`hashimoto`].
|
|
256
|
+
|
|
257
|
+
Note that here we multiply the prime with the full 32-bit input, in
|
|
258
|
+
contrast with the [FNV-1] spec which multiplies the prime with one byte
|
|
259
|
+
(octet) in turn.
|
|
260
|
+
|
|
261
|
+
[`hashimoto`]: ref:ethereum.ethash.hashimoto
|
|
262
|
+
[`generate_dataset_item`]: ref:ethereum.ethash.generate_dataset_item
|
|
263
|
+
[`fnv_hash`]: ref:ethereum.ethash.fnv_hash
|
|
264
|
+
[FNV]: https://w.wiki/XKZ
|
|
265
|
+
[FNV-1]: http://www.isthe.com/chongo/tech/comp/fnv/#FNV-1
|
|
266
|
+
"""
|
|
267
|
+
# This is a faster way of doing `number % (2 ** 32)`.
|
|
268
|
+
result = ((Uint(a) * Uint(0x01000193)) ^ Uint(b)) & Uint(U32.MAX_VALUE)
|
|
269
|
+
return U32(result)
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
def fnv_hash(
|
|
273
|
+
mix_integers: Tuple[U32, ...], data: Tuple[U32, ...]
|
|
274
|
+
) -> Tuple[U32, ...]:
|
|
275
|
+
"""
|
|
276
|
+
Combines `data` into `mix_integers` using [`fnv`]. See [`hashimoto`] and
|
|
277
|
+
[`generate_dataset_item`].
|
|
278
|
+
|
|
279
|
+
[`hashimoto`]: ref:ethereum.ethash.hashimoto
|
|
280
|
+
[`generate_dataset_item`]: ref:ethereum.ethash.generate_dataset_item
|
|
281
|
+
[`fnv`]: ref:ethereum.ethash.fnv
|
|
282
|
+
"""
|
|
283
|
+
return tuple(
|
|
284
|
+
fnv(mix_integers[i], data[i]) for i in range(len(mix_integers))
|
|
285
|
+
)
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
def generate_dataset_item(
|
|
289
|
+
cache: Tuple[Tuple[U32, ...], ...], index: Uint
|
|
290
|
+
) -> Hash64:
|
|
291
|
+
"""
|
|
292
|
+
Generate a particular dataset item 0-indexed by `index` by hashing
|
|
293
|
+
pseudorandomly-selected entries from `cache` together. See [`fnv`] and
|
|
294
|
+
[`fnv_hash`] for the digest function, [`generate_cache`] for generating
|
|
295
|
+
`cache`, and [`generate_dataset`] for the full dataset generation
|
|
296
|
+
algorithm.
|
|
297
|
+
|
|
298
|
+
[`fnv`]: ref:ethereum.ethash.fnv
|
|
299
|
+
[`fnv_hash`]: ref:ethereum.ethash.fnv_hash
|
|
300
|
+
[`generate_dataset`]: ref:ethereum.ethash.generate_dataset
|
|
301
|
+
[`generate_cache`]: ref:ethereum.ethash.generate_cache
|
|
302
|
+
"""
|
|
303
|
+
mix = keccak512(
|
|
304
|
+
(
|
|
305
|
+
le_uint32_sequence_to_uint(cache[index % ulen(cache)]) ^ index
|
|
306
|
+
).to_le_bytes64()
|
|
307
|
+
)
|
|
308
|
+
|
|
309
|
+
mix_integers = le_bytes_to_uint32_sequence(mix)
|
|
310
|
+
|
|
311
|
+
for j in (Uint(k) for k in range(DATASET_PARENTS)):
|
|
312
|
+
mix_word: U32 = mix_integers[j % Uint(16)]
|
|
313
|
+
cache_index = fnv(index ^ j, mix_word) % U32(len(cache))
|
|
314
|
+
parent = cache[cache_index]
|
|
315
|
+
mix_integers = fnv_hash(mix_integers, parent)
|
|
316
|
+
|
|
317
|
+
mix = Hash64(le_uint32_sequence_to_bytes(mix_integers))
|
|
318
|
+
|
|
319
|
+
return keccak512(mix)
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
def generate_dataset(block_number: Uint) -> Tuple[Hash64, ...]:
|
|
323
|
+
"""
|
|
324
|
+
Generate the full dataset for the block identified by `block_number`.
|
|
325
|
+
|
|
326
|
+
This function is present only for demonstration purposes. It is not used
|
|
327
|
+
while validating blocks.
|
|
328
|
+
"""
|
|
329
|
+
dataset_size_bytes: Uint = dataset_size(block_number)
|
|
330
|
+
cache: Tuple[Tuple[U32, ...], ...] = generate_cache(block_number)
|
|
331
|
+
|
|
332
|
+
# TODO: Parallelize this later on if it adds value
|
|
333
|
+
return tuple(
|
|
334
|
+
generate_dataset_item(cache, Uint(index))
|
|
335
|
+
for index in range(dataset_size_bytes // HASH_BYTES)
|
|
336
|
+
)
|
|
337
|
+
|
|
338
|
+
|
|
339
|
+
def hashimoto(
|
|
340
|
+
header_hash: Hash32,
|
|
341
|
+
nonce: Bytes8,
|
|
342
|
+
dataset_size: Uint,
|
|
343
|
+
fetch_dataset_item: Callable[[Uint], Tuple[U32, ...]],
|
|
344
|
+
) -> Tuple[Bytes, Hash32]:
|
|
345
|
+
"""
|
|
346
|
+
Obtain the mix digest and the final value for a header, by aggregating
|
|
347
|
+
data from the full dataset.
|
|
348
|
+
|
|
349
|
+
#### Parameters
|
|
350
|
+
|
|
351
|
+
- `header_hash` is a valid RLP hash of a block header.
|
|
352
|
+
- `nonce` is the propagated nonce for the given block.
|
|
353
|
+
- `dataset_size` is the size of the dataset. See [`dataset_size`].
|
|
354
|
+
- `fetch_dataset_item` is a function that retrieves a specific dataset item
|
|
355
|
+
based on its index.
|
|
356
|
+
|
|
357
|
+
#### Returns
|
|
358
|
+
|
|
359
|
+
- The mix digest generated from the header hash and propagated nonce.
|
|
360
|
+
- The final result obtained which will be checked for leading zeros (in
|
|
361
|
+
byte representation) in correspondence with the block difficulty.
|
|
362
|
+
|
|
363
|
+
[`dataset_size`]: ref:ethereum.ethash.dataset_size
|
|
364
|
+
"""
|
|
365
|
+
nonce_le = Bytes(reversed(nonce))
|
|
366
|
+
seed_hash = keccak512(header_hash + nonce_le)
|
|
367
|
+
seed_head = U32.from_le_bytes(seed_hash[:4])
|
|
368
|
+
|
|
369
|
+
rows = dataset_size // Uint(128)
|
|
370
|
+
mix = le_bytes_to_uint32_sequence(seed_hash) * (MIX_BYTES // HASH_BYTES)
|
|
371
|
+
|
|
372
|
+
for i in range(HASHIMOTO_ACCESSES):
|
|
373
|
+
new_data: Tuple[U32, ...] = ()
|
|
374
|
+
parent = fnv(U32(i) ^ seed_head, mix[i % len(mix)]) % U32(rows)
|
|
375
|
+
for j in range(MIX_BYTES // HASH_BYTES):
|
|
376
|
+
# Typecasting `parent` from U32 to Uint as 2*parent + j may
|
|
377
|
+
# overflow U32.
|
|
378
|
+
new_data += fetch_dataset_item(Uint(2) * Uint(parent) + Uint(j))
|
|
379
|
+
|
|
380
|
+
mix = fnv_hash(mix, new_data)
|
|
381
|
+
|
|
382
|
+
compressed_mix = []
|
|
383
|
+
for i in range(0, len(mix), 4):
|
|
384
|
+
compressed_mix.append(
|
|
385
|
+
fnv(fnv(fnv(mix[i], mix[i + 1]), mix[i + 2]), mix[i + 3])
|
|
386
|
+
)
|
|
387
|
+
|
|
388
|
+
mix_digest = le_uint32_sequence_to_bytes(compressed_mix)
|
|
389
|
+
result = keccak256(seed_hash + mix_digest)
|
|
390
|
+
|
|
391
|
+
return mix_digest, result
|
|
392
|
+
|
|
393
|
+
|
|
394
|
+
def hashimoto_light(
|
|
395
|
+
header_hash: Hash32,
|
|
396
|
+
nonce: Bytes8,
|
|
397
|
+
cache: Tuple[Tuple[U32, ...], ...],
|
|
398
|
+
dataset_size: Uint,
|
|
399
|
+
) -> Tuple[Bytes, Hash32]:
|
|
400
|
+
"""
|
|
401
|
+
Run the [`hashimoto`] algorithm by generating dataset item using the cache
|
|
402
|
+
instead of loading the full dataset into main memory.
|
|
403
|
+
|
|
404
|
+
#### Parameters
|
|
405
|
+
|
|
406
|
+
- `header_hash` is a valid RLP hash of a block header.
|
|
407
|
+
- `nonce` is the propagated nonce for the given block.
|
|
408
|
+
- `cache` is the cache generated by [`generate_cache`].
|
|
409
|
+
- `dataset_size` is the size of the dataset. See [`dataset_size`].
|
|
410
|
+
|
|
411
|
+
#### Returns
|
|
412
|
+
|
|
413
|
+
- The mix digest generated from the header hash and propagated nonce.
|
|
414
|
+
- The final result obtained which will be checked for leading zeros (in
|
|
415
|
+
byte representation) in correspondence with the block difficulty.
|
|
416
|
+
|
|
417
|
+
[`dataset_size`]: ref:ethereum.ethash.dataset_size
|
|
418
|
+
[`generate_cache`]: ref:ethereum.ethash.generate_cache
|
|
419
|
+
[`hashimoto`]: ref:ethereum.ethash.hashimoto
|
|
420
|
+
"""
|
|
421
|
+
|
|
422
|
+
def fetch_dataset_item(index: Uint) -> Tuple[U32, ...]:
|
|
423
|
+
item: Hash64 = generate_dataset_item(cache, index)
|
|
424
|
+
return le_bytes_to_uint32_sequence(item)
|
|
425
|
+
|
|
426
|
+
return hashimoto(header_hash, nonce, dataset_size, fetch_dataset_item)
|
ethereum/exceptions.py
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Error types common across all Ethereum forks.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class EthereumException(Exception): # noqa N818
|
|
7
|
+
"""
|
|
8
|
+
Base class for all exceptions _expected_ to be thrown during normal
|
|
9
|
+
operation.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class InvalidBlock(EthereumException):
|
|
14
|
+
"""
|
|
15
|
+
Thrown when a block being processed is found to be invalid.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class StateWithEmptyAccount(EthereumException):
|
|
20
|
+
"""
|
|
21
|
+
Thrown when the state has empty account.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class InvalidTransaction(EthereumException):
|
|
26
|
+
"""
|
|
27
|
+
Thrown when a transaction being processed is found to be invalid.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class InvalidSenderError(InvalidTransaction):
|
|
32
|
+
"""
|
|
33
|
+
Thrown when a transaction originates from an account that cannot send
|
|
34
|
+
transactions.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class InvalidSignatureError(InvalidTransaction):
|
|
39
|
+
"""
|
|
40
|
+
Thrown when a transaction has an invalid signature.
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class InsufficientBalanceError(InvalidTransaction):
|
|
45
|
+
"""
|
|
46
|
+
Thrown when a transaction cannot be executed due to insufficient sender
|
|
47
|
+
funds.
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class NonceMismatchError(InvalidTransaction):
|
|
52
|
+
"""
|
|
53
|
+
Thrown when a transaction's nonce does not match the expected nonce for the
|
|
54
|
+
sender.
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class GasUsedExceedsLimitError(InvalidTransaction):
|
|
59
|
+
"""
|
|
60
|
+
Thrown when a transaction's gas usage exceeds the gas available in the
|
|
61
|
+
block.
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class InsufficientTransactionGasError(InvalidTransaction):
|
|
66
|
+
"""
|
|
67
|
+
Thrown when a transaction does not provide enough gas to cover its
|
|
68
|
+
intrinsic cost.
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class NonceOverflowError(InvalidTransaction):
|
|
73
|
+
"""
|
|
74
|
+
Thrown when a transaction's nonce is greater than `2**64 - 2`.
|
|
75
|
+
"""
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Activation criteria for forks.
|
|
3
|
+
|
|
4
|
+
Most generally, a _fork_ is a divergence in a blockchain resulting in multiple
|
|
5
|
+
tips. Most forks are short lived, and can be caused by networking issues or the
|
|
6
|
+
behavior of block creators. These short-lived forks resolve themselves
|
|
7
|
+
according to the rules of the protocol, eventually settling back to a single
|
|
8
|
+
tip of the chain.
|
|
9
|
+
|
|
10
|
+
A second class of forks are intentionally created by changing the rules of the
|
|
11
|
+
protocol, and never resolve back to a single tip. Older software will continue
|
|
12
|
+
to follow the original fork, while updated software will create and follow a
|
|
13
|
+
new fork.
|
|
14
|
+
|
|
15
|
+
For these intentional forks to succeed, all participants need to agree on
|
|
16
|
+
exactly when to switch rules. The agreed upon criteria are represented by
|
|
17
|
+
subclasses of [`ForkCriteria`], like [`ByBlockNumber`] and [`ByTimestamp`]. The
|
|
18
|
+
special type of [`Unscheduled`] is used for forks in active development that do
|
|
19
|
+
not yet have a scheduled deployment.
|
|
20
|
+
|
|
21
|
+
[`ForkCriteria`]: ref:ethereum.fork_criteria.ForkCriteria
|
|
22
|
+
[`ByBlockNumber`]: ref:ethereum.fork_criteria.ByBlockNumber
|
|
23
|
+
[`ByTimestamp`]: ref:ethereum.fork_criteria.ByTimestamp
|
|
24
|
+
[`Unscheduled`]: ref:ethereum.fork_criteria.Unscheduled
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
import functools
|
|
28
|
+
from abc import ABC, abstractmethod
|
|
29
|
+
from typing import Final, Literal, SupportsInt, Tuple
|
|
30
|
+
|
|
31
|
+
from ethereum_types.numeric import U256, Uint
|
|
32
|
+
from typing_extensions import override
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@functools.total_ordering
|
|
36
|
+
class ForkCriteria(ABC):
|
|
37
|
+
"""
|
|
38
|
+
Abstract base class for conditions specifying when a fork activates.
|
|
39
|
+
|
|
40
|
+
Subclasses override the comparison methods ([`__eq__`] and [`__lt__`]) to
|
|
41
|
+
provide an ordering for forks, and override [`check`] to determine whether
|
|
42
|
+
a particular block meets the activation criteria.
|
|
43
|
+
|
|
44
|
+
[`__eq__`]: ref:ethereum.fork_criteria.ForkCriteria.__eq__
|
|
45
|
+
[`__lt__`]: ref:ethereum.fork_criteria.ForkCriteria.__lt__
|
|
46
|
+
[`check`]: ref:ethereum.fork_criteria.ForkCriteria.check
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
BLOCK_NUMBER: Final[int] = 0
|
|
50
|
+
"""
|
|
51
|
+
Value representing a fork criteria based on the block's number.
|
|
52
|
+
|
|
53
|
+
Used for pre-merge blocks.
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
TIMESTAMP: Final[int] = 1
|
|
57
|
+
"""
|
|
58
|
+
Value representing a fork criteria based on the block's timestamp.
|
|
59
|
+
|
|
60
|
+
Used for post-merge blocks.
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
UNSCHEDULED: Final[int] = 2
|
|
64
|
+
"""
|
|
65
|
+
Value representing a fork criteria that will never be satisfied.
|
|
66
|
+
|
|
67
|
+
Used for in-development forks.
|
|
68
|
+
"""
|
|
69
|
+
|
|
70
|
+
_internal: Tuple[int, int]
|
|
71
|
+
|
|
72
|
+
def __eq__(self, other: object) -> bool:
|
|
73
|
+
"""
|
|
74
|
+
Equality for fork criteria.
|
|
75
|
+
"""
|
|
76
|
+
if isinstance(other, ForkCriteria):
|
|
77
|
+
return self._internal == other._internal
|
|
78
|
+
return NotImplemented
|
|
79
|
+
|
|
80
|
+
def __lt__(self, other: object) -> bool:
|
|
81
|
+
"""
|
|
82
|
+
Less-than comparison function, with earlier forks being less than later
|
|
83
|
+
forks.
|
|
84
|
+
|
|
85
|
+
All [`BLOCK_NUMBER`] forks come before [`TIMESTAMP`] forks, and all
|
|
86
|
+
scheduled forks come before [`UNSCHEDULED`] forks.
|
|
87
|
+
|
|
88
|
+
[`BLOCK_NUMBER`]: ref:ethereum.fork_criteria.ForkCriteria.BLOCK_NUMBER
|
|
89
|
+
[`TIMESTAMP`]: ref:ethereum.fork_criteria.ForkCriteria.TIMESTAMP
|
|
90
|
+
[`UNSCHEDULED`]: ref:ethereum.fork_criteria.ForkCriteria.UNSCHEDULED
|
|
91
|
+
"""
|
|
92
|
+
if isinstance(other, ForkCriteria):
|
|
93
|
+
return self._internal < other._internal
|
|
94
|
+
return NotImplemented
|
|
95
|
+
|
|
96
|
+
def __hash__(self) -> int:
|
|
97
|
+
"""
|
|
98
|
+
Compute a hash for this instance, so it can be stored in dictionaries.
|
|
99
|
+
"""
|
|
100
|
+
return hash(self._internal)
|
|
101
|
+
|
|
102
|
+
@abstractmethod
|
|
103
|
+
def check(self, block_number: Uint, timestamp: U256) -> bool:
|
|
104
|
+
"""
|
|
105
|
+
Check whether fork criteria have been met.
|
|
106
|
+
|
|
107
|
+
Returns `True` when the current block meets or exceeds the criteria,
|
|
108
|
+
and `False` otherwise.
|
|
109
|
+
"""
|
|
110
|
+
raise NotImplementedError()
|
|
111
|
+
|
|
112
|
+
@abstractmethod
|
|
113
|
+
def __repr__(self) -> str:
|
|
114
|
+
"""
|
|
115
|
+
String representation of this object.
|
|
116
|
+
"""
|
|
117
|
+
raise NotImplementedError()
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
class ByBlockNumber(ForkCriteria):
|
|
121
|
+
"""
|
|
122
|
+
Forks that occur when a specific block number has been reached.
|
|
123
|
+
"""
|
|
124
|
+
|
|
125
|
+
block_number: Uint
|
|
126
|
+
"""
|
|
127
|
+
Number of the first block in this fork.
|
|
128
|
+
"""
|
|
129
|
+
|
|
130
|
+
def __init__(self, block_number: SupportsInt):
|
|
131
|
+
self._internal = (ForkCriteria.BLOCK_NUMBER, int(block_number))
|
|
132
|
+
self.block_number = Uint(int(block_number))
|
|
133
|
+
|
|
134
|
+
@override
|
|
135
|
+
def check(self, block_number: Uint, timestamp: U256) -> bool:
|
|
136
|
+
"""
|
|
137
|
+
Check whether the block number has been reached.
|
|
138
|
+
|
|
139
|
+
Returns `True` when the given `block_number` is equal to or greater
|
|
140
|
+
than [`block_number`], and `False` otherwise.
|
|
141
|
+
|
|
142
|
+
[`block_number`]: ref:ethereum.fork_criteria.ByBlockNumber.block_number
|
|
143
|
+
"""
|
|
144
|
+
return block_number >= self.block_number
|
|
145
|
+
|
|
146
|
+
def __repr__(self) -> str:
|
|
147
|
+
"""
|
|
148
|
+
String representation of this object.
|
|
149
|
+
"""
|
|
150
|
+
return f"ByBlockNumber({self.block_number})"
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
class ByTimestamp(ForkCriteria):
|
|
154
|
+
"""
|
|
155
|
+
Forks that occur when a specific timestamp has been reached.
|
|
156
|
+
"""
|
|
157
|
+
|
|
158
|
+
timestamp: U256
|
|
159
|
+
"""
|
|
160
|
+
First instance of time that is part of this fork.
|
|
161
|
+
"""
|
|
162
|
+
|
|
163
|
+
def __init__(self, timestamp: SupportsInt):
|
|
164
|
+
self._internal = (ForkCriteria.TIMESTAMP, int(timestamp))
|
|
165
|
+
self.timestamp = U256(timestamp)
|
|
166
|
+
|
|
167
|
+
@override
|
|
168
|
+
def check(self, block_number: Uint, timestamp: U256) -> bool:
|
|
169
|
+
"""
|
|
170
|
+
Check whether the timestamp has been reached.
|
|
171
|
+
|
|
172
|
+
Returns `True` when the given `timestamp` is equal to or greater than
|
|
173
|
+
[`timestamp`], and `False` otherwise.
|
|
174
|
+
|
|
175
|
+
[`timestamp`]: ref:ethereum.fork_criteria.ByTimestamp.timestamp
|
|
176
|
+
"""
|
|
177
|
+
return timestamp >= self.timestamp
|
|
178
|
+
|
|
179
|
+
def __repr__(self) -> str:
|
|
180
|
+
"""
|
|
181
|
+
String representation of this object.
|
|
182
|
+
"""
|
|
183
|
+
return f"ByTimestamp({self.timestamp})"
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
class Unscheduled(ForkCriteria):
|
|
187
|
+
"""
|
|
188
|
+
Forks that have not been scheduled.
|
|
189
|
+
"""
|
|
190
|
+
|
|
191
|
+
def __init__(self, order_index: int = 0) -> None:
|
|
192
|
+
self._internal = (ForkCriteria.UNSCHEDULED, order_index)
|
|
193
|
+
|
|
194
|
+
@override
|
|
195
|
+
def check(self, block_number: Uint, timestamp: U256) -> Literal[False]:
|
|
196
|
+
"""
|
|
197
|
+
Unscheduled forks never occur; always returns `False`.
|
|
198
|
+
"""
|
|
199
|
+
return False
|
|
200
|
+
|
|
201
|
+
def __repr__(self) -> str:
|
|
202
|
+
"""
|
|
203
|
+
String representation of this object.
|
|
204
|
+
"""
|
|
205
|
+
return f"Unscheduled(order_index={self._internal[1]})"
|