Codice proxy diverso per aggiornare smart contract e attacchi di rientro

Oct 15 2020

Sto cercando di aggiornare lo smart contract in Ethereum. Ho scoperto che il pattern proxy può aiutarmi in questo. Nei documenti openzeppelin, dovrei aggiungere il seguente codice in fallbackfunzione nel mio contratto:

assembly {
  let ptr := mload(0x40)

  // (1) copy incoming call data
  calldatacopy(ptr, 0, calldatasize)

  // (2) forward call to logic contract
  let result := delegatecall(gas, _impl, ptr, calldatasize, 0, 0)
  let size := returndatasize

  // (3) retrieve return data
  returndatacopy(ptr, 0, size)

  // (4) forward return data back to caller
  switch result
  case 0 { revert(ptr, size) }
  default { return(ptr, size) }
}

Sembra che dovrei inoltrare la chiamata e recuperare i dati di ritorno. Tuttavia, in alcuni contratti, aggiornano semplicemente il contratto con codice come questo:

/**
     * Resolves asset implementation contract for the caller and forwards there transaction data,
     * along with the value. This allows for proxy interface growth.
     */
    function () payable {
        _getAsset().__process.value(msg.value)(msg.data, msg.sender);
    }

Ho due domande:

  1. Il secondo codice può aggiornare anche lo smart contract?
  2. Penso che aggiungere il primo codice in fallbackfunzione nel mio contratto possa portare a un attacco di rientro, è vero? Grazie!

Risposte

Ismael Oct 16 2020 at 22:59

Sono due modi per rendere aggiornabile un contratto.

  • Il primo utilizza il codice operativo DELEGATECALL. Non cambia msg.sender. Deve utilizzare l'assembly per recuperare il valore restituito. Hanno alcune limitazioni che devi conoscere prima di usarlihttps://blog.openzeppelin.com/the-transparent-proxy-pattern/, https://blog.openzeppelin.com/proxy-patterns/.
  • Il secondo utilizza il normale codice operativo CALL. Cambia msg.sender quindi il codice deve adattarsi a questo. Non supporta le funzioni getter perché ignora il valore restituito.

Nessuna delle due opzioni fornisce una protezione contro gli attacchi di rientro, dipende dall'implementazione.