Skip to content

EVM Block Builder Package

Python wrapper for the evm b11r tool.

BlockBuilder

Generic Block builder frontend.

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/evm_block_builder/__init__.py
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class BlockBuilder:
    """
    Generic Block builder frontend.
    """

    @abstractmethod
    def build(
        self,
        header: Any,
        txs: Any,
        ommers: Any,
        withdrawals: Optional[Any] = None,
        clique: Optional[Any] = None,
        ethash: bool = False,
        ethash_mode: str = "normal",
    ) -> Tuple[str, str]:
        """
        Build a block with specified parameters and return RLP and hash
        """
        pass

    @abstractmethod
    def version(self) -> str:
        """
        Return name and version of tool used to build the block
        """
        pass

build(header, txs, ommers, withdrawals=None, clique=None, ethash=False, ethash_mode='normal') abstractmethod

Build a block with specified parameters and return RLP and hash

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/evm_block_builder/__init__.py
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@abstractmethod
def build(
    self,
    header: Any,
    txs: Any,
    ommers: Any,
    withdrawals: Optional[Any] = None,
    clique: Optional[Any] = None,
    ethash: bool = False,
    ethash_mode: str = "normal",
) -> Tuple[str, str]:
    """
    Build a block with specified parameters and return RLP and hash
    """
    pass

version() abstractmethod

Return name and version of tool used to build the block

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/evm_block_builder/__init__.py
34
35
36
37
38
39
@abstractmethod
def version(self) -> str:
    """
    Return name and version of tool used to build the block
    """
    pass

EvmBlockBuilder

Bases: BlockBuilder

Go-ethereum evm Block builder frontend.

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/evm_block_builder/__init__.py
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
class EvmBlockBuilder(BlockBuilder):
    """
    Go-ethereum `evm` Block builder frontend.
    """

    binary: Path
    cached_version: Optional[str] = None

    def __init__(self, binary: Optional[Path | str] = None):
        if binary is None:
            which_path = which("evm")
            if which_path is not None:
                binary = Path(which_path)
        if binary is None or not Path(binary).exists():
            raise Exception(
                """`evm` binary executable is not accessible, please refer to
                https://github.com/ethereum/go-ethereum on how to compile and
                install the full suite of utilities including the `evm` tool"""
            )
        self.binary = Path(binary)

    def build(
        self,
        header: Any,
        txs: Any,
        ommers: Any,
        withdrawals: Optional[Any] = None,
        clique: Optional[Any] = None,
        ethash: bool = False,
        ethash_mode: str = "normal",
    ) -> Tuple[str, str]:
        """
        Executes `evm b11r` with the specified arguments.
        """
        args = [
            str(self.binary),
            "b11r",
            "--input.header=stdin",
            "--input.txs=stdin",
            "--input.ommers=stdin",
            "--seal.clique=stdin",
            "--output.block=stdout",
            "--input.withdrawals=stdin" if withdrawals is not None else "",
        ]

        if ethash:
            args.append("--seal.ethash")
            args.append("--seal.ethash.mode=" + ethash_mode)

        stdin = {
            "header": header,
            "txs": txs,
            "uncles": ommers,
            "clique": clique,
        }
        if withdrawals is not None:
            stdin["withdrawals"] = withdrawals

        result = subprocess.run(
            args,
            input=str.encode(json.dumps(stdin)),
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
        )

        if result.returncode != 0:
            raise Exception("failed to build")

        output = json.loads(result.stdout)

        if "rlp" not in output or "hash" not in output:
            Exception("malformed result")

        return (output["rlp"], output["hash"])

    def version(self) -> str:
        """
        Gets `evm` binary version.
        """
        if self.cached_version is None:
            result = subprocess.run(
                [str(self.binary), "-v"],
                stdout=subprocess.PIPE,
            )

            if result.returncode != 0:
                raise Exception("failed to evaluate: " + result.stderr.decode())

            self.cached_version = result.stdout.decode().strip()

        return self.cached_version

build(header, txs, ommers, withdrawals=None, clique=None, ethash=False, ethash_mode='normal')

Executes evm b11r with the specified arguments.

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/evm_block_builder/__init__.py
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
def build(
    self,
    header: Any,
    txs: Any,
    ommers: Any,
    withdrawals: Optional[Any] = None,
    clique: Optional[Any] = None,
    ethash: bool = False,
    ethash_mode: str = "normal",
) -> Tuple[str, str]:
    """
    Executes `evm b11r` with the specified arguments.
    """
    args = [
        str(self.binary),
        "b11r",
        "--input.header=stdin",
        "--input.txs=stdin",
        "--input.ommers=stdin",
        "--seal.clique=stdin",
        "--output.block=stdout",
        "--input.withdrawals=stdin" if withdrawals is not None else "",
    ]

    if ethash:
        args.append("--seal.ethash")
        args.append("--seal.ethash.mode=" + ethash_mode)

    stdin = {
        "header": header,
        "txs": txs,
        "uncles": ommers,
        "clique": clique,
    }
    if withdrawals is not None:
        stdin["withdrawals"] = withdrawals

    result = subprocess.run(
        args,
        input=str.encode(json.dumps(stdin)),
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
    )

    if result.returncode != 0:
        raise Exception("failed to build")

    output = json.loads(result.stdout)

    if "rlp" not in output or "hash" not in output:
        Exception("malformed result")

    return (output["rlp"], output["hash"])

version()

Gets evm binary version.

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/evm_block_builder/__init__.py
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
def version(self) -> str:
    """
    Gets `evm` binary version.
    """
    if self.cached_version is None:
        result = subprocess.run(
            [str(self.binary), "-v"],
            stdout=subprocess.PIPE,
        )

        if result.returncode != 0:
            raise Exception("failed to evaluate: " + result.stderr.decode())

        self.cached_version = result.stdout.decode().strip()

    return self.cached_version