¿Cómo mapear una dirección con una matriz de cadenas en solidez?

Objetivo: deseo almacenar una serie de nombres con una dirección en un contrato inteligente. Es más como pares clave-valor donde las direcciones se emparejan con una lista de cadenas de tipos.

¿Puedo usar el mapeo para implementar esto? Véase más abajo, por ejemplo.

mapping(address => strings[]) userAddress2UserNames;

¿O hay un enfoque diferente?

Experimentos que realicé

No recibí ningún error cuando compilé el código anterior, pero cuando llamé a un método que devuelve una cadena [] de este mapeo, recibí un error que se indica a continuación.

TypeError: This type is only supported in the new experimental ABI encoder. Use "pragma experimental ABIEncoderV2;" to enable the feature.

No estoy muy al tanto de esta versión, pero asumo que no debería hacer una implementación a nivel de producción con ella porque puede ser que no sea estable. (Por favor, corríjame si estoy equivocado)

Por favor sugiérame una manera de lograr mi objetivo.

Actualmente no puedes usar cadenas como esa. Una cadena en sí misma es una matriz de bytes y está asignando una matriz de una matriz de bytes. Solidity no tiene la función para hacer eso, pero sintácticamente está bien. Dado que es una función que aún se está desarrollando, es por eso que recibe ese error. ¿Qué versión de solidez está utilizando, es decir, cuál es el número junto a pragma solidity?
estoy usando 0.4.24
Así que realmente quiero implementar dicho mapeo. ¿Cuáles son las otras formas de hacerlo? ¿Estructuras? matriz 2-d de tipo bytes32? Estoy bastante confundido.
Pruebe el mismo código en 0.4.25 o 0.5.0 y luego podrá hacerlo. No sé nada más lo siento.

Respuestas (3)

¿Cuánto duran los nombres de usuario? Tal vez pueda usar bytes32 en lugar de una cadena (cada nombre de usuario estaría limitado a 32 caracteres). Al hacer esto, no estaría combinando dos niveles de arreglos dinámicos, lo cual no está permitido en la versión actual.

El compilador generará captadores automáticamente para las variables declaradas como públicas.

mapping(address => strings[]) userAddress2UserNames;

En este caso, el captador se verá como

function userAddress2UserNames(address _addr, uint _index);

Debe proporcionar una dirección y un índice para la matriz.

¿Cómo podemos insertar datos en el mapeo? userAddress2UserNames[msg.sender] = ? ¿Cómo enviar datos aquí?
@ShubhamChadokar Dado que es una matriz de almacenamiento, puede enviarla: userAddress2UserNames[msg.sender].push("name"). Si tienes más dudas es mejor que hagas una nueva pregunta.

Como lo sugiere @Patricio, use bytes en lugar de cadenas.
En las versiones actuales existen muchas limitaciones en el uso de cadenas. Así que mejor usa bytes.
Lo que desea lograr es una asignación de uno a muchos. Pero las asignaciones son únicas y no puede asignar una clave con muchos valores, por lo que debe usar struct en este caso.
Sigue el siguiente enlace que lo han explicado muy bien.
https://ethereum.stackexchange.com/a/38842/24373