Skip to content

Commit

Permalink
Make cancun fork
Browse files Browse the repository at this point in the history
  • Loading branch information
SamWilsn committed Jul 12, 2023
1 parent 5360030 commit 673ccec
Show file tree
Hide file tree
Showing 46 changed files with 8,160 additions and 0 deletions.
5 changes: 5 additions & 0 deletions setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,11 @@ packages =
ethereum/shanghai/vm
ethereum/shanghai/vm/instructions
ethereum/shanghai/vm/precompiled_contracts
ethereum/cancun
ethereum/cancun/utils
ethereum/cancun/vm
ethereum/cancun/vm/instructions
ethereum/cancun/vm/precompiled_contracts


package_dir =
Expand Down
10 changes: 10 additions & 0 deletions src/ethereum/cancun/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
"""
Ethereum Cancun Hardfork
^^^^^^^^^^^^^^^^^^^^^^^^
The Fifteenth Ethereum hardfork.
"""

from ethereum.fork_criteria import Unscheduled

FORK_CRITERIA = Unscheduled()
83 changes: 83 additions & 0 deletions src/ethereum/cancun/bloom.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
"""
Ethereum Logs Bloom
^^^^^^^^^^^^^^^^^^^
.. contents:: Table of Contents
:backlinks: none
:local:
Introduction
------------
This modules defines functions for calculating bloom filters of logs. For the
general theory of bloom filters see e.g. `Wikipedia
<https://en.wikipedia.org/wiki/Bloom_filter>`_. Bloom filters are used to allow
for efficient searching of logs by address and/or topic, by rapidly
eliminating blocks and reciepts from their search.
"""

from typing import Tuple

from ethereum.base_types import Uint
from ethereum.crypto.hash import keccak256

from .fork_types import Bloom, Log


def add_to_bloom(bloom: bytearray, bloom_entry: bytes) -> None:
"""
Add a bloom entry to the bloom filter (`bloom`).
The number of hash functions used is 3. They are calculated by taking the
least significant 11 bits from the first 3 16-bit words of the
`keccak_256()` hash of `bloom_entry`.
Parameters
----------
bloom :
The bloom filter.
bloom_entry :
An entry which is to be added to bloom filter.
"""
hash = keccak256(bloom_entry)

for idx in (0, 2, 4):
# Obtain the least significant 11 bits from the pair of bytes
# (16 bits), and set this bit in bloom bytearray.
# The obtained bit is 0-indexed in the bloom filter from the least
# significant bit to the most significant bit.
bit_to_set = Uint.from_be_bytes(hash[idx : idx + 2]) & 0x07FF
# Below is the index of the bit in the bytearray (where 0-indexed
# byte is the most significant byte)
bit_index = 0x07FF - bit_to_set

byte_index = bit_index // 8
bit_value = 1 << (7 - (bit_index % 8))
bloom[byte_index] = bloom[byte_index] | bit_value


def logs_bloom(logs: Tuple[Log, ...]) -> Bloom:
"""
Obtain the logs bloom from a list of log entries.
The address and each topic of a log are added to the bloom filter.
Parameters
----------
logs :
List of logs for which the logs bloom is to be obtained.
Returns
-------
logs_bloom : `Bloom`
The logs bloom obtained which is 256 bytes with some bits set as per
the caller address and the log topics.
"""
bloom: bytearray = bytearray(b"\x00" * 256)

for log in logs:
add_to_bloom(bloom, log.address)
for topic in log.topics:
add_to_bloom(bloom, topic)

return Bloom(bloom)
Loading

0 comments on commit 673ccec

Please sign in to comment.