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
abi.encodePacked(x)
wo x
ist die adresse. (Danke @k06a )
toAsciiString
im Beispiel in der anderen Antwort.Invalid type for argument in the string.concat function call. string type is required, but t_bytes_memory_ptr provided
) , das toAsciiString
funktioniert bei mir.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);
}
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.Web3.utils.toChecksumAddress()
.Dies ist eine Methode zum Konvertieren address
in 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);
}
Sie können die Adresse in uint160 umwandeln und dann die OpenZeppelin Strings-Bibliothek verwenden.
Strings.toHexString(uint160(address), 20)
Bezug:
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);
}
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")
Kushan Gunasekera
internal pure
Schlüsselwort verwenden, sonst erhalten Sie eine Warnung. Weitere Informationen zu pure function .