Bitcoin Forum
November 09, 2024, 12:16:40 AM *
News: Latest Bitcoin Core release: 28.0 [Torrent]
 
   Home   Help Search Login Register More  
Pages: [1]
  Print  
Author Topic: платная функция  (Read 659 times)
ShDenis (OP)
Full Member
***
Offline Offline

Activity: 313
Merit: 103



View Profile
September 16, 2017, 08:19:45 PM
 #1

Доброго времени суток.
Чё-то туплю, нужна помощь опытных гуру.
Мне нужно сделать платную функцию в смартконтракте. Нужно сделать так, что бы при вызове функции отрабатывал код только если на контракт сперва передали эфир или мой токен с вызывающего функцию адреса. Причём нужно точно знать что передали на контракт именно для определённой цели. Т.е. не отслеживать все переводы на контракт, а при вызове функции получить оплату её корыстной услуги...
aleks_raiden
Full Member
***
Offline Offline

Activity: 138
Merit: 101


View Profile
September 17, 2017, 07:40:23 AM
 #2

Напрашивается идея с прокси-контрактом, на каждую такую платную функцию - свой контракт, принимающий оплату, а далее вызывает вашу функцию в главном контракте. При этом внутри проверяем, что допустимо вызвать только с контракта-прокси, а не напрямую. 
ShDenis (OP)
Full Member
***
Offline Offline

Activity: 313
Merit: 103



View Profile
September 17, 2017, 08:21:31 AM
 #3

спасибо. наверное да.
т.е. получается что "стандартных" решений нет и нужно выкручиваться?
тогда я тоже придумал вариант: реестр с платежами в контракте в адрес этого контракта и проверку в платной функции на предварительный платёж с вызывающего адреса в этом реестре.
платить же можно в адрес любого контракта? или нужно ещё что-то в контракте дописывать (например, функцию снятия токена и эфира с контракта в адрес владельца)?
aleks_raiden
Full Member
***
Offline Offline

Activity: 138
Merit: 101


View Profile
September 17, 2017, 08:29:39 AM
 #4

Ну это и есть стандартное решение )

Так если у вас одна функция - то так тоже можно, но если у вас один контракт и 2-3-5 платных функций, со своими условиями, то можно или вести внутри списки балансов, различая транзакции по какому-то ид переданному с транзакцией, или же отдельные контракты на каждую функцию.

Да, платить можно в адрес любого, но вот что дальше будет - зависит от контракта на этом адресе )
ShDenis (OP)
Full Member
***
Offline Offline

Activity: 313
Merit: 103



View Profile
September 17, 2017, 06:56:28 PM
 #5

ок. спасибо за помощь.
quantum
Member
**
Offline Offline

Activity: 108
Merit: 250


View Profile
September 20, 2017, 04:08:28 AM
 #6

А чем модификатор payable для этой функции не подходит?
ShDenis (OP)
Full Member
***
Offline Offline

Activity: 313
Merit: 103



View Profile
September 25, 2017, 01:13:18 PM
 #7

А чем модификатор payable для этой функции не подходит?

Мне нужно различать, для каких целей был сделан перевод. Т.е. например, контракт принимает деньги для двух целей, каждая из которых оформлена своей функцией. По деньгам не поймёшь, для чего их перевели на контракт.
KostiaSA
Jr. Member
*
Offline Offline

Activity: 34
Merit: 3


View Profile
September 25, 2017, 06:39:40 PM
 #8

Если человек платит через обычный кошелек, например MetaMask, то он может заполнить поле "data" (например 0x1 или 0x2), это поле доступно для анализа в коде контракта (msg.data).

Важно помнить, что перевод с обычных кошельков отлавливает функция без названия с модификатором "payable":

function () payable{

}

если такой функции в контракте нет, то посылка на него денег будет давать отлуп.
Jaga-Jaga
Sr. Member
****
Offline Offline

Activity: 613
Merit: 256



View Profile
September 26, 2017, 09:54:08 PM
 #9

