В чем разница между «msg.sender» и «tx.origin»?

Если они используются в теле функции Solidity, которая может изменить состояние контракта (вызов записи), в чем основное отличие и /или преимущество использования одного над другим. Например:

   function setOwner() {
      owner = msg.sender;
   }

против.

   function setOwner() {
      owner = tx.origin;
   }

В чем разница?

42 голоса | спросил dbryson 7 MaramMon, 07 Mar 2016 04:26:21 +03002016-03-07T04:26:21+03:0004 2016, 04:26:21

2 ответа


51

С msg.sender владелец может быть контрактом.

С tx.origin владелец никогда не может быть контрактом.

В простой цепочке вызовов A-> B-> C-> D внутри D msg.sender будет C, а tx.origin будет A.

msg.sender является предпочтительным для гибкости, которую он предоставляет. Кроме того, для Serenity, несмотря на то, что это время, Виталик рекомендует избегать tx.origin: Как сделать мой DAPP« Serenity-Proof? »

Внимательно рассмотрите, действительно ли вам нужно использовать tx.origin. Помните, что вы не можете быть единственным пользователем вашего контракта. Другие люди могут захотеть использовать ваш контракт и хотят взаимодействовать с ним по контракту, который они написали.

Если в D действительно требуется начало координат, то каждая из функций в контрактах B, C, D может взять дополнительный параметр для распространения начала: A будет передавать свой адрес (this) к B, B передаст значение C, а C передаст его D.

EDIT: Чтобы подчеркнуть комментарий, приведенный ниже в @WBT, контракт, который использует переданное значение для источника, должен быть очень осторожным в том, как он использует происхождение: любой может передать значение, которое не является реальным происхождением.

ответил eth 7 MaramMon, 07 Mar 2016 05:33:57 +03002016-03-07T05:33:57+03:0005 2016, 05:33:57
10

msg.sender предоставляет прямой отправитель сообщения, например, контракт, который его передал.

tx.origin предоставляет происхождение транзакций, поэтому пользовательский адрес был изначально отправлен. На практике это всегда будет пользователь, поэтому ответ eth отвечает.

ответил Jared Pereira 7 MaramMon, 07 Mar 2016 08:55:04 +03002016-03-07T08:55:04+03:0008 2016, 08:55:04

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132