recuperar datos de un contrato inteligente

Tengo el siguiente código de Solidity:

pragma solidity ^0.4.18;

contract ContractsRegistry {

  address owner;

  struct ContractInfo {
    bytes32 subject;
    bytes32 companyName;
    string contactName;
    string contactEmail;
    string contactPhone;
  }

  mapping(address => ContractInfo) contractsMap;
  address[]   addresses;

Quiero mostrar el contenido completo del mapeo contractsMapen la aplicación web. ¿Cuál sería el mejor enfoque para lograr esto? Aquí hay algunas preguntas adicionales:

  • ¿Es posible convertirlo a representación JSON de alguna manera?

  • ¿Debo usar otra estructura de datos?

  • ¿Es una forma habitual de usar un contrato inteligente o nadie lo hace así?

Respuestas (2)

No puede usar el mapeo si necesita acceder a "todos" los datos almacenados. El objetivo del mapeo es encontrar de una manera rápida y ágil EL registro que está buscando mediante una búsqueda rápida en la tabla hash.

El único elemento iterable práctico podría ser una matriz en la que el registro único sea su estructura previamente almacenada, pero debe insertar ese registro en la matriz al escribir el elemento de asignación único (esto en el caso de que su asignación sea realmente necesaria para su trabajo porque su capacidad para ser rápido y asegurar el ahorro de gas en la recuperación}.

Podría, de esa manera, usar la matriz solo para enumerar y el mapeo solo para buscar.

Una segunda posibilidad más rápida podría ser hacer que la asignación genere el índice en la matriz, que se puede usar para recuperar los datos sin duplicar el espacio de memoria utilizado.

Cuando llega un nuevo registro, debe escribirlo en la matriz junto con la dirección o no, dependiendo de su aplicación, recuperar el índice en la matriz y luego escribir en la asignación {dirección, índice}

al recuperar una estructura a través de una llamada a un contrato inteligente, obtendrá una matriz simple que le brinda los valores sin las claves.

Obtendrás algo como esto:["mysubject","mycompanyname","mycontactname","mycontactemail","mycontactphone"]

no tendrás un objeto mapeado. Tendrá que saber exactamente cuál es la estructura que ha recuperado y el orden de las claves definidas, para que de esta manera pueda reconstruir el mapeo del objeto dentro de su aplicación/sitio web/middleware/lo que sea que hizo la llamada

Quiero recuperar todas las asignaciones, no solo la estructura, por lo que debería ser una matriz multidimensional
Desafortunadamente, eso no es posible. Solo podrá recuperar un elemento a la vez a través del captador creado automáticamente al hacer pública la asignación.
@ pabloruiz55 ¿Qué hay de usar otra estructura de datos? ¿O puede ser una buena idea iterar el mapa y ensamblar una matriz de objetos JSON y luego devolverla como una cadena?
No puede iterar asignaciones. Puede crear una matriz que almacene las claves de cada estructura en el mapeo y luego, en su Dapp, para cada elemento, obtenga una estructura, recree el objeto json y agréguelo a una matriz para luego mostrarlo como desee.
@ pabloruiz55, "y luego, en su Dapp, para cada elemento, obtenga una estructura", ¿quiere decir hacer una llamada al método de contrato () para recuperar cada estructura?
Sí. No puede devolver una matriz de estructuras de solidity, por lo que solo le queda la opción de obtener cada una en llamadas separadas y luego agregarlas a una matriz en su dapp. Si su matriz de estructuras tiene 10 elementos, entonces haría 10 llamadas e insertaría cada resultado en una matriz en el front-end.