C# - Ethereum ABI-Adresse in String umwandeln (Solidity)

Ich bin neu bei Ethereum, also entschuldigen Sie bitte meine Unwissenheit. Ethereum scheint ein ABI-Serialisierungsprotokoll namens Solidity zu haben. Die Spezifikation ist hier: https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI

Ich suche nach einer Möglichkeit, Verträge in C # zu codieren und zu decodieren. Insbesondere möchte ich ein Array von Bytes (byte []) nehmen und es als Ausgangspunkt in eine für Menschen lesbare Ethereum-Adresse konvertieren.

Hier sind ein paar Bibliotheken, die ich geklont habe, aber nachdem ich den Code durchgesehen habe, ist nicht sofort ersichtlich, wie ich das erreichen kann, was ich versuche:

https://github.com/Nethereum/Nethereum

https://github.com/sense2k/Ethereum.NET

Kann mir jemand ein Beispiel zeigen, wie man ein Byte-Array in eine für Menschen lesbare Ethereum-String-Adresse umwandelt?

Antworten (1)

In Solidität:

Beispiel für die Umwandlung einer Adresse in ein Byte-Array und dann in einen String:

/// @dev Function convert a Address to a String
/// @return Address as a string
function toString(address input) internal pure returns (string) {
    bytes memory byteArray = new bytes(20);
    for (uint i = 0; i < 20; i++) {
        byteArray[i] = byte(uint8(uint(input) / (2**(8*(19 - i)))));
    }
    return string(byteArray);
}

In C#:

Byte-Array in einen String umwandeln:

string address = System.Text.Encoding.UTF8.GetString(addrByteArray, 0, addrByteArray.Length);

Wo addrByteArrayist die Adresse im Byte-Array-Format.

Hoffentlich hilft das.

Danke. Ich habe das versucht, aber alles, was ich zurückbekomme, sind verstümmelte Zeichen. Das Array, das ich erhalte – in diesem Fall von meinem Trezor – ist nicht im UTF8-Format kodiert.
Was bedeutet hier uint(input)? Ist die Eingabe nicht ein Array von Bytes? Konvertiert uint(input) das Array nicht in ein Array von uints?
uint ist der Indexzähler des Arrays (wie für i = 0; i++, aber für Solidity). Es extrahiert jedes Byte aus dem Array, solange dieses Array unter 20 liegt (eine Adresse gibt ein 20-Byte-Array zurück).
Entschuldigung für meine Unwissenheit. Aber ist "i" nicht der Array-Indexzähler? In diesem Fall gibt es ein Stück Code uint(input) . Welche Operation führt das aus?