Solidez: Convertir de "bytes de memoria" a "dirección"

estoy usando solidity 0.5.0 y cuando trato de compilar mi contrato me da este error

Explicit type conversion not allowed from "bytes memory" to "address"

mi codigo es este:

  /// @dev get broker address for endpoint
 function getEndpointBroker(address oracleAddress, bytes32 endpoint) public view returns (address) 
  {


return address(db.getBytes(keccak256(abi.encodePacked('oracles', oracleAddress, endpoint, 'broker'))));
}
¿Qué hace db.getBytes (...)?

Respuestas (1)

Se omitió la función db.getBytes()para evitar errores de compilación en remix. Tu puedes elegir:

function getEndpointBroker(address oracleAddress, bytes32 endpoint) public view returns (address) {
        return address(uint160(uint256(keccak256(abi.encodePacked('oracles', oracleAddress, endpoint, 'broker')))));
    }

O:

function getEndpointBroker(address oracleAddress, bytes32 endpoint) public view returns (address) {
        return address(uint160(bytes20(keccak256(abi.encodePacked('oracles', oracleAddress, endpoint, 'broker')))));
    }

Editar: Solidity doc .

Si convierte un tipo que usa un tamaño de byte más grande a un address, por ejemplo bytes32, entonces se addresstrunca. Para reducir la ambigüedad de la conversión, la versión 0.4.24 y posteriores del compilador obligan a que el truncamiento sea explícito en la conversión. Tomemos por ejemplo la dirección 0x111122223333444455556666777788889999AAAABBBBCCCCDDDDEEEEFFFFCCCC.

Puede usar address(uint160(bytes20(b))), que da como resultado 0x111122223333444455556666777788889999aAaa, o puede usar address(uint160(uint256(b))), que da como resultado 0x777788889999AaAAbBbbCcccddDdeeeEfFFfCcCc.