Укажите отправителя между контрактными вызовами

Возможно ли при вызове контракта из другого указать отправителя?

Что-то вроде API, выставленного web3.

function sendTokensToContract() {
    //Send tokens from this contract to this contract (?!)
    token.transfer(this, amount); 

    //Send tokens from sender to this contract
    token.transfer(this, assetPrice, {sender: msg.sender});
} 

Спасибо.

5 голосов | спросил Víctor Albertos 4 Jpm1000000pmWed, 04 Jan 2017 16:59:06 +030017 2017, 16:59:06

1 ответ


4

Нет, но да.

Нет, потому что контракт не может отправлять что-либо из ничего, кроме самого себя. Нет возможности {из: account}. Сделки являются «из» контракта. Без исключений.

Да, поскольку if токен-контракт отвечает за ведение бухгалтерской книги для токенов или что-то еще, что она отслеживает, тогда просто нужно выполнить некоторые внутренние операции бухгалтерии.

Просто упрощенный пример с иллюстрациями о функциональности, необходимой в token.transfer. Будьте действительно осторожны, чтобы убедиться, что вы не открыли его пользователям, которые тратят токены из любой старой учетной записи. Это будет хаос:

function sendTokensFromAnywhere(address sender, address receiver, uint amount) 
    onlyAuthorized // needs definition, or look at 2nd example
    returns(bool success)
{
    token.transfer(sender, receiver, amount); 
    return true;
} 

contract Token {

  modifier onlyOwner() {
    // owner is trusted, but no one else
    if(msg.sender != owner) throw;
    _;
  }

  function Token() {
    // assume deployment originates from the "owner"
    owner = msg.sender; 
    // owner will be the only contract authorized to use transfer()
  }
...
  function transfer(address sender, address receiver, uint amount) 
    onlyOwner  // sender is obviously dangerous, so control who can call this
    returns (bool success)
  {
    if(balances[sender] < amount) throw;
    balances[sender] -= amount;
    balances[receiver] += amount;
    return true;
  }

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

function sendTokensFromAnywhere(address receiver, uint amount) 
    public
    returns(bool success)
{
    token.transfer(msg.sender, receiver, amount); // only own tokens
    return true;
} 

Объект, вызывающий функцию, может передавать только () из своих собственных активов, поэтому мы можем удалить onlyAuthorized, а не определять его.

С небольшой дополнительной осторожностью (хотя ничто в token.transfer в настоящее время не возвращает false):

function sendTokensFromAnywhere(address receiver, uint amount) 
    public
    returns(bool success)
{
    if(token.transfer(msg.sender, receiver, amount)) return true;
    // looks like something went wrong with the transfer
    throw;
} 

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

ответил Rob Hitchens 4 Jpm1000000pmWed, 04 Jan 2017 18:46:07 +030017 2017, 18:46:07

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

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

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