Как извлечь деньги из смарт контракта эфириум
Перейти к содержимому

Как извлечь деньги из смарт контракта эфириум

  • автор:

How to send and withdraw Ether from a smart contract

manuchim

In this article, we’ll be checking out an example of a smart contract that will we can send money to, check it’s balance and then withdraw the money to an address only if the address calling the function is the owner, commonly known as the Owner Model.

This is actually from a bank smart contract I developed and built a website around. More on that later

Creating a smart contract with an Owner

Okay so first things first: We have to create a new file, name it MySmartContract.sol (or ideally, whatever you want lol) and add the license and Solidity version statements like this:

Then we create an address variable to store the owner of the contract below:

Next we will create a constructor that stores the address that deployed the contract as the owner. A constructor is a special function that is only called once when the contract is deployed. We will use the msg object’s sender property. msg.sender is a built-in variable in solidity that stores the address interacting with the smart contract at any given time.

Go ahead and save the contract, compile and deploy. Click the contractOwner button to see the address that deployed the contract is now the owner.

Send money to smart contract

Next, we are going to create a function that allows any address to send money to the contract.

We can use the keyword payable to specify that the function can receive Ether.

In the getBalance function, the keyword this refers to this particular contract (MySmartContract).

Now we’ll go ahead and deploy the contract and test you can send ether to the contract and check the balance of the contract

Withdraw all money from smart contract

Now, create a withdrawAll function that passes the address we wish to send the money too.

When you deploy and test out the contract, you’ll notice that anyone can run this withdrawAll function. Lets only allow to sendcontract owner to execute this function. We use the require to check for conditions and throw an exception if the condition is not met. Just to keep things secure

In this case, we check that the address calling the function is the same as the contract owner. If it fails, it will rollback the transaction. This contract now meets the Owner model where it checks if address calling the function is the owner before allowing it to proceed further.

So that’s it for this simple smart contract that allows money to be sent to it, and only allows the owner to withdraw all the money from the smart contract.

If you found this article helpful, feel free to give me a Clap, as this brightens my day knowing I may have helped someone in their journey in making stuff.

You may also send me a message if you need any further help. I’d be happy to assist.

Простыми словами: смарт-контракты, Ethereum, ICO

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

Так вот, Биткойн — на данный момент однозначно номер один. А знаете, какая криптовалюта на втором месте? Ethereum. Когда мы говорим про места, мы имеем в виду капитализацию, то есть суммарную стоимость всех монет валюты.


Капитализация и цены TOP-5 криптовалют. Источник

Как видите, Ethereum с большим отрывом опережает другие «альткойны», а в июне 2017 чуть было даже не обогнал Биткойн, «великий и ужасный». Давайте разберемся, что же в Ethereum такого особенного и почему подавляющее большинство проводимых в этом году ICO используют именно его.

Идея Ethereum

Ethereum запустился совсем недавно, 30 июля 2015 года. Одним из его создателей был нынче известный в блокчейн-тусовке и, не побоюсь этого слова, влиятельный Виталик Бутерин. Он родился в России, но с шести лет жил в Канаде. На тот момент, когда он изложил свои идеи, которые в итоге легли в основу сети Ethereum, ему было 19 лет.

Так вот, в чем же идея? В сети Биткойн с точки зрения пользователя все устроено довольно просто. Есть кошельки, можно передавать деньги с одного кошелька на другой или на несколько сразу. Сеть построена на весьма остроумных принципах, позволяющих обходиться без единого центра, но задачи решаются вполне классические. Обычная платежная система, по большому счету: люди, деньги, переводы — все, больше ничего нет.

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

Собственно, создатели Ethereum как раз и добавили к базовой функциональности криптовалют возможность создавать подобные программы. Все кошельки в Ethereum делятся на два типа: те, что управляются людьми, и те, что управляются автономно программами.

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

И вот это нововведение существенно расширило сферу применения блокчейн-валют.

Примеры смарт-контрактов

Какие программы можно написать? Да какие угодно. Например, финансовую пирамиду. Для этого в сети Ethereum достаточно создать смарт-контракт со следующими правилами:

  1. Если с адреса кошелька A пришла сумма X, запомнить это в табличке долгов.
  2. Если после этого с адреса B пришла сумма Y > 2*X, отправить 2*Х денег на адрес А, запомнить долг участнику B.
  3. И так далее для каждого участника.
  4. Опционально: отправлять 5% всех поступающих денег автору смарт-контракта.
  1. Если аукцион еще не окончен, запоминаем адреса отправителей и суммы ставок каждого участника.
  2. Когда аукцион окончен, выбираем максимальную ставку, объявляем победителя, высылаем обратно все остальные ставки.
  3. Опционально: высылаем выигранный лот, если Ethereum имеет представление, что это такое.

