En un contrato (solo una demo) tengo:
struct Bank {
string name;
mapping(address => uint) balances;
}
mapping(address => uint) userIsAtBank;
Bank[] banks;
Ahora me gustaría tener una función que copie el mapeo userIsAtBank/ los bancos de matriz sin pasar por él (como todos los valores en una devolución) y establezca un nuevo mapeo con los mismos valores. En mi ejemplo: userIsAtBankNew = userIsAtBank - y: banksNew = banks. ¿Es eso posible?
Si no es posible, ¿cuál es la mejor manera de pasar por una longitud de 25 000 (si, por ejemplo, el último banco es banks[25000]) sin que la transacción sea rechazada o sea demasiado costosa?
Está en el camino correcto al cambiar su pensamiento para aumentar los costos.
Es posible que pueda mover el límite ligeramente con eficiencias, pero la única forma de resolver el problema es reconsiderar el enfoque para que cada transacción se complete en O (1) ... una operación.
El enfoque sugerido no es muy blockchain. Supongamos que el cliente, Alice, obtiene la lista de 25 000 bancos. ¿Por qué lo buscaría de nuevo? Si está escuchando registros de eventos, entonces sabrá sobre el número de banco 25,001 cuando se agregue. ¿Por qué necesitaría preguntar?
Puede utilizar un enfoque doble.
Eche un vistazo a Mapped Struct with Index aquí: ¿Existen patrones de almacenamiento simples y bien resueltos para Solidity?
La estructura de datos comienza exactamente según su patrón. Lo que sigue son funciones para tratar con instancias individuales a la vez. Explicado con la justificación y un ejemplo más completo aquí: https://medium.com/@robhitchens/solidity-crud-part-1-824ffa69509a
Espero eso ayude.
PD Debo mencionar que no es posible enumerar o contar las claves en un mapping
o pasar asignaciones de un solo trago. Puede hacerlo con matrices dinámicas, pero no es completamente compatible y no funciona entre contratos. Una fila a la vez evita las limitaciones y los problemas de escala.