Es ist eine Methode, um den durch Solidität erstellten Vertrag mit web3j auszuführen. Erfahren Sie, wie Sie eine Sol-Datei in eine Java-Klasse konvertieren. Der in diesem Artikel verwendete Vertrag verwendet den im folgenden Artikel beschriebenen Inhalt.
So konvertieren Sie Soliditätsverträge in Java-Vertragsklassen
sample.java
try {
SampleGasProvider gasProvider = new SampleGasProvider(BigInteger.valueOf(500), BigInteger.valueOf(200000));
Addition contract = Addition.deploy(
web3j,
credentials,
gasProvider
).send();
//Geben Sie die Adresse des Vertrags aus
System.out.println("contract address: " + contract.getContractAddress());
//Methodenaufruf (keine Transaktion)
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;
}
}
Der Inhalt des Codes ist einfach. Stellen Sie zunächst den Vertrag bereit. Nach Abschluss dieses Vorgangs wird eine Transaktion zum Bereitstellen des Vertrags erstellt, in den Block eingefügt und anschließend abgeschlossen.
Sample.java
Addition contract = Addition.deploy(
web3j,
credentials,
gasProvider
).send();
Ausführungsergebnis (Geth-Konsole)
INFO [09-16|17:19:41.983] Submitted contract creation fullhash=0xd169416410c2e6e7bdc02a2a27384ed2425e1433f39117a3810675fcfed85353 contract=0xf5ad7542173e8944D1aE16B4394eAA34cfdA4814
Dann führen Sie den Vertrag aus.
Sample.java
System.out.println("get: " + contract.get().send());
System.out.println("add: " + contract.add(BigInteger.valueOf(10)).sendAsync());
In diesem Beispiel wird zuerst der Abrufprozess des Vertrags aufgerufen. Da get nur auf den Wert verweist, wird keine Transaktion erstellt und sofort eine Antwort zurückgegeben.
Da der nächste Additionsprozess das Aktualisieren des Werts ist, wird eine Transaktion erstellt. Da wir "send Async" verwenden, erhalten wir eine Antwort, bevor sie in den Block aufgenommen wird. In diesem Beispiel lautet die Ausgabe wie folgt.
add: java.util.concurrent.CompletableFuture@18271936[Not completed]
Wenn Sie warten müssen, bis die Verarbeitung im Block erfasst wurde, nehmen Sie die folgenden Änderungen vor:
Sample.java
System.out.println("add: " + contract.add(BigInteger.valueOf(10)).send());
Der obige Code diente zum Bereitstellen und Ausführen des Vertrags. Es gibt jedoch auch eine Möglichkeit, einen Vertrag bereitzustellen, der bereits bereitgestellt wurde.
Sample.java
Addition contract = Addition.load(
address,
web3j,
credentials,
gasProvider
);
Die Bereitstellung und die Argumente sind fast gleich, aber das erste Argument ist die Adresse des Vertrags. (Einschließlich 0x) Nachfolgende Operationen werden sich überhaupt nicht ändern.
Recommended Posts