Получение интерфейса ABI с помощью solc в автономном режиме

Предположим, у меня есть контракт наследования (xyz.sol) с тремя контрактами A, B и C, так что C является B, я пытаюсь скомпилировать с помощью solc в автономном режиме в консоли узла. После компиляции у меня есть три отдельных байт-кода и сгенерированный интерфейс ABI. Только для одного контракта ABI=..... [`:xyz'].interface используется для предоставления только ABI. Теперь, поскольку в выходном скомпилированном коде присутствует больше ABI, он возвращает ошибку (undefined). Можно ли объединить весь интерфейс ABI или разделить его каким-либо методом индексации?

Ответы (1)

Я не понимаю этого утверждения:

Теперь, поскольку в выходном скомпилированном коде присутствует больше ABI, он возвращает ошибку (undefined).

Я не уверен на 100%, что именно возвращает ошибку. Зависит от того, что ты делаешь, я полагаю. Вероятно, вас должен интересовать только ABI контракта, который вы хотите развернуть.

Для каждого контракта существует ABI, и возможно, вы захотите развернуть любой из контрактов, содержащихся в вашем исходном коде. Вы обнаружите, что функции B являются частью ABI C.

Рассмотрим еще более простой пример:

pragma solidity 0.4.18;

contract A {

    function aDo() public pure returns(bool success) {
        return true;
    }
}

contract B is A {

    function bDo() public pure returns(bool success) {
        return true;
    }

}

Обратите внимание, что ABI для B содержит, function aDo()потому что B is A.

[{"constant":true,"inputs":[],"name":"bDo","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"aDo","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"}]

Компилятор предоставит вам ABI для A, но дело в том, что он вам на самом деле не нужен (или байт-код для A), если только вы не планируете развертывать A, а вы, вероятно, этого не хотите.

В большинстве случаев вам нужно развернуть только основной контракт, который унаследовал компоненты арендодателя.

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

ps При использовании Truffle они принимают/делают предположение, что имя исходного файла совпадает с именем контракта, который вы будете заинтересованы в развертывании (B в моем примере, C в вашем), хотя исходный код и импорт могут загрузить его многими контракты, которые не будут развернуты сами по себе.