¿Es un contrato 'algo' equivalente a una tabla o una fila en una base de datos tradicional?

Siguiendo la analogía de que una cadena de bloques es una especie de base de datos , estoy tratando de entender cómo deben estructurarse y almacenarse mis datos en la cadena de bloques.

He leído sobre escribir contratos en solidez y veo que los contratos pueden contener tipos de datos complejos, como asignaciones, matrices y puntales, etc.

¿Debo almacenar datos de tabla de tipo base de datos, dentro de uno de estos dentro de un contrato, o debo crear muchos contratos del mismo tipo y almacenar una fila de datos en cada uno?

Quizás un ejemplo ayude a explicar, digamos que quiero almacenar relaciones entre cuentas de usuario, ¿crearía un contrato de 'tabla' de la siguiente manera?

pragma solidity ^0.4.0;

/// @title Company roles.
contract CompanyRole {

    mapping(address => address) public directors;
}

o un contrato de 'fila':

pragma solidity ^0.4.0;

/// @title Company roles.
contract CompanyRole {

    address person; // company the role is valid for
    address company; // company the role is valid for
    uint type;   // the type of role
}

Sería útil conocer las ventajas y desventajas de ambos enfoques u otros, incluidas las implicaciones de costos.

Básicamente, mi pregunta es ¿dónde se deben almacenar los datos de la tabla?

Respuestas (1)

Solidity nos brinda estructuras, matrices, asignaciones y registros de eventos, pero nada que se parezca mucho a las tablas de la base de datos. Tenemos que idear implementaciones con características completas a un nivel más bajo del que podríamos estar acostumbrados.

No hay una respuesta correcta para cada situación. Puedo describir algunos casos de uso.

Un contrato de fila crearía cada instancia como una pequeña entidad similar a un objeto con métodos de acceso. Este es probablemente el más caro en gasolina. Este tipo de patrón de fábrica tiene casos de uso; siempre que haya una razón para crear muchas copias de un contrato base, como una fábrica de fichas. En la práctica, encuentro que normalmente quiero mantener una lista de los contratos creados.

Un contrato de tabla que utiliza matrices permite la iteración sobre estructuras cuando no se conocen las claves, pero no proporciona acceso aleatorio cuando se conocen las claves.

Un contrato de tabla que utiliza asignaciones permite el acceso aleatorio a las estructuras cuando se conocen las claves, pero no enumera las claves cuando no se conocen ni las cuenta.

Los emisores de eventos pueden informar a los clientes sobre los cambios de estado. Estos pueden incluir índices de búsqueda y pueden ser informativos para los clientes. A veces resuelve el problema de que el cliente no tenga una forma obvia de conocer las claves válidas.

He encontrado que es bastante común necesitarlo todo. Acceso aleatorio cuando se conocen las claves, pero también una forma de navegar por las claves cuando no se conocen. Para lograr eso, puede tener una asignación a estructuras en combinación con una matriz de claves.

ingrese la descripción de la imagen aquí

Una explicación bastante detallada con código de ejemplo: https://medium.com/@robhitchens/solidity-crud-part-1-824ffa69509a#.jh7gw1ekm

Actualización: algunos patrones de almacenamiento simples aquí: Blog: Patrones de almacenamiento simples en Solidity

Muchísimas gracias. El enlace solidity CRUD parece muy útil, lo leeré en detalle
Espero eso ayude. Se refiere descaradamente a votar/responder en caso de que la respuesta sea útil. :-)