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.
¿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.
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
RD
Gagan
Gagan
RD