¿Contratos anidados en Solidity?

Según la documentación de Solidity 0.4.16, los contratos son similares al concepto de Clase de un lenguaje orientado a objetos. Dicho esto, ¿podemos crear un contrato dentro de un contrato?

En caso afirmativo, explique con una muestra de trabajo o al menos proporcione una clasificación en varios tipos de contratos anidados que podemos crear.

SI no, qué nos impide hacer, es decir, desafíos prácticos al tomar esta decisión de no tener contratos anidados en solidez.

Problema planteado en líneas similares pero que NO aborda directamente esta pregunta: testrpc, ¿contrato de creación de contrato no extraído?

Respuestas (2)

La solidez permite que un contrato herede de otros contratos.

Solidity también permite estructuras de datos personalizadas dentro de un contrato. Estos tipos de estructura podrían tomar el lugar de un contrato dentro de un contrato de "clase privada" (Java) para la mayoría de los usos.

Y los contratos de Solidity pueden crear nuevos contratos (patrón de "fábrica"), aunque los nuevos contratos no necesitan tener ningún vínculo con el "padre". Los contratos pueden llamar a métodos en todos los demás contratos, por lo que un contrato puede tratar a otro como un "hijo" o una "biblioteca" solo en la forma en que usa ese contrato, pero no existe una relación formal entre ellos.

No, los contratos no se pueden anidar en Solidity. Ejecute el siguiente fragmento de código en Remix para comprobarlo usted mismo:

// SPDX-License-Identifier: Unlicense
pragma solidity >=0.8.4;

contract Foo {
    uint256 public foo;

    contract Bar {
        uint256 public bar;
    }
}

La compilación falla con el siguiente error:

> from solidity:
ParserError: Function, variable, struct or modifier declaration expected.
 --> contracts/Foo.sol:7:5:
  |
7 |     contract Bar {
  |     ^^^^^^^^