Skip to content

Commit

Permalink
feat[tool]: add integrity hash to initcode
Browse files Browse the repository at this point in the history
  • Loading branch information
charles-cooper committed Sep 11, 2024
1 parent 9a208a6 commit 5cd91a8
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 18 deletions.
6 changes: 2 additions & 4 deletions vyper/compiler/output.py
Original file line number Diff line number Diff line change
Expand Up @@ -320,15 +320,13 @@ def _build_source_map_output(compiler_data, bytecode, pc_maps):


def build_source_map_output(compiler_data: CompilerData) -> dict:
bytecode, pc_maps = compile_ir.assembly_to_evm(
compiler_data.assembly, insert_compiler_metadata=False
)
bytecode, pc_maps = compile_ir.assembly_to_evm(compiler_data.assembly, compiler_metadata=None)
return _build_source_map_output(compiler_data, bytecode, pc_maps)


def build_source_map_runtime_output(compiler_data: CompilerData) -> dict:
bytecode, pc_maps = compile_ir.assembly_to_evm(
compiler_data.assembly_runtime, insert_compiler_metadata=False
compiler_data.assembly_runtime, compiler_metadata=None
)
return _build_source_map_output(compiler_data, bytecode, pc_maps)

Expand Down
17 changes: 9 additions & 8 deletions vyper/compiler/phases.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import warnings
from functools import cached_property
from pathlib import Path, PurePath
from typing import Optional
from typing import Any, Optional

from vyper import ast as vy_ast
from vyper.ast import natspec
Expand Down Expand Up @@ -249,12 +249,15 @@ def assembly_runtime(self) -> list:

@cached_property
def bytecode(self) -> bytes:
insert_compiler_metadata = not self.no_bytecode_metadata
return generate_bytecode(self.assembly, insert_compiler_metadata=insert_compiler_metadata)
metadata = None
if not self.no_bytecode_metadata:
module_t = self.compilation_target._metadata["type"]
metadata = bytes.fromhex(module_t.integrity_sum)
return generate_bytecode(self.assembly, compiler_metadata=metadata)

@cached_property
def bytecode_runtime(self) -> bytes:
return generate_bytecode(self.assembly_runtime, insert_compiler_metadata=False)
return generate_bytecode(self.assembly_runtime, compiler_metadata=None)

@cached_property
def blueprint_bytecode(self) -> bytes:
Expand Down Expand Up @@ -351,7 +354,7 @@ def _find_nested_opcode(assembly, key):
return any(_find_nested_opcode(x, key) for x in sublists)


def generate_bytecode(assembly: list, insert_compiler_metadata: bool) -> bytes:
def generate_bytecode(assembly: list, compiler_metadata: Optional[Any]) -> bytes:
"""
Generate bytecode from assembly instructions.
Expand All @@ -365,6 +368,4 @@ def generate_bytecode(assembly: list, insert_compiler_metadata: bool) -> bytes:
bytes
Final compiled bytecode.
"""
return compile_ir.assembly_to_evm(assembly, insert_compiler_metadata=insert_compiler_metadata)[
0
]
return compile_ir.assembly_to_evm(assembly, compiler_metadata=compiler_metadata)[0]
14 changes: 8 additions & 6 deletions vyper/ir/compile_ir.py
Original file line number Diff line number Diff line change
Expand Up @@ -1155,22 +1155,23 @@ def _relocate_segments(assembly):


# TODO: change API to split assembly_to_evm and assembly_to_source/symbol_maps
def assembly_to_evm(assembly, pc_ofst=0, insert_compiler_metadata=False):
def assembly_to_evm(assembly, pc_ofst=0, compiler_metadata=None):
bytecode, source_maps, _ = assembly_to_evm_with_symbol_map(
assembly, pc_ofst=pc_ofst, insert_compiler_metadata=insert_compiler_metadata
assembly, pc_ofst=pc_ofst, compiler_metadata=compiler_metadata
)
return bytecode, source_maps


def assembly_to_evm_with_symbol_map(assembly, pc_ofst=0, insert_compiler_metadata=False):
def assembly_to_evm_with_symbol_map(assembly, pc_ofst=0, compiler_metadata=None):
"""
Assembles assembly into EVM
assembly: list of asm instructions
pc_ofst: when constructing the source map, the amount to offset all
pcs by (no effect until we add deploy code source map)
insert_compiler_metadata: whether to append vyper metadata to output
(should be true for runtime code)
compiler_metadata: any compiler metadata to add. pass `None` to indicate
no metadata to be added (should always be `None` for
runtime code)
"""
line_number_map = {
"breakpoints": set(),
Expand Down Expand Up @@ -1278,10 +1279,11 @@ def assembly_to_evm_with_symbol_map(assembly, pc_ofst=0, insert_compiler_metadat
pc += 1

bytecode_suffix = b""
if insert_compiler_metadata:
if compiler_metadata is not None:
# this will hold true when we are in initcode
assert immutables_len is not None
metadata = (
compiler_metadata,
len(runtime_code),
data_section_lengths,
immutables_len,
Expand Down

0 comments on commit 5cd91a8

Please sign in to comment.