El nombre del proyecto es Aplicación de votación descentralizada (DApps) que se basa en Solidity Language. Este proyecto muestra muchas de las características de Solidity. Implementa un contrato de votación. Por supuesto, el principal problema del voto electrónico es cómo evitar que se asigne el voto duplicado.
Algunos conceptos importantes son:
1. Contrato: un contrato es como una clase en Solidity que consiste (sus funciones) y datos (su estado) que residen en una dirección específica en Ethereum Blockchain. En cada contrato, podemos definir variables de estado, métodos y eventos, etc. Un contrato inteligente se ejecuta exactamente según lo programado sin posibilidad de tiempo de inactividad, censura, fraude e interferencia de terceros.
2. Estructura: la estructura es una colección de diferentes tipos de tipos de datos, como C y C++ , que se muestra en el siguiente ejemplo:
struct Voter{ bool authorized; bool voted; }
3. Mapeo: el mapeo es como las tablas hash. Almacena el valor según la clave. No se pueden usar como parámetros o devolver parámetros de funciones de contrato que son públicamente visibles. No puede iterar sobre asignaciones, es decir, no puede enumerar sus claves. Es posible implementar una estructura de datos encima de ellos e iterar sobre eso.
Ejemplo:
mapping(address=>Voter) info;
4. Modificador: Los modificadores se utilizan para cambiar fácilmente el comportamiento de una función. Pueden verificar automáticamente las condiciones antes de ejecutar las funciones.
modifier ownerOn() { require(msg.sender==owner); _; } function temaAF(address _address) public { require(!info[_address].voted, "already voted person"); //If already not vote require(info[_address].authorized, "You Have No Right for Vote"); info[_address].voted = true; teamA++; totalVotes++; }
Explicación:
require(!info[_address].voted, "already voted person");
En primer lugar, debemos verificar que la persona haya votado o no. Si se vota Person, deténgase para continuar con el código; de lo contrario, continúe con el resto del código.
Implementación en Solidity
Solidity
// Solidity program to demonstrate // DApps pragma solidity 0.5.11; // Smart Contract for the Voting application contract VotingForTopper { // Refer to the owner address owner; // Declaring the public variable 'purpose' // to demonstrate the purpose of voting string public purpose; // Defining a structure with boolean // variables authorized and voted struct Voter{ bool authorized; bool voted; } // Declaring the unsigned integer // variables totalVotes, and for the //3 teams- A,B, and C uint totalVotes; uint teamA; uint teamB; uint teamC; // Creating a mapping for the total Votes mapping(address=>Voter) info; // Defining a constructor indicating // the purpose of voting constructor( string memory _name) public{ purpose = _name; owner = msg.sender; } // Defining a modifier to // verify the ownership modifier ownerOn() { require(msg.sender==owner); _; } // Defining a function to verify // the person is voted or not function authorize( address _person) ownerOn public { info[_person].authorized= true; } // Defining a function to check and // skip the code if the person is already // voted else allow to vote and // calculate totalvotes for team A function temaAF(address _address) public { require( !info[_address].voted, "already voted person"); require( info[_address].authorized, "You Have No Right for Vote"); info[_address].voted = true; teamA++; totalVotes++; } // Defining a function to check // and skip the code if the person // is already voted else allow to vote // and calculate totalvotes for team B function temaBF(address _address) public { require( !info[_address].voted, "already voted person"); require( info[_address].authorized, "You Have No Right for Vote"); teamB++; info[_address].voted = true; totalVotes++; } // Defining a function to check // and skip the code if the person // is already voted else allow to vote // and calculate totalvotes for team C function temaCF(address _address) public returns( string memory){ require( !info[_address].voted, "already voted person"); require( info[_address].authorized, "You Have No Right for Vote"); info[_address].voted = true; teamC++; totalVotes++; return("Thanks for Voting"); } function totalVotesF() public view returns(uint){ return totalVotes; } // Defining a function to announce // the result of voting and // the name of the winning team function resultOfVoting() public view returns( string memory){ if(teamA>teamB){ if(teamA>teamC){ return"A is Winning"; } else if(teamC>teamA){ return "C is Winning"; } } else if(teamB>teamC) { return "B is Winning"; } else if( teamA==teamB && teamA==teamC || teamB==teamC ){ return "No One is Winning"; } } }
Publicación traducida automáticamente
Artículo escrito por VikasTomar y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA