Fehler beim Übertragen von Ether von einem Konto zum anderen in Trüffel mit testrpc

Ich habe einen Mustervertrag mit einer Funktion:

pragma solidity ^0.4.0;

contract Test {

    function sell(address transferTo) public {
        transferTo.transfer(1000);
    }
}

Ich verwende testrpcund trufflezum Bereitstellen und Ausführen von Verträgen:

Test.deployed().then(instance => instance.sell(accounts[1], {from: accounts[0]}))

und Befehl schlägt mit Ausnahme auf VM-Ebene fehl:

Error: VM Exception while processing transaction: revert
    at XMLHttpRequest._onHttpResponseEnd (/usr/local/lib/node_modules/truffle/build/cli.bundled.js:70604:12)
    at XMLHttpRequest._setReadyState (/usr/local/lib/node_modules/truffle/build/cli.bundled.js:70449:12)
    at XMLHttpRequestEventTarget.dispatchEvent (/usr/local/lib/node_modules/truffle/build/cli.bundled.js:70159:18)
    at XMLHttpRequest.request.onreadystatechange (/usr/local/lib/node_modules/truffle/build/cli.bundled.js:315621:13)
    at /usr/local/lib/node_modules/truffle/build/cli.bundled.js:314196:9
    at /usr/local/lib/node_modules/truffle/build/cli.bundled.js:331156:36
    at Object.InvalidResponse (/usr/local/lib/node_modules/truffle/build/cli.bundled.js:43303:16)

Irgendwelche Gedanken, was schief gelaufen ist? Scheint, als ob diese Funktion darstellt, was Dokumente sagen.

Antworten (1)

Da Sie die Methode aus dem Vertrag aufrufen transfer(), versucht sie, das Guthaben aus dem Vertrag selbst zu übertragen , anstatt die 1000 vom Aufrufer zu nehmen. Es scheitert, weil der Vertrag keinen Saldo hat.

pragma solidity ^0.4.0;

contract Test {
    function sell(address transferTo)
      public
      payable // make function payable
    {
      // change the amount to the amount sent with the call (msg.value)          
      transferTo.transfer(msg.value);
    }
}

Im Truffle-Befehl müssten Sie einen Wertbetrag für die Überweisung hinzufügen:

Test.deployed().then(instance => instance.sell(accounts[1], {from: accounts[0], value: web3.toWei(1, 'ether') }))
Was meine Änderungen effektiv bewirken, ist also, Ether von Konten[0] auf Konten[1] zu übertragen, was offensichtlich viel einfacher ist, wenn man Ether einfach direkt überträgt. Aber für das obige Muster würde dies nur Sinn machen, wenn es verschiedene Funktionen gibt, um Ether in den Vertrag zu bringen (zahlbar) und die ursprüngliche Funktion verwendet wird, um Ether aus dem Vertrag herauszuholen.
Vielen Dank, ich werde dies in 10 Minuten überprüfen. Mein ursprünglicher Vertrag ist komplexer, die Übertragung von Ether erfolgt, wenn nur wenige Bedingungen erfüllt sind, und deshalb brauche ich die Funktion selbst.
Gibt es eine Möglichkeit, diese Daten dynamisch zu erhalten? Mein Geschäftsanwendungsfall ist, dass der Kunde die Vertragsfunktion aufruft und die Funktion überprüft, ob der Absender genügend Ethereum auf dem Konto hat und den erforderlichen Betrag nimmt
Soweit mir bekannt ist, ist das nicht möglich. Der Vertrag kann nur Dinge innerhalb des Vertrags kontrollieren, was ihm gegeben/bezahlt wird. Scheint, als könnte eine Funktion, wie Sie sie vorschlagen, ziemlich gefährlich sein, ein böswilliger Smart-Contract-Ersteller könnte jemanden ausnutzen, der diese Methode aufruft, wenn er auf das externe Guthaben dieser Adresse zugreifen könnte. Ein typischeres Muster ist, dass Menschen Gelder auf den Vertrag einzahlen können, der Vertrag das Guthaben jeder Adresse im Vertrag berücksichtigt. Autorisierte Aktionen könnten von diesem Guthaben abgezogen werden, und Menschen können ihr Guthaben auch abheben.
Tatsächlich könnten Sie in Ihrer Benutzeroberfläche außerhalb des Smart Contracts selbst nach solchen Dingen suchen. Wenn Sie beispielsweise Metamask verwenden, geben Sie in Ihrer Benutzeroberfläche den Betrag an, der vom Konto der Person abgezogen werden soll. Sie rufen die Funktion mit web3 auf, wodurch die Autorisierung dieser Person in Metamask abgerufen wird. Wenn ihr Guthaben nicht ausreicht, wird dies von Metamask behandelt/abgelehnt, bevor der Vertrag aufgerufen wird. Dies setzt jedoch voraus, dass es der Zahler ist, der den Anruf einleitet (seine Metamaske).
Danke! Es ist das erste Mal, dass ich von Metamask höre, ursprünglich hatte ich geplant, mobile Apps zu verwenden