Могут ли смарт-контракты совершать транзакции от имени вызывающей стороны?

Я хочу сделать смарт-контракт, который охватывает другие смарт-контракты.

В некоторых из этих контрактов пользователь должен сам отправить транзакцию. Можно ли заставить смарт-контракт отправлять транзакции от имени вызывающей стороны?

Ответы (1)

Вроде, как бы, что-то вроде.

Да, контракты могут отправлять сообщения другим контрактам. Они могут сделать это, потому что транзакция была подписана сторонней учетной записью. Например (упрощенно):

contract Helper {    

// a bunch of initialization stuff ... 

function doStuff() public {
      contractA.aFunction();
      contractB.anotherFunction();
    }
}

В контексте contractAи contractB, не msg.senderявляется Helperлицом, подписавшим транзакцию, отправленную Helper.doStuff().

Helperне может выдавать себя за первоначального подписавшего по той же причине, по которой Алиса не может тратить деньги Боба. С точки зрения contractAи contractB, Helperэто просто еще один пользователь, не имеющий (точнее, очень немногих) отличительных свойств.

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

Если вы на самом деле пишете contractAи contractBу вас больше контроля над дизайном, вы можете передать адрес пользователя в:

В договоре А...

  function aFunction(address user) public onlyAuthorized {
    // In this context, "msg.sender" is the calling contract and there is access control so only the trusted contract has this privilege.
    // address "user" is the user the trusted contract passed in which could be the original signer.
  }

Надеюсь, поможет.