es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Contratos inteligentes: Si llamo a una función que utiliza una variable pública, ¿puede ser modificada mediante la llamada de una función de otro usuario?

Estoy creando un contrato inteligente de crowdfunding descentralizado en Solidity para aprender más sobre el lenguaje.

El contrato es capaz de almacenar muchos proyectos de crowdfunding en un mapeo que se ve así:

struct CrowdFundingProject{
    address author,
    string description,
    string title,
    uint goal,
    bool exists
}
mapping(uint, CrowdFundingProject) public projects;
uint lastProject = 0;

La clave del mapeo es un número autoincrementado. Cuando creas un proyecto, se ve así:

function createProject(string title, string desc, uint goal) public{
    CrowdFundingProject newProject;
    newProject.author = msg.sender;
    newProject.title = title;
    newProject.description = desc;
    newProject.goal = goal;
    newProject.exists = true;
    lastProject += 1;
    projects[lastProject] = newProject;
}

Pero creo que esto podría causar problemas, por ejemplo, si el usuario A ejecuta la función createProject justo cuando la EVM está ejecutando lastProject += 1; y luego el usuario B ejecuta la función también, haciendo que si lastProject era igual a 100, ahora sea 101 al mismo tiempo que projects[lastProject] = newProject; no se ha completado la ejecución para el usuario A, ambos tendrían un proyecto con el ID 101, lo cual sobrescribiría el proyecto del usuario A y solo dejaría el del usuario B.

¿Es correcto esto? Si es así, mi otro enfoque es en lugar de agregar directamente el proyecto como project[lastProject], sería mejor hacer algo como:

lastProject += 1;
uint myProjectsId = lastProject - 1;
projects[myProjectsId] = newProject;

No sé si este enfoque pueda causar algún tipo de error, o si el error de sobrescritura es incluso posible, así que quiero asegurarme:

¿Puede ocurrir un error como la superposición de IDs?
Si es así: ¿El segundo enfoque que propuse tendría algún comportamiento extraño?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible que ocurra el problema de IDs superpuestos según se describe. Esto se conoce como una condición de carrera, donde varios usuarios están modificando los mismos datos al mismo tiempo, lo que puede llevar a un comportamiento inesperado.

    Tu segundo enfoque de utilizar una variable separada para almacenar el ID antes de agregar el nuevo proyecto al mapeo es una buena solución para evitar este problema. Al hacer esto, te aseguras de que el ID sea único antes de agregar el nuevo proyecto al mapeo, evitando cualquier superposición con otros proyectos. Este enfoque se utiliza comúnmente en Solidity para prevenir condiciones de carrera al modificar datos en un contrato inteligente.

    Utilizando este enfoque, no debería haber ningún comportamiento extraño ni errores que ocurran, siempre y cuando manejes correctamente la variable de ID y te asegures de que se establezca correctamente.

Comments are closed.