Смарт-контракт для отправки нескольких выходов

В настоящее время я изучаю смарт-контракты и немного запутался в том, как они на самом деле работают.

Мой веб-сайт позволяет пользователям отправлять ETH со своего кошелька на сайте на другой адрес вне сайта. В течение которого я хотел бы вычесть 1% за комиссию на моем сайте.

Можно ли это сделать с помощью смарт-контрактов?

Что я сделал сейчас, используя Solidity, так это разработал этот очень простой контракт:

pragma solidity ^0.4.18;

contract MultiSend
{
    function multiSendETH(address[] memory addresses, uint[] memory values) public payable
    {
        // Validate addresses and values match
        if(addresses.length != values.length)
        {
            return;
        }

        else
        {
            for(uint i = 0; i < addresses.length; i++)
            {
                address(addresses[i]).transfer(values[i]);
            }

            msg.sender.transfer(this.balance);
        }
    }
}

Я успешно развернул его со значением 1 wei через remix.ethereum.org.

Можно ли повторно использовать один и тот же смарт-контракт снова и снова каждый раз, когда кто-то снимает деньги с моего сайта?

Или мне нужно создать смарт-контракт со стоимостью, равной той, что снимается?

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

Я надеялся, что можно будет повторно использовать этот смарт-контракт и, возможно, добавить параметр, из какого кошелька отправлять? Это возможно?

Также можно получить идентификатор транзакции из этой строки:

address(addresses[i]).transfer(values[i]);

Или мое понимание смарт-контрактов полностью отсутствует?

Я хотел бы назвать это так:

addresses = ['0xTheirOutputAddress', '0xMySiteAddress']
fee = total * 0.01
values    = [total - fee, fee]
w3.contract.multiSendETH(addresses, values).call()

Ответы (2)

Я бы порекомендовал вам потратить некоторое время, решить эти проблемы одну за другой и поискать, если на них уже был дан ответ.
Если нет, составьте подробный, но простой вопрос для каждого из них.

Люди, которые знают гораздо больше меня, смогут вам помочь, но прямо сейчас у вас есть несколько вопросов в одном, и это очень запутывает. Просто пытаюсь помочь.

Кстати:

  • Я уверен, что вы можете сделать «гонорар» в контракте, если я вспомню, где я видел пример, я снова прокомментирую.
  • В зависимости от случая, но обычно я считаю, что лучше повторно использовать контракт.

Конечно, вы можете использовать один и тот же контракт для всех транзакций. На самом деле это означает, что вы должны быть использованы таким образом. Вы развертываете его только один раз, и все транзакции выполняются одним и тем же контрактом.

Вам необходимо уточнить, что вы подразумеваете под «адресом моего веб-сайта», потому что то, как вы написали, «гонорар» останется в договоре. Вам все равно нужно будет перевести плату на ваш «веб-сайт».

Что я вижу в вашем коде, так это то, что вы не проверяете, связаны ли «значения» каким-либо образом с количеством ETH, переданным тем, кто вызвал эту функцию. Здесь ваш контракт развалится.