Меня просят предоставить значение 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
возникновения события.
Спасибо!
Все сводится к тому, как вы используете данные и какой метод является наиболее эффективным для вас.
Это правда, что вы можете получить msg.sender
из блока (или транзакции) или события. Если вы создаете внешний интерфейс и заполняете страницу данными из события, вероятно, было бы лучше включить его в событие для чистого и краткого кода внешнего интерфейса. Если вы уже храните каждый блок и его данные в своем собственном обозревателе блоков, вы также можете использовать эти данные и придете к тому же результату.
Обновлять
Глядя на это с точки зрения газа, вы в конечном итоге заплатите больше за добавление его к событиям. Стоимость LOG
(согласно желтой бумаге) следующая:
k + unindexedBytes * a + indexedTopics * b
куда:
k = 375 (initial `LOG` cost)
a = 8
b = 375 (each additional indexed `LOG`)
хорошая вибрация
Шейн Фонтейн