Напомним преимущество: это блокчейн — все уверены, что никто не жульничает, все видят текст программы и понимают, что она работает именно так, как в ней написано. Программа — не человек. Она не скроется с деньгами, не обанкротится, и так далее. Если, конечно, в ней нет багов или «неожиданного поведения».

Ограничения смарт-контрактов

Но есть и существенные ограничения, вот некоторые из них:

  1. В программе очень сложно получить случайные числа и другую неопределенность. В некоторых лотереях умным участникам удается «подгадать» джекпот.
  2. Не так просто «спрятать» какую-то информацию. Например, список участников аукциона или их ставки.
  3. Если для работы контракта требуется информация, которой в блокчейне нет (например, текущий курс какой-нибудь валюты), то кто-то доверенный должен добавлять эту информацию в блокчейн.
  4. Для взаимодействия с контрактами пользователям нужен эфир — это внутренняя валюта Ethereum. Нельзя устроить голосование среди тех, у кого еще нет кошельков с деньгами.
  5. Смарт-контракты работают довольно медленно. На весь мир можно выполнять 3-5 транзакций в секунду.
  6. Сами смарт-контракты обычно выполняют немного действий, ведь в блокчейне каждый майнер должен будет эти действия повторить и сверить результат. Вдруг у него будет медленный компьютер.
  7. Если в смарт-контракте есть ошибки, то это навсегда. Единственный выход исправить ошибку — перейти на другой смарт-контракт, но только если возможность вывода денег и такого перехода была предусмотрена в программе изначально. Как правило, очень мало кто это предусматривает.
  8. Смарт-контракты могут зависнуть или вообще работать не так, как все ожидали, потому что не разобрались в программном коде.

Главное использование смарт-контрактов


Простой смарт-контракт Ethereum. Имеющаяся ошибка позволяет украсть все деньги, кто нашел — молодец

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

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

Смарт-контракты дали миллиону «криптоинвесторов» возможность «швырять деньги в монитор».

ICO — Initial Coin Offering

Нащупал эту нишу Ethereum не сразу. На 1 января 2017 стоимость одного эфира составляла $8, а своего пика (во всяком случае, пока) в $400 курс достиг к июню. Все благодаря большому количеству проводимых ICO — первичному предложению акций стартапов. Желание вложить эфир в какой-либо проект стимулирует спрос на эфир. А проектов этих сейчас — тьма.


График стоимости Ethereum. Источник

Обсудим ICO поподробнее. Типичная схема криптостартапа такова:

  1. У вас есть идея. Обычно она как-то связана с криптовалютой или блокчейном.
  2. На ее реализацию и запуск вам нужны деньги.
  3. Вы объявляете всем, что принимаете эфир, а взамен выдаете акции/токены/фантики при помощи смарт-контракта.
  4. Вы рекламируете свой проект и собираете требуемую сумму.

Доходит до комических случаев. Например, в ходе ICO одного из проектов 35 миллионов долларов собрали за 24 секунды. А чтобы попасть в число «счастливчиков-участников», фанаты проекта платили до $6600 комиссии за транзакцию. Большой спрос и низкая пропускная способность Ethereum’а заставляет увеличивать комиссионные, чтобы отправить деньги и поучаствовать, а не остаться в хвосте очереди.

Окупаемость криптоинвестиций

Что будет дальше с выданными инвесторам токенами, зависит от проекта. Кто-то обещает выплачивать дивиденды с будущей прибыли, кто-то планирует принимать эти токены к оплате услуг, реализуемых проектом, кто-то ничего не обещает.

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

Иногда первых настолько больше, что цена растет стремительно, и капитализация проекта раздувается до миллиарда долларов. При том, что у него нет прибыли нет продукта, есть только идея, план и, в лучшем случае, команда.

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

В 2017 году (к сентябрю) на ICO разные проекты уже собрали порядка 1,7 миллиарда долларов. Об успешных проектах слышно мало, но инвесторы не теряют оптимизма.

Withdraw Ether From Smart Contract¶

So far we have sent Ether to our Smart Contract. But there is currently no way to get Ether back out again! So, what’s next? Yes! A function to withdraw Ether would be good, ey?!

