Мне нужна помощь с контрактом на краудфандинг

Этот краудфандинговый контракт далек от завершения, я все еще нахожусь в процессе написания кода и тестирования каждой отдельной функции. Подход, который я использовал с функцией getRefund(), кажется, работает отлично, однако я немного обеспокоен потенциальными коллизиями, поскольку я сопоставил все адреса инвесторов с количеством ETH, отправленным в контракт. Возможно ли, чтобы адрес A и адрес B сопоставлялись с одним и тем же индексом в сопоставлении? Если да, то не означает ли это, что если адрес А потребует возмещения, не получит ли адрес А также средства, отправленные с адреса Б?

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); 
    }
}

Ответы (2)

Возможно ли, чтобы адрес A и адрес B сопоставлялись с одним и тем же индексом в сопоставлении?

Нет, это невозможно, потому что при сопоставлении вы определяете уникальную связь между адресом и внесенной суммой. Так что процесс возврата должен пройти без проблем. Чтобы столкнуться 2 адреса должны иметь одинаковый приватный ключ, а это практически невозможно.

Совет: используйте revert() вместо throw, это устарело.

Кроме того, стоимость газа для резервной функции должна быть ниже 2300:

Пожалуйста, убедитесь, что вы тщательно протестировали свою резервную функцию, чтобы убедиться, что стоимость выполнения составляет менее 2300 газа, прежде чем развертывать контракт.

Большое спасибо за Вашу помощь. Теперь я протестировал резервную функцию, и предполагаемая плата составляет 42 980 газа. Я не совсем уверен, как это понизить. Есть ли у вас какие-либо предложения?
я тоже пытаюсь в этом разобраться

Отсюда . _

«Способ генерации закрытых ключей означает, что существует «2160 или около 1 из 1 461 501 637 330 902 918 203 684 832 716 283 019 655 932 542 976» двух столкновений закрытых ключей. Таким образом, адреса во всех отношениях уникальны».