Creando un Smart Contract que hace la función de un Crowdfunding similar a kickstarter

in Develop Spanish9 months ago

Saludos cordiales, en el día de hoy voy a crear un kickstarter pero mejor porque lo voy a crear con un Smart Contract, que quiere decir esto ? Que mi dApp es descentralizada es decir que no depende de un tercero, ya que está distribuida en Miles de nodos alrededor del mundo. Además de distribuida es muy segura y es muy difícil de hackear digamos que imposible.

Pongámonos en contexto.
El funcionamiento de nuestra dApp será algo así:

Una persona quiere dinero para crear algo, dinero que no tiene, y el desea que las personas lo ayuden a crear ese "algo" digamos que desea crear un carro que vuela, y por ende necesita dinero para ello. El crea un Smart Contract para que las personas le den dinero. Pero las personas (contribuyentes deciden el destino de ese dinero) los que contribuirán tendrán la potestad de votar si esa persona gasta un dinero para un fin. El que crea el Smart Contract creará una lista de solicitudes por ejemplo :

  • Comprar cauchos: dónde el incluirá la dirección (address) del proveedor. Entonces los que han contribuido decidirán en una votación si se efectúa esa solicitud. En caso de que la votación supere la mitad de contribuyentes se procederá a enviar ese dinero de esa solicitud automáticamente al proveedor.

Se diferencia nuestra dApp de Kickstarter en qué en esta última si se supera el monto del proyecto se envía todo ese dinero al que crea ese kickstarter sin más. Con el riesgo de que esta persona se agarre el dinero y no haga el proyecto. (Eso ha pasado en esa plataforma) y no es broma. Las personas se agarran el dinero y no hacen nada estafando a los que han contribuido a ese proyecto.

¿Que les parece?

Excelente dirán, bueno me pondré en marcha y crearé mi Smart Contract:

El código comienza desde aquí:

pragma solidity ^0.8.6;

contract Crowdfunding {

address public creator;

struct Request{
string description;
address provider;
uint amount;
uint votingCount;
mapping(address => bool) approvals;
}

mapping(address=> bool) public approvers;

mapping(uint=> Request) public requests;

uint public requetsCount;
uint public minimumContribution;
uint public contributors;

constructor(uint minimum){
creator=msg.sender;
minimumContribution = minimum;
}

function contribute() public payable{
require(msg.value >= minimumContribution);
approvers[msg.sender] = true;
contributors++;
}

function makeRequest(string memory description, uint amount, address provider) public {
require(msg.sender==creator);
require(bytes(description).length>0));
require(provider=!address(0));

requetsCount++;
Request storage request = requests[requestCount];

request.description = description;
request.amount= amount;
request.provider= provider;
request.votingCount= 0;
}

function voting(uint id) public {
require(id>0 && id<requestCount);
Request memory request = request[id];

require(!request.approvals [msg.sender]);

request.votingCount++;
request.approvals[msg.sender] = true;
}

function finalizeRequest(uint id) public {
require(msg.sender == creator);
Request memory requets = requests [id];

if( request.votingCount > contributors/2){
payable(request.provider).transfer (request.amount);
}

}

Sort:  
 9 months ago  

Te recomiendo usar

"```"

para meter tu codigo y se vea mas legible, sino asi amontonado no se puede apreciar, checa como es el markdown, para que te quede algo asi

function int main()
{
  cout << "hello world"
}