ethereum.forks.amsterdam.vm.instructions.log

Ethereum Virtual Machine (EVM) Logging Instructions.

.. contents:: Table of Contents :backlinks: none :local:

Introduction

Implementations of the EVM logging instructions.

log_n

Appends a log entry, having num_topics topics, to the evm logs.

This will also expand the memory if the data (required by the log entry) corresponding to the memory is not accessible.

Parameters

evm : The current EVM frame. num_topics : The number of topics to be included in the log entry.

def log_n(evm: Evm, ​​num_topics: int) -> None:
31
    """
32
    Appends a log entry, having `num_topics` topics, to the evm logs.
33
34
    This will also expand the memory if the data (required by the log entry)
35
    corresponding to the memory is not accessible.
36
37
    Parameters
38
    ----------
39
    evm :
40
        The current EVM frame.
41
    num_topics :
42
        The number of topics to be included in the log entry.
43
44
    """
45
    # STACK
46
    memory_start_index = pop(evm.stack)
47
    size = pop(evm.stack)
48
49
    topics = []
50
    for _ in range(num_topics):
51
        topic = pop(evm.stack).to_be_bytes32()
52
        topics.append(topic)
53
54
    # GAS
55
    extend_memory = calculate_gas_extend_memory(
56
        evm.memory, [(memory_start_index, size)]
57
    )
58
    charge_gas(
59
        evm,
60
        GasCosts.OPCODE_LOG_BASE
61
        + GasCosts.OPCODE_LOG_DATA_PER_BYTE * Uint(size)
62
        + GasCosts.OPCODE_LOG_TOPIC * Uint(num_topics)
63
        + extend_memory.cost,
64
    )
65
66
    # OPERATION
67
    evm.memory += b"\x00" * extend_memory.expand_by
68
    if evm.message.is_static:
69
        raise WriteInStaticContext
70
    log_entry = Log(
71
        address=evm.message.current_target,
72
        topics=tuple(topics),
73
        data=memory_read_bytes(evm.memory, memory_start_index, size),
74
    )
75
76
    evm.logs = evm.logs + (log_entry,)
77
78
    # PROGRAM COUNTER
79
    evm.pc += Uint(1)

log0

82
log0 = partial(log_n, num_topics=0)

log1

83
log1 = partial(log_n, num_topics=1)

log2

84
log2 = partial(log_n, num_topics=2)

log3

85
log3 = partial(log_n, num_topics=3)

log4

86
log4 = partial(log_n, num_topics=4)