Solução blockchain para controle de ponto.
- #Blockchain
Creio que muitos de nós já se irritaram com aqueles irritantes papéis emitidos pelos controles de ponto. Esses papéis são difíceis de gerenciar, ocupam espaço, você os perde e por melhor que os guarde, ainda há o risco deles serem apagados com o tempo.
Pensando nisso, resolvi criar uma solução para armazenar esses registros. Sei que já existem diversas soluções profissionais e com ótimo custo no mercado capaz de atender aos mais diversos cenários para demandas de controle de ponto. Mas pensei, já que estou focado no estudo de blockchain, entendi que seria interessante criar uma solução que aliasse essa necessidade com a tecnologia blockchain.
Para desenvolver essa solução, criei um Smart Contract em Solidity, utilizando Remix - Ethereum. Neste pocket project pude trabalhar com conceitos interessantes envolvendo essa tecnologia, entre eles variáveis de estado, definição de um owner do contrato, variáveis memory e storage, modifiers, visibilidade e tipos de retorno.Neste Smart Contract há funções de execução exclusiva do owner do contrato e outras públicas, acessíveis por qualquer um. Nas funções exclusivas do owner estão a definição do nome do utlizador, a empresa, o documento e, é claro, registrar o ponto. Ou seja, somente aquele que criou o contrato pode definir estas variáveis.
Quanto às funções de acesso público estão a visualização dos dados do proprietário, com nome, empresa e o documento; o histórico de registro de ponto; e o endereço do proprietário do contrato.
O contrato foi feito na versão 0.8.12 do Solidity
pragma solidity ^0.8.12;
O contrato tem as seguintes variáveis de estado. Todas elas com visualização internal, sendo acessíveis apenas com métodos próprios.
address internal owner;
mapping(address => string[]) internal registroPonto;
string[] internal pontoArray;
string internal nome;
string internal empresa;
string internal cpf;
Na sequência, o construtor define qual o endereço do owner do contrato.
constructor () {
owner = msg.sender;
}
Temos então, um modifier que será utilizado em funções chave do contrato.
modifier onlyOwner {
require (msg.sender == owner);
_
}
Na sequência temos a funções de definição das variáveis de estado acessíveis apenas pelo owner do contrato que permitem definir o nome, a empresa, o cpf e registrar o ponto.
function setNome(string memory _nome) public onlyOwner{
nome = _nome;
}
function setEmpresa(string memory _empresa) public onlyOwner{
empresa = _empresa;
}
function setDocumento(string memory _cpf) public onlyOwner{
cpf = _cpf;
}
function registrarPonto(string memory hora) public onlyOwner{
pontoArray.push(hora);
registroPonto[owner] = pontoArray;
}
E depois, as funções públicas acessíveis por qualquer pessoa que permitem verificar todos os registros de ponto, os dados do proprietário e o endereço do proprietário.
function getPonto() public view returns(string[] memory) {
return pontoArray;
}
function getProprietario() public view returns(string memory) {
string memory dados;
dados = string.concat(dados, nome);
dados = string.concat(dados, ",");
dados = string.concat(dados, empresa);
dados = string.concat(dados, ",");
dados = string.concat(dados, cpf);
return dados;
}
function getEnderecoProprietario() public view returns(address) {
return owner;
}
E é claro, como todo Smart Contract, é preciso conectar sua carteira web3 para ter acesso e interagir com as funções. Fiz o mint do contrato na rede de testes da Ethereum, Rinkeby, mas é possível publicá-lo em qualquer rede.
O próximo passo, neste projeto, é evoluir as funções de interação com o contrato e padronizá-lo dentro das especificações da ERC721. Em paralelo, criar uma interação com algum framework frontend como React, por exemplo, e biblioteca Web3 para interagir com o contrato. Em último, mas não menos importante, evoluir este projeto para registrar geolocalização e foto do utilizador, para poder gravar a foto e o local onde o ponto está sendo registrado, pois com essas implementações, creio que irá trazer recursos importantes para aquelas empresas que precisam registrar a rotina de trabalho de seus colaboradores que tem local de trabalho itinerante, ou seja, não estão todo dia no mesmo local.
Acho que já falei de mais... O código do projeto está disponível em meu GitHub .
https://github.com/gilrsantana/BlockchainToys/blob/main/ControlePonto.sol
Dá uma olhadinha lá, tenho certeza que você vai gostar.