Solidity/Web3.js Wert kann nicht an nicht zahlbaren Konstruktor gesendet werden

Ich habe einen einfachen Vertrag, mit dem ich eine kleine Webanwendung erstellt habe. Der Vertrag lautet wie folgt:

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);
    }
}

Das hat immer funktioniert - ich verwende MetaMask, um die Zahlungen zu unterzeichnen und die Verträge einzuleiten. Seit ungefähr einer Woche erhalte ich in meiner Konsole einen Fehler von Web3:Cannot send value to non-payable constructor

Ich habe mich dann bei Google umgeschaut und festgestellt, dass eine Funktion benötigt wird payableund dass es eine Fallback-Funktion in meinem Vertrag geben sollte. Also habe ich meinen Vertrag ein wenig angepasst, das ist, was ich jetzt habe:

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);
    }
}

Ich weiß, dass nicht jede Funktion sein sollte payable, aber um sicherzugehen, habe ich sie zu allem hinzugefügt. Muss nur wieder funktionieren.

Ich erhalte immer noch diesen Fehler mit dem obigen (bearbeiteten) Vertrag.

Antworten (1)

Eine kleine Erklärung. Ich habe "reject" in "kill" umbenannt und zahlbar aus den Funktionen entfernt, die ich mir nicht vorstellen sollte.

Es gibt zwei Möglichkeiten, die Finanzierung in den Vertrag einzuspeisen:

  1. Fügen Sie bei der Bereitstellung des Vertrags einen Mehrwert hinzu. Sie können dies über meta.mask tun, während Sie den Vertrag bereitstellen.
  2. Nachdem es bereitgestellt wurde, können Sie Ether auf die gleiche Weise an die Adresse des Vertrags senden, wie Sie ETH an Ihre andere Brieftasche senden würden. Keine benannte Funktion erforderlich. Die unbenannte (Fallback-)Funktion, nämlich payable, wird ausgeführt.

Sie können den Fallback auch von JavaScript web3.eth.sendTransaction({from: me, to: contract, value: amount})oder von einem anderen Vertrag mit auslösen contractAddress.send(amount). Der Vertrag führt die Fallback-Funktion aus, wenn keine Funktion angegeben ist oder wenn die angegebene Funktion nicht vorhanden ist.

Ich habe der Fallback-Funktion einen Event-Emitter hinzugefügt, um zu zeigen, wie Sie den Fallback für etwas Nützliches verwenden können. Aus Konsistenzgründen habe ich es auch in den Konstruktor eingefügt und ein ähnliches Ereignis für send() hinzugefügt.

Wir können mit Sicherheit sagen, dass die "notwendige Buchhaltung" (in diesem Fall Protokolle) für alle Gelder durchgeführt wird, die diesen Vertrag erreichen und verlassen. Nichts wird sich durch solche Funktionen einschleichen send(), die nicht für die Verarbeitung von Belegen ausgelegt sind.

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);
  }

}

Ich hoffe es hilft.

Könnte der Vertrag innerhalb der Funktion sehen, wie viel Ether er erhalten hat? Ist msg.value äquivalent dazu? @Rob Hitchens
@Avatar Ja, msg.value gibt dir zuverlässig den übertragenen Wert in Wei. Es ist ein uint256.