Solidity: Konvertieren von "Bytes Speicher" in "Adresse"

Ich verwende Solidity 0.5.0 und wenn ich versuche, meinen Vertrag zu kompilieren, erhalte ich diesen Fehler

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

mein Code ist dieser:

  /// @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'))));
}
Was macht db.getBytes(...)?

Antworten (1)

Die Funktion wurde weggelassen db.getBytes(), um Kompilierungsfehler im Remix zu vermeiden. Du kannst wählen:

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

Oder:

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

Bearbeiten: Solidity doc .

Wenn Sie einen Typ, der eine größere Bytegröße verwendet address, beispielsweise in ein konvertieren bytes32, wird das addressabgeschnitten. Um die Mehrdeutigkeit der Konvertierung zu reduzieren, erzwingen Version 0.4.24 und höher des Compilers, dass Sie die Kürzung in der Konvertierung explizit machen. Nehmen Sie zum Beispiel die Adresse 0x111122223333444455556666777788889999AAAABBBBCCCCDDDDEEEEFFFFCCCC.

Sie können verwenden address(uint160(bytes20(b))), was zu führt 0x111122223333444455556666777788889999aAaa, oder Sie können verwenden address(uint160(uint256(b))), was zu führt 0x777788889999AaAAbBbbCcccddDdeeeEfFFfCcCc.