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'))));
}
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 konvertierenbytes32
, wird dasaddress
abgeschnitten. 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 Adresse0x111122223333444455556666777788889999AAAABBBBCCCCDDDDEEEEFFFFCCCC
.Sie können verwenden
address(uint160(bytes20(b)))
, was zu führt0x111122223333444455556666777788889999aAaa
, oder Sie können verwendenaddress(uint160(uint256(b)))
, was zu führt0x777788889999AaAAbBbbCcccddDdeeeEfFFfCcCc
.
Majd TL