Author

Topic: платная функция (Read 659 times)

full member
Activity: 138
Merit: 101
September 27, 2017, 02:39:26 PM
#12
да, можно так сделать, как в примере, лучше вынести определение цен за вызовы в отдельным мап и добавить управление, чтобы овнер мог менять стоимость в процессе работы контракта
jr. member
Activity: 34
Merit: 3
September 27, 2017, 02:41:55 AM
#11
Jaga-Jaga, цена вызова функции контролируется очень просто, assert откатывает транзакцию, деньги не поступают на контракт.

function deposit() payable {
     assert(msg.value >= 0.1 ether);
     balances[msg.sender] += msg.value;
}
full member
Activity: 313
Merit: 103
September 27, 2017, 12:54:26 AM
#10
KostiaSA, ваша правда. По поводу необходимости payable функции, что бы на контракт вообще можно было перевод эфира сделать я уже отдельную тему с вопросом создал. По поводу data поля - это как вариант подойдёт, хотя не сильно удобно, и вопрос - а в каких кошельках может не быть этого поля? И ещё один вопрос - а как отследить и отличать перевод какого токена был сделан на контракт?


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

Никак цену вызова задать не получится. Боле того, это не вызов функции идёт, а перехват для обработки приёма платежа на стороне контракта. Можно только сделать проверку на сумму платежа внутри payable функции и возвращать деньги назад, если сумма неправильная. Т.е. пользователь делает произвольный перевод в адрес контракта, и функции payable контракта вызываются сами (нужно будет самому проверить все ли функции вызываются, в какой очерёдности, и можно ли вызвать функцию самостоятельно, хотя последнее маловероятно). Соответственно, если эфира на балансе меньше "необходимого", то перевод просто не получится сделать (нельзя имея на балансе 10 eth, перевести кому-то 11 eth, и наверное даже все 10ETH не получится отдать, по причине оплаты GAZ за транзакцию). Если же вызывается функция требующая GAZ за вызов, которого не достаточно, то код начнёт выполняться, но потом остановится и откатится до довызывного состояния. Потраченный GAZ не вернётся. Вроде как-то так.
sr. member
Activity: 613
Merit: 256
September 26, 2017, 04:54:08 PM
#9
А чем модификатор payable для этой функции не подходит?
Я потихоньку тоже начинаю осваивать смарт контракты, у меня вопрос по payable функции, как можно задать цену вызова функции и как будет происходить оплата? Когда тот кто захочет вызвать мою payable функцию как он будет это делать и как я получу оплату за это? Еще хитрый вопрос, что будет если у того кто вызывает payable функцию немного не хватит эфира на балансе то функция совсем не вызовется или начнет исполняться код и потом где то функция остановится?
jr. member
Activity: 34
Merit: 3
September 25, 2017, 01:39:40 PM
#8
Если человек платит через обычный кошелек, например MetaMask, то он может заполнить поле "data" (например 0x1 или 0x2), это поле доступно для анализа в коде контракта (msg.data).

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

function () payable{

}

если такой функции в контракте нет, то посылка на него денег будет давать отлуп.
full member
Activity: 313
Merit: 103
September 25, 2017, 08:13:18 AM
#7
А чем модификатор payable для этой функции не подходит?

Мне нужно различать, для каких целей был сделан перевод. Т.е. например, контракт принимает деньги для двух целей, каждая из которых оформлена своей функцией. По деньгам не поймёшь, для чего их перевели на контракт.
member
Activity: 108
Merit: 250
September 19, 2017, 11:08:28 PM
#6
А чем модификатор payable для этой функции не подходит?
full member
Activity: 313
Merit: 103
September 17, 2017, 01:56:28 PM
#5
ок. спасибо за помощь.
full member
Activity: 138
Merit: 101
September 17, 2017, 03:29:39 AM
#4
Ну это и есть стандартное решение )

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

Да, платить можно в адрес любого, но вот что дальше будет - зависит от контракта на этом адресе )
full member
Activity: 313
Merit: 103
September 17, 2017, 03:21:31 AM
#3
спасибо. наверное да.
т.е. получается что "стандартных" решений нет и нужно выкручиваться?
тогда я тоже придумал вариант: реестр с платежами в контракте в адрес этого контракта и проверку в платной функции на предварительный платёж с вызывающего адреса в этом реестре.
платить же можно в адрес любого контракта? или нужно ещё что-то в контракте дописывать (например, функцию снятия токена и эфира с контракта в адрес владельца)?
full member
Activity: 138
Merit: 101
September 17, 2017, 02:40:23 AM
#2
Напрашивается идея с прокси-контрактом, на каждую такую платную функцию - свой контракт, принимающий оплату, а далее вызывает вашу функцию в главном контракте. При этом внутри проверяем, что допустимо вызвать только с контракта-прокси, а не напрямую. 
full member
Activity: 313
Merit: 103
September 16, 2017, 03:19:45 PM
#1
Доброго времени суток.
Чё-то туплю, нужна помощь опытных гуру.
Мне нужно сделать платную функцию в смартконтракте. Нужно сделать так, что бы при вызове функции отрабатывал код только если на контракт сперва передали эфир или мой токен с вызывающего функцию адреса. Причём нужно точно знать что передали на контракт именно для определённой цели. Т.е. не отслеживать все переводы на контракт, а при вызове функции получить оплату её корыстной услуги...
Jump to: