C# — преобразовать адрес Ethereum ABI в строку (Solidity)

Я новичок в Ethereum, поэтому, пожалуйста, извините мое невежество. Ethereum, похоже, имеет протокол сериализации ABI под названием Solidity. Спецификация находится здесь: https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI .

Я ищу способ кодировать и декодировать контракты на С#. В частности, я хочу взять массив байтов (byte[]) и преобразовать его в удобочитаемый адрес Ethereum в качестве отправной точки.

Вот несколько библиотек, которые я клонировал, но после просмотра кода не сразу понятно, как добиться того, что я пытаюсь сделать:

https://github.com/Нетериум/Нетериум

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

Может ли кто-нибудь указать мне пример того, как преобразовать массив байтов в удобочитаемый строковый адрес Ethereum?

Ответы (1)

В солидности:

Пример преобразования адреса в байтовый массив, а затем в строку:

/// @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);
}

В С#:

Превращение массива байтов в строку:

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

Где addrByteArrayнаходится адрес в формате байтового массива.

Надеюсь, это поможет.

Спасибо. Я пробовал это, но все, что я получаю, это искаженные символы. Массив, который я получаю — в данном случае от моего Trezor, не закодирован в формате UTF8.
в чем здесь смысл uint(input)? Разве ввод не является массивом байтов? Разве uint(input) не преобразует массив в массив uint?
uint — это счетчик индекса массива (как для i = 0; i++, но для Solidity). Он извлекает каждый байт из массива, если этот массив меньше 20 (адрес вернет 20-байтовый массив).
Извините за мое невежество. Но разве «i» не счетчик индекса массива? В данном случае есть кусок кода uint(input) . Какую операцию он выполняет?