В чем разница между msg.отправителем, от и отправителем в токенах ERC20?

#solidity #smartcontracts

Вопрос:

мой контракт

 contract Token{
    string public name = "Dhruv";
    string public symbol = "DhruvToken";
    uint256 public decimals = 18;
    uint256 public totalSupply;

    mapping(address => uint) public balanceOf;
    mapping(address => mapping(address => uint256)) public allowance;

    constructor() public{
        totalSupply = 1000000 * (10 ** decimals);
        balanceOf[msg.sender] = totalSupply;
    }

    //events
    event Transfer(address from, address to, uint256 value);
    event Approve(address indexed from, address indexed to, uint256 indexed value);

    function transfer(address _to, uint256 _value) public returns (bool success){
        require(balanceOf[msg.sender] >= _value);
        _transfer(msg.sender, _to, _value);
        return true;
    }

    //internal function can be accessed only within the smart contract
    function _transfer(address _from, address _to, uint256 _value)  internal{
        require(_to != address(0));
        balanceOf[_from] = balanceOf[_from] - _value;
        balanceOf[_to] = balanceOf[_to]   _value;
        emit Transfer(_from, _to, _value);
    }

    // approve the tokens
    function approve(address _spender, uint256 _value) public returns (bool success){
        require(_spender != address(0));
        allowance[msg.sender][_spender] = _value;
        emit Approve(msg.sender, _spender, _value);
        return true;

    }

    function transferFrom(address _from, address _to, uint256 _value)  public returns (bool success){
        // require(balanceOf[_from] >= _value);
        allowance[_from][msg.sender] =  allowance[_from][msg.sender] - _value;
        _transfer(_from, _to, _value);
        return true;
    }
}
 

функции, называемые

 token.transferFrom(deployer, receiver, amount, { from: exchange })
token.approve(exchange, amount, { from: deployer });
token.allowance(deployer, exchange);
 

мои сомнения

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

Пожалуйста, ответьте на мое сомнение, я много исследовал, но это сомнение еще не рассеялось

Комментарии:

1. Пожалуйста, ответьте, я действительно застрял здесь, пожалуйста, предложите, если мне нужно отредактировать свой вопрос, чтобы было более ясно, что я действительно застрял здесь

Ответ №1:

извините, я думаю, что не смогу ответить на все ваши вопросы. Без особого контекста, насколько я понимаю, основная цель этого контракта состоит в том, чтобы позволить кому-то разрешить другому лицу отправлять токены от его имени потенциальной третьей стороне.

Приемлемым сценарием для меня было бы :

-«А» разворачивает контракт.

-«B» вызывает функцию token.approve (таким образом, B является отправителем msg.здесь), чтобы позволить C потратить значение от своего имени. (допустим, для этого примера : 10)

 allowance[B][C] = 10;
 

-«С» вызывает токен.Функция transferFrom для отправки некоторого токена B в D.(скажем, 6. Обратите внимание, что теперь C является отправителем msg.)

 allowance[B][C] =  allowance[B][C] - 6; (10-6 --> C still can send 4 tokens from now on)
 

Теперь с этими тремя вызовами функций :

знак.Передача от(отправитель, получатель, сумма, { от: exchange })

 allowance[deployer][exchange] =  allowance[deployer][exchange] - _value;
 

токен.одобрить(обмен, сумма, { от: deployer });

 allowance[deployer][exhange] = _value;
 

знак.пособие(развертыватель, обмен);

Вы просто получаете обновленное количество токенов, которые можно отправить. Порядок вызовов этих функций для меня не совсем понятен, так как я ожидал бы, что сначала будет вызвана функция утверждения.

Что касается фигурных скобок, я не знаком с этим синтаксисом. Я больше привык к чему-то вроде

 token.transferFrom(deployer, receiver, amount).send( { from: exchange } )
 

в javascript. В любом случае, это просто способ использовать пары ключ-значение в качестве аргумента функции. Вероятно, первые аргументы (из фигурных скобок) относятся к функции-члену токена, а аргумент между фигурными скобками-к эквиваленту функции отправки, которую я привел в качестве примера выше.

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