Greifen Sie in der Java-Anwendung auf den Smart Contract von Ethereum zu

Ich habe Smart Contract in Solidität mit Trüffel und Ganache entwickelt. Jetzt möchte ich über eine API auf diesen Smart Contract zugreifen. Also wie macht man das? Sollte ich zwingend web3j verwenden müssen oder gibt es eine andere Möglichkeit, dies zu tun?

Antworten (1)

Sie könnten web3j verwenden.

Angenommen, Sie haben Ihren Vertrag mit Truffle für Ganache bereitgestellt, können Sie in Ihrem Java-Code TruffleJsonFunctionWrapperGenerator verwenden, um einen Wrapper für Ihren Vertrag zu generieren. Maven-Abhängigkeiten hinzufügen:

    <dependency>
        <groupId>org.web3j</groupId>
        <artifactId>core</artifactId>
        <version>LATEST</version>
    </dependency>
    <dependency>
        <groupId>org.web3j</groupId>
        <artifactId>codegen</artifactId>
        <version>LATEST</version>
    </dependency>

Generieren Sie die Wrapper-Klasse:

        String outputDir = PROJECT_DIR + \\src\main\java;
        String packageName = "domain.yourCompany.yourApp.somePackage";  //output package
        String[] contractGenerationArgs = new String[7];
        contractGenerationArgs[0] = "generate";
        contractGenerationArgs[1] = "--javaTypes";
        contractGenerationArgs[2] = PATH_TO_TRUFFLE_JSON_OUTPUT_FILE_OF_THE_CONTRACT;
        contractGenerationArgs[3] = "-o";
        contractGenerationArgs[4] = outputDir;
        contractGenerationArgs[5] = "-p";
        contractGenerationArgs[6] = packageName;
        TruffleJsonFunctionWrapperGenerator.run(contractGenerationArgs);

Jetzt verwenden:

Web3j web3 = Web3j.build(new HttpService("http://localhost:7545/")); //running ganache over port 7545
Web3ClientVersion web3ClientVersion = web3.web3ClientVersion().send();
String account = web3.ethAccounts().send().getAccounts().get(0);
Credentials credentials = Credentials.create(account);
String contractAddress = "0x345ca3e014aaf5dca488057592ee47305d9b3e10"; //The deployed contract address, taken from truffle console or ganache logs
BigInteger gasPrice = new BigInteger(GAS_PRICE);
BigInteger gasLimit = new BigInteger(GAS_LIMIT);
MyContract myContract = MyContract.load(contractAddress, web3, credentials, gasPrice, gasLimit);

//Now you can call methods
myContract.someMethod().send();

Wenn Sie web3j nicht verwenden möchten, können Sie auch truffle von der Terminal-/Windows-Power-Shell verwenden:

  1. truffle develop
  2. migrate --compile-all --reset(falls nicht bereits bereitgestellt)
  3. MyContract.deployed().then(function(instance){app = instance;})
  4. app.someMethod()