Bitcoin Forum
May 04, 2024, 03:25:10 AM *
News: Latest Bitcoin Core release: 27.0 [Torrent]
 
   Home   Help Search Login Register More  
Pages: [1]
  Print  
Author Topic: solidity, плата за вызов функции  (Read 238 times)
zan0za (OP)
Jr. Member
*
Offline Offline

Activity: 46
Merit: 3


View Profile
September 21, 2018, 01:12:06 PM
 #1

Я хочу сделать так чтобы тот кто вызывает функцию в моем контракте заплатил бы мне за вызов фиксированную сумму, как это сделать? Как прописать сумму которую я хочу взымать за вызов функции?
Если я объявлю мою функцию как payable то что мне еще надо сделать?
1714793110
Hero Member
*
Offline Offline

Posts: 1714793110

View Profile Personal Message (Offline)

Ignore
1714793110
Reply with quote  #2

1714793110
Report to moderator
1714793110
Hero Member
*
Offline Offline

Posts: 1714793110

View Profile Personal Message (Offline)

Ignore
1714793110
Reply with quote  #2

1714793110
Report to moderator
1714793110
Hero Member
*
Offline Offline

Posts: 1714793110

View Profile Personal Message (Offline)

Ignore
1714793110
Reply with quote  #2

1714793110
Report to moderator
There are several different types of Bitcoin clients. The most secure are full nodes like Bitcoin Core, which will follow the rules of the network no matter what miners do. Even if every miner decided to create 1000 bitcoins per block, full nodes would stick to the rules and reject those blocks.
Advertised sites are not endorsed by the Bitcoin Forum. They may be unsafe, untrustworthy, or illegal in your jurisdiction.
1714793110
Hero Member
*
Offline Offline

Posts: 1714793110

View Profile Personal Message (Offline)

Ignore
1714793110
Reply with quote  #2

1714793110
Report to moderator
1714793110
Hero Member
*
Offline Offline

Posts: 1714793110

View Profile Personal Message (Offline)

Ignore
1714793110
Reply with quote  #2

1714793110
Report to moderator
resttorg
Newbie
*
Offline Offline

Activity: 14
Merit: 0


View Profile
September 22, 2018, 12:15:08 PM
 #2

Вы можете переложить оплату газа на пользователя, но указать точную сумму не сможете
bomj
Sr. Member
****
Offline Offline

Activity: 1337
Merit: 288


0xbt


View Profile WWW
September 23, 2018, 09:31:10 AM
Last edit: September 23, 2018, 11:47:39 AM by bomj
 #3

https://ethereum.stackexchange.com/questions/6676/add-a-transaction-fee-for-each-time-a-function-is-called
https://ethereum.stackexchange.com/questions/42322/how-to-dynamically-charge-a-fee-associated-with-executing-a-particular-solidity
Еще интересные моменты -
https://ethereum.stackexchange.com/questions/11818/paying-a-transaction-fee-with-an-erc20-token
https://ethereum.stackexchange.com/questions/144/can-contracts-pay-the-gas-instead-of-the-message-sender/46546#46546
https://github.com/bitclave/Feeless
https://github.com/ethereum/EIPs/issues/865

zan0za (OP)
Jr. Member
*
Offline Offline

Activity: 46
Merit: 3


View Profile
September 24, 2018, 07:30:53 PM
 #4


Сделал как по ссылкам описано и это работает.
Такой код для проверки пришлось написать
Code:
//PayableService.sol

pragma solidity ^0.4.25;

contract PayableService{

    address public owner;
   
    address public donator;
   
    uint amount;
   
    uint public constant ETH_PERCENT = 10 * 10 ** 15;  // price in wei // 0.01 ETH
   
    uint public constant CALL_PRICE = ETH_PERCENT * 50; // 50% = 0.5 ETH
   
    uint public ret = 0;
   
    constructor() payable public {
        owner = msg.sender;
    }   
   
    function () payable public  {
        donator = msg.sender;
        amount = msg.value;
    }

    function summ(uint arg1, uint arg2) payable public /*constant*/ returns (uint) {
       
        require(msg.value >= CALL_PRICE);
       
        require(arg1 >= 0 && arg2 >= 0);
       
        return ret = arg1 + arg2;
    }

}

Если просто вызывать функцию и делать оплату то это работает.
А что делать если надо из смарт контракта вызвать платную функцию другого контракта, как мне переделать этот пример чтобы работал с контрактом выше?

Code:
//PayableServiceUser.sol

pragma solidity ^0.4.25;

import "./PayableService.sol";

