Функция библиотеки не найдена в интеллектуальном контракте Solidity - PullRequest
0 голосов
/ 03 ноября 2018

Я создал проект для DApp на языке Solidity для Ethereum со следующей структурой:

... ReinsuranceProject ..... договор ....... Reinsure.sol .....библиотека ....... Strings.sol

В контракте Reinsure.sol я импортировал Strings.sol, который является библиотекой, например: import "../Strings.sol"; Эта библиотека содержит функцию, которая преобразует байты в строку. В мой основной контракт Reinsure.sol я добавил следующие строки: using StringsLib for bytes; (StringLib его, потому что сама библиотека называется так, а не файл) и в другом методе я хочу вернуть varBytes.toString();

Однако при компиляции проекта я получаю эту ошибку:

TypeError: член "toString" не найден или не виден после зависимого от аргумента поиска в байтовой памяти \ n

Метод toString объявлен так:

function toString(bytes32 x) constant internal returns (string)

Версия Solidity для компилятора pragma solidity "0.4.25"; (я использую код Visual Studio с расширением для Solidity)

Вопросы: если проблема заключается в импорте, как правильно импортировать библиотеку Strings.sol с указанной структурой проекта? Если нет, я неправильно назвал классы, и если да, то как это исправить? Есть ли способ сделать файл конфигурации для путей, чтобы сделать это проще?

Буду очень признателен за помощь и заранее благодарю!

1 Ответ

0 голосов
/ 03 ноября 2018

Вы смешиваете типы. bytes является динамическим массивом, а bytes32 является статическим. Измените using StringLib for bytes на using StringLib for bytes32.

Пример:

pragma solidity ^0.4.25;

library StringsLib {
    function toString(bytes32 self) constant internal returns (string) {
        // Convert bytes32 to string
    }
}

Контракт:

pragma solidity ^0.4.25;

import "./StringsLib.sol";

contract LibraryClient {
    using StringsLib for bytes32;

    function doSomething(bytes32 x) public constant returns (string) {
        return x.toString();
    }
}
...