¿Cómo funciona este código de implementación estándar ERC223?

Aquí hay un fragmento de código del ERC223-token-standard .

function transfer(address _to, uint _value, bytes _data) {
    // Standard function transfer similar to ERC20 transfer with no _data .
    // Added due to backwards compatibility reasons .
    uint codeLength;

    assembly {
        // Retrieve the size of the code on target address, this needs assembly .
        codeLength := extcodesize(_to)
    }

    balances[msg.sender] = balances[msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    if(codeLength>0) {
        ERC223ReceivingContract receiver = ERC223ReceivingContract(_to);
        receiver.tokenFallback(msg.sender, _value, _data);
    }
    Transfer(msg.sender, _to, _value, _data);
}

Lo que no entiendo es cómo funcionan estas dos líneas:

ERC223ReceivingContract receiver = ERC223ReceivingContract(_to);
receiver.tokenFallback(msg.sender, _value, _data);

No se crea ninguna nueva instancia aquí, pero todavía estamos llamando a la función. ¿Cómo podemos llamar así a la función del contrato? No hay una construcción en ERC223RecievingContract pero aquí se pasa la dirección. ¿Qué está pasando exactamente aquí?

Respuestas (3)

Se supone que cualquier contrato inteligente que desee interactuar con un token ERC223 implemente la tokenFallback()función para manejar las transferencias de tokens entrantes.

Esas 2 líneas llaman a esa función en la cuenta de destino (si es un contrato inteligente), por lo que el contrato inteligente de destino DEBE haber implementado previamente la función tokenFallback().

Como se puede ver en la implementación de ejemplo, la función tokenFallback() se puede usar para recuperar todos los datos enviados por la llamada transfer() y usarlos como quieras dentro de tu contrato de receptor:

https://github.com/Dexaran/ERC223-token-standard/blob/Recommended/Receiver_Interface.sol

ERC223ReceivingContract receiver = ERC223ReceivingContract(_to);, este código no crea una instancia del contrato de recepción, entonces, ¿cómo llamamos a su función? ¿Es ERC223ReceiveContract un constructor?
Cuando haces ContractX x = ContractX(dirección del contrato) estás instanciando un contrato existente en la dirección especificada. Si conoce sus funciones puede llamarlas desde otro contrato.

Es lo mismo que las funciones de respaldo para Ether.

de los documentos:

Los tokens ERC223 deben enviarse llamando a la función de transferencia en el contrato de token sin diferencia si el receptor es un contrato o una dirección de billetera. Si el receptor es una billetera, la transferencia del token ERC223 será la misma que la transferencia ERC20. Si el receptor es un contrato de token ERC223, el contrato intentará llamar a la función tokenFallback en el contrato del receptor. Si no hay una función tokenFallback en el contrato del receptor, la transacción fallará. La función tokenFallback es análoga a la función de respaldo para las transacciones de Ether. Se puede usar para manejar transacciones entrantes.

Esto puede no ser tan claro, pero implica lo siguiente:

Los tokens ERC223 deben usarse mediante transferencia de envío. Si el destinatario es una billetera, no habrá problema. Si el destinatario es un contrato, la transferencia intentará llamar a la función tokenFallback. Si no hay tokenFallback presente, la transacción fallará.

Sin embargo, puede optar por implementar un tokenFallback para manejar las transacciones de tokens entrantes en su contrato. El siguiente ejemplo rechazará todas las transacciones de tokens entrantes, excepto las emitidas por el crowdsale, que se agregarán nuevamente al saldo de crowdsale disponible.

  function tokenFallback(address, uint _value, bytes)
      isToken
      public {
      _available = _available.add(_value);
  }

Como Pabloruiz55 indicó anteriormente, también se puede usar para obtener la información de la transacción: msg.sender, msg.value y msg.data. También puede enviar estos valores si elige implementar una función tokenFallback, ya que se pasan como parámetros de función. .

¿Puede decirme cómo funciona este código? ERC223ReceivingContract receiver = ERC223ReceiveContract(_to);
Si el receptor (_to) es un contrato, creará una instancia del ERC223ReceiveContract ya definido en esa dirección desde la cual puede llamar al tokenFallback. ERC223ReceivingContract receiver = ERC223ReceivingContract(_to);definiendo la variable 'tipo' (aquí instancia de contrato --- llamamos a la variable receptora --- invocamos el contrato con el parámetro _to
Lo siento estaba equivocado. No está iniciando un nuevo contrato en la dirección de _to. Solo está especificando que el contrato se puede encontrar allí si se implementa. Para obtener más información sobre este tema, consulte el siguiente video de YouTube: youtube.com/watch?v=l_E5F5qnbtk
@Kyriediculous. Gracias, pero ¿cómo puede Solidity restaurar los saldos de tokens? Por favor, vea mi respuesta a continuación...

Gracias a Kyriediculous por la explicación del Polimorfismo en el Tutorial 17 Polimorfismo https://www.youtube.com/watch?v=l_E5F5qnbtk

   ContractReceiver receiver = ContractReceiver(_to);

solo asumimos que en la dirección _to hay un contrato (o implementación de interfaz) llamado ContractReceiver

    receiver.tokenFallback(msg.sender, _value, _data);

y ahora asumimos que dicho contrato en _to tiene la función tokenFallback

pero si tal función o tal contrato no existe en tal dirección, fallamos... ¿entonces qué?

Lo encontré aquí: EIP Breakdown: The ERC 223 Token Standard https://www.youtube.com/watch?v=GS62VNyPVHs También vea "Ethereum Cross Chain Atomic Swaps" para transacciones atómicas https://medium.com/@DontPanicBurns /ethereum-cross-chain-atomic-swaps-5a91adca4f43

En Solidity, las transacciones se denominan atómicas, lo que significa que todas las transacciones tienen éxito juntas o todas fallan juntas. Entonces, incluso si falla una línea ( receiver.tokenFallback() ) en la función, toda la función fallará. Luego los saldos serán restaurados a sus valores originales.

Resuelto para la transferencia de tokens ERC223 al contrato error/falla no compatible