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.sender
a 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)?
tx.origin
contra 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.origin
a menos que realmente necesite saber el origen.
No debe usarlo tx.origin
para 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:
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 .
Desde C llamar a la función ERC20 transferFrom(address _from, address _to, uint256 _value)
. Pasando from: A.address
yto: B.address
msg.sender
también puede ser una dirección de contrato, mientras que tx.origin
siempre es un EOA. http://ethdocs.org/en/latest/contracts-and-transactions/account-types-gas-and-transactions.html#eoa-vs-contract-accounts
El uso msg.sender
permite que los contratos reciban fondos de otras cuentas de contrato en lugar de solo EOA.