Siguiendo mi ejemplo de sensor de temperatura, supongamos que el sensor forma parte de un proyecto agrícola de alta tecnología donde se quiere monitorear la temperatura de un campo en tiempo real. Este proyecto agrícola busca financiamiento, y la comunidad puede enviar fondos (ether) para apoyarlo.
fundProject:
Los interesados pueden financiar el proyecto enviando ether. Esto podría ser usado para mantener el sensor, para realizar investigaciones relacionadas con los datos recopilados, o para expandir el proyecto y agregar más sensores.
changeProjectStatus:
A medida que el proyecto avanza, el propietario puede cambiar el estado del proyecto para informar a la comunidad sobre su progreso.
Funciones de visibilidad:
public: Pueden ser llamadas desde fuera y dentro del contrato. Por ejemplo, geoposition es una variable pública, por lo que se genera automáticamente una función getter que permite a cualquier persona ver la geoposición.
external: Solo pueden ser llamadas desde fuera del contrato. Es más eficiente que public para funciones que siempre serán llamadas desde fuera. Ejemplo: updateTemperature.
internal: Solo pueden ser llamadas desde el mismo contrato o contratos derivados. Son útiles para funciones de utilidad que no deben ser expuestas. Ejemplo: internalFunction.
private: Solo pueden ser llamadas desde el mismo contrato. Son útiles para funciones y variables que no deben ser accesibles de ninguna otra manera. Ejemplo: privateFunction
Este contrato ahora no solo registra y actualiza la temperatura, sino que también permite el financiamiento del proyecto y la actualización del estado del mismo. En un contexto real, esto podría representar un sistema de crowdfunding para proyectos agrícolas que desean utilizar sensores IOT para mejorar sus operaciones.
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.8.7 <0.9.0;
contract TemperatureSensor {
// Datos del sensor
string public geoposition;
string public macAddress;
int public temperature;
address public owner;
address public wallet;
uint public funds;
enum ProjectStatus { NotStarted, InProgress, Completed }
ProjectStatus public status;
modifier onlyOwner() {
require(msg.sender == owner, "Only the owner can perform this action");
_;
}
constructor(
string memory _geoposition,
string memory _macAddress,
int _initialTemperature,
address _wallet
) {
geoposition = _geoposition;
macAddress = _macAddress;
temperature = _initialTemperature;
owner = msg.sender;
wallet = _wallet;
funds = 0;
status = ProjectStatus.NotStarted;
}
function updateTemperature(int _newTemperature) external onlyOwner {
temperature = _newTemperature;
}
function fundProject() external payable {
funds += msg.value;
}
function changeProjectStatus(ProjectStatus _newStatus) external onlyOwner {
status = _newStatus;
}
// Función con visibilidad internal
function internalFunction() internal view returns(uint) {
return funds * 2;
}
// Función con visibilidad private
function privateFunction() private view returns(uint) {
return funds / 2;
}
// Estas funciones son solo para demostrar la visibilidad. No tienen un propósito real en este contrato.
}