msg.sender
es una variable global incorporada en Solidity que devuelve la dirección del remitente de una transacción o llamada. Su valor cambia dinámicamente con cada interacción, reflejando la dirección de quien inicia la acción.
1. Especificidad: Identifica al remitente actual de la transacción.
2. Fiabilidad: Es una fuente confiable para autenticar acciones.
3. No mutable: Su valor no puede ser alterado dentro del contrato.
msg.sender
msg.sender
se utiliza para restringir el acceso a funciones específicas del contrato.
pragma solidity ^0.8.0;
contract Permisos {
address public owner;
constructor() {
owner = msg.sender; // Almacena la dirección que despliega el contrato
}
// Función restringida al propietario
function soloPropietario() public view returns (string memory) {
require(msg.sender == owner, "No tienes permiso");
return "Acceso concedido";
}
}
En este ejemplo:
soloPropietario
.
msg.sender
puede utilizarse para registrar direcciones que interactúan con el contrato.
contract Registro {
mapping(address => bool) public usuarios;
// Registrar al remitente
function registrar() public {
require(!usuarios[msg.sender], "Ya registrado");
usuarios[msg.sender] = true;
}
// Verificar si un usuario está registrado
function esUsuarioRegistrado(address usuario) public view returns (bool) {
return usuarios[usuario];
}
}
En este caso:
msg.sender
asegura que cada dirección registre solo su propia cuenta.
msg.sender
es crucial para gestionar transacciones financieras dentro de contratos.
contract Transferencias {
mapping(address => uint) public saldos;
// Depositar Ether en el contrato
function depositar() public payable {
saldos[msg.sender] += msg.value;
}
// Retirar Ether del contrato
function retirar(uint cantidad) public {
require(saldos[msg.sender] >= cantidad, "Saldo insuficiente");
saldos[msg.sender] -= cantidad;
payable(msg.sender).transfer(cantidad);
}
}
En este ejemplo:
msg.sender
identifica qué usuario está depositando o retirando fondos.
payable(msg.sender)
asegura que los fondos se transfieran al remitente.
1. Autenticación:
2. Gestión de pagos:
3. Registro y seguimiento:
contract Mercado {
struct Producto {
string nombre;
uint precio;
address vendedor;
}
Producto[] public productos;
// Añadir un nuevo producto al mercado
function listarProducto(string memory nombre, uint precio) public {
productos.push(Producto(nombre, precio, msg.sender));
}
// Comprar un producto
function comprarProducto(uint indice) public payable {
Producto memory producto = productos[indice];
require(msg.value == producto.precio, "Precio incorrecto");
require(producto.vendedor != msg.sender, "No puedes comprar tu propio producto");
// Transferir Ether al vendedor
payable(producto.vendedor).transfer(msg.value);
// Eliminar el producto vendido
delete productos[indice];
}
}
En este mercado:
msg.sender
identifica al vendedor al listar productos.
msg.sender
1. Validar siempre:
require
para verificar que msg.sender
cumpla con los permisos necesarios.
2. Evitar confusiones con contratos intermedios:
msg.sender
refleja la dirección del contrato intermedio, no del usuario final.
3. Combinar con lógica adicional:
msg.sender
para rastrear actividad o validar acciones.
1. No identifica al usuario final con contratos intermedios:
msg.sender
será la dirección del contrato intermedio.
2. No se puede falsificar:
3. Costo de gas:
msg.sender
consume gas adicional en funciones públicas.
msg.sender
1. Seguridad:
2. Simplicidad:
3. Versatilidad:
Para más información sobre msg.sender
, consulta la documentación oficial de Solidity.
Jorge García
Fullstack developer