contract PayableServiceUser {
   
    address public owner;
   
    address public addr1;
   
    uint public resp = 0;
   
    constructor() payable public {
        owner = msg.sender;
    }     

    function setContractAddr(address _addr) payable public{
        require(msg.sender == owner);
        addr1 = _addr;
    }   
   
    function requestService(uint arg1, uint arg2) payable public {
       
        //как тут вызов сделать который будет платить за вызов?
        PayableService payableService = PayableService(addr1);
        resp = payableService.summ(arg1, arg2);
    }     
}
zan0za (OP)
Jr. Member
*
Offline Offline

Activity: 46
Merit: 3


View Profile
September 24, 2018, 10:49:17 PM
Merited by bomj (1), Jaga-Jaga (1)
 #5

Заменил
resp = payableService.summ(arg1, arg2);

на
resp =  payableService.summ.value(CALL_PRICE)(arg1, arg2);
Так заработало.

А как выводить эфир с адреса контракта, обязательно функцию писать для этого или владелец контракта как то имеет возможность совершать транзакции с этого контракта без написания специальной функции?
bomj
Sr. Member
****
Offline Offline

Activity: 1337
Merit: 288


0xbt


View Profile WWW
September 25, 2018, 05:15:37 PM
 #6

А как выводить эфир с адреса контракта, обязательно функцию писать для этого или владелец контракта как то имеет возможность совершать транзакции с этого контракта без написания специальной функции?

Вы знаете, пока не разбирался.
Подготовил концепцию нового токена, перерываю толк на поиск аналогов.
Одновременно просматриваю интересные контракты и возможность реализации.
Все, что интересует пока быстро просматриваю забрасываю в закладки, откуда и послал вам ссылки.
Уже массу закладок понаделал. Когда читать?
Кстати данная тема меня интересует. Так что спасибо, за то что не промолчали,
а ответили да еще и с кодом.
Возможно в будущем к вам и обращусь с вопросом.

zan0za (OP)
Jr. Member
*
Offline Offline

Activity: 46
Merit: 3


View Profile
September 25, 2018, 10:06:52 PM
 #7

А как выводить эфир с адреса контракта, обязательно функцию писать для этого или владелец контракта как то имеет возможность совершать транзакции с этого контракта без написания специальной функции?

Вы знаете, пока не разбирался.
Подготовил концепцию нового токена, перерываю толк на поиск аналогов.
Одновременно просматриваю интересные контракты и возможность реализации.
Все, что интересует пока быстро просматриваю забрасываю в закладки, откуда и послал вам ссылки.
Уже массу закладок понаделал. Когда читать?
Кстати данная тема меня интересует. Так что спасибо, за то что не промолчали,
а ответили да еще и с кодом.
Возможно в будущем к вам и обращусь с вопросом.

Как можно без кода задавать вопрос или отвечать в теме КОДЕРЫ?  Grin

Я могу написать функцию которая будет выводить эфир с адреса моего смарт контракта, но хочу узнать есть ли возможность у того кто деплоил контракт выводить эфир с баланса смарт контракта?
pchistyakov
Newbie
*
Offline Offline

Activity: 13
Merit: 0


View Profile
September 26, 2018, 06:14:23 AM
 #8

Посмотрите ссылку, может пригодится https://github.com/ethereum/EIPs/issues/865
bomj
Sr. Member
****
Offline Offline

Activity: 1337
Merit: 288


0xbt


View Profile WWW
September 26, 2018, 10:14:10 AM
Merited by Jaga-Jaga (1)
 #9

Может пригодиться пример реализации у Etherdelta
https://etherscan.io/address/0x8d12a197cb00d4747a1fe03395095ce2a5cc6819#code

Jaga-Jaga
Sr. Member
****
Offline Offline

Activity: 613
Merit: 256



View Profile
October 01, 2018, 05:35:37 PM
 #10

Заменил
resp = payableService.summ(arg1, arg2);

на
resp =  payableService.summ.value(CALL_PRICE)(arg1, arg2);
Так заработало.

А как выводить эфир с адреса контракта, обязательно функцию писать для этого или владелец контракта как то имеет возможность совершать транзакции с этого контракта без написания специальной функции?

Может пригодиться пример реализации у Etherdelta
https://etherscan.io/address/0x8d12a197cb00d4747a1fe03395095ce2a5cc6819#code

За код который может пригодиться вам по мериту  Wink
Может есть смысл отдельную тему для полезного кода создать?

           ▀██▄ ▄██▀
            ▐█████▌
           ▄███▀███▄
         ▄████▄  ▀███▄
       ▄███▀ ▀██▄  ▀███▄
     ▄███▀  ▄█████▄  ▀███▄
   ▄███▀  ▄███▀ ▀███▄  ▀███▄
  ███▀  ▄████▌   ▐████▄  ▀███
 ███   ██▀  ██▄ ▄██  ▀██   ███
