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

log0

84
log0 = partial(log_n, num_topics=0)

log1

85
log1 = partial(log_n, num_topics=1)

log2

86
log2 = partial(log_n, num_topics=2)

log3

87
log3 = partial(log_n, num_topics=3)

log4

88
log4 = partial(log_n, num_topics=4)