Как один контракт отправляет эфир в другой контракт с более чем 2300 газами?

Я хочу, чтобы один контракт собирал определенное количество финни, прежде чем отправлять его другому контракту, но я не могу просто отправить его с помощью C2.send(thisMuch).

function() {
    Dividend m = Dividend(dividendAddr);
    if (this.balance >= 70 finney) {
        uint sendProfit = this.balance;
    }
    m.Enter.send(sendProfit);
}

Это то, что у меня есть до сих пор, но я полностью потерял, когда дело доходило до отправки финни из одного контракта в другой. Как я могу это сделать?

Я заключил два контракта о том, как я думаю, что он должен работать. Контракт один отправляет его на контракт два.

contract one {

    address public deployer;
    address public targetAddress;


    modifier execute {
        if (msg.sender == deployer) {
            _
        }
    }


    function one(address _targetAddress) {
        deployer = msg.sender;
        targetAddress = _targetAddress;
    }


    function forward() {
        two m = two(targetAddress);
        m.pay();
        targetAddress.send(this.balance);
    }


    function() {
        forward();
    }


    function sendBack() execute {
        deployer.send(this.balance);
    }


}

Контракт два возвращает его мне.

contract two {

    address public deployer;

    function two() {
        deployer = msg.sender;
    }

    function pay() {
        deployer.send(this.balance);
    }

    function() {
        pay();
    }

}

Так ли это должно работать?

17 голосов | спросил Sileniced 11 PMpMon, 11 Apr 2016 18:02:19 +030002Monday 2016, 18:02:19

4 ответа


18

Чтобы отправить эфир на другой контракт, указав количество газа, используйте функцию call.

targetAddress.call.gas(200000).value(this.balance)(); вызовет резервную функцию.

targetAddress.call.gas(200000).value(this.balance)(bytes4(sha3("pay()"))); будет вызывать pay функция.

ответил Tjaden Hess 14 AMpThu, 14 Apr 2016 01:48:53 +030048Thursday 2016, 01:48:53
2

Должно быть возможно указать переданное значение и использованный газ для вызова каждой внешней функции (и конструктора):

contract Fa { function fa(uint _a) {} }

contract Fb {
  function fb(address a) {
     Fa b= Fa(a);// or Fa b = New Fa.value(2).gas(200)(a);
    b.fa.value(3).gas(1500)(50);
  }
}

f.gas(x).value(20)() вызывает измененную функцию f и тем самым отправляет 20 Wei (или 20 эфиров по значению (20 эфиров)) и ограничивает газ x (так что этот вызов функции, скорее всего, исчезнет из газа и вернет вам 20 Вэй).

NB: send() должен фактически использовать минимальный газ. Если мы хотим, чтобы код выполнялся, мы должны использовать call()

ответил Badr Bellaj 22 AM00000010000000931 2016, 01:52:09
1

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

ответил Nick Johnson 13 PMpWed, 13 Apr 2016 18:43:59 +030043Wednesday 2016, 18:43:59
0

Функции, посылающие эфир, должны быть отмечены как подлежащие оплате:     имя функции (args) к оплате {       //сделай что-нибудь     }

ответил Jbartual 11 Jam1000000amThu, 11 Jan 2018 09:26:33 +030018 2018, 09:26:33

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132