Obtener la interfaz ABI usando solc sin conexión

Supongamos que tengo un contrato de herencia (xyz.sol) con tres contratos A, B y C de modo que C es B, estoy tratando de compilar usando solc sin conexión en la consola del nodo. Al compilar, tengo tres bytecodes separados y una interfaz ABI generada. Para un solo contrato solo ABI=..... [`:xyz'].interfaz utilizada para dar solo el ABI. Ahora, debido a que hay más ABI presentes en el código compilado de salida, devuelve un error (indefinido). ¿Es posible juntar o separar toda la interfaz ABI mediante algún método de indexación?

Respuestas (1)

No entiendo esta afirmación:

Ahora, debido a que hay más ABI presentes en el código compilado de salida, devuelve un error (indefinido).

No estoy 100% seguro de "qué" exactamente devuelve el error. Depende de lo que estés haciendo, supongo. Probablemente solo debería preocuparse por la ABI del contrato que desea implementar.

Hay una ABI para cada contrato y es posible que desee implementar cualquiera de los contratos contenidos en su fuente. Encontrará que las funciones de B son parte del ABI de C.

Considere este ejemplo aún más simple:

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;
    }

}

Observe que el ABI para B contiene function aDo()porque 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"}]

El compilador le dará el ABI para A, pero realmente no lo necesita (o el código de bytes para A) a menos que planee implementar A, y probablemente no quiera hacerlo.

En la mayoría de los casos de uso, solo querrá implementar el contrato principal que ha heredado los componentes del arrendador.

Espero eso ayude.

pd Si usa Truffle, asumen que el nombre del archivo fuente coincide con el nombre del contrato que le interesará implementar (B en mi ejemplo, C en el suyo), aunque la fuente y las importaciones pueden cargarlo con muchos contratos que no se implementarán por sí mismos.