Transfiere tokens ERC20 usando otro contrato. tx.origin frente a msg.sender

Tengo un contrato básico de token ERC20 (moneda TMP) como se menciona en el ejemplo de token ERC20 .

En el ejemplo de token ERC20, la función de transferencia de código transfiere tokens msg.sendera otra cuenta, pero ¿por qué no los usamos tx.origin?

¿Cómo puedo transferir tokens de monedas TMP de una cuenta a otra usando otro contrato inteligente (contrato XYZ)?

Respuestas (2)

tx.origincontra msg.sender:

msg.sender- la dirección de la persona que llama directamente (puede ser un contrato o una cuenta de propiedad externa)

tx.origin- la dirección de la persona que llama desde la que se origina la transacción (siempre una cuenta de propiedad externa).

Es una buena práctica no usar tx.origina menos que realmente necesite saber el origen.

No debe usarlo tx.originpara la verificación, ya que eso lo expondría a posibles ataques ( ataque tx.origin ). El ejemplo en los documentos de Solidity está desactualizado y ya no se puede reproducir, .transfer()pero hay formas de evitarlo.

Transferir ERC20 de A a B:

Para transferir tokens de la cuenta A a la cuenta B utilizando el Contrato C , debe hacer lo siguiente:

  1. Desde A llama a la función ERC20 approve(address _spender, uint256 _value)y pasa la dirección de C como gastador, más la cantidad que tiene permitido enviar. Esto le indicaría al Contrato de Token que su contrato C puede transferir la cantidad especificada desde su dirección A .

  2. Desde C llamar a la función ERC20 transferFrom(address _from, address _to, uint256 _value). Pasando from: A.addressyto: B.address

msg.sendertambién puede ser una dirección de contrato, mientras que tx.originsiempre es un EOA. http://ethdocs.org/en/latest/contracts-and-transactions/account-types-gas-and-transactions.html#eoa-vs-contract-accounts

El uso msg.senderpermite que los contratos reciban fondos de otras cuentas de contrato en lugar de solo EOA.