Увидев некоторые неожиданные результаты компиляции, я сократил проблему до этого крошечного примера:
Следующее компилируется под 0.4.10 в Remix:
contract StorageMapping {
struct S {
mapping(bytes32 => uint) m;
bytes32[] b;
uint x;
}
mapping(bytes32 => S) public sStructs;
}
Однако следующее не удается скомпилировать с « Внутренний тип не разрешен для переменной состояния, ссылаясь на сопоставление. Выборочная проверка 3.x и 2.x. Результат соответствует версии 0.2.1 (0.2.0 выдает внутреннюю ошибку компилятора ).
Отличие контрактов только в том, что одна строка закомментирована.
contract StorageMapping {
struct S {
mapping(bytes32 => uint) m;
bytes32[] b;
// uint x;
}
mapping(bytes32 => S) public sStructs;
}
Кажется важным добавить в структуру простое значение (даже если оно не нужно). Это заставляет меня задаться вопросом, что на самом деле происходит.
Кто-нибудь знает причину, по которой отображаемой структуре требуется хотя бы одно простое значение, чтобы избежать путаницы ?
Спасибо chriseth за указание на то, что невозможно собрать геттер для sStructs, когда структуры содержат только индексированные типы. Поскольку он объявлен public
, компилятору не понравится, что его попросят создать невозможный геттер.
Удалите public
и оба аромата и скомпилируйте.