Ein Problem mit Filtern und Ereignissen (web3j/TestRPC). SOS! ;)

Helfen Sie mir bitte bei dieser kleinen einfachen Aufgabe! Ich kann dieses Problem seit mehreren Tagen nicht lösen. SOS! ;) Ich versuche, ein Programm zum Filtern von Ereignissen über web3j zu schreiben. Ich habe zum Starten (für den Test) von irgendwo diesen einfachen Vertrag kopiert:

pragma solidity ^0.4.11;
contract EventTest {                
  event NumberEvent(uint indexed number);   

  function triggerEvent(uint val) returns (uint) { 
    NumberEvent(val);
    return 123;
  }                                 
}

Dann habe ich TestRPC, Remix ausgeführt und einen Vertrag erstellt. Hier der Zustand danach:

C:\>testrpc
EthereumJS TestRPC v3.0.5

Available Accounts
==================
(0) 0x5403bdee62d577b2660a2a6af4590ce9c426aceb
(1) 0x88302f871bb26f044f106f1f686fba4f07d9658d
(2) 0xd90aedb12243b420b63317936acaff289316bad6
(3) 0x537598e72b2b8cd179f3fc72ef09f7233f73ef44
(4) 0xef571d65c0e828da5091bb76169dc7ca0ff67f15
(5) 0xe251fa32bf822ad3ccb3133d97ccd64ab97cb0fd
(6) 0x20d6a6bd42ba577a1e6fa938f738b0e07191021b
(7) 0x8e76d16288f5068d2406f1cb7005df449a88790a
(8) 0xb05b5df33972324edc49c02d23ec710f31fc3d09
(9) 0x1bb116bd5916ba749caa429d08406d57030d2eb6

Private Keys
==================
(0) fbd2033e842b85c0da50d1ebc0a73deae130c887762116937ad60266a974c3dd
(1) 6fa1c314f48bb9dee169cb3d6e4d9348adb7df82fefa5229349e8aa3ebc7ce02
(2) 0995cc564f136217a7438daab9f55ca3e593e67483f36de5862826b52f264b19
(3) f642805c48f3c9fda4fac90df031ad0836a4701263d1c900f1d5b42e3b073b51
(4) d4b868c78ee8af1c7900a9a2f6ae59042ef26038aeb151f03a010547852bc99a
(5) 9f76d96f9d88e078591f38ae0d249a746287814fb0f95e59b8634165a1b71560
(6) 722f6fbbd74b471e0ab294983401abb1aecabd6e1e4584eba99c2f408b75c9e3
(7) a57e22386e8874834535e2dd02c28ef8123e7412ff6896d273e0cac69553fe81
(8) 28a53adc37ffa7e96615b0b2e20fb7f342dc99aed2d0e681ca9a447cc5101f05
(9) b92a329c6f616af0bfe7f20d9a48e5518d5ede352475eab640a555300029a7d9

HD Wallet
==================
Mnemonic:      bird ship unlock fiber drink kiwi surprise warrior over cereal item poet
Base HD Path:  m/44'/60'/0'/0/{account_index}

Listening on localhost:8545
eth_accounts
eth_accounts
eth_estimateGas
eth_getBlockByNumber
eth_sendTransaction

  Transaction: 0xc9b39a4ee3c3d02ef4a76011b3bdc00721f196e90e6b9a6708c8d9842ca03698
  Contract created: 0x53417664007120b53005a9f1a42b3fb02e6cb0c7
  Gas usage: 0x01a9f1
  Block Number: 0x01
  Block Time: Thu May 04 2017 12:08:19 GMT+0200

eth_getTransactionReceipt
eth_newFilter
eth_getFilterLogs
eth_getFilterChanges
eth_getFilterChanges
eth_getFilterChanges
eth_getFilterChanges
eth_getFilterChanges

