Как передать переменную из смарт-контракта в java-проект с помощью web3j

#java #solidity #web3-java

#java #solidity #web3-java

Вопрос:

Вот очень простой смарт-контракт:

 pragma solidity ^0.7.0;
        
contract Name {
    
    string name = "Tom";
    
    function getName() public view returns (string memory) {
        return name;
    }
}
  

Затем я преобразовал это в файл Java с помощью web3j, и функция getName() выглядит следующим образом:

 public RemoteCall<TransactionReceipt> getName() {
    final Function function = new Function(
            FUNC_GETNAME, 
            Arrays.<Type>asList(), 
            Collections.<TypeReference<?>>emptyList());
    return executeRemoteCallTransaction(function);
}
  

Я немного запутался в том, как получить возвращаемое значение функции getName().

Ответ №1:

Я не уверен, какую версию web3j вы используете. В настоящее время я использую Web3j 1.4.1. Когда я создал класс-оболочку, он имеет другой возвращаемый тип, чем тот, который вы упомянули.

 public RemoteFunctionCall<String> getName() {
    final org.web3j.abi.datatypes.Function function = new org.web3j.abi.datatypes.Function(FUNC_GETNAME, 
            Arrays.<Type>asList(), 
            Arrays.<TypeReference<?>>asList(new TypeReference<Utf8String>() {}));
    return executeRemoteCallSingleValueReturn(function, String.class);
}
  

Ниже приведен код, который я попытался обойти. Он возвращает имя, которое упоминается в общедоступной переменной.

 nameContract = Name.deploy(this.web3j, this.credential, (new ContractGasProviderImplementations())).send();
        
String name = nameContract.getName().send();
        
System.out.println(name);