From 3eb423ecbe8c16687b895ba92d3e698ef262d397 Mon Sep 17 00:00:00 2001 From: wangchao Date: Thu, 3 Sep 2020 16:20:27 +0800 Subject: [PATCH 1/3] use locally preempted submission sequence --- .../transactions/TransactionManager.java | 8 +-- .../com/peersafe/chainsql/core/Chainsql.java | 2 + .../com/peersafe/chainsql/core/Submit.java | 23 +++++-- .../com/peersafe/chainsql/net/Connection.java | 4 +- .../peersafe/example/chainsql/TestRipple.java | 66 +++++++++++-------- 5 files changed, 62 insertions(+), 41 deletions(-) diff --git a/chainsql/src/main/java/com/peersafe/base/client/transactions/TransactionManager.java b/chainsql/src/main/java/com/peersafe/base/client/transactions/TransactionManager.java index 03d86d7f..a2f1f4eb 100644 --- a/chainsql/src/main/java/com/peersafe/base/client/transactions/TransactionManager.java +++ b/chainsql/src/main/java/com/peersafe/base/client/transactions/TransactionManager.java @@ -117,7 +117,7 @@ private void clearFailed(long ledger_index) { Set seenValidatedSequences = new TreeSet(); public long sequence = 0; - private UInt32 locallyPreemptedSubmissionSequence() { + public UInt32 locallyPreemptedSubmissionSequence() { if (!accountRoot.primed()) { throw new IllegalStateException("The AccountRoot hasn't been populated from the server"); } @@ -406,9 +406,9 @@ public void handleSubmitSuccess(final ManagedTxn txn, final Response res) { case telNormalFailure: txn.emit(ManagedTxn.OnSubmitError.class, res); return; -// case tefPAST_SEQ: + case tefPAST_SEQ: // resubmitWithNewSequence(txn); -// break; + break; // case tefMAX_LEDGER: // resubmit(txn, submitSequence); // break; @@ -451,7 +451,7 @@ public void handleSubmitSuccess(final ManagedTxn txn, final Response res) { // case terRETRY: // awaitLastLedgerSequenceExpiry(txn); // if (getPending().isEmpty()) { -// sequence--; + sequence--; // } else { // // Plug a Sequence gap and pre-emptively resubmit some txns // // rather than waiting for `OnValidatedSequence` which will diff --git a/chainsql/src/main/java/com/peersafe/chainsql/core/Chainsql.java b/chainsql/src/main/java/com/peersafe/chainsql/core/Chainsql.java index e3488418..9babd5ba 100644 --- a/chainsql/src/main/java/com/peersafe/chainsql/core/Chainsql.java +++ b/chainsql/src/main/java/com/peersafe/chainsql/core/Chainsql.java @@ -73,6 +73,8 @@ public void as(String address, String secret) { this.connection.address = address; this.connection.secret = secret; this.connection.scope = address; + + this.connection.account = this.connection.client.accountFromSeed(secret); } diff --git a/chainsql/src/main/java/com/peersafe/chainsql/core/Submit.java b/chainsql/src/main/java/com/peersafe/chainsql/core/Submit.java index 43718859..8b05bb29 100644 --- a/chainsql/src/main/java/com/peersafe/chainsql/core/Submit.java +++ b/chainsql/src/main/java/com/peersafe/chainsql/core/Submit.java @@ -385,14 +385,23 @@ protected Transaction toTransaction(JSONObject json,TransactionType type) throws fee = fee.add(extraFee); tx.as(Amount.Fee, fee); + + int count = 100; + while (!connection.account.getAccountRoot().primed()) { + Util.waiting(); + if (--count == 0) { + break; + } + } + tx.put(UInt32.Sequence, connection.account.transactionManager().locallyPreemptedSubmissionSequence()); - AccountID account = AccountID.fromAddress(this.connection.address); - JSONObject obj = connection.client.accountInfo(account); - if(obj.has("error")) { - throw new Exception(obj.getString("error_message")); - }else { - tx.as(UInt32.Sequence, obj.getJSONObject("account_data").getInt("Sequence")); - } +// AccountID account = AccountID.fromAddress(this.connection.address); +// JSONObject obj = connection.client.accountInfo(account); +// if(obj.has("error")) { +// throw new Exception(obj.getString("error_message")); +// }else { +// tx.as(UInt32.Sequence, obj.getJSONObject("account_data").getInt("Sequence")); +// } try { tx.parseFromJson(json); diff --git a/chainsql/src/main/java/com/peersafe/chainsql/net/Connection.java b/chainsql/src/main/java/com/peersafe/chainsql/net/Connection.java index 59854687..7e5d92af 100644 --- a/chainsql/src/main/java/com/peersafe/chainsql/net/Connection.java +++ b/chainsql/src/main/java/com/peersafe/chainsql/net/Connection.java @@ -4,6 +4,7 @@ import java.io.IOException; import com.peersafe.base.client.Client; +import com.peersafe.base.client.Account; import com.peersafe.base.client.transport.WebSocketTransport; import com.peersafe.base.client.transport.impl.JavaWebSocketTransportImpl; @@ -12,8 +13,9 @@ public class Connection implements Closeable { public String address; public String secret; public String scope; - public Client client; + public Account account; + public Client client; public String userCert; diff --git a/chainsql/src/test/java/com/peersafe/example/chainsql/TestRipple.java b/chainsql/src/test/java/com/peersafe/example/chainsql/TestRipple.java index 68c29766..22ef6421 100644 --- a/chainsql/src/test/java/com/peersafe/example/chainsql/TestRipple.java +++ b/chainsql/src/test/java/com/peersafe/example/chainsql/TestRipple.java @@ -15,16 +15,16 @@ public class TestRipple { // //account,secret private static String[] sAddr = { - "zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh", // root - "zLLV3G8RfBXY4EAYDvnSaAz4q4PQg8PEe6", // user1 - "zPcimjPjkhQk7a7uFHLKEv6fyGHwFGQjHa", // user - "zhRc343nqZk1wUEQFGXaoU76faJgYRrSBS" // issuer + "zHb9CJAWyB4zj91VRWn96DkukG4bwdtyTh", // root in shard 1 + "zLLV3G8RfBXY4EAYDvnSaAz4q4PQg8PEe6", // user1 in shard 1 + "zPcimjPjkhQk7a7uFHLKEv6fyGHwFGQjHa", // user2 in shard 2 + "zhRc343nqZk1wUEQFGXaoU76faJgYRrSBS" // issuer in shard 2 }; private static String[] sSec = { "xnoPBzXtMeMyMHUVTgbuqAfg1SUTb", // root sec "xnBWT67xXecGGWPCrTYtE1MHjKQqW", // user1 sec - "xxCosoAJMADiy6kQFVgq1Nz8QewkU", // user sec + "xxCosoAJMADiy6kQFVgq1Nz8QewkU", // user2 sec "xxRjxBvT7ABczPh2CMikpNUwjiuLU" // issuer sec }; @@ -33,8 +33,8 @@ public class TestRipple { public static String sUser1 = sAddr[1]; public static String sUserSec1 = sSec[1]; - public static String sUser = sAddr[2]; - public static String sUserSec = sSec[2]; + public static String sUser2 = sAddr[2]; + public static String sUserSec2 = sSec[2]; public static String sGateWay = sAddr[3]; public static String sGateWaySec = sSec[3]; @@ -43,7 +43,7 @@ public class TestRipple { public static void main(String[] args) throws Exception { // - c.connect("ws://192.168.29.115:5217"); + c.connect("ws://192.168.29.69:5017"); // String sCurrency = "abc"; JSONObject jsonObj; @@ -54,17 +54,17 @@ public static void main(String[] args) throws Exception // c.as(rootAddress, rootSecret); // - boolean bActive = false; + boolean bActive = true; boolean bTrust = true; - boolean bPay = false; + boolean bPay = true; if(bActive) { System.out.print("activate >>>>>>>>>>>>>>>\n"); jsonObj = c.pay(sGateWay, "100000000").submit(SyncCond.validate_success); System.out.print(" gateWay:" + jsonObj + "\n"); - jsonObj = c.pay(sUser, "100000000").submit(SyncCond.validate_success); - System.out.print(" user:" + jsonObj + "\n"); jsonObj = c.pay(sUser1, "100000000").submit(SyncCond.validate_success); + System.out.print(" user:" + jsonObj + "\n"); + jsonObj = c.pay(sUser2, "100000000").submit(SyncCond.validate_success); System.out.print(" user1:" + jsonObj + "\n"); System.out.print("activate <<<<<<<<<<<<<<<\n"); } @@ -82,18 +82,18 @@ public static void main(String[] args) throws Exception { System.out.print(e); } - c.as(sUser, sUserSec); - jsonObj = c.trustSet("1000000000", sCurrency, sGateWay).submit(SyncCond.validate_success); - System.out.print(" user: " + jsonObj + "\n"); c.as(sUser1, sUserSec1); - jsonObj = c.trustSet("1000000000", sCurrency, sGateWay).submit(SyncCond.validate_success); + jsonObj = c.trustSet("10000", sCurrency, sGateWay).submit(SyncCond.send_success); System.out.print(" user1: " + jsonObj + "\n"); + c.as(sUser2, sUserSec2); + jsonObj = c.trustSet("10000", sCurrency, sGateWay).submit(SyncCond.validate_success); + System.out.print(" user2: " + jsonObj + "\n"); //check accountline System.out.print("acountLines ...\n"); - jsonObj = c.connection.client.GetAccountLines(sUser); - System.out.print(" user: " + jsonObj + "\n"); jsonObj = c.connection.client.GetAccountLines(sUser1); - System.out.print(" user1 " + jsonObj + "\n"); + System.out.print(" user1: " + jsonObj + "\n"); + jsonObj = c.connection.client.GetAccountLines(sUser2); + System.out.print(" user2: " + jsonObj + "\n"); System.out.print("trust <<<<<<<<<<<<<<<\n"); } if(bPay) @@ -101,15 +101,23 @@ public static void main(String[] args) throws Exception System.out.print("pay >>>>>>>>>>>>>>>\n"); System.out.print("transter issue coin hello:\n"); c.as(sGateWay, sGateWaySec); - jsonObj = c.pay(sUser, "1000000000", sCurrency, sGateWay).submit(SyncCond.validate_success); - System.out.print(" user:\n " + jsonObj + "\n"); - jsonObj = c.connection.client.GetAccountLines(sUser); - System.out.print(" lines: " + jsonObj + "\n"); - c.as(sUser, sUserSec); - jsonObj = c.pay(sUser1, "10000000", sCurrency, sGateWay).submit(SyncCond.validate_success); - System.out.print(" user1:\n " + jsonObj + "\n"); + jsonObj = c.pay(sUser2, "3000", sCurrency, sGateWay).submit(SyncCond.validate_success); + System.out.print(" gateway: " + jsonObj + "\n"); + + c.as(sUser2, sUserSec2); + jsonObj = c.pay(sUser1, "2000", sCurrency, sGateWay).submit(SyncCond.send_success); + System.out.print(" user2: " + jsonObj + "\n"); + + c.as(sUser1, sUserSec1); + jsonObj = c.trustSet("1", sCurrency, sGateWay).submit(SyncCond.validate_success); + System.out.print(" user1: " + jsonObj + "\n"); + jsonObj = c.connection.client.GetAccountLines(sUser1); - System.out.print(" lines: " + jsonObj + "\n"); + System.out.print("user1 lines: " + jsonObj + "\n"); + jsonObj = c.connection.client.GetAccountLines(sUser2); + System.out.print("user2 lines: " + jsonObj + "\n"); + jsonObj = c.connection.client.GetAccountLines(sGateWay); + System.out.print(" gw lines: " + jsonObj + "\n"); System.out.print("pay <<<<<<<<<<<<<<<\n"); } } @@ -141,8 +149,8 @@ public static void main(String[] args) throws Exception } if(bTestCancel) { - c.as(sUser, sUserSec); - jsonObj = c.escrowCancel(sUser, nCreateEscrowSeq).submit(SyncCond.validate_success); + c.as(sUser1, sUserSec1); + jsonObj = c.escrowCancel(sUser1, nCreateEscrowSeq).submit(SyncCond.validate_success); System.out.print("escrowCancel res: " + jsonObj + "\n"); } if(bTime) From 8666b78989855f0d189374a988e25c11de638c82 Mon Sep 17 00:00:00 2001 From: wangchao Date: Thu, 10 Sep 2020 15:22:30 +0800 Subject: [PATCH 2/3] add priority for transaction of nested contract call and callcode --- .../main/java/com/peersafe/chainsql/contract/Contract.java | 5 +++++ .../src/main/java/com/peersafe/chainsql/core/Submit.java | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/chainsql/src/main/java/com/peersafe/chainsql/contract/Contract.java b/chainsql/src/main/java/com/peersafe/chainsql/contract/Contract.java index b6224e41..dc30c6e2 100644 --- a/chainsql/src/main/java/com/peersafe/chainsql/contract/Contract.java +++ b/chainsql/src/main/java/com/peersafe/chainsql/contract/Contract.java @@ -266,6 +266,11 @@ Contract executeTransaction( if(dropValue.intValue() > 0) objTx.put("ContractValue", Amount.fromString(dropValue.toString())); objTx.put("ContractAddress", contractAddress); + + if (this.priority) + { + objTx.put("Priority", 1); + } mTxJson = objTx; diff --git a/chainsql/src/main/java/com/peersafe/chainsql/core/Submit.java b/chainsql/src/main/java/com/peersafe/chainsql/core/Submit.java index 8b05bb29..9f571837 100644 --- a/chainsql/src/main/java/com/peersafe/chainsql/core/Submit.java +++ b/chainsql/src/main/java/com/peersafe/chainsql/core/Submit.java @@ -50,6 +50,8 @@ public abstract class Submit { protected Integer needVerify = 1; //严格模式 protected boolean strictMode = false; + //合約嵌套调用交易,发送到委员会处理 + protected boolean priority = true; public enum SyncCond { send_success, @@ -92,6 +94,10 @@ public void setNeedVerify(boolean flag){ this.needVerify = flag ? 1 : 0; } + public void setPriority(boolean flag) { + this.priority = flag; + } + /** * asynchronous,callback trigger with all possible status * @param cb Callback. From a264507d9bc64c2b41bc32695609e4582e25c69f Mon Sep 17 00:00:00 2001 From: wangchao Date: Sat, 8 May 2021 14:47:05 +0800 Subject: [PATCH 3/3] set transaction default priority to false --- chainsql/src/main/java/com/peersafe/chainsql/core/Submit.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chainsql/src/main/java/com/peersafe/chainsql/core/Submit.java b/chainsql/src/main/java/com/peersafe/chainsql/core/Submit.java index 9f571837..3cc045c5 100644 --- a/chainsql/src/main/java/com/peersafe/chainsql/core/Submit.java +++ b/chainsql/src/main/java/com/peersafe/chainsql/core/Submit.java @@ -51,7 +51,7 @@ public abstract class Submit { //严格模式 protected boolean strictMode = false; //合約嵌套调用交易,发送到委员会处理 - protected boolean priority = true; + protected boolean priority = false; public enum SyncCond { send_success,