Есть ли смысл добавлять msg.sender к событию?

Меня просят предоставить значение msg.senderкак часть события, испускаемого в функции.

Это что-то вроде:

contract MyContract {
    event MyEvent(address indexed sender, uint256 input, uint256 output);

    function func(uint256 input) external {
        verify(msg.sender);
        uint256 output = compute(input);
        emit MyEvent(msg.sender, input, output);
    }

    function verify(address sender) private view {
        // verify the sender...
        ...
    }

    function compute(uint256 input) private returns (uint256) {
        // compute the output...
    }
}

Есть ли в этом смысл, или это значение все равно всегда будет присутствовать в блоке?

При всем при этом эта функция вызывается только из оффчейна (т.е. не по какому-либо контракту).

Таким образом msg.sender, всегда будет равно моменту tx.originвозникновения события.

Спасибо!

Ответы (1)

Все сводится к тому, как вы используете данные и какой метод является наиболее эффективным для вас.

Это правда, что вы можете получить msg.senderиз блока (или транзакции) или события. Если вы создаете внешний интерфейс и заполняете страницу данными из события, вероятно, было бы лучше включить его в событие для чистого и краткого кода внешнего интерфейса. Если вы уже храните каждый блок и его данные в своем собственном обозревателе блоков, вы также можете использовать эти данные и придете к тому же результату.

Обновлять

Глядя на это с точки зрения газа, вы в конечном итоге заплатите больше за добавление его к событиям. Стоимость LOG(согласно желтой бумаге) следующая:

k + unindexedBytes * a + indexedTopics * b

куда:

k = 375 (initial `LOG` cost)
a = 8
b = 375 (each additional indexed `LOG`)
Я больше думал об аспекте стоимости газа, так как этот дополнительный (индексированный) параметр стоит немного, поэтому мы включаем его, если он уже есть? Спасибо.
Я понимаю. Добавлю к ответу.