А чем модификатор payable для этой функции не подходит?
Я потихоньку тоже начинаю осваивать смарт контракты, у меня вопрос по payable функции, как можно задать цену вызова функции и как будет происходить оплата? Когда тот кто захочет вызвать мою payable функцию как он будет это делать и как я получу оплату за это? Еще хитрый вопрос, что будет если у того кто вызывает payable функцию немного не хватит эфира на балансе то функция совсем не вызовется или начнет исполняться код и потом где то функция остановится?

           ▀██▄ ▄██▀
            ▐█████▌
           ▄███▀███▄
         ▄████▄  ▀███▄
       ▄███▀ ▀██▄  ▀███▄
     ▄███▀  ▄█████▄  ▀███▄
   ▄███▀  ▄███▀ ▀███▄  ▀███▄
  ███▀  ▄████▌   ▐████▄  ▀███
 ███   ██▀  ██▄ ▄██  ▀██   ███
███   ███  ███   ███  ███   ███
███   ███   ███████   ███   ███
 ███   ███▄▄       ▄▄███   ███
  ███▄   ▀▀█████████▀▀   ▄███
   ▀████▄▄           ▄▄████▀
      ▀▀███████████████▀▀
DeepOnion
███
███
███
███
███
███
███
███
███
███
   Anonymity Guaranteed
   Anonymous and Untraceable
   Guard Your Privacy
      ▄▄██████████▄▄
    ▄███▀▀      ▀▀█▀   ▄▄
   ███▀              ▄███
  ███              ▄███▀   ▄▄
 ███▌  ▄▄▄▄      ▄███▀   ▄███
▐███  ██████   ▄███▀   ▄███▀
███▌ ███  ███▄███▀   ▄███▀
███▌ ███   ████▀   ▄███▀
███▌  ███   █▀   ▄███▀  ███
▐███   ███     ▄███▀   ███
 ███▌   ███  ▄███▀     ███
  ███    ██████▀      ███
   ███▄             ▄███
    ▀███▄▄       ▄▄███▀
      ▀▀███████████▀▀
ShDenis (OP)
Full Member
***
Offline Offline

Activity: 313
Merit: 103



View Profile
September 27, 2017, 05:54:26 AM
 #10

KostiaSA, ваша правда. По поводу необходимости payable функции, что бы на контракт вообще можно было перевод эфира сделать я уже отдельную тему с вопросом создал. По поводу data поля - это как вариант подойдёт, хотя не сильно удобно, и вопрос - а в каких кошельках может не быть этого поля? И ещё один вопрос - а как отследить и отличать перевод какого токена был сделан на контракт?


А чем модификатор payable для этой функции не подходит?
Я потихоньку тоже начинаю осваивать смарт контракты, у меня вопрос по payable функции, как можно задать цену вызова функции и как будет происходить оплата? Когда тот кто захочет вызвать мою payable функцию как он будет это делать и как я получу оплату за это? Еще хитрый вопрос, что будет если у того кто вызывает payable функцию немного не хватит эфира на балансе то функция совсем не вызовется или начнет исполняться код и потом где то функция остановится?

Никак цену вызова задать не получится. Боле того, это не вызов функции идёт, а перехват для обработки приёма платежа на стороне контракта. Можно только сделать проверку на сумму платежа внутри payable функции и возвращать деньги назад, если сумма неправильная. Т.е. пользователь делает произвольный перевод в адрес контракта, и функции payable контракта вызываются сами (нужно будет самому проверить все ли функции вызываются, в какой очерёдности, и можно ли вызвать функцию самостоятельно, хотя последнее маловероятно). Соответственно, если эфира на балансе меньше "необходимого", то перевод просто не получится сделать (нельзя имея на балансе 10 eth, перевести кому-то 11 eth, и наверное даже все 10ETH не получится отдать, по причине оплаты GAZ за транзакцию). Если же вызывается функция требующая GAZ за вызов, которого не достаточно, то код начнёт выполняться, но потом остановится и откатится до довызывного состояния. Потраченный GAZ не вернётся. Вроде как-то так.
KostiaSA
Jr. Member
*
Offline Offline

Activity: 34
Merit: 3


View Profile
September 27, 2017, 07:41:55 AM
 #11

Jaga-Jaga, цена вызова функции контролируется очень просто, assert откатывает транзакцию, деньги не поступают на контракт.

function deposit() payable {
     assert(msg.value >= 0.1 ether);
     balances[msg.sender] += msg.value;
}
aleks_raiden
Full Member
***
Offline Offline

Activity: 138
Merit: 101


View Profile
September 27, 2017, 07:39:26 PM
 #12

да, можно так сделать, как в примере, лучше вынести определение цен за вызовы в отдельным мап и добавить управление, чтобы овнер мог менять стоимость в процессе работы контракта
Pages: [1]
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!