C'est une méthode pour exécuter le contrat créé par solidity en utilisant web3j. Apprenez à convertir un fichier sol en classe Java. Le contrat utilisé dans cet article utilise le contenu décrit dans l'article suivant.
Comment convertir des contrats de solidité en classes de contrat Java
sample.java
try {
SampleGasProvider gasProvider = new SampleGasProvider(BigInteger.valueOf(500), BigInteger.valueOf(200000));
Addition contract = Addition.deploy(
web3j,
credentials,
gasProvider
).send();
//Sortir l'adresse du contrat
System.out.println("contract address: " + contract.getContractAddress());
//Appel de méthode (pas de transaction)
System.out.println("get: " + contract.get().send());
System.out.println("add: " + contract.add(BigInteger.valueOf(10)).sendAsync());
System.out.println("get: " + contract.get().send());
} catch (Exception e) {
e.printStackTrace();
}
SampleGasProvider.java
package jp.ethereum;
import java.math.BigInteger;
import org.web3j.tx.gas.ContractGasProvider;
public class SampleGasProvider implements ContractGasProvider{
private BigInteger gasPrice;
private BigInteger gasLimit;
public SampleGasProvider(BigInteger gasPrice, BigInteger gasLimit) {
this.gasPrice = gasPrice;
this.gasLimit = gasLimit;
}
@Override
public BigInteger getGasPrice(String contractFunc) {
return this.gasPrice;
}
@Override
public BigInteger getGasPrice() {
return this.gasPrice;
}
@Override
public BigInteger getGasLimit(String contractFunc) {
return this.gasLimit;
}
@Override
public BigInteger getGasLimit() {
return this.gasLimit;
}
}
Le contenu du code est simple. Tout d'abord, déployez le contrat. Une fois ce processus terminé, une transaction de déploiement du contrat est créée, remplie dans le bloc, puis terminée.
Sample.java
Addition contract = Addition.deploy(
web3j,
credentials,
gasProvider
).send();
Résultat de l'exécution (console geth)
INFO [09-16|17:19:41.983] Submitted contract creation fullhash=0xd169416410c2e6e7bdc02a2a27384ed2425e1433f39117a3810675fcfed85353 contract=0xf5ad7542173e8944D1aE16B4394eAA34cfdA4814
Puis exécutez le contrat.
Sample.java
System.out.println("get: " + contract.get().send());
System.out.println("add: " + contract.add(BigInteger.valueOf(10)).sendAsync());
Dans cet exemple, le processus get du contrat est appelé en premier. Étant donné que get fait uniquement référence à la valeur, aucune transaction n'est créée et une réponse est renvoyée immédiatement.
Étant donné que le processus d'ajout suivant est le processus de mise à jour de la valeur, une transaction est créée. Puisque nous utilisons "send Async", nous obtenons une réponse avant qu'elle ne soit remplie dans le bloc. Dans cet exemple, la sortie sera la suivante.
add: java.util.concurrent.CompletableFuture@18271936[Not completed]
Si vous devez attendre que le traitement soit capturé dans le bloc, apportez les modifications suivantes:
Sample.java
System.out.println("add: " + contract.add(BigInteger.valueOf(10)).send());
Le code ci-dessus était de déployer et d'exécuter le contrat, mais il existe également un moyen d'exécuter un contrat qui a déjà été déployé.
Sample.java
Addition contract = Addition.load(
address,
web3j,
credentials,
gasProvider
);
Le déploiement et les arguments sont presque les mêmes, mais le premier argument est l'adresse du contrat. (Y compris 0x) Les opérations suivantes ne changeront pas du tout.
Recommended Posts