Мы отправили ETH на неправильный адрес и смогли их вернуть


Всё началось с проблемы с которой мы столкнулись в BitClave: во время подготовки нашего ICO некоторый объем криптовалюты ETH (эфир) был отправлен на адрес смарт-контракта, который ранее был задеплоен в тестовую сеть Ethereum. Деньги были отправлены в главной сети на адрес не относящийся ни к одному приватному ключу, ни к одному смарт-контракту в этой сети. Сначала нам показалось, что мы просто выкинули $2000 без единой возможности вернуть наши средства 💸💸💸

История началась с того, что мой коллега спросил у меня приватный ключ к адресу 0x9c86825280b1d6c7dB043D4CC86E1549990149f9. Я отправил ему приватный ключ к адресу 0x231A3925A014EF0a11a0DC5c33bF7cdB3bd9919f, с которого был загружен смарт-контракт по первому адресу. Мы обсудили проблему и пришли к выводу, что вернуть отправленные деньги нет никакой возможности 😔

Каждый смарт-контракт, загружаемый в сеть Ethereum имеет уникальный адрес, который на первый взгляд выглядит как случайный, но я выяснил как именно адрес генерируется при загрузке в сеть: https://ethereum.stackexchange.com/a/761/3032. Проще говоря адрес загрузки – это хеш адреса отправителя транзакции и значения nonce (равного числу исходящих транзакций с этого адреса):

deployed_address = sha3(rlp.encode([sender, nonce]))


Это натолкнуло меня на мысль использовать тот же самый кошелек (тот что я использовал в тестовой сети) для загрузки нового смарт-контракта в основную сеть. Я разработал смарт-контракт простейшего кошелька, позволяющего лишь отобразить баланс и перевести утраченные средства:

contract SimpleWallet is Ownable {
    function () public payable {
    }
    function weiBalance() public constant returns(uint256) {
        return this.balance;
    }
    function claim(address destination) public onlyOwner {
        destination.transfer(this.balance);
    }
}


Затем я нашел транзакцию в тестовой сети, с помощью которой была произведена загрузка исходного контракта: 0xc4c32a3d97dbd691eb3646e4c0c404e899a632010bc48d7182d75bef6803b7bc и обнаружил, что поле nonce было равно 13. Я пополнил кошелек на 0.03 ETH в главной сети и стал заливать новый смарт-контракт раз за разом, до тех пор пока nonce не вырос с 0 до 13. И всё, я получил смарт-контракт загруженный по желаемому адресу! Тут мы можем наблюдать 2 транзакции с одинаковым nonce равным 13, который загрузили 2 различных смарт-контракта в 2 разные сети по идентичным адресам с разницей в 5 дней 😎:

Средства были успешно получены нами после вызова метода claim, свежезалитого смарт-контракта 👏👏👏

Также обратите внимание, что смарт-контракт был залит в сеть на 2 дня позже того, как на него поступили средства 🤗:

Кратко. Мы отправили деньги в основной сети Ethereum на адрес смарт-контракта, который был залит в тестовую сеть Ethereum. Мы использовали тот же самый кошелёк для загрузки совершенно другого смарт-контракта в основную сеть Ethereum несколько раз, пока у транзакции поле nonce не достигло значения 13, которое как раз использовалось для загрузки смарт-контракта в тестовую сеть. Затем мы вызвали специальный метод нового смарт-контаркта, который позволил нам вывести средства на наш кошелёк. Получилось, что мы загрузили смарт-контракт по адресу, на котором его уже дожидались средства 🎩🐰


Comments 8


Привет! Я робот. Хозяин поручил мне проголосовать за Ваш пост! Я нашла похожий контент, который может быть интересен читателям ГОЛОСа:
https://habrahabr.ru/post/341518/

03.11.2017 09:51
0

Да, это мой пост тоже. Я решил, что аудитории ГОЛОСА этот пост будет намного интереснее.

03.11.2017 09:53
0

Привет!

03.11.2017 10:51
0

Приветствую Вас и желаю успехов на платформе Голос!

В этой статье вы сможете найти ответы на большинство вопросов, возникающих у новичков. Также большую подборку ссылок на полезные материалы вы можете найти по этой ссылке
Оперативно получить помощь, вы можете присоединившись к нашему сообществу в Телеграм

Буду признателен, если расскажете, откуда Вы узнали о платформе Голос (ответьте цифрой):
1) увидел в Facebook
2) увидел в ВКонтакте
3) из поиска Google
4) из поиска Яндекс
5) из Steem
6) рассказал друг
7) другое (укажите в комментарии)

Чтобы быстрей освоится, присоединяйтесь к мотивирующему промоушену для новичков, действующего месяц с момента регистрации!

И обязательно добавьте себе в Telegram Бота-инструктора, который позволит вам пошагово освоится на платформе Голос.

03.11.2017 11:00
0

@k06a Поздравляю! Вы добились некоторого прогресса на Голосе и были награждены следующими новыми бейджами:

Вы опубликовали свой первый пост
Вы написали свой первый комментарий
Вы получили первый голос за ваши посты

Вы можете нажать на любой бейдж, чтобы увидеть свою страницу на Доске Почета.
Чтобы увидеть больше информации о Доске Почета, нажмите здесь

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

Голосуя за это уведомление, вы помогаете всем пользователям Голоса. Узнайте, как здесь.

03.11.2017 11:39
0

@k06a Поздравляю! Вы добились некоторого прогресса на Голосе и были награждены следующими новыми бейджами:

Награда за количество полученных голосов

Вы можете нажать на любой бейдж, чтобы увидеть свою страницу на Доске Почета.
Чтобы увидеть больше информации о Доске Почета, нажмите здесь

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

Голосуя за это уведомление, вы помогаете всем пользователям Голоса. Узнайте, как здесь.

03.11.2017 19:40
0

Ваш пост поддержали следующие Инвесторы Сообщества "Добрый кит":
genyakuc, vika-teplo, process, kito-boy, privet
Поэтому я тоже проголосовал за него!

Узнать подробности о сообществе можно тут:
Разрешите представиться - Кит Добрый
Правила
Инструкция по внесению Инвестиционного взноса
Вы тоже можете стать Инвестором и поддержать проект!!!


Если Вы хотите отказаться от поддержки Доброго Кита, то ответьте на этот комментарий командой "!нехочу"


dobryj.kit теперь стал Делегатом! Ваш голос важен для всего сообщества!!!
Поддержите нас:

04.11.2017 05:51
0

@k06a Поздравляю! Вы получили личную награду!

С Днём Рождения - 2 лет на Голосе
Вы можете нажать на бейдж, чтобы увидеть свою страницу на Доске Почета.

Вам нравится проект Доска Почета? Проголосуйте за делегата @golosboard, и вы получите еще одну награду!

12.05.2019 11:17
0
My pageSettingsLogout
Cancel Confirm
100%
Cancel Confirm
Cancel Confirm