Da in der Kommandozeile von TestRPC ungefähr jede Sekunde die Meldung " eth_getFilterChanges" erschien, habe ich den Browser mit Remix geschlossen und dann kamen die neuen Meldungen " eth_getFilterChanges" nicht mehr.

Dann habe ich einen solchen Java-Code gestartet, um auf neue Ereignisse aus diesem meinem Testvertrag zu "lauschen".

import org.web3j.protocol.Web3j;
import org.web3j.protocol.core.DefaultBlockParameterName;
import org.web3j.protocol.core.methods.request.EthFilter;
import org.web3j.protocol.core.methods.response.Log;
import org.web3j.protocol.http.HttpService;

import rx.functions.Action1;

public class Subscribe {

    public static String contractAddr = "0x53417664007120b53005a9f1a42b3fb02e6cb0c7";

    public static void main(String[] args) {

        Web3j web3 = Web3j.build(new HttpService());

        EthFilter filter = new EthFilter(DefaultBlockParameterName.EARLIEST, DefaultBlockParameterName.LATEST, contractAddr);
        web3.ethLogObservable(filter).subscribe(new Action1<Log>() {
            @Override
            public void call(Log log) {
                System.out.println("log.toString(): " + log.toString());
            }
        });
    }
}

Hier ist das Ergebnis:

eth_newFilter
eth_getFilterChanges
FilterSubprovider - no filter with that id: 0x2

Könnten Sie mir bitte erklären, was ich falsch mache? Vielen Dank im Voraus für jede Hilfe!

Wie rufst du die Funktion auf triggerEvent?
Diese Meldungen erscheinen BEVOR und UNABHÄNGIG von der Veranstaltung!

Antworten (3)

Das Problem hier scheint zu sein, dass test rpc keine Hex-Zahlen ohne führende Null für einstellige Filter erkennt. Es erkennt also "0x03", aber nicht "0x3". Und gut, das ist scheiße.

Aber wenn Sie die ersten 9 Filter-IDs erstellen und verwerfen, sollten Sie für testrpc gut geeignet sein.

Um das Ereignis (für Test) aufzurufen, habe ich beispielsweise diesen Code verwendet:

import java.math.BigInteger;
import java.util.Arrays;
import java.util.concurrent.ExecutionException;

import org.web3j.abi.FunctionEncoder;
import org.web3j.abi.TypeReference;
import org.web3j.abi.datatypes.Function;
import org.web3j.abi.datatypes.Uint;
import org.web3j.protocol.Web3j;
import org.web3j.protocol.core.methods.request.Transaction;
import org.web3j.protocol.http.HttpService;

public class SendEvent {

    public static String myAddr = "0x5638ebd0c2519a0a5e11b79c63add6ef1a5e0557";

    public static void main(String[] args) {

        try {
            Web3j web3 = Web3j.build(new HttpService());

            String encodedFunction = FunctionEncoder.encode(new Function("triggerEvent", 
                    Arrays.asList(Uint.DEFAULT),                                            
                    Arrays.asList(new TypeReference<Uint>() {})));
            String from = myAddr;
            BigInteger gasPrice = BigInteger.valueOf(1);
            BigInteger gasLimit = BigInteger.valueOf(1000000L);
            String to = Subscribe.contractAddr;
            BigInteger nonce = null;

            Transaction transaction = Transaction.createFunctionCallTransaction(from, nonce, gasPrice, gasLimit, to,
                    encodedFunction);

            org.web3j.protocol.core.methods.response.EthSendTransaction transactionResponse = web3
                    .ethSendTransaction(transaction).sendAsync().get();

        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

Ich habe dieses Problem gefunden. Dies war in der Testkette KOVAN und in TestRPC. Die gleichen Aktionen auf der Hauptkette führten zu einem erfolgreichen Ergebnis. Ich wollte die Hauptkette nicht mit Testverträgen belasten, aber ich musste. Nochmals vielen Dank an alle!

Der Vertrag: 0x2783318E7C1c6d1Aab46F0773264f74Fd0a8313d