Devolver asignaciones/matrices completas

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?

Respuestas (1)

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.

  1. Ni una sola operación con n iteraciones y costo creciente. 25.000 operaciones con un coste fijo de gas, exactamente lo mismo a cualquier escala. Llévatelos de uno en uno.
  2. Use registros de eventos para informar a los clientes sobre todos los cambios de estado importantes: crear, recuperar, actualizar, eliminar. De hecho, escuchar los registros de eventos y modificar las tablas locales puede ser el único lado del cliente que necesita.

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 mappingo 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.