Adresse in String umwandeln

Wie kann ich in Solidity die Absenderadresse in einen String umwandeln?

Die Kommentare in Wie konvertiere ich eine Adresse in Bytes in Solidity? lieferte keine funktionierende Lösung

Funktion toString (Adresse x) interne reine Rückgabe (String) { Bytes Speicher b = neue Bytes (20); for (uint i = 0; i < 20; i++) b[i] = byte(uint8(uint(x) / (2**(8*(19 - i))))); Rückgabezeichenfolge (b); } internal pureSchlüsselwort verwenden, sonst erhalten Sie eine Warnung. Weitere Informationen zu pure function .

Antworten (5)

Verwendenabi.encodePacked(x)

wo xist die adresse. (Danke @k06a )

Es funktioniert, aber das Ergebnis ist kein für Menschen lesbarer String. Eine für Menschen lesbare Zeichenfolge finden Sie toAsciiStringim Beispiel in der anderen Antwort.
kann nicht zusammen mit string.concat (0.8.x) verwendet werden ( Fehlermeldung: Invalid type for argument in the string.concat function call. string type is required, but t_bytes_memory_ptr provided) , das toAsciiStringfunktioniert bei mir.
@Siwei Danke, ich habe diese Antwort positiv bewertet. Diese Art von Frage verwirrt mich, weil es sich möglicherweise um ein Anti-Muster handelt: Im Allgemeinen sollte versucht werden, solche Konvertierungen in einem Vertrag zu vermeiden und sie an anderer Stelle wie dem Frontend durchzuführen ...

Ich konnte den ABI-codierten String mit web3.js nicht lesen. Daher habe ich den ASCII-Zeichen eine Konvertierung hinzugefügt:

function toAsciiString(address x) internal pure returns (string memory) {
    bytes memory s = new bytes(40);
    for (uint i = 0; i < 20; i++) {
        bytes1 b = bytes1(uint8(uint(uint160(x)) / (2**(8*(19 - i)))));
        bytes1 hi = bytes1(uint8(b) / 16);
        bytes1 lo = bytes1(uint8(b) - 16 * uint8(hi));
        s[2*i] = char(hi);
        s[2*i+1] = char(lo);            
    }
    return string(s);
}

function char(bytes1 b) internal pure returns (bytes1 c) {
    if (uint8(b) < 10) return bytes1(uint8(b) + 0x30);
    else return bytes1(uint8(b) + 0x57);
}
Es gab ein Problem mit der Funktion char(byte b). "TypeError: Operator < nicht kompatibel mit den Typen bytes1 und int_const 10" Ich nehme an, dieser Vergleich funktioniert trotzdem, da Sie wahrscheinlich gemeint haben, wenn b eine Zahl ist, dann fügen Sie 0x30 hinzu. Aber woher wissen Sie, ob ein Byte kleiner als 10 ist oder nicht?
if (b < 10)muss auf geändert werden if (uint8(b) < 10), dann Operator < not compatible with types bytes1 ...ist der Fehler behoben. Ich habe die Antwort bearbeitet. Hoffe es wird genehmigt.
Danke für die Antwort - bisher funktioniert das in v0.5.10
Bei dieser Konvertierung geht die Adressprüfsumme verloren, die zwischen Groß- und Kleinschreibung unterscheidet. Die Prüfsumme kann mit wiederhergestellt werden Web3.utils.toChecksumAddress().
Die Adresse wird in Kleinbuchstaben ohne 0x am Anfang formatiert

Dies ist eine Methode zum Konvertieren addressin Hex string:

function toString(address account) public pure returns(string memory) {
    return toString(abi.encodePacked(account));
}

function toString(uint256 value) public pure returns(string memory) {
    return toString(abi.encodePacked(value));
}

function toString(bytes32 value) public pure returns(string memory) {
    return toString(abi.encodePacked(value));
}

function toString(bytes memory data) public pure returns(string memory) {
    bytes memory alphabet = "0123456789abcdef";

    bytes memory str = new bytes(2 + data.length * 2);
    str[0] = "0";
    str[1] = "x";
    for (uint i = 0; i < data.length; i++) {
        str[2+i*2] = alphabet[uint(uint8(data[i] >> 4))];
        str[3+i*2] = alphabet[uint(uint8(data[i] & 0x0f))];
    }
    return string(str);
}
In acht nehmen!! Obwohl der Code gut konstruiert ist, führt er zu diesem Fehler: github.com/ethers-io/ethers.js/issues/…
Ab solidity 0.8.x ist eine explizite Typkonvertierung von address nach uint256 nicht erlaubt. Verwenden Sie also uint256 i = uint256 (uint160 (address (msg.sender)));

Sie können die Adresse in uint160 umwandeln und dann die OpenZeppelin Strings-Bibliothek verwenden.

Strings.toHexString(uint160(address), 20)

Bezug:

Casting-Adresse an uint

OpenZeppelin Strings für Bytes

Dies funktioniert mit solidity 0.6.0

function addressToString(address _pool) public pure returns (string memory _uintAsString) {
      uint _i = uint256(_pool);
      if (_i == 0) {
          return "0";
      }
      uint j = _i;
      uint len;
      while (j != 0) {
          len++;
          j /= 10;
      }
      bytes memory bstr = new bytes(len);
      uint k = len - 1;
      while (_i != 0) {
          bstr[k--] = byte(uint8(48 + _i % 10));
          _i /= 10;
      }
      return string(bstr);
    }

Funktioniert, aber Achtung: returns (string memory _uintAsString)!!! es ist also ein int, nicht die Adresszeichenfolge, wie Sie es auf den ersten Blick erwarten würden. Das bedeutet auch, dass, wenn Ihre Adresse mit einer oder mehreren Nullen beginnt (0x 0 A1bC4 ...), diese führende 0 fehlt , wenn Sie sie in eine Ganzzahl und dann wieder zurück in Hex (Adresse) umwandeln . Sie brauchen so etwas: '0x' + BigInt(ethAddressAsInt).toString(16).padStart(40, '0')(40 ist die Länge einer Ethereum-Adresse, ohne das "0x")
Könnten Sie die Antwort bearbeiten, um dies in die Funktion aufzunehmen?
Mit Solidity 8.7 wird dies nicht kompiliert. Gibt "Parser-Fehler - erwarteter primärer Ausdruck" auf bstr[k--] = byte(uint8(48 + _i % 10)); ]