Escribiendo y compilando tu primer Smart-contract
Curso de Arquitectura de Aplicaciones Descentralizadas en Ethereum
Contenido del curso
José Valentin Salina Peña
Didier Zuñiga
Julio Rogers Cajas Guncay
Francisco Rappazzini
Gerardo Lopez Falcon
ProfesorOtto Napoleón Mendoza Quant
Gerardo Lopez Falcon
ProfesorDany R
Marcelo Haro
Dario Macedo
Gerardo Lopez Falcon
ProfesorEste codigo tiene un problema, si hay mas de un owner con comidas voy a terminar accediendo a espacios del array que no existen, asi lo solucione:
PlatziFoodItem[] memory myFoods = new PlatziFoodItem[](itemCount); uint256 nextPosition = 0; for (uint256 i = 0; i < platziFoods.length; i++){ if(platziFoods[i].owner == msg.sender) { myFoods[nextPosition] = platziFoods[i]; nextPosition += 1; } }
si, eso ví, supongo que lo hizo para solucionarlo mas adelante en el curso 😅
@alexis-lozano-teran
Te explico el problema con el siguiente ejemplo: 0: comida de Julio 1: comida de Julio 2: comida de Alex 3: comida de Julio
Podemos ver que el espacio para myFoods es de 3 items.
Sin embargo, si guardamos en myFoods usando el iterador i. myFoods se estaria guardando de la siguiente manera: myFoods[0], myFoods[1], myFoods[3]. Este ultimo es un problema. Ya que lo correcto hubiese sido que se guarde myFoods[2], ya que se establecio espacio solo para 3 items, myFoods[3] vendria ser un 4to item.
Hola. No seria mas eficiente tener un mapping(address => uint) para guardar la cantidad de comidas por address (y asi poder usarlo para crear el array estatico en getPlatziFoodsByOwner()) ? En la funcion addPlatziFood() despues del .push agregaria + 1 al address del mapping. Tal vez usar un mapping de manera persistente es menos eficiente, pero se me ocurrio para no hacer un doble for en la function getPlatziFoodsByOwner(). Gracias!
podría... coméntame cómo te fue
Alguien me puede ayudar con el código correcto del platziFoods siempre me salen parse error ya llevo días y no lo soluciono alguien lo tendrá completo
No entiendo a que te refieres con el código correcto? Ya que el ejemplo está correcto. Muestranos tú código, a ver que puede ser el error y ver como te ayudamos :)
Usa memory en los argumentos, pero lo adecuado es calldata
Tipos de almacenamiento
Storage: Memoria persistente. Es el más costoso. Similar a la memoria ROM, almacenamiento dentro del contrato, garantiza que el valor va a seguir existiendo, se va a mantener.
Memory: Variables temporales durante ejecución. Se asimila a la RAM, ligado al ámbito de la función que lo declara, es de costo menor a storage.
Calldata: es donde se alojan los parámetros, de comportamiento similar a memory. Son constantes definidas en el entorno de ejecución de una variable. No son modificables.
Cuál sería la diferencia entre usar un array o un mapping?
Basicamente un array almacena indices. Un mapping no, es relación key:value. Te dejo un link con más información https://www.devtwins.com/blog/understanding-mapping-vs-array-in-solidity