Ich brauche Hilfe bei einem Crowdfunding-Vertrag

Dieser Crowdfunding-Vertrag ist noch lange nicht abgeschlossen, ich bin noch dabei, den Code zu schreiben und jede einzelne Funktion zu testen. Der Ansatz, den ich mit der Funktion getRefund() gewählt habe, scheint perfekt zu funktionieren, aber ich bin ein wenig besorgt über mögliche Kollisionen, da ich alle Adressen der Investoren dem an den Vertrag gesendeten ETH-Betrag zugeordnet habe. Ist es möglich, dass Adresse A und Adresse B innerhalb der Zuordnung demselben Index zugeordnet werden? Wenn ja, würde dies nicht bedeuten, dass, wenn Adresse A eine Rückerstattung beantragen würde, Adresse A nicht auch die Gelder erhalten würde, die von Adresse B gesendet wurden?

pragma solidity ^0.4.0;

contract Crowdfunding {

    address private owner;

    mapping (address => uint) investors;

    //Constructor
    function Crowdfunding() {
        owner = msg.sender;
    }

    //Modifiers
    modifier investorsOnly {
        if(investors[msg.sender] == 0) throw;
        _;
    }

    //Events
    event PaymentReceived(uint Amount, address From, address To);
    event WithdrawalClaimed(uint Amount, address From);

    //Functions
    function() payable {
        investors[msg.sender] += msg.value;
        PaymentReceived(msg.value, msg.sender, this);
    }

    function withdrawFunds() {
        suicide(owner);
    }

    function getRefund() investorsOnly {
        uint amount = investors[msg.sender];
        investors[msg.sender] = 0;
        msg.sender.transfer(amount);
        WithdrawalClaimed(amount, msg.sender); 
    }
}

Antworten (2)

Ist es möglich, dass Adresse A und Adresse B innerhalb der Zuordnung demselben Index zugeordnet werden?

Nein, das ist nicht möglich, da Sie mit dem Mapping eine eindeutige Verknüpfung zwischen der Adresse und dem gespendeten Betrag definieren. Der Rückerstattungsprozess sollte also problemlos verlaufen. Um zu kollidieren, sollten 2 Adressen den gleichen privaten Schlüssel haben, und das ist fast unmöglich.

Tipp: Verwenden Sie revert() anstelle von throw, das ist veraltet.

Außerdem sollten die Gaskosten der Fallback-Funktion unter 2300 liegen:

Bitte stellen Sie sicher, dass Sie Ihre Fallback-Funktion gründlich testen, um sicherzustellen, dass die Ausführungskosten weniger als 2300 Gas betragen, bevor Sie einen Vertrag bereitstellen.

Vielen Dank für Ihre Hilfe. Ich habe jetzt die Fallback-Funktion getestet und die geschätzte Gebühr beträgt 42.980 Gas. Ich bin mir nicht ganz sicher, wie ich das senken kann. Haben Sie Vorschläge?
Ich versuche das auch herauszufinden

Von hier .

„Die Art und Weise, wie private Schlüssel generiert werden, bedeutet, dass „2160 oder ungefähr 1 von 1.461.501.637.330.902.918.203.684.832.716.283.019.655.932.542.976“ von zwei privaten Schlüsseln kollidieren. Daher sind Adressen in jeder Hinsicht und für jeden Zweck eindeutig.“