¿Cómo funciona el método de llamada delegado para llamar al método de otro contrato?

Estoy tratando de descubrir cómo usar el delegatecallmétodo en una dirección de contrato en un contrato para llamar a una función en un contrato separado.

Sé que las bibliotecas son la interfaz de nivel superior para usar, pero quiero comprender las acciones y comportamientos de nivel inferior.

Si alguien pudiera proporcionar algunos buenos ejemplos de un contrato que se utiliza delegatecallpara las funciones de otro contrato, sería muy apreciado.

Respuestas (1)

Aquí hay un fragmento del Duso delegatecallde Diferencia Eentre CALL, CALLCODE y DELEGATECALL

contract D {
  uint public n;
  address public sender;

  function delegatecallSetN(address _e, uint _n) {
    _e.delegatecall(bytes4(keccak256("setN(uint256)")), _n); // D's storage is set, E is not modified 
  }
}

contract E {
  uint public n;
  address public sender;
  function setN(uint _n) {
    n = _n;
    sender = msg.sender;
  }
}

Cuando una dirección C invoca delegatecallSetN, las D senderse establecerán en C (E no se modifica). Lo msg.valueque sea parte de la invocación, también será el valor del msg.valueinterior setN.

Puede probar rápidamente arriba en Solidity Browser .

Para las bibliotecas, consulte los documentos de Solidity .

Pude hacerlo funcionar aunque no pude hacerlo funcionar para cadenas o bytes32
Creo que debería funcionar igual para bytes32. Para stringy bytes, no estoy seguro y probablemente se necesite una pregunta por separado.
D.delcallCfunc(addressOfE, 10);es la forma correcta de llamarlo? ¿Podría addressOfEser una cadena? @eth
@Avatar Si está usando un ejemplo como la respuesta, la forma en que llama parece consistente, pero addressOfEno puede ser una cadena ya que la cadena no tiene un delegatecallmiembro. Probablemente sea más fácil apegarse a las bibliotecas en lugar de una llamada de delegado "simple".
¿Esto funciona con enumeraciones?
@eth en ese caso, E y D y se almacenan en la misma dirección, ¿no es así?
@ user2284570 La pregunta no está clara. Cada dirección solo tiene 1 contrato.