Доступ к смарт-контракту Ethereum в приложении Java

Я разработал смарт-контракт в солидности, используя трюфель и ганаш. Теперь я хочу получить доступ к этому смарт-контракту с помощью некоторого API. Итак, как это сделать? Должен ли я обязательно использовать web3j или есть другой способ сделать это?

Ответы (1)

Вы можете использовать web3j.

Предполагая, что вы развернули свой контракт на ганаш с помощью трюфеля, в своем java-коде вы можете использовать TruffleJsonFunctionWrapperGenerator для создания оболочки для вашего контракта. Добавьте зависимости maven:

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

Создайте класс-оболочку:

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

Теперь используйте его:

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

Если вы не хотите использовать web3j, вы также можете использовать трюфель из оболочки терминала/Windows Power:

  1. truffle develop
  2. migrate --compile-all --reset(если еще не развернуто)
  3. MyContract.deployed().then(function(instance){app = instance;})
  4. app.someMethod()