Zugriff auf Smart Contracts, die mit Trüffel in testrpc von Javascript veröffentlicht wurden, nicht möglich

Ich versuche, einen einfachen Smart Contract zu entwickeln, der Ether von einer Adresse zur anderen sendet, und ich kann es nicht zum Laufen bringen.

Ich verwende Ubuntu 16.04, Truffle 3.4.7, Node 7.10.1 und Solidity 0.4.13.

Der Vertrag wird in einem lokalen TestrPC zusammengestellt und veröffentlicht, aber wenn ich versuche, darauf zuzugreifen, scheint es einfach nicht zu funktionieren.

Ich habe überall nach Lösungen gesucht, aber ich kann einfach nicht herausfinden, was falsch ist, also hoffe ich, dass mir hier jemand helfen kann :)

Der Smart-Contract-Code lautet wie folgt:

contract Transfer {
    function Transfer () {
        owner = msg.sender;
    }
    function sendEther (address dst) payable {
        if(msg.value<=0) revert();
        dst.transfer(msg.value);
    }
}

Die Reihenfolge, der ich folge, um es bereitzustellen, ist wie folgt:

  1. testrpc
  2. Trüffel kompilieren
  3. Trüffel bereitstellen

Dann habe ich eine einfache HTML-Datei, die eine js-Datei enthält, die die Übertragung vornehmen soll:

< script src="/usr/local/lib/node_modules/ethereum-console/node_modules/web3/dist/web3.min.js" >< /script >
< script src="test.js" >< /script >
< /head >
< body >
< /body >
< /html >

Und hier ist der Inhalt der Datei test.js:

var Web3 = require('web3');
let web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
var account_one = web3.eth.accounts[0]; // testrpc address
var account_two = web3.eth.accounts[9]; // testrpc address
/*
// This works fine, makes the transfer:
web3.eth.sendTransaction({from: account_two, to: account_one, value: 100000000000});
*/
// These don't work:
try
{
// First try:
    obj = Transfer.deployed();
    obj.sendEther(account_two, {from: account_one, to: objTransfer, value: 100000000000});
// Second try:
    Transfer.deployed().then(
        function(instance) {
            obj = instance;
            return obj.sendEther.call(account_two, {from: account_one, to: objTransfer, value: 100000000000});
        }
    );
} catch (e) {
    document.write("< br/ >< b >Error: ");
    document.write(e.message);
    document.write("< /b >");
}

Natürlich sind erster und zweiter Versuch die beiden Dinge, die ich versucht habe, nicht beide gleichzeitig ausgeführt, wenn man einen von ihnen versucht, wird der andere kommentiert.

So oder so lautet die Ausgabe, die ich erhalte, wenn ich die HTML-Datei in einem Browser anzeige:

Fehler: Übertragung ist nicht definiert

Offensichtlich kann der Transfer Smart Contract nicht erstellt werden, aber ich verstehe einfach nicht warum. Irgendwelche Hilfe, wie ich das zum Laufen bringen kann?

Vielen Dank im Voraus! :)

Antworten (1)

Sie müssen eine Vertragsinstanz in einer Javascript-Datei erstellen, indem Sie ihre ABI und die Adresse, an der sie bereitgestellt wird, wie unten beschrieben verwenden [ersetzen Sie die ABI und die Adresse Ihres Vertrags]:

// Try to use as below
try {
    // First try:
    var abi = <your contract ABI>;
    var Contract = web3.eth.contract(abi);
    var contractInstance = Contract.at('<Your contract address>');
    contractInstance.sendTransaction({from: account_two, to: account_one, value: 100000000000});
} catch (e) {
    document.write("< br/ >< b >Error: ");
    document.write(e.message);
    document.write("< /b >");
}
Vielen Dank! Ich werde es gleich ausprobieren, um zu sehen, ob es funktioniert :) Gibt es dafür nicht eine ... "elegantere" Lösung? Ich meine, ist es unbedingt notwendig, die gesamte ABI zur js-Datei hinzuzufügen?
Ok ... bei mir funktioniert es auch nicht :( Es zeigt diesen Fehler: t.abi.filter ist keine Funktion
Ihre ABI sollte ein Javascript-Array anstelle einer Zeichenfolge sein. Versuchen Sie es mit JSON.stringify('<ABI>'). ABI wäre öffentlich, wenn Sie den Vertrag bereitstellen, sodass Sie ihn in Javascript behalten oder auf einem Server speichern und über einen Ajax-Aufruf abrufen können. Es hängt alles von dir ab. :)
Wow... endlich geklappt!!! Kann dir nicht genug danken!! :)
Ich habe endlich genug Ruf, um Ihre Antwort positiv zu bewerten !!! :)