Solidity /Web3.js Не удается отправить значение для неплатежеспособного конструктора

У меня есть простой контракт, с которым я построил небольшое веб-приложение. Контракт заключен в следующем:

contract MyContract {
    address public creator;

    function MyContract() {
        creator = msg.sender;
    }

    function reject() {
        selfdestruct(creator);
    }

    function send(address target, uint256 amount) {
        if (!target.send(amount)) throw;
    }
       function destroy(address target) {

        selfdestruct(0x0000000000000000000000000000000000000000);
    }
}

Это всегда сработало - я использую MetaMask для подписи платежей и заключения контрактов. Начиная с недели или чего-то, я получаю сообщение об ошибке в моей консоли из Web3: Cannot send value to non-payable constructor

Затем я начал работать в Google и узнал о функции, которая должна быть payable и что должна быть функция возврата в мой контракт. Поэтому я немного подгонял свой контракт, это то, что у меня есть сейчас:

pragma solidity ^0.4.9;

contract Oursurance {
    address public creator;
    uint x;

    function() payable { x = 1; }

    function Oursurance() payable {
        creator = msg.sender;
    }

    function reject() payable {
        selfdestruct(creator);
    }

    function send(address target, uint256 amount) payable {
        if (!target.send(amount)) throw;
    }

    function destroy(address target) payable {
        selfdestruct(0x0000000000000000000000000000000000000000);
    }
}

Я знаю, что не каждая функция должна быть payable, но для того, чтобы быть уверенным, что я добавил ее ко всему. Просто нужно, чтобы он снова работал.

Я все еще получаю эту ошибку с вышеупомянутым (отредактированным) контрактом.

5 голосов | спросил Arko Elsenaar 13 FebruaryEurope/MoscowbMon, 13 Feb 2017 16:43:54 +0300000000pmMon, 13 Feb 2017 16:43:54 +030017 2017, 16:43:54

1 ответ


4

Немного объяснений. Я переименовал «отклонить», чтобы «убить» и убрать, оплачивая из функций, которые, как я полагаю, не должен иметь этого.

Существует два способа ввода финансирования в контракт:

  1. При развертывании контракта добавьте значение. Вы можете сделать это через meta.mask при развертывании контракта.
  2. После того, как он развернут , вы можете отправить Ether на адрес контракта таким же образом, как и ETH для вашего другого кошелька. Не требуется никакой функции. Будет запущена безымянная (резервная) функция, которая является payable.

Вы также можете инициировать возврат из JavaScript web3.eth.sendTransaction({from: me, to: contract, value: amount}) или из другого контракта с помощью contractAddress.send(amount). Контракт будет выполнять резервную функцию, если функция не указана, или когда указанная функция не существует.

Я добавил источник событий в функцию возврата, чтобы показать, как вы можете использовать резервную копию для чего-то полезного. Для согласованности я также поместил его в конструктор и добавил аналогичное событие для send ().

Мы можем с уверенностью сказать, что «необходимый учет» (журналы в этом случае) выполняется для всех фондов, которые приходят и выходят из этого контракта. Ничто не прорвется через такие функции, как send(), которые не предназначены для обработки квитанций.

pragma solidity ^0.4.9;
contract Oursurance {

  address public creator;

  event LogFundsReceived(address sender, uint amount);
  event LogFundsSent(address receiver, uint amount);

  function() payable {
    LogFundsReceived(msg.sender, msg.value);
  }

  function Oursurance() payable {
    creator = msg.sender;
    LogFundsReceived(msg.sender, msg.value);
  }

  function kill() {
    selfdestruct(creator);
  }

  function send(address target, uint256 amount) {
    if (!target.send(amount)) throw;
    LogFundsSent(target, amount);
  }

}

Надеюсь, что это поможет.

ответил Rob Hitchens 14 FebruaryEurope/MoscowbTue, 14 Feb 2017 05:04:55 +0300000000amTue, 14 Feb 2017 05:04:55 +030017 2017, 05:04:55

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

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

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