Правильный рабочий процесс обмена ethereum

Недавно я узнал, что нет удобного способа отслеживать транзакции на «внешнюю учетную запись», созданную каким-либо контрактом. Я посещал различные форумы и багтрекеры Эфириума в поисках ответа и видел множество запросов на добавление некоторых вызовов API для перечисления всех транзакций, обычных и вызванных по контракту. Некоторые из людей описали реальные ситуации, когда они потеряли ETH, потому что биржа, которую они использовали, не поддерживала такие внутренние транзакции. Но во всех случаях разработчики eth говорили одно и то же — «разработчики биржи не понимают основ ethereum, им следует использовать контракты вместо EOA».

Хорошо, я пытался понять, что они должны были сделать. Используя EOA, это действительно просто - создайте новую учетную запись, отдайте ее пользователю и дождитесь некоторых транзакций. Как я понимаю, используя простейшие контракты, вам нужно предоставить вашему пользователю 2 сущности - адрес вашего контракта и некоторые закодированные данные, которые будут содержать сигнатуру метода и сгенерированный идентификатор пользователя, а затем вы просто слушаете логи. С точки зрения пользователя, я вижу довольно неудобно работать с двумя экземплярами, если я просто хочу внести деньги на свой счет - это становится гораздо более подверженным ошибкам. И я не уверен, что все контракты пользователей будут поддерживать отправку на такие контракты обмена без дополнительного кодирования.

Есть ли какой-то очевидный сценарий, который я упускаю?

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

РЕДАКТИРОВАТЬ: Недостаточно репутации, чтобы прокомментировать ответ Тьядена (спасибо за это, кстати), поэтому «комментируйте» здесь. Да, я тоже думал об этой версии, но забыл добавить ее в исходный вопрос. Использовать резервную функцию приятно и просто, НО, насколько я понимаю, в этом случае вы должны создать контракт для каждого пользователя, что приводит к 2 проблемам:
- каждый раз тратить деньги (не много, но все же) - платить только за создание аккаунта выглядит не очень честно)
- вы должны отправить каждый контракт в блокчейн, а затем подождать некоторое время, пока он будет подтвержден, прежде чем предоставлять пользователю его адрес.

Думает ли большинство сообщества Эфириума так же, как Тьяден?

Ответы (1)

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

contract DepositAddress{
    string username;
    address exchange;
    event ReceivedEther(uint amount, uint time, string username);

    function DepositAddress(string _username, address _exchange){
        exchange =_exchange;
        username = _username;
    }

    function(){
        ReceivedEther(msg.value,block.timestamp,username);
        exchange.send(msg.value);
    }
}

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

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

Я все еще новичок в контрактах, но где реализовано тело события ReceivedEther()?
Тело функции отсутствует, оно автоматически генерируется объявлением события. Вызов RecievedEtherпросто пишет в лог в удобном формате