███   ███  ███   ███  ███   ███
███   ███   ███████   ███   ███
 ███   ███▄▄       ▄▄███   ███
  ███▄   ▀▀█████████▀▀   ▄███
   ▀████▄▄           ▄▄████▀
      ▀▀███████████████▀▀
DeepOnion
███
███
███
███
███
███
███
███
███
███
   Anonymity Guaranteed
   Anonymous and Untraceable
   Guard Your Privacy
      ▄▄██████████▄▄
    ▄███▀▀      ▀▀█▀   ▄▄
   ███▀              ▄███
  ███              ▄███▀   ▄▄
 ███▌  ▄▄▄▄      ▄███▀   ▄███
▐███  ██████   ▄███▀   ▄███▀
███▌ ███  ███▄███▀   ▄███▀
███▌ ███   ████▀   ▄███▀
███▌  ███   █▀   ▄███▀  ███
▐███   ███     ▄███▀   ███
 ███▌   ███  ▄███▀     ███
  ███    ██████▀      ███
   ███▄             ▄███
    ▀███▄▄       ▄▄███▀
      ▀▀███████████▀▀
bomj
Sr. Member
****
Offline Offline

Activity: 1337
Merit: 288


0xbt


View Profile WWW
October 10, 2018, 01:37:32 PM
 #11

Мысли вслух....

Условие:
Существует развернутый контракт А.
Задача:
Создать контракт Б, который будет срабатывать при вызове
Контракта А.

Пока такие ссылки нашел:
https://dicoiner.com/вызов-существующего-контракта-из-другого-контракта-f9a140eb7dc1  
https://askentire.net/q/Как-вызвать-функцию-из-уже-развернутого-контракта-32299853198  
https://ethereum.stackexchange.com/questions/9733/calling-function-from-deployed-contract

Jaga-Jaga
Sr. Member
****
Offline Offline

Activity: 613
Merit: 256



View Profile
October 14, 2018, 06:45:09 PM
 #12

Мысли вслух....

Условие:
Существует развернутый контракт А.
Задача:
Создать контракт Б, который будет срабатывать при вызове
Контракта А.

Пока такие ссылки нашел:
https://dicoiner.com/вызов-существующего-контракта-из-другого-контракта-f9a140eb7dc1  
https://askentire.net/q/Как-вызвать-функцию-из-уже-развернутого-контракта-32299853198  
https://ethereum.stackexchange.com/questions/9733/calling-function-from-deployed-contract

Если в контракте A не предусмотрен вызов другого контракта то никак не вызвать. Контракты нельзя изменять.
Если в контракте A заранее предусмотреть вызов контракта B то это несложно реализовать, можно даже запилить контракт так чтобы из него можно было вызывать любой контракт а не только B, но и C, D, E, F, при этом этих контрактов еще может и не существовать на момент деплоя контракта A.

До чего мы дожили кодерские темы модераторы в альты переносят, модераторы уже совсем не шарят в теме? ЛОЛ.

           ▀██▄ ▄██▀
            ▐█████▌
           ▄███▀███▄
         ▄████▄  ▀███▄
       ▄███▀ ▀██▄  ▀███▄
     ▄███▀  ▄█████▄  ▀███▄
   ▄███▀  ▄███▀ ▀███▄  ▀███▄
  ███▀  ▄████▌   ▐████▄  ▀███
 ███   ██▀  ██▄ ▄██  ▀██   ███
███   ███  ███   ███  ███   ███
███   ███   ███████   ███   ███
 ███   ███▄▄       ▄▄███   ███
  ███▄   ▀▀█████████▀▀   ▄███
   ▀████▄▄           ▄▄████▀
      ▀▀███████████████▀▀
DeepOnion
███
███
███
███
███
███
███
███
███
███
   Anonymity Guaranteed
   Anonymous and Untraceable
   Guard Your Privacy
      ▄▄██████████▄▄
    ▄███▀▀      ▀▀█▀   ▄▄
   ███▀              ▄███
  ███              ▄███▀   ▄▄
 ███▌  ▄▄▄▄      ▄███▀   ▄███
▐███  ██████   ▄███▀   ▄███▀
███▌ ███  ███▄███▀   ▄███▀
███▌ ███   ████▀   ▄███▀
███▌  ███   █▀   ▄███▀  ███
▐███   ███     ▄███▀   ███
 ███▌   ███  ▄███▀     ███
  ███    ██████▀      ███
   ███▄             ▄███
    ▀███▄▄       ▄▄███▀
      ▀▀███████████▀▀
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!