Usando cadenas como índices en Solidity

¿Puedo usar cadenas como identificadores en un mapeo de Solidity?

Quiero algo como esto:

contract C {
    mapping(string => mapping(address => uint)) public balances;
    string[] public tokennames; 
    mapping(string => uint) public tokennameIndex;
}

Cada cadena representará un saldo de token diferente. La lista de tokens se mantendrá (agregar, editar, eliminar, reorganizar) mediante una cuenta de administrador. Una alternativa para esto es usar diferentes contratos para cada token, pero un mapeo 2-D de alguna manera parece más fácil, dado que el almacenamiento no será demasiado grande. También elimina la necesidad de una lista de direcciones de contrato. ¿Tiene sentido tal indexación? ¡Gracias!

Respuestas (2)

De momento no creo que puedas. De los documentos de solidez :

Los tipos de mapeo se declaran como mapeo (_KeyType => _ValueType). Aquí, _KeyType puede ser casi cualquier tipo, excepto una asignación, una matriz de tamaño dinámico, un contrato, una enumeración y una estructura.

Tenga en cuenta que una cadena es una matriz de tamaño dinámico .

Todavía podría lograr lo mismo, por ejemplo, usando el código de token de tres letras como KeyType, en lugar del nombre completo del token.

Las cadenas no funcionan como claves de mapeo. Haga un hash de la cadena con keccak256()y use el resultado bytes32como la clave de mapeo.

En cuanto al enfoque de usar una matriz bidimensional en lugar de una instancia de contrato separada por token, está bien, siempre que:

  • No necesita exponer alguna interfaz estándar, como ERC20, que espera que cada token tenga una instancia de contrato
  • No es necesario que le des a diferentes tokens diferentes comportamientos.