Skip to content

Commit 2ada6d8

Browse files
authored
<feat>(transaction,contract): add transaction manager nonce and blockLimit fields. (#889)
1 parent b765754 commit 2ada6d8

17 files changed

+584
-396
lines changed

src/main/java/org/fisco/bcos/sdk/v3/codec/datatypes/Function.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ public class Function {
1212
private List<TypeReference<Type>> outputParameters;
1313
private int transactionAttribute = 0;
1414
private BigInteger value;
15+
private String nonce;
16+
private BigInteger blockLimit;
1517

1618
public Function(
1719
String name, List<Type> inputParameters, List<TypeReference<?>> outputParameters) {
@@ -42,6 +44,19 @@ public Function(
4244
this.value = value;
4345
}
4446

47+
public Function(
48+
String name,
49+
List<Type> inputParameters,
50+
List<TypeReference<?>> outputParameters,
51+
int transactionAttribute,
52+
BigInteger value,
53+
String nonce,
54+
BigInteger blockLimit) {
55+
this(name, inputParameters, outputParameters, transactionAttribute, value);
56+
this.nonce = nonce;
57+
this.blockLimit = blockLimit;
58+
}
59+
4560
public Function() {
4661
this.name = "";
4762
this.inputParameters = Collections.<Type>emptyList();
@@ -75,4 +90,20 @@ public BigInteger getValue() {
7590
public void setValue(BigInteger value) {
7691
this.value = value;
7792
}
93+
94+
public String getNonce() {
95+
return nonce;
96+
}
97+
98+
public void setNonce(String nonce) {
99+
this.nonce = nonce;
100+
}
101+
102+
public BigInteger getBlockLimit() {
103+
return blockLimit;
104+
}
105+
106+
public void setBlockLimit(BigInteger blockLimit) {
107+
this.blockLimit = blockLimit;
108+
}
78109
}

src/main/java/org/fisco/bcos/sdk/v3/transaction/gasProvider/ContractGasProvider.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,6 @@ public interface ContractGasProvider {
1414
boolean isEIP1559Enabled();
1515

1616
EIP1559Struct getEIP1559Struct(String methodId);
17+
18+
EIP1559Struct getEIP1559Struct(byte[] methodId);
1719
}

src/main/java/org/fisco/bcos/sdk/v3/transaction/gasProvider/StaticEIP1559GasProvider.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,9 @@ public boolean isEIP1559Enabled() {
4848
public EIP1559Struct getEIP1559Struct(String methodId) {
4949
return new EIP1559Struct(maxFeePerGas, maxPriorityFeePerGas, gasLimit);
5050
}
51+
52+
@Override
53+
public EIP1559Struct getEIP1559Struct(byte[] methodId) {
54+
return new EIP1559Struct(maxFeePerGas, maxPriorityFeePerGas, gasLimit);
55+
}
5156
}

src/main/java/org/fisco/bcos/sdk/v3/transaction/gasProvider/StaticGasProvider.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,9 @@ public boolean isEIP1559Enabled() {
4040
public EIP1559Struct getEIP1559Struct(String methodId) {
4141
return new EIP1559Struct(BigInteger.ZERO, BigInteger.ZERO, gasLimit);
4242
}
43+
44+
@Override
45+
public EIP1559Struct getEIP1559Struct(byte[] methodId) {
46+
return new EIP1559Struct(BigInteger.ZERO, BigInteger.ZERO, gasLimit);
47+
}
4348
}

src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/AssembleTransactionService.java

Lines changed: 15 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.fisco.bcos.sdk.v3.transaction.codec.decode.ReceiptParser;
1818
import org.fisco.bcos.sdk.v3.transaction.codec.decode.TransactionDecoderInterface;
1919
import org.fisco.bcos.sdk.v3.transaction.codec.decode.TransactionDecoderService;
20+
import org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.dto.AbiEncodedRequest;
2021
import org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.dto.BasicDeployRequest;
2122
import org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.dto.BasicRequest;
2223
import org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.dto.DeployTransactionRequest;
@@ -99,16 +100,10 @@ public TransactionResponse sendTransaction(BasicRequest request)
99100
} else {
100101
throw new ContractCodecException("Request type error, please check.");
101102
}
103+
AbiEncodedRequest abiEncodedRequest = new AbiEncodedRequest(request);
104+
abiEncodedRequest.setEncodedData(encodeMethod);
102105

103-
TransactionReceipt receipt =
104-
transactionManager.sendTransaction(
105-
request.getTo(),
106-
encodeMethod,
107-
request.getValue(),
108-
request.getGasPrice(),
109-
request.getGasLimit(),
110-
request.getAbi(),
111-
false);
106+
TransactionReceipt receipt = transactionManager.sendTransaction(abiEncodedRequest);
112107
if (Objects.nonNull(receipt)
113108
&& (Objects.isNull(receipt.getInput()) || receipt.getInput().isEmpty())) {
114109
receipt.setInput(Hex.toHexStringWithPrefix(encodeMethod));
@@ -155,15 +150,10 @@ public TransactionResponse deployContract(BasicDeployRequest request)
155150
} else {
156151
throw new ContractCodecException("DeployRequest type error, please check.");
157152
}
158-
TransactionReceipt receipt =
159-
transactionManager.sendTransaction(
160-
request.getTo(),
161-
encodeConstructor,
162-
request.getValue(),
163-
request.getGasPrice(),
164-
request.getGasLimit(),
165-
request.getAbi(),
166-
true);
153+
AbiEncodedRequest abiEncodedRequest = new AbiEncodedRequest(request);
154+
abiEncodedRequest.setEncodedData(encodeConstructor);
155+
abiEncodedRequest.setCreate(true);
156+
TransactionReceipt receipt = transactionManager.sendTransaction(abiEncodedRequest);
167157
if (Objects.nonNull(receipt)
168158
&& (Objects.isNull(receipt.getInput()) || receipt.getInput().isEmpty())) {
169159
receipt.setInput(Hex.toHexStringWithPrefix(encodeConstructor));
@@ -210,15 +200,9 @@ public String asyncSendTransaction(BasicRequest request, TransactionCallback cal
210200
} else {
211201
throw new ContractCodecException("Request type error, please check.");
212202
}
213-
return transactionManager.asyncSendTransaction(
214-
request.getTo(),
215-
encodeMethod,
216-
request.getValue(),
217-
request.getGasPrice(),
218-
request.getGasLimit(),
219-
request.getAbi(),
220-
false,
221-
callback);
203+
AbiEncodedRequest abiEncodedRequest = new AbiEncodedRequest(request);
204+
abiEncodedRequest.setEncodedData(encodeMethod);
205+
return transactionManager.asyncSendTransaction(abiEncodedRequest, callback);
222206
}
223207

224208
/**
@@ -260,15 +244,10 @@ public String asyncDeployContract(BasicDeployRequest request, TransactionCallbac
260244
} else {
261245
throw new ContractCodecException("DeployRequest type error, please check.");
262246
}
263-
return transactionManager.asyncSendTransaction(
264-
request.getTo(),
265-
encodeConstructor,
266-
request.getValue(),
267-
request.getGasPrice(),
268-
request.getGasLimit(),
269-
request.getAbi(),
270-
true,
271-
callback);
247+
AbiEncodedRequest abiEncodedRequest = new AbiEncodedRequest(request);
248+
abiEncodedRequest.setEncodedData(encodeConstructor);
249+
abiEncodedRequest.setCreate(true);
250+
return transactionManager.asyncSendTransaction(abiEncodedRequest, callback);
272251
}
273252

274253
/**

src/main/java/org/fisco/bcos/sdk/v3/transaction/manager/transactionv1/DefaultTransactionManager.java

Lines changed: 118 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,124 @@ public void setNonceProvider(NonceAndBlockLimitProvider nonceProvider) {
6262
this.nonceProvider = nonceProvider;
6363
}
6464

65+
/**
66+
* This method is used to send transaction.
67+
*
68+
* @param request An instance of AbiEncodedRequest which contains the necessary information to
69+
* create a transaction: if it is a contract creation, request should setCreate(true), and
70+
* the abi field should be set; if it is EIP1559 transaction, request should set
71+
* EIP1559Struct.
72+
* @return An instance of TxPair which contains the signed transaction and the transaction hash.
73+
* @throws JniException If there is an error during the JNI operation.
74+
*/
75+
@Override
76+
public TransactionReceipt sendTransaction(AbiEncodedRequest request) throws JniException {
77+
String signedTransaction = createSignedTransaction(request).getSignedTx();
78+
BcosTransactionReceipt bcosTransactionReceipt =
79+
client.sendTransaction(signedTransaction, false);
80+
return bcosTransactionReceipt.getTransactionReceipt();
81+
}
82+
83+
/**
84+
* This method is used to send transaction asynchronously.
85+
*
86+
* @param request An instance of AbiEncodedRequest which contains the necessary information to
87+
* create a transaction: if it is a contract creation, request should setCreate(true), and
88+
* the abi field should be set; if it is EIP1559 transaction, request should set
89+
* EIP1559Struct.
90+
* @param callback callback when transaction receipt is returned
91+
* @return transaction data hash
92+
* @throws JniException If there is an error during the JNI operation.
93+
*/
94+
@Override
95+
public String asyncSendTransaction(AbiEncodedRequest request, TransactionCallback callback)
96+
throws JniException {
97+
TxPair txPair = createSignedTransaction(request);
98+
client.sendTransactionAsync(txPair.getSignedTx(), false, callback);
99+
return txPair.getTxHash();
100+
}
101+
102+
/**
103+
* This method is used to create a signed transaction.
104+
*
105+
* @param request An instance of AbiEncodedRequest which contains the necessary information to
106+
* create a transaction: if it is a contract creation, request should setCreate(true), and
107+
* the abi field should be set; if it is EIP1559 transaction, request should set
108+
* EIP1559Struct.
109+
* @return An instance of TxPair which contains the signed transaction and the transaction hash.
110+
* @throws JniException If there is an error during the JNI operation.
111+
*/
112+
@Override
113+
public TxPair createSignedTransaction(AbiEncodedRequest request) throws JniException {
114+
if (!request.isTransactionEssentialSatisfy()) {
115+
throw new JniException(
116+
"Transaction essential fields are not satisfied: encodedData, to.");
117+
}
118+
int transactionAttribute;
119+
if (client.isWASM()) {
120+
transactionAttribute = TransactionAttribute.LIQUID_SCALE_CODEC;
121+
if (request.isCreate()) {
122+
transactionAttribute |= TransactionAttribute.LIQUID_CREATE;
123+
}
124+
} else {
125+
transactionAttribute = TransactionAttribute.EVM_ABI_CODEC;
126+
}
127+
byte[] methodId = new byte[4];
128+
if (!request.isCreate() && (request.getEncodedData().length >= 4)) {
129+
System.arraycopy(request.getEncodedData(), 0, methodId, 0, 4);
130+
}
131+
String nonce =
132+
request.getNonce() == null ? getNonceProvider().getNonce() : request.getNonce();
133+
BigInteger blockLimit =
134+
request.getBlockLimit() == null
135+
? getNonceProvider().getBlockLimit(client)
136+
: request.getBlockLimit();
137+
if (getGasProvider().isEIP1559Enabled() || request.isEIP1559Enabled()) {
138+
EIP1559Struct eip1559Struct =
139+
request.getEip1559Struct() == null
140+
? getGasProvider().getEIP1559Struct(methodId)
141+
: request.getEip1559Struct();
142+
return TransactionBuilderV1JniObj.createSignedEIP1559TransactionWithFullFields(
143+
client.getCryptoSuite().getCryptoKeyPair().getJniKeyPair(),
144+
client.getGroup(),
145+
client.getChainId(),
146+
request.getTo(),
147+
nonce,
148+
request.getEncodedData(),
149+
request.isCreate() ? request.getAbi() : "",
150+
blockLimit.longValue(),
151+
Numeric.toHexString(request.getValue()),
152+
Numeric.toHexString(eip1559Struct.getMaxFeePerGas()),
153+
Numeric.toHexString(eip1559Struct.getMaxPriorityFeePerGas()),
154+
eip1559Struct.getGasLimit().longValue(),
155+
transactionAttribute,
156+
client.getExtraData());
157+
}
158+
159+
BigInteger gasPrice =
160+
request.getGasPrice() == null
161+
? getGasProvider().getGasPrice(methodId)
162+
: request.getGasPrice();
163+
BigInteger gasLimit =
164+
request.getGasLimit() == null
165+
? getGasProvider().getGasLimit(methodId)
166+
: request.getGasLimit();
167+
return TransactionBuilderV1JniObj.createSignedTransactionWithFullFields(
168+
client.getCryptoSuite().getCryptoKeyPair().getJniKeyPair(),
169+
client.getGroup(),
170+
client.getChainId(),
171+
request.getTo(),
172+
nonce,
173+
request.getEncodedData(),
174+
request.isCreate() ? request.getAbi() : "",
175+
blockLimit.longValue(),
176+
Numeric.toHexString(request.getValue()),
177+
Numeric.toHexString(gasPrice),
178+
gasLimit.longValue(),
179+
transactionAttribute,
180+
client.getExtraData());
181+
}
182+
65183
/**
66184
* Send tx with abi field
67185
*
@@ -152,14 +270,6 @@ public TransactionReceipt sendTransaction(
152270
return bcosTransactionReceipt.getTransactionReceipt();
153271
}
154272

155-
@Override
156-
public TransactionReceipt sendTransaction(AbiEncodedRequest request) throws JniException {
157-
String signedTransaction = createSignedTransaction(request).getSignedTx();
158-
BcosTransactionReceipt bcosTransactionReceipt =
159-
client.sendTransaction(signedTransaction, false);
160-
return bcosTransactionReceipt.getTransactionReceipt();
161-
}
162-
163273
/**
164274
* This method is used to create a signed transaction.
165275
*
@@ -213,55 +323,6 @@ public String createSignedTransaction(
213323
return txPair.getSignedTx();
214324
}
215325

216-
@Override
217-
public TxPair createSignedTransaction(AbiEncodedRequest request) throws JniException {
218-
if (!request.isTransactionEssentialSatisfy()) {
219-
throw new JniException(
220-
"Transaction essential fields are not satisfied: encodedData, to.");
221-
}
222-
int transactionAttribute;
223-
if (client.isWASM()) {
224-
transactionAttribute = TransactionAttribute.LIQUID_SCALE_CODEC;
225-
if (request.isCreate()) {
226-
transactionAttribute |= TransactionAttribute.LIQUID_CREATE;
227-
}
228-
} else {
229-
transactionAttribute = TransactionAttribute.EVM_ABI_CODEC;
230-
}
231-
byte[] methodId = new byte[4];
232-
if (!request.isCreate() && (request.getEncodedData().length >= 4)) {
233-
System.arraycopy(request.getEncodedData(), 0, methodId, 0, 4);
234-
}
235-
String nonce =
236-
request.getNonce() == null ? getNonceProvider().getNonce() : request.getNonce();
237-
BigInteger blockLimit =
238-
request.getBlockLimit() == null
239-
? getNonceProvider().getBlockLimit(client)
240-
: request.getBlockLimit();
241-
BigInteger gasPrice =
242-
request.getGasPrice() == null
243-
? getGasProvider().getGasPrice(methodId)
244-
: request.getGasPrice();
245-
BigInteger gasLimit =
246-
request.getGasLimit() == null
247-
? getGasProvider().getGasLimit(methodId)
248-
: request.getGasLimit();
249-
return TransactionBuilderV1JniObj.createSignedTransactionWithFullFields(
250-
client.getCryptoSuite().getCryptoKeyPair().getJniKeyPair(),
251-
client.getGroup(),
252-
client.getChainId(),
253-
request.getTo(),
254-
nonce,
255-
request.getEncodedData(),
256-
request.isCreate() ? request.getAbi() : "",
257-
blockLimit.longValue(),
258-
Numeric.toHexString(request.getValue()),
259-
Numeric.toHexString(gasPrice),
260-
gasLimit.longValue(),
261-
transactionAttribute,
262-
client.getExtraData());
263-
}
264-
265326
/**
266327
* Send tx with abi field asynchronously
267328
*
@@ -391,14 +452,6 @@ public String asyncSendTransaction(
391452
return txPair.getTxHash();
392453
}
393454

394-
@Override
395-
public String asyncSendTransaction(AbiEncodedRequest request, TransactionCallback callback)
396-
throws JniException {
397-
TxPair txPair = createSignedTransaction(request);
398-
client.sendTransactionAsync(txPair.getSignedTx(), false, callback);
399-
return txPair.getTxHash();
400-
}
401-
402455
/**
403456
* Send tx with EIP1559
404457
*

0 commit comments

Comments
 (0)