Skip to content

Commit fda2f89

Browse files
committed
<feat>(transaction,contract): add transaction manager extension field, adapt v2 transaction, add contract wrapper.
1 parent 67ca800 commit fda2f89

File tree

10 files changed

+311
-77
lines changed

10 files changed

+311
-77
lines changed

build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ ext {
2424
webankJavaCryptoVersion = "1.0.3"
2525
junitVersion = '4.13.2'
2626
commonsCollections4Version = "4.4"
27-
bcosSdkJniVersion = "3.6.0"
27+
bcosSdkJniVersion = "3.7.0-SNAPSHOT"
2828
slf4jApiVerison = '1.7.36'
2929
mockitoVersion = '4.8.0'
3030
gsonVersion = '2.10.1'
@@ -35,7 +35,7 @@ ext {
3535
// integrationTest.mustRunAfter test
3636
allprojects {
3737
group = 'org.fisco-bcos.java-sdk'
38-
version = '3.6.0'
38+
version = '3.7.0-SNAPSHOT'
3939

4040
apply plugin: 'maven-publish'
4141
apply plugin: 'idea'

src/integration-test/java/org/fisco/bcos/sdk/v3/test/transaction/decoder/HashCalculatorTest.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ public void testTxHashCalculate() throws IOException {
116116
// abi
117117
byteArrayOutputStream.write(abi.getBytes());
118118

119-
if (transactionResponse.getVersion() == TransactionVersion.V1.getValue()) {
119+
if (transactionResponse.getVersion() >= TransactionVersion.V1.getValue()) {
120120
byteArrayOutputStream.write(transactionResponse.getValue().getBytes());
121121
byteArrayOutputStream.write(transactionResponse.getGasPrice().getBytes());
122122
byteArrayOutputStream.write(
@@ -125,6 +125,10 @@ public void testTxHashCalculate() throws IOException {
125125
byteArrayOutputStream.write(transactionResponse.getMaxPriorityFeePerGas().getBytes());
126126
}
127127

128+
if(transactionResponse.getVersion() >= TransactionVersion.V2.getValue()){
129+
byteArrayOutputStream.write(transactionResponse.getExtension());
130+
}
131+
128132
String hash = "";
129133
if (client.getCryptoSuite().cryptoTypeConfig == CryptoType.ECDSA_TYPE) {
130134
hash = Keccak256.calculateHash(byteArrayOutputStream.toByteArray());

src/main/java/org/fisco/bcos/sdk/v3/client/protocol/model/JsonTransactionResponse.java

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.fisco.bcos.sdk.jni.utilities.tx.TransactionBuilderV1JniObj;
3030
import org.fisco.bcos.sdk.jni.utilities.tx.TransactionData;
3131
import org.fisco.bcos.sdk.jni.utilities.tx.TransactionDataV1;
32+
import org.fisco.bcos.sdk.jni.utilities.tx.TransactionDataV2;
3233
import org.fisco.bcos.sdk.jni.utilities.tx.TransactionStructBuilderJniObj;
3334
import org.fisco.bcos.sdk.jni.utilities.tx.TransactionVersion;
3435
import org.fisco.bcos.sdk.v3.client.exceptions.ClientException;
@@ -68,6 +69,9 @@ public class JsonTransactionResponse {
6869
private String maxFeePerGas = "";
6970
private String maxPriorityFeePerGas = "";
7071

72+
// Fields of v2 transaction
73+
private byte[] extension = null;
74+
7175
public JsonTransactionResponse() {}
7276

7377
public String getAbi() {
@@ -232,6 +236,14 @@ public void setMaxPriorityFeePerGas(String maxPriorityFeePerGas) {
232236
this.maxPriorityFeePerGas = maxPriorityFeePerGas;
233237
}
234238

239+
public byte[] getExtension() {
240+
return extension;
241+
}
242+
243+
public void setExtension(byte[] extension) {
244+
this.extension = extension;
245+
}
246+
235247
/**
236248
* This method is not correct, only can decode from method {@link #writeToHexString()}, which
237249
* not enable to send transaction to blockchain.
@@ -304,6 +316,24 @@ public String calculateHash(CryptoSuite cryptoSuite) throws ClientException {
304316
*/
305317
public String calculateHash(int cryptoSuiteType) throws ClientException {
306318
try {
319+
// FIXME: core dump in here
320+
// return TransactionStructBuilderJniObj.calcTransactionDataStructHash(
321+
// cryptoSuiteType,
322+
// new TransactionDataV2()
323+
// .buildExtension(getExtension())
324+
// .buildValue(getValue())
325+
// .buildGasPrice(getGasPrice())
326+
// .buildGasLimit(getGasLimit())
327+
// .buildMaxFeePerGas(getMaxFeePerGas())
328+
// .buildMaxPriorityFeePerGas(getMaxPriorityFeePerGas())
329+
// .buildVersion(getVersion())
330+
// .buildGroupId(getGroupID())
331+
// .buildChainId(getChainID())
332+
// .buildTo(getTo())
333+
// .buildNonce(new String(Hex.decode(getNonce())))
334+
// .buildInput(Hex.decode(getInput()))
335+
// .buildAbi(getAbi())
336+
// .buildBlockLimit(getBlockLimit()));
307337
return TransactionBuilderV1JniObj.calcTransactionDataHashWithFullFields(
308338
cryptoSuiteType,
309339
(getVersion() == 0 ? TransactionVersion.V0 : TransactionVersion.V1),
@@ -371,19 +401,24 @@ public byte[] encodeTransactionData() throws IOException {
371401
// abi
372402
byteArrayOutputStream.write(getAbi().getBytes());
373403

374-
if (getVersion() == TransactionVersion.V1.getValue()) {
404+
if (getVersion() >= TransactionVersion.V1.getValue()) {
375405
byteArrayOutputStream.write(getValue().getBytes());
376406
byteArrayOutputStream.write(getGasPrice().getBytes());
377407
byteArrayOutputStream.write(toBytesPadded(BigInteger.valueOf(getGasLimit()), 8));
378408
byteArrayOutputStream.write(getMaxFeePerGas().getBytes());
379409
byteArrayOutputStream.write(getMaxPriorityFeePerGas().getBytes());
380410
}
411+
412+
if (getVersion() >= TransactionVersion.V2.getValue()) {
413+
byteArrayOutputStream.write(getExtension());
414+
}
415+
381416
return byteArrayOutputStream.toByteArray();
382417
}
383418

384419
public static JsonTransactionResponse decodeTransaction(String hexString) throws JniException {
385420
Transaction transactionV1 =
386-
TransactionStructBuilderJniObj.decodeTransactionStructV1(hexString);
421+
TransactionStructBuilderJniObj.decodeTransactionStructV2(hexString);
387422
TransactionData transactionData = transactionV1.getTransactionData();
388423
JsonTransactionResponse jsonTransactionResponse = new JsonTransactionResponse();
389424
jsonTransactionResponse.setVersion(transactionData.getVersion());
@@ -404,8 +439,7 @@ public static JsonTransactionResponse decodeTransaction(String hexString) throws
404439
Hex.toHexStringWithPrefixNullable(transactionV1.getSignature(), ""));
405440
jsonTransactionResponse.setImportTime(transactionV1.getImportTime());
406441

407-
if (transactionData instanceof TransactionDataV1
408-
&& transactionData.getVersion() == TransactionVersion.V1.getValue()) {
442+
if (transactionData.getVersion() >= TransactionVersion.V1.getValue()) {
409443
TransactionDataV1 transactionDataV1 = (TransactionDataV1) transactionData;
410444
jsonTransactionResponse.setValue(transactionDataV1.getValue());
411445
jsonTransactionResponse.setGasPrice(transactionDataV1.getGasPrice());
@@ -414,6 +448,11 @@ public static JsonTransactionResponse decodeTransaction(String hexString) throws
414448
jsonTransactionResponse.setMaxPriorityFeePerGas(
415449
transactionDataV1.getMaxPriorityFeePerGas());
416450
}
451+
452+
if (transactionData.getVersion() >= TransactionVersion.V2.getValue()) {
453+
TransactionDataV2 transactionDataV2 = (TransactionDataV2) transactionData;
454+
jsonTransactionResponse.setExtension(transactionDataV2.getExtension());
455+
}
417456
return jsonTransactionResponse;
418457
}
419458

src/main/java/org/fisco/bcos/sdk/v3/contract/Contract.java

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,10 @@
5656
import org.fisco.bcos.sdk.v3.transaction.codec.decode.ReceiptParser;
5757
import org.fisco.bcos.sdk.v3.transaction.manager.TransactionProcessor;
5858
import org.fisco.bcos.sdk.v3.transaction.manager.TransactionProcessorFactory;
59+
import org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.DefaultTransactionManager;
5960
import org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.TransactionManager;
61+
import org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.dto.AbiEncodedRequest;
62+
import org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.utils.TransactionRequestBuilder;
6063
import org.fisco.bcos.sdk.v3.transaction.model.dto.CallRequest;
6164
import org.fisco.bcos.sdk.v3.transaction.model.exception.ContractException;
6265
import org.slf4j.Logger;
@@ -560,6 +563,31 @@ protected String asyncExecuteTransaction(Function function, TransactionCallback
560563
function.getValue());
561564
}
562565

566+
protected String asyncExecuteTransaction(
567+
ContractWrapper contractWrapper, TransactionCallback callback) {
568+
try {
569+
TransactionManager txManager = this.transactionManager;
570+
if (txManager == null) {
571+
txManager = new DefaultTransactionManager(client);
572+
}
573+
AbiEncodedRequest abiEncodedRequest =
574+
new TransactionRequestBuilder()
575+
.setNonce(contractWrapper.getNonce())
576+
.setBlockLimit(contractWrapper.getBlockLimit())
577+
.setExtension(contractWrapper.getExtension())
578+
.setValue(
579+
contractWrapper.getValue() != null
580+
? contractWrapper.getValue().toBigIntegerExact()
581+
: null)
582+
.buildAbiEncodedRequest(
583+
this.functionEncoder.encode(contractWrapper.getFunction()));
584+
return txManager.asyncSendTransaction(abiEncodedRequest, callback);
585+
} catch (JniException | ContractException e) {
586+
logger.error("sendTransaction failed, error info: {}", e.getMessage(), e);
587+
}
588+
return null;
589+
}
590+
563591
protected TransactionReceipt executeTransaction(Function function) {
564592

565593
if (transactionManager != null) {
@@ -586,6 +614,31 @@ protected TransactionReceipt executeTransaction(Function function) {
586614
txAttribute);
587615
}
588616

617+
protected TransactionReceipt executeTransaction(ContractWrapper contractWrapper) {
618+
TransactionManager txManager = this.transactionManager;
619+
if (txManager == null) {
620+
txManager = new DefaultTransactionManager(client);
621+
}
622+
TransactionReceipt transactionReceipt = null;
623+
try {
624+
AbiEncodedRequest abiEncodedRequest =
625+
new TransactionRequestBuilder()
626+
.setNonce(contractWrapper.getNonce())
627+
.setBlockLimit(contractWrapper.getBlockLimit())
628+
.setExtension(contractWrapper.getExtension())
629+
.setValue(
630+
contractWrapper.getValue() != null
631+
? contractWrapper.getValue().toBigIntegerExact()
632+
: null)
633+
.buildAbiEncodedRequest(
634+
this.functionEncoder.encode(contractWrapper.getFunction()));
635+
transactionReceipt = txManager.sendTransaction(abiEncodedRequest);
636+
} catch (JniException | ContractException e) {
637+
logger.error("sendTransaction failed, error info: {}", e.getMessage(), e);
638+
}
639+
return transactionReceipt;
640+
}
641+
589642
protected TransactionReceipt executeDeployTransaction(byte[] data, String abi) {
590643
if (transactionManager != null) {
591644

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package org.fisco.bcos.sdk.v3.contract;
2+
3+
import java.math.BigDecimal;
4+
import java.math.BigInteger;
5+
import org.fisco.bcos.sdk.v3.codec.datatypes.Function;
6+
import org.fisco.bcos.sdk.v3.model.TransactionReceipt;
7+
import org.fisco.bcos.sdk.v3.model.callback.TransactionCallback;
8+
9+
public class ContractWrapper {
10+
private final Contract contract;
11+
private Function function;
12+
private String nonce;
13+
private BigInteger blockLimit;
14+
private BigDecimal value;
15+
private byte[] extension;
16+
17+
public ContractWrapper(Contract contract) {
18+
this.contract = contract;
19+
}
20+
21+
public ContractWrapper(Contract contract, Function function) {
22+
this.contract = contract;
23+
this.function = function;
24+
}
25+
26+
public Function getFunction() {
27+
return function;
28+
}
29+
30+
public ContractWrapper setFunction(Function function) {
31+
this.function = function;
32+
return this;
33+
}
34+
35+
public String getNonce() {
36+
return nonce;
37+
}
38+
39+
public ContractWrapper setNonce(String nonce) {
40+
this.nonce = nonce;
41+
return this;
42+
}
43+
44+
public BigInteger getBlockLimit() {
45+
return blockLimit;
46+
}
47+
48+
public ContractWrapper setBlockLimit(BigInteger blockLimit) {
49+
this.blockLimit = blockLimit;
50+
return this;
51+
}
52+
53+
public BigDecimal getValue() {
54+
return value;
55+
}
56+
57+
public ContractWrapper setValue(BigDecimal value) {
58+
this.value = value;
59+
return this;
60+
}
61+
62+
public byte[] getExtension() {
63+
return extension;
64+
}
65+
66+
public ContractWrapper setExtension(byte[] extension) {
67+
this.extension = extension;
68+
return this;
69+
}
70+
71+
public TransactionReceipt send() {
72+
return contract.executeTransaction(this);
73+
}
74+
75+
public String asyncSend(TransactionCallback callback) {
76+
return contract.asyncExecuteTransaction(this, callback);
77+
}
78+
}

src/main/java/org/fisco/bcos/sdk/v3/model/TransactionReceipt.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,7 @@ public byte[] encodeTransactionReceipt() throws IOException {
368368
byteArrayOutputStream.write(getContractAddress().getBytes());
369369
byteArrayOutputStream.write(toBytesPadded(BigInteger.valueOf(getStatus()), 4));
370370
byteArrayOutputStream.write(getOutput().getBytes());
371-
if (getVersion() == TransactionVersion.V1.getValue()) {
371+
if (getVersion() >= TransactionVersion.V1.getValue()) {
372372
byteArrayOutputStream.write(getEffectiveGasPrice().getBytes());
373373
}
374374

0 commit comments

Comments
 (0)