Skip to content

Commit 56aac84

Browse files
authored
<fix&feat>(transaction,build): update jni version, add transaction manager builder interfaces. (#882)
1 parent f874ddd commit 56aac84

File tree

7 files changed

+330
-56
lines changed

7 files changed

+330
-56
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
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-DEV-SNAPSHOT"
27+
bcosSdkJniVersion = "3.6.0-SNAPSHOT"
2828
slf4jApiVerison = '1.7.36'
2929
mockitoVersion = '4.8.0'
3030
gsonVersion = '2.10.1'

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

Lines changed: 59 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -152,18 +152,9 @@ public TransactionReceipt sendTransaction(
152152
return bcosTransactionReceipt.getTransactionReceipt();
153153
}
154154

155-
// @Override
155+
@Override
156156
public TransactionReceipt sendTransaction(AbiEncodedRequest request) throws JniException {
157-
String signedTransaction =
158-
createSignedTransaction(
159-
request.getTo(),
160-
request.getEncodedData(),
161-
request.getValue(),
162-
request.getGasPrice(),
163-
request.getGasLimit(),
164-
request.getBlockLimit(),
165-
request.getAbi(),
166-
request.getAbi() != null);
157+
String signedTransaction = createSignedTransaction(request).getSignedTx();
167158
BcosTransactionReceipt bcosTransactionReceipt =
168159
client.sendTransaction(signedTransaction, false);
169160
return bcosTransactionReceipt.getTransactionReceipt();
@@ -222,6 +213,55 @@ public String createSignedTransaction(
222213
return txPair.getSignedTx();
223214
}
224215

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+
225265
/**
226266
* Send tx with abi field asynchronously
227267
*
@@ -351,6 +391,14 @@ public String asyncSendTransaction(
351391
return txPair.getTxHash();
352392
}
353393

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+
354402
/**
355403
* Send tx with EIP1559
356404
*

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

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.fisco.bcos.sdk.jni.common.JniException;
88
import org.fisco.bcos.sdk.jni.utilities.tx.TransactionBuilderV1JniObj;
99
import org.fisco.bcos.sdk.jni.utilities.tx.TransactionVersion;
10+
import org.fisco.bcos.sdk.jni.utilities.tx.TxPair;
1011
import org.fisco.bcos.sdk.v3.client.Client;
1112
import org.fisco.bcos.sdk.v3.client.protocol.model.TransactionAttribute;
1213
import org.fisco.bcos.sdk.v3.client.protocol.request.Transaction;
@@ -23,6 +24,7 @@
2324
import org.fisco.bcos.sdk.v3.transaction.gasProvider.ContractGasProvider;
2425
import org.fisco.bcos.sdk.v3.transaction.gasProvider.DefaultGasProvider;
2526
import org.fisco.bcos.sdk.v3.transaction.gasProvider.EIP1559Struct;
27+
import org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.dto.AbiEncodedRequest;
2628
import org.fisco.bcos.sdk.v3.transaction.nonce.DefaultNonceAndBlockLimitProvider;
2729
import org.fisco.bcos.sdk.v3.transaction.nonce.NonceAndBlockLimitProvider;
2830
import org.fisco.bcos.sdk.v3.transaction.signer.AsyncTransactionSignercInterface;
@@ -173,6 +175,12 @@ public TransactionReceipt sendTransaction(
173175
return client.sendTransaction(signedTransaction, false).getTransactionReceipt();
174176
}
175177

178+
@Override
179+
public TransactionReceipt sendTransaction(AbiEncodedRequest request) throws JniException {
180+
TxPair txPair = createSignedTransaction(request);
181+
return client.sendTransaction(txPair.getSignedTx(), false).getTransactionReceipt();
182+
}
183+
176184
/**
177185
* This method is used to create a signed transaction.
178186
*
@@ -265,6 +273,94 @@ public String createSignedTransaction(
265273
client.getExtraData());
266274
}
267275

276+
@Override
277+
public TxPair createSignedTransaction(AbiEncodedRequest request) throws JniException {
278+
if (!request.isTransactionEssentialSatisfy()) {
279+
throw new JniException("Transaction essential fields are not satisfied");
280+
}
281+
int transactionAttribute;
282+
if (client.isWASM()) {
283+
transactionAttribute = TransactionAttribute.LIQUID_SCALE_CODEC;
284+
if (request.isCreate()) {
285+
transactionAttribute |= TransactionAttribute.LIQUID_CREATE;
286+
}
287+
} else {
288+
transactionAttribute = TransactionAttribute.EVM_ABI_CODEC;
289+
}
290+
byte[] methodId = new byte[4];
291+
if (!request.isCreate() && (request.getEncodedData().length >= 4)) {
292+
System.arraycopy(request.getEncodedData(), 0, methodId, 0, 4);
293+
}
294+
String nonce =
295+
request.getNonce() == null ? getNonceProvider().getNonce() : request.getNonce();
296+
BigInteger blockLimit =
297+
request.getBlockLimit() == null
298+
? getNonceProvider().getBlockLimit(client)
299+
: request.getBlockLimit();
300+
BigInteger gasPrice =
301+
request.getGasPrice() == null
302+
? getGasProvider().getGasPrice(methodId)
303+
: request.getGasPrice();
304+
BigInteger gasLimit =
305+
request.getGasLimit() == null
306+
? getGasProvider().getGasLimit(methodId)
307+
: request.getGasLimit();
308+
309+
String dataHash =
310+
TransactionBuilderV1JniObj.calcTransactionDataHashWithFullFields(
311+
cryptoType,
312+
TransactionVersion.V1,
313+
client.getGroup(),
314+
client.getChainId(),
315+
request.getTo(),
316+
nonce,
317+
request.getEncodedData(),
318+
request.isCreate() ? request.getAbi() : "",
319+
blockLimit.longValue(),
320+
Numeric.toHexString(request.getValue()),
321+
Numeric.toHexString(gasPrice),
322+
gasLimit.longValue(),
323+
"",
324+
"");
325+
CompletableFuture<SignatureResult> signFuture = new CompletableFuture<>();
326+
SignatureResult signatureResult;
327+
try {
328+
asyncTxSigner.signAsync(
329+
Hex.decode(dataHash),
330+
signature -> {
331+
signFuture.complete(signature);
332+
return 0;
333+
});
334+
signatureResult =
335+
signFuture.get(
336+
client.getConfigOption().getNetworkConfig().getTimeout(),
337+
TimeUnit.MILLISECONDS);
338+
} catch (Exception e) {
339+
logger.error("Sign transaction failed, error message: {}", e.getMessage(), e);
340+
throw new JniException("Sign transaction failed, error message: " + e.getMessage());
341+
}
342+
String signedTransactionWithSignature =
343+
TransactionBuilderV1JniObj.createSignedTransactionWithSignature(
344+
signatureResult.encode(),
345+
dataHash,
346+
TransactionVersion.V1,
347+
client.getGroup(),
348+
client.getChainId(),
349+
request.getTo(),
350+
nonce,
351+
request.getEncodedData(),
352+
request.isCreate() ? request.getAbi() : "",
353+
blockLimit.longValue(),
354+
Numeric.toHexString(request.getValue()),
355+
Numeric.toHexString(gasPrice),
356+
gasLimit.longValue(),
357+
"",
358+
"",
359+
transactionAttribute,
360+
client.getExtraData());
361+
return new TxPair(dataHash, signedTransactionWithSignature);
362+
}
363+
268364
/**
269365
* Send tx with abi field asynchronously
270366
*
@@ -474,6 +570,14 @@ public void onResponse(TransactionReceipt receipt) {
474570
return dataHash;
475571
}
476572

573+
@Override
574+
public String asyncSendTransaction(AbiEncodedRequest request, TransactionCallback callback)
575+
throws JniException {
576+
TxPair txPair = createSignedTransaction(request);
577+
client.sendTransactionAsync(txPair.getSignedTx(), false, callback);
578+
return txPair.getTxHash();
579+
}
580+
477581
/**
478582
* Send tx with EIP1559
479583
*

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22

33
import java.math.BigInteger;
44
import org.fisco.bcos.sdk.jni.common.JniException;
5+
import org.fisco.bcos.sdk.jni.utilities.tx.TxPair;
56
import org.fisco.bcos.sdk.v3.client.Client;
67
import org.fisco.bcos.sdk.v3.client.protocol.response.Call;
78
import org.fisco.bcos.sdk.v3.model.TransactionReceipt;
89
import org.fisco.bcos.sdk.v3.model.callback.RespCallback;
910
import org.fisco.bcos.sdk.v3.model.callback.TransactionCallback;
1011
import org.fisco.bcos.sdk.v3.transaction.gasProvider.ContractGasProvider;
1112
import org.fisco.bcos.sdk.v3.transaction.gasProvider.EIP1559Struct;
13+
import org.fisco.bcos.sdk.v3.transaction.manager.transactionv1.dto.AbiEncodedRequest;
1214
import org.fisco.bcos.sdk.v3.transaction.nonce.NonceAndBlockLimitProvider;
1315
import org.slf4j.Logger;
1416
import org.slf4j.LoggerFactory;
@@ -116,8 +118,8 @@ public abstract TransactionReceipt sendTransaction(
116118
boolean constructor)
117119
throws JniException;
118120

119-
// public abstract TransactionReceipt sendTransaction(AbiEncodedRequest request) throws
120-
// JniException;
121+
public abstract TransactionReceipt sendTransaction(AbiEncodedRequest request)
122+
throws JniException;
121123

122124
/**
123125
* This method is used to create a signed transaction.
@@ -145,6 +147,8 @@ public abstract String createSignedTransaction(
145147
boolean constructor)
146148
throws JniException;
147149

150+
public abstract TxPair createSignedTransaction(AbiEncodedRequest request) throws JniException;
151+
148152
/**
149153
* Simple send tx asynchronously
150154
*
@@ -230,6 +234,9 @@ public abstract String asyncSendTransaction(
230234
TransactionCallback callback)
231235
throws JniException;
232236

237+
public abstract String asyncSendTransaction(
238+
AbiEncodedRequest request, TransactionCallback callback) throws JniException;
239+
233240
/**
234241
* Send tx with EIP1559
235242
*

0 commit comments

Comments
 (0)