Add a Withdraw Function¶

Let’s add the following function to the Smart Contract:

This function will send all funds stored in the Smart Contract to the person who calls the «withdrawMoney()» function.

Deploy the new Smart Contract¶

  1. Deploy the new version and send again 1 Ether to the Smart Contract.
  2. To avoid confusion I recommend you close the previous Instance, we won’t need it anymore

At the end you should end up with one active Instance of your Smart Contract.

The same procedure as before:

  1. Put in «1 Ether» into the value input box
  2. hit «receiveMoney» in your new contract Instance

Your balance should be 1 Ether again:

If your balance is 0, then double check the value field

If your balance is 2 Ether, then double check the contract Instance you are interacting with!

Withdraw Funds from the Smart Contract¶

Now it’s time we use our new function! But to make things more exciting, we’re going to withdraw to a different Account.

Select the second Account from the Accounts dropdown:

Then hit the «withdrawMoney» button:

Observe the amount of Ether you have now in your Account:

It’s more than the previous 100 Ether! We got our 1 Ether through our Smart Contract into another Account! AWESOME!

Why not 101 Ether?

Are you wondering why you don’t have 101 Ether in your Account? After all, you had 100 Ether before, and now you added 1 Ether, so, why is it not 101 Ether? Is the Math you learned in school worthless?

No, the Math you learned in School comes in handy actually.

What you can observe here is the concept of «Gas» on the Ethereum Blockchain. Every transaction on Ethereum costs a little bit. And it’s not different here on a simulated chain. Same principles apply. How much is the Gas you paid, you’re wondering? Well, you can open the transaction details and see for yourself. We’re covering this — in depth — later on in the course. I also made a dedicated video and blog post about this if you want to deep dive right now.

While we can withdraw our funds now, the whole function itself is pretty useless, isn’t it?! Anyone can withdraw funds to his Account. There are no fractions of the Amount — all in all, pretty insecure.

I still hope the concept is a bit clearer now!

Let’s to another function, which allows us the send the full amount to a specific Address! It will still be insecure, but at least teaches a new concept — one at a time!

Transfers and approval of ERC-20 tokens from a solidity smart contract

In the previous tutorial we studied the anatomy of an ERC-20 token in Solidity on the Ethereum blockchain. In this article we’ll see how we can use a smart contract to interact with a token using the Solidity language.

For this smart contract, we’ll create a really dummy decentralized exchange where a user can trade ether for our newly deployed ERC-20 token.

For this tutorial we’ll use the code we wrote in the previous tutorial as a base. Our DEX will instantiate an instance of the contract in its constructor and perform the operations of:

  • exchanging tokens to ether
  • exchanging ether to tokens

We’ll start our Decentralized exchange code by adding our simple ERC20 codebase:

Our new DEX smart contract will deploy the ERC-20 and get all the supplied:

So we now have our DEX and it has all the token reserve available. The contract has two functions:

  • buy : The user can send ether and get tokens in exchange
  • sell : The user can decide to send tokens to get ether back

The buy function

Let’s code the buy function. We’ll first need to check the amount of ether the message contains and verify that the contracts own enough tokens and that the message has some ether in it. If the contract owns enough tokens it’ll send the number of tokens to the user and emit the Bought event.

Note that if we call the require function in the case of an error the ether sent will directly be reverted and given back to the user.

To keep things simple, we just exchange 1 token for 1 Wei.

In the case where the buy is successful we should see two events in the transaction: The token Transfer and the Bought event.

The sell function

The function responsible for the sell will first require the user to have approved the amount by calling the approve function beforehand. Approving the transfer requires the ERC20Basic token instantiated by the DEX to be called by the user. This can be achieved by first calling the DEX contract's token() function to retrieve the address where DEX deployed the ERC20Basic contract called token . Then we create an instance of that contract in our session and call its approve function. Then we are able to call the DEX's sell function and swap our tokens back for ether. For example, this is how this looks in an interactive brownie session:

Then when the sell function is called, we’ll check if the transfer from the caller address to the contract address was successful and then send the Ethers back to the caller address.

If everything works you should see 2 events (a Transfer and Sold ) in the transaction and your token balance and ether balance updated.

From this tutorial we saw how to check the balance and allowance of an ERC-20 token and also how to call Transfer and TransferFrom of an ERC20 smart contract using the interface.

Once you make a transaction we have a JavaScript tutorial to wait and get details about the transactions (opens in a new tab)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *