Я разработал смарт-контракт в солидности, используя трюфель и ганаш. Теперь я хочу получить доступ к этому смарт-контракту с помощью некоторого API. Итак, как это сделать? Должен ли я обязательно использовать web3j или есть другой способ сделать это?
Вы можете использовать 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:
truffle develop
migrate --compile-all --reset
(если еще не развернуто)MyContract.deployed().then(function(instance){app = instance;})
app.someMethod()