Если любой из них используется в теле функции Solidity, которая может изменить состояние контракта (вызов записи), в чем основное отличие и/или преимущество использования одного над другим. Например:
function setOwner() {
owner = msg.sender;
}
против.
function setOwner() {
owner = tx.origin;
}
Какая разница?
С msg.sender
собственником может быть договор.
С tx.origin
собственником никогда не может быть контракта.
В простой цепочке вызовов A->B->C->D внутри D msg.sender
будет C, а tx.origin
будет A.
msg.sender
предпочтительнее из-за гибкости, которую он обеспечивает. Кроме того, для Serenity, несмотря на то, что прошло некоторое время, Виталик рекомендует избегать tx.origin
: Как мне сделать мой DAPP «защищенным от Serenity?»
Внимательно подумайте, действительно ли вам когда-нибудь понадобится использовать tx.origin
. Помните, что вы не можете быть единственным пользователем вашего контракта. Другие люди могут захотеть использовать ваш контракт и захотеть взаимодействовать с ним через контракт, который они написали.
Если источник действительно требуется в D, то каждая из функций в контрактах B, C, D может принимать дополнительный параметр для распространения источника: A передаст свой адрес ( this
) в B, B передаст значение C, и C передаст его D.
РЕДАКТИРОВАТЬ: Чтобы подчеркнуть комментарий @WBT ниже, контракт, который использует переданное значение для источника, должен быть очень осторожным в том, как он использует источник: любой может передать значение, которое не является реальным источником.
msg.sender
дает прямого отправителя сообщения, например, контракт, который передал его.
tx.origin
дает источник транзакций, то есть адрес пользователя, с которого он был первоначально отправлен. На практике это всегда будет пользователь, поэтому ответ eth остается верным.
Пол С
эт
Курт
эт
ВБТ