From 5851902fc4cc4f5b2746cc775fae41d1ee7d5bb1 Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Wed, 22 May 2019 11:24:38 +0800 Subject: [PATCH] test pass for contract param serialize and deserialize --- .../com/jd/blockchain/consts/DataCodes.java | 8 +++ .../contract/ContractSerializeUtils.java | 62 ++++++++++++++---- .../blockchain/ledger/CONTRACT_BIG_INT.java | 2 +- .../jd/blockchain/ledger/CONTRACT_BINARY.java | 3 +- .../jd/blockchain/ledger/CONTRACT_INT16.java | 2 +- .../jd/blockchain/ledger/CONTRACT_INT8.java | 2 +- .../transaction/ContractInvocationProxy.java | 5 +- .../sdk/client/GatewayServiceFactory.java | 8 +++ .../sdk/test/SDK_Contract_Test.java | 4 +- .../src/test/resources/contract.jar | Bin 5372 -> 6765 bytes .../jd/blockchain/intgr/IntegrationTest.java | 37 +++-------- .../jd/blockchain/intgr/IntegrationTest2.java | 41 +++++------- .../intgr/IntegrationTestAll4Redis.java | 43 ++++-------- 13 files changed, 113 insertions(+), 104 deletions(-) diff --git a/source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java b/source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java index 6b47a505..9d069903 100644 --- a/source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java +++ b/source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java @@ -79,7 +79,15 @@ public interface DataCodes { public static final int DATA = 0x900; + //contract related; public static final int CONTRACT = 0xA00; + public static final int CONTRACT_INT8 = 0xA01; + public static final int CONTRACT_INT16 = 0xA02; + public static final int CONTRACT_INT32 = 0xA03; + public static final int CONTRACT_INT64 = 0xA04; + public static final int CONTRACT_TEXT = 0xA05; + public static final int CONTRACT_BINARY = 0xA06; + public static final int CONTRACT_BIG_INT = 0xA07; public static final int HASH = 0xB00; diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/contract/ContractSerializeUtils.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/contract/ContractSerializeUtils.java index 440c06d1..c68c84bc 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/contract/ContractSerializeUtils.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/contract/ContractSerializeUtils.java @@ -6,8 +6,10 @@ import com.jd.blockchain.binaryproto.DataField; import com.jd.blockchain.consts.DataCodes; import com.jd.blockchain.ledger.*; import com.jd.blockchain.utils.ArrayUtils; +import com.jd.blockchain.utils.Bytes; import com.jd.blockchain.utils.io.ByteArray; import com.jd.blockchain.utils.io.BytesUtils; +import org.springframework.util.ReflectionUtils; import org.springframework.util.SerializationUtils; import java.lang.annotation.Annotation; @@ -92,7 +94,7 @@ public class ContractSerializeUtils { byteBuffer.putInt(curResult.length); } for(int k=0; k classType = classTypes[i]; - int curParamLength = byteBuffer.get(i+1); + int curParamLength = byteBuffer.getInt((i+1)*4); DataContract dataContract = classType.getDeclaredAnnotation(DataContract.class); if(dataContract == null){ - throw new IllegalArgumentException("must set annotation in each param of contract."); + boolean canPass = false; + //check by annotation; + Annotation[] annotationArr = annotations[i]; + for(Annotation annotation : annotationArr){ + if(annotation.annotationType().equals(DataContract.class)){ + dataContract = (DataContract) annotation; + canPass = true; + } + } + if(!canPass){ + throw new IllegalArgumentException("must set annotation in each param of contract."); + } } - result [i] = BinaryProtocol.decodeAs( - byteBuffer.get(params,(i + 1 + classTypes.length)*4,curParamLength).array(), + ByteBuffer byteBuffer1 = ByteBuffer.allocate(curParamLength); + byteBuffer1.put(params,offsetPosition,curParamLength); + offsetPosition += curParamLength; + //if dataContract=primitive type(byte/short/int/long/String),only use its getValues(); + Object object = BinaryProtocol.decodeAs(byteBuffer1.array(), getDataIntf().get(dataContract.code())); + if(isPrimitiveType(dataContract.code())){ + Class classObj = getDataIntf().get(dataContract.code()); + try { + result[i] = ReflectionUtils.invokeMethod(classObj.getMethod("getValue"),object); + } catch (NoSuchMethodException e) { + throw new IllegalStateException("no getValue(). detail="+e.getMessage()); + } + }else { + result[i] = object; + } + byteBuffer1.clear(); } return result; @@ -146,19 +177,28 @@ public class ContractSerializeUtils { return dataContractMap; } + public static boolean isPrimitiveType(int dataContractCode){ + return (dataContractCode == DataCodes.CONTRACT_INT8 || + dataContractCode == DataCodes.CONTRACT_INT16 || + dataContractCode == DataCodes.CONTRACT_INT32 || + dataContractCode == DataCodes.CONTRACT_INT64 || + dataContractCode == DataCodes.CONTRACT_TEXT + ); + } + private static Object regenObj(DataContract dataContract, Object object){ if(getDataIntf().get(dataContract.code()).equals(CONTRACT_INT8.class)){ return new CONTRACT_INT8() { @Override - public int getValue() { - return Integer.parseInt(object.toString()); + public Byte getValue() { + return Byte.parseByte(object.toString()); } }; }else if(getDataIntf().get(dataContract.code()).equals(CONTRACT_INT16.class)){ return new CONTRACT_INT16() { @Override - public int getValue() { - return Integer.parseInt(object.toString()); + public short getValue() { + return Short.parseShort(object.toString()); } }; }else if(getDataIntf().get(dataContract.code()).equals(CONTRACT_INT32.class)){ @@ -185,8 +225,8 @@ public class ContractSerializeUtils { }else if(getDataIntf().get(dataContract.code()).equals(CONTRACT_BINARY.class)){ return new CONTRACT_BINARY() { @Override - public Byte getValue() { - return (Byte) object; + public Bytes getValue() { + return (Bytes) object; } }; }else if(getDataIntf().get(dataContract.code()).equals(CONTRACT_BIG_INT.class)){ diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_BIG_INT.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_BIG_INT.java index e53f017f..fad0e208 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_BIG_INT.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_BIG_INT.java @@ -12,7 +12,7 @@ import java.math.BigDecimal; * @author zhaogw * date 2019-05-17 15:32 */ -@DataContract(code = DataCodes.CONTRACT_BINARY) +@DataContract(code = DataCodes.CONTRACT_BIG_INT) public interface CONTRACT_BIG_INT { @DataField(order=2, primitiveType= PrimitiveType.BIG_INT) diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_BINARY.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_BINARY.java index b4193d85..7661b852 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_BINARY.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_BINARY.java @@ -4,6 +4,7 @@ import com.jd.blockchain.binaryproto.DataContract; import com.jd.blockchain.binaryproto.DataField; import com.jd.blockchain.binaryproto.PrimitiveType; import com.jd.blockchain.consts.DataCodes; +import com.jd.blockchain.utils.Bytes; /** * contract args for Binary; @@ -14,5 +15,5 @@ import com.jd.blockchain.consts.DataCodes; public interface CONTRACT_BINARY { @DataField(order=2, primitiveType= PrimitiveType.BYTES) - Byte getValue(); + Bytes getValue(); } diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_INT16.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_INT16.java index cb27e0c6..b6666cc0 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_INT16.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_INT16.java @@ -14,5 +14,5 @@ import com.jd.blockchain.consts.DataCodes; public interface CONTRACT_INT16 { @DataField(order=2, primitiveType= PrimitiveType.INT16) - int getValue(); + short getValue(); } diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_INT8.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_INT8.java index 754e23ed..f77d3de2 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_INT8.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_INT8.java @@ -14,5 +14,5 @@ import com.jd.blockchain.consts.DataCodes; public interface CONTRACT_INT8 { @DataField(order=2, primitiveType= PrimitiveType.INT8) - int getValue(); + Byte getValue(); } diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ContractInvocationProxy.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ContractInvocationProxy.java index 26857631..542e31f5 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ContractInvocationProxy.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ContractInvocationProxy.java @@ -1,8 +1,7 @@ package com.jd.blockchain.transaction; +import com.jd.blockchain.contract.ContractSerializeUtils; import com.jd.blockchain.utils.Bytes; -import com.jd.blockchain.utils.serialize.binary.ContractSerializeUtils; - import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; @@ -46,7 +45,7 @@ public class ContractInvocationProxy implements InvocationHandler { return null; } - private byte[] serializeArgs(Object[] args, Method method) throws Exception { + private byte[] serializeArgs(Object[] args, Method method) { // TODO 根据方法参数的定义序列化参数; return ContractSerializeUtils.serializeMethodParam(args,method); } diff --git a/source/sdk/sdk-client/src/main/java/com/jd/blockchain/sdk/client/GatewayServiceFactory.java b/source/sdk/sdk-client/src/main/java/com/jd/blockchain/sdk/client/GatewayServiceFactory.java index 5396a430..f3e3b42c 100644 --- a/source/sdk/sdk-client/src/main/java/com/jd/blockchain/sdk/client/GatewayServiceFactory.java +++ b/source/sdk/sdk-client/src/main/java/com/jd/blockchain/sdk/client/GatewayServiceFactory.java @@ -56,6 +56,14 @@ public class GatewayServiceFactory implements BlockchainServiceFactory, Closeabl DataContractRegistry.register(ClientIdentifications.class); DataContractRegistry.register(ClientIdentification.class); + DataContractRegistry.register(CONTRACT_INT8.class); + DataContractRegistry.register(CONTRACT_INT16.class); + DataContractRegistry.register(CONTRACT_INT32.class); + DataContractRegistry.register(CONTRACT_INT64.class); + DataContractRegistry.register(CONTRACT_TEXT.class); + DataContractRegistry.register(CONTRACT_BINARY.class); +// DataContractRegistry.register(CONTRACT_BIG_INT.class); + ByteArrayObjectUtil.init(); } diff --git a/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_Contract_Test.java b/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_Contract_Test.java index d74ea6bd..168065d7 100644 --- a/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_Contract_Test.java +++ b/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_Contract_Test.java @@ -46,7 +46,7 @@ public class SDK_Contract_Test { @Before public void init(){ - ledgerAddress = "j5rpuGWVxSuUbU3gK7MDREfui797AjfdHzvAMiSaSzydu7"; + ledgerAddress = "j5qHcS8jG6XwpE5wXv9HYMeGTb5Fs2gQao3TPQ3irqFpQL"; ledgerHash = getLedgerHash(); pubKey = SDK_GateWay_KeyPair_Para.pubKey0; privKey = SDK_GateWay_KeyPair_Para.privkey0; @@ -68,7 +68,7 @@ public class SDK_Contract_Test { public void demoContract1() { // 发起交易; TransactionTemplate txTemp = bcsrv.newTransaction(ledgerHash); - String contractAddress = "LdeNfBcbQWqVge1sVyLq3EHBJhMMjwQY3uJJE"; + String contractAddress = "LdeNm31KhQ4e76bVjCyhPc7QoTejU6Pig9mHW"; AssetContract2 assetContract = txTemp.contract(contractAddress, AssetContract2.class); TransactionContentBody transactionContentBody = new TransactionContentBody() { @Override diff --git a/source/sdk/sdk-samples/src/test/resources/contract.jar b/source/sdk/sdk-samples/src/test/resources/contract.jar index c96e32148a9e10caa00ba044c759389e29140337..8fb967493d7e30e2fe84a0d75ccf3130e7894aa8 100644 GIT binary patch delta 1621 zcmZXUdpHwn9LG0XL*}xJWtL+yvI@hfIE-A15mJgF2_-9YORjTwT&lBHk(v-i3?=Dt ztwo2q9hYuWi7;x+C6{tJn>x=qo%4JD_&)FZyzlRQ-|zE$Kg)PNQQCnF0&fI}iW6VO zkj63d@!4Q}(xKkvqe++(aLgM`9V25wnb3!o-Q_zz|X&_JY>Y#<2;7kx~>loq53 z1OOmn0Dv}txrW$A*VQ^sJr*2%{`W2$kdEB5Mrt+t%!(7=tS%LM#1S;azT>JXv7y;! z>NT~f_)P)MFRy&`iMSxI>9rR=X$wTX-PX6^y=_AS$pko%@7Qc6p91yauN>3~>5A;R zu%t2UcV?tE3ehic^D!S;EI~YzLO;+~@{ia3(CItt9Dwts$B%KK;iO%sli8!O9~OO1 z#s5+gH*eT+=#2u#qI&|ZWkA5;4dG*~qhrUcVo~PQrYuN_CZrDjuH-STrfhY`X88>x zF9?|!La_m-V{0d*ZOT%P>fmOpIBR7`GR>2ckZPTSRAOY9WgUGeF=H#2(5xQSe&3H-UdYnYKYaVgETJ? zpVIfVGW8d7hpv|Nd>i5ilW4|YodWG^{n>-=6ze#ZC9Z5#Jy))4^ej5!g|{VPE_2y5 z>SP~x4_^>;#Ti2G8Gi0w7Nr-UInRqGdDD!hQBNIsPBR^@^)>rSB}q^WxFYAg20M+L z<1l$)$ZVf}1GIF&w2^UTc+YsOa!@swo?skC*-m=3UE!^&p{`LsvlIN_@EKx2%PGqu zuflu_1x1h+OfMt)6u7@U)txlg%J7og*CCCS|5$4xEjA%}?));ZvZ38ICb>18M{#q! zq;AJ2>cNOUq``?tWd&C!DP>Fe>nbz6*kM!Z4UciKukX$_{%u! zo=YA>*F7eSCqX?vghKr0blN?}FA<> zEFH6(hT=MNTQ*p!F718ajBEa=Q(xZOUdZUqYFPt+voeFOuyLNTF}dE?V=)Q^j6P3^ zK+1B?{o=Lm1*LoAh$j0#gJl@EVUH|_vy#vOw;y`i5;I^@Z&Mt(>5lZARP>qN;H^#W z1Gkd86*?w+XFZwNPL8Ca`gBEA`k}i9)Yj!WS={PNg5{91i?nJ-sh+g;r_?~tG~MhY z7`C0-><%&ioC;L`d@#Dr;^H(|Cq4Ugo)%@Z+x)pgI|U=qaa2D3^IXwwegxPekDvAG zway6Dc~$vGLLh+e5g|$K6bA_r%M6DTe`YMR2ClzOtr@uXy5bPJ>*|6qUZ>bKgw?tZ zAzWbpgBa5mxf}H(Uk+rT7!o9+`TCtq6C_5=4J@J@GYN^piq8HVP!aaOS3z7URJ2j? mUvd3!yBuM=5n16bC8ocW49bDL0U|mqB^-tz06=MzX!aL6TFh(! delta 376 zcmaEB@<)?5z?+$civa|lhOL{(tHS#vY@OdZ>BfNRK%spT?PTls@--`nv^|{LQvHBU z!K^Uj&XtwEK31i?1;b{$@& zWBK|3>&+^KRV{sst)xr81S<32vTMF%_=Lr3^(>C!-?6g`Kg}up#(;1)Tj08hf908h z)MR-^B{1#6sLKrW$K(=5GZ4LbEu%dnn32ii%K>J5;x}h!2Ksoij<^Y`mnY|nn}Q8l zDy|QvuZtUjX&wn%u%SK@ZeV(