From f781f6c3d187b020bf58085c8caf524c490a4785 Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Tue, 21 May 2019 14:59:41 +0800 Subject: [PATCH] parse the params'bytes[] --- .../blockchain/binaryproto/DataContract.java | 2 +- .../contract/jvm/JavaContractCode.java | 2 +- .../contract/ContractSerializeUtils.java | 202 ++++++++++++ .../blockchain/ledger/CONTRACT_BIG_INT.java | 20 ++ .../jd/blockchain/ledger/CONTRACT_BINARY.java | 18 ++ .../jd/blockchain/ledger/CONTRACT_INT16.java | 18 ++ .../jd/blockchain/ledger/CONTRACT_INT32.java | 18 ++ .../jd/blockchain/ledger/CONTRACT_INT64.java | 18 ++ .../jd/blockchain/ledger/CONTRACT_INT8.java | 18 ++ .../jd/blockchain/ledger/CONTRACT_TEXT.java | 18 ++ .../contract/ContractConfigure.java | 93 ++++++ .../contract/samples/AssetContract2.java | 27 ++ .../contract/samples/AssetContractImpl2.java | 68 ++++ .../sdk/test/SDK_Contract_Test.java | 301 ++++++++++++++++++ .../sdk/test/SDK_GateWay_KeyPair_Para.java | 16 +- .../src/test/resources/contract.jar | Bin 0 -> 5372 bytes .../test/resources/sys-contract.properties | 13 + .../binary/ContractSerializeUtils.java | 51 --- 18 files changed, 842 insertions(+), 61 deletions(-) create mode 100644 source/ledger/ledger-model/src/main/java/com/jd/blockchain/contract/ContractSerializeUtils.java create mode 100644 source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_BIG_INT.java create mode 100644 source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_BINARY.java create mode 100644 source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_INT16.java create mode 100644 source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_INT32.java create mode 100644 source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_INT64.java create mode 100644 source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_INT8.java create mode 100644 source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_TEXT.java create mode 100644 source/sdk/sdk-samples/src/main/java/com/jd/blockchain/contract/ContractConfigure.java create mode 100644 source/sdk/sdk-samples/src/main/java/com/jd/blockchain/contract/samples/AssetContract2.java create mode 100644 source/sdk/sdk-samples/src/main/java/com/jd/blockchain/contract/samples/AssetContractImpl2.java create mode 100644 source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_Contract_Test.java create mode 100644 source/sdk/sdk-samples/src/test/resources/contract.jar create mode 100644 source/sdk/sdk-samples/src/test/resources/sys-contract.properties delete mode 100644 source/utils/utils-serialize/src/main/java/com/jd/blockchain/utils/serialize/binary/ContractSerializeUtils.java diff --git a/source/binary-proto/src/main/java/com/jd/blockchain/binaryproto/DataContract.java b/source/binary-proto/src/main/java/com/jd/blockchain/binaryproto/DataContract.java index dee872e3..6c0fc8e2 100644 --- a/source/binary-proto/src/main/java/com/jd/blockchain/binaryproto/DataContract.java +++ b/source/binary-proto/src/main/java/com/jd/blockchain/binaryproto/DataContract.java @@ -27,7 +27,7 @@ import java.lang.annotation.Target; * @author huanghaiquan * */ -@Target({ ElementType.TYPE }) +@Target({ ElementType.TYPE, ElementType.PARAMETER }) @Retention(RetentionPolicy.RUNTIME) public @interface DataContract { diff --git a/source/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/JavaContractCode.java b/source/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/JavaContractCode.java index 98eccc18..e1697b8b 100644 --- a/source/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/JavaContractCode.java +++ b/source/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/JavaContractCode.java @@ -5,7 +5,7 @@ import com.jd.blockchain.contract.engine.ContractCode; import com.jd.blockchain.runtime.Module; import com.jd.blockchain.transaction.ContractType; import com.jd.blockchain.utils.Bytes; -import com.jd.blockchain.utils.serialize.binary.ContractSerializeUtils; +import com.jd.blockchain.contract.ContractSerializeUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.ReflectionUtils; 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 new file mode 100644 index 00000000..440c06d1 --- /dev/null +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/contract/ContractSerializeUtils.java @@ -0,0 +1,202 @@ +package com.jd.blockchain.contract; + +import com.jd.blockchain.binaryproto.BinaryProtocol; +import com.jd.blockchain.binaryproto.DataContract; +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.io.ByteArray; +import com.jd.blockchain.utils.io.BytesUtils; +import org.springframework.util.SerializationUtils; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.math.BigDecimal; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author zhaogw + * date 2019/5/16 18:05 + */ +public class ContractSerializeUtils { + public static Map> dataContractMap = new HashMap<>(); + public static final Class[] confirmedType = {CONTRACT_INT8.class,CONTRACT_INT16.class,CONTRACT_INT32.class,CONTRACT_INT64.class, + CONTRACT_TEXT.class,CONTRACT_BINARY.class,CONTRACT_BIG_INT.class}; + + /** + * valid then parse the Object by Method params; + * @param object + * @param method + * @return + */ + public static byte[] serializeMethodParam(Object object,Method method) { + if (object == null) { + return null; + } + + Object[] objArr = null; + if(object.getClass().isArray()){ + objArr = (Object[]) object; + } + + Class[] classTypes = method.getParameterTypes(); + Annotation [][] annotations = method.getParameterAnnotations(); + byte[][] result = new byte[classTypes.length][]; + //将method中形参转换为实体对象,每个形参都必须为@DataContract类型;每个形参使用系统的BinaryProtocol来进行序列化,如果有5个参数,则使用5次序列化; + int sum = 0; + for(int i=0;i classType = classTypes[i]; + DataContract dataContract = classType.getDeclaredAnnotation(DataContract.class); + if(dataContract == null){ + boolean canPass = false; + //check by annotation; + Annotation[] annotationArr = annotations[i]; + for(Annotation annotation : annotationArr){ + if(annotation.annotationType().equals(DataContract.class)){ + dataContract = (DataContract) annotation; + objArr[i] = regenObj(dataContract,objArr[i]); + canPass = true; + } + } + if(!canPass){ + throw new IllegalArgumentException("must set annotation in each param of contract."); + } + } + //get data interface; + result[i] = BinaryProtocol.encode(objArr[i],getDataIntf().get(dataContract.code())); + sum += result[i].length; + } + /** + * //return is byte[], but now is byte[][], so we should reduct dimension, use the header info to the first byte(length=classTypes.length); + format:result[][]={{1,2,3},{4,5},{6,7}}; newResult[]=classTypes.length/first length/second length/3 length/result[0]/result[1]/result[2]; + rtnBytes[0]: 4 bytes(classTypes.length, <255); + rtnBytes[1]: 4 bytes(each param's length, ) + rtnBytes[2]: 4 bytes(each param's length, ) + rtnBytes[3]: 4 bytes(each param's length, ) + rtnBytes[4...]: result[0][] bytes(each param's length) + rtnBytes[5...]: result[1][] bytes(each param's length) + rtnBytes[6...]: result[2][] bytes(each param's length) + */ + + int bodyFirstPosition = 4 + 4*(classTypes.length); + ByteBuffer byteBuffer = ByteBuffer.allocate(bodyFirstPosition + sum); + byteBuffer.putInt(classTypes.length); + for(int j=0; j[] classTypes = method.getParameterTypes(); + Object result[] = new Object[classTypes.length]; + + ByteBuffer byteBuffer = ByteBuffer.allocate(params.length); + int paramNums = byteBuffer.getInt(0); + + if(paramNums != classTypes.length){ + throw new IllegalArgumentException("deserializeMethodparm. params'length in byte[] != method's param length"); + } + for(int i=0; i classType = classTypes[i]; + int curParamLength = byteBuffer.get(i+1); + DataContract dataContract = classType.getDeclaredAnnotation(DataContract.class); + if(dataContract == null){ + 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(), + getDataIntf().get(dataContract.code())); + } + + return result; + } + + + public static Map > getDataIntf(){ + dataContractMap.put(DataCodes.CONTRACT_INT8, CONTRACT_INT8.class); + dataContractMap.put(DataCodes.CONTRACT_INT16, CONTRACT_INT16.class); + dataContractMap.put(DataCodes.CONTRACT_INT32, CONTRACT_INT32.class); + dataContractMap.put(DataCodes.CONTRACT_INT64, CONTRACT_INT64.class); + dataContractMap.put(DataCodes.CONTRACT_TEXT, CONTRACT_TEXT.class); + dataContractMap.put(DataCodes.CONTRACT_BINARY, CONTRACT_BINARY.class); + dataContractMap.put(DataCodes.CONTRACT_BIG_INT, CONTRACT_BIG_INT.class); + dataContractMap.put(DataCodes.TX_CONTENT_BODY, TransactionContentBody.class); + return dataContractMap; + } + + 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()); + } + }; + }else if(getDataIntf().get(dataContract.code()).equals(CONTRACT_INT16.class)){ + return new CONTRACT_INT16() { + @Override + public int getValue() { + return Integer.parseInt(object.toString()); + } + }; + }else if(getDataIntf().get(dataContract.code()).equals(CONTRACT_INT32.class)){ + return new CONTRACT_INT32() { + @Override + public int getValue() { + return Integer.parseInt(object.toString()); + } + }; + }else if(getDataIntf().get(dataContract.code()).equals(CONTRACT_INT64.class)){ + return new CONTRACT_INT64() { + @Override + public long getValue() { + return Long.parseLong(object.toString()); + } + }; + }else if(getDataIntf().get(dataContract.code()).equals(CONTRACT_TEXT.class)){ + return new CONTRACT_TEXT() { + @Override + public String getValue() { + return object.toString(); + } + }; + }else if(getDataIntf().get(dataContract.code()).equals(CONTRACT_BINARY.class)){ + return new CONTRACT_BINARY() { + @Override + public Byte getValue() { + return (Byte) object; + } + }; + }else if(getDataIntf().get(dataContract.code()).equals(CONTRACT_BIG_INT.class)){ + return new CONTRACT_BIG_INT() { + @Override + public BigDecimal getValue() { + return new BigDecimal(object.toString()); + } + }; + } + return null; + } +} 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 new file mode 100644 index 00000000..e53f017f --- /dev/null +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_BIG_INT.java @@ -0,0 +1,20 @@ +package com.jd.blockchain.ledger; + +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 java.math.BigDecimal; + +/** + * contract args for BIG_INT; + * @author zhaogw + * date 2019-05-17 15:32 + */ +@DataContract(code = DataCodes.CONTRACT_BINARY) +public interface CONTRACT_BIG_INT { + + @DataField(order=2, primitiveType= PrimitiveType.BIG_INT) + BigDecimal getValue(); +} 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 new file mode 100644 index 00000000..b4193d85 --- /dev/null +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_BINARY.java @@ -0,0 +1,18 @@ +package com.jd.blockchain.ledger; + +import com.jd.blockchain.binaryproto.DataContract; +import com.jd.blockchain.binaryproto.DataField; +import com.jd.blockchain.binaryproto.PrimitiveType; +import com.jd.blockchain.consts.DataCodes; + +/** + * contract args for Binary; + * @author zhaogw + * date 2019-05-17 15:32 + */ +@DataContract(code = DataCodes.CONTRACT_BINARY) +public interface CONTRACT_BINARY { + + @DataField(order=2, primitiveType= PrimitiveType.BYTES) + Byte 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 new file mode 100644 index 00000000..cb27e0c6 --- /dev/null +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_INT16.java @@ -0,0 +1,18 @@ +package com.jd.blockchain.ledger; + +import com.jd.blockchain.binaryproto.DataContract; +import com.jd.blockchain.binaryproto.DataField; +import com.jd.blockchain.binaryproto.PrimitiveType; +import com.jd.blockchain.consts.DataCodes; + +/** + * contract args for int16; + * @author zhaogw + * date 2019-05-17 15:32 + */ +@DataContract(code = DataCodes.CONTRACT_INT16) +public interface CONTRACT_INT16 { + + @DataField(order=2, primitiveType= PrimitiveType.INT16) + int getValue(); +} diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_INT32.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_INT32.java new file mode 100644 index 00000000..02fdb07e --- /dev/null +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_INT32.java @@ -0,0 +1,18 @@ +package com.jd.blockchain.ledger; + +import com.jd.blockchain.binaryproto.DataContract; +import com.jd.blockchain.binaryproto.DataField; +import com.jd.blockchain.binaryproto.PrimitiveType; +import com.jd.blockchain.consts.DataCodes; + +/** + * contract args for int32; + * @author zhaogw + * date 2019-05-17 15:32 + */ +@DataContract(code = DataCodes.CONTRACT_INT32) +public interface CONTRACT_INT32 { + + @DataField(order=2, primitiveType= PrimitiveType.INT32) + int getValue(); +} diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_INT64.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_INT64.java new file mode 100644 index 00000000..ad092edd --- /dev/null +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_INT64.java @@ -0,0 +1,18 @@ +package com.jd.blockchain.ledger; + +import com.jd.blockchain.binaryproto.DataContract; +import com.jd.blockchain.binaryproto.DataField; +import com.jd.blockchain.binaryproto.PrimitiveType; +import com.jd.blockchain.consts.DataCodes; + +/** + * contract args for int64; + * @author zhaogw + * date 2019-05-17 15:32 + */ +@DataContract(code = DataCodes.CONTRACT_INT64) +public interface CONTRACT_INT64 { + + @DataField(order=2, primitiveType= PrimitiveType.INT64) + long 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 new file mode 100644 index 00000000..754e23ed --- /dev/null +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_INT8.java @@ -0,0 +1,18 @@ +package com.jd.blockchain.ledger; + +import com.jd.blockchain.binaryproto.DataContract; +import com.jd.blockchain.binaryproto.DataField; +import com.jd.blockchain.binaryproto.PrimitiveType; +import com.jd.blockchain.consts.DataCodes; + +/** + * contract args for int8; + * @author zhaogw + * date 2019-05-17 15:32 + */ +@DataContract(code = DataCodes.CONTRACT_INT8) +public interface CONTRACT_INT8 { + + @DataField(order=2, primitiveType= PrimitiveType.INT8) + int getValue(); +} diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_TEXT.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_TEXT.java new file mode 100644 index 00000000..8f5e4a4c --- /dev/null +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_TEXT.java @@ -0,0 +1,18 @@ +package com.jd.blockchain.ledger; + +import com.jd.blockchain.binaryproto.DataContract; +import com.jd.blockchain.binaryproto.DataField; +import com.jd.blockchain.binaryproto.PrimitiveType; +import com.jd.blockchain.consts.DataCodes; + +/** + * contract args for String; + * @author zhaogw + * date 2019-05-17 15:32 + */ +@DataContract(code = DataCodes.CONTRACT_TEXT) +public interface CONTRACT_TEXT { + + @DataField(order=2, primitiveType= PrimitiveType.TEXT) + String getValue(); +} diff --git a/source/sdk/sdk-samples/src/main/java/com/jd/blockchain/contract/ContractConfigure.java b/source/sdk/sdk-samples/src/main/java/com/jd/blockchain/contract/ContractConfigure.java new file mode 100644 index 00000000..61dbb10c --- /dev/null +++ b/source/sdk/sdk-samples/src/main/java/com/jd/blockchain/contract/ContractConfigure.java @@ -0,0 +1,93 @@ +package com.jd.blockchain.contract; + +import com.jd.blockchain.utils.BaseConstant; +import com.jd.blockchain.utils.ConsoleUtils; +import com.jd.blockchain.utils.io.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.io.ClassPathResource; + +import java.io.*; +import java.util.*; + +import static com.jd.blockchain.utils.BaseConstant.SYS_CONTRACT_CONF; +import static com.jd.blockchain.utils.BaseConstant.SYS_CONTRACT_PROPS_NAME; + +/** + * + * @author zhaogw + * date 2019/3/15 18:22 + */ +public enum ContractConfigure { + instance(); + private static final Logger LOGGER = LoggerFactory.getLogger(ContractConfigure.class); + static Properties pp; + + ContractConfigure(){ + init(); + } + + private void init(){ + String contractConfPath = System.getProperty(SYS_CONTRACT_CONF); + System.out.println("contractConfPath="+contractConfPath); + try { + if (contractConfPath == null) { + ConsoleUtils.info("Load build-in default contractConf in ContractConfigure ..."); + ClassPathResource contractConfigResource = new ClassPathResource(SYS_CONTRACT_PROPS_NAME); + InputStream in = contractConfigResource.getInputStream(); + pp = FileUtils.readProperties(in, BaseConstant.CHARSET_UTF_8); + } else { + ConsoleUtils.info("Load configuration in ContractConfigure,contractConfPath="+contractConfPath); + File file = new File(contractConfPath); + pp = FileUtils.readProperties(file, BaseConstant.CHARSET_UTF_8); + } + } catch (Exception e) { + LOGGER.info(SYS_CONTRACT_PROPS_NAME+"文件异常!"+e.getMessage()); + } + } + + public String values(String key) { + if(pp == null){ + init(); + } + return pp.getProperty(key); + } + + public String allValues() { + if(pp == null){ + init(); + } + Set allKeys = pp.stringPropertyNames(); + List propList = new ArrayList(); + for(String _key : allKeys){ + String value = pp.getProperty(_key); + propList.add(_key+": "+value); + LOGGER.info("key={}, value={}",_key,value); + } + return propList.toString(); + } + + //写入资源文件信息 + public static void writeProperties(String fileAllName, String comments, Map map){ + Properties properties=new Properties(); + try { + File file = new File(fileAllName); + if (!file.getParentFile().exists()) { + boolean result = file.getParentFile().mkdirs(); + if (!result) { + System.out.println("文件创建失败."); + } + } + OutputStream outputStream=new FileOutputStream(file); + for(Map.Entry entry : map.entrySet()){ + properties.setProperty(entry.getKey(), entry.getValue()); + } + properties.store(outputStream, comments); + outputStream.close(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/source/sdk/sdk-samples/src/main/java/com/jd/blockchain/contract/samples/AssetContract2.java b/source/sdk/sdk-samples/src/main/java/com/jd/blockchain/contract/samples/AssetContract2.java new file mode 100644 index 00000000..24fcc598 --- /dev/null +++ b/source/sdk/sdk-samples/src/main/java/com/jd/blockchain/contract/samples/AssetContract2.java @@ -0,0 +1,27 @@ +package com.jd.blockchain.contract.samples; + +import com.jd.blockchain.binaryproto.DataContract; +import com.jd.blockchain.consts.DataCodes; +import com.jd.blockchain.contract.Contract; +import com.jd.blockchain.contract.ContractEvent; +import com.jd.blockchain.ledger.CONTRACT_TEXT; +import com.jd.blockchain.ledger.TransactionContentBody; + +/** + * 示例:一个“资产管理”智能合约; + * + * @author zhaogw + */ +@Contract +public interface AssetContract2 { + + /** + * 发行资产; + * 新发行的资产数量; + * @param assetHolderAddress + * 新发行的资产的持有账户; + */ + @ContractEvent(name = "issue-asset") + void issue(@DataContract(code = DataCodes.TX_CONTENT_BODY) TransactionContentBody transactionContentBody, + @DataContract(code = DataCodes.CONTRACT_TEXT) String assetHolderAddress); +} \ No newline at end of file diff --git a/source/sdk/sdk-samples/src/main/java/com/jd/blockchain/contract/samples/AssetContractImpl2.java b/source/sdk/sdk-samples/src/main/java/com/jd/blockchain/contract/samples/AssetContractImpl2.java new file mode 100644 index 00000000..a6c2b157 --- /dev/null +++ b/source/sdk/sdk-samples/src/main/java/com/jd/blockchain/contract/samples/AssetContractImpl2.java @@ -0,0 +1,68 @@ +package com.jd.blockchain.contract.samples; + +import com.jd.blockchain.contract.ContractEventContext; +import com.jd.blockchain.contract.ContractException; +import com.jd.blockchain.contract.EventProcessingAwire; +import com.jd.blockchain.crypto.HashDigest; +import com.jd.blockchain.ledger.BlockchainIdentity; +import com.jd.blockchain.ledger.KVDataEntry; +import com.jd.blockchain.ledger.KVDataObject; +import com.jd.blockchain.ledger.TransactionContentBody; +import com.jd.blockchain.utils.io.BytesUtils; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +/** + * 示例:一个“资产管理”智能合约的实现; + * + * 注: 1、实现 EventProcessingAwire 接口以便合约实例在运行时可以从上下文获得合约生命周期事件的通知; 2、实现 + * AssetContract 接口定义的合约方法; + * + * @author huanghaiquan + * + */ +public class AssetContractImpl2 implements EventProcessingAwire, AssetContract2 { + // 合约事件上下文; + private ContractEventContext eventContext; + + @Override + public void issue(TransactionContentBody transactionContentBody, String assetHolderAddress) { + System.out.println(transactionContentBody.toString()); + } + + /* + * (non-Javadoc) + * + * @see + * com.jd.blockchain.contract.model.EventProcessingAwire#beforeEvent(com.jd. + * blockchain.contract.model.ContractEventContext) + */ + @Override + public void beforeEvent(ContractEventContext eventContext) { + this.eventContext = eventContext; + } + + /* + * (non-Javadoc) + * + * @see com.jd.blockchain.contract.model.EventProcessingAwire#postEvent(com.jd. + * blockchain.contract.model.ContractEventContext, + * com.jd.blockchain.contract.model.ContractError) + */ + @Override + public void postEvent(ContractEventContext eventContext, ContractException error) { + this.eventContext = null; + } + + @Override + public void postEvent(ContractException error) { + + } + + @Override + public void postEvent() { + + } +} 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 new file mode 100644 index 00000000..d74ea6bd --- /dev/null +++ b/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_Contract_Test.java @@ -0,0 +1,301 @@ +package test.com.jd.blockchain.sdk.test; + +import com.jd.blockchain.contract.samples.AssetContract; +import com.jd.blockchain.contract.samples.AssetContract2; +import com.jd.blockchain.crypto.*; +import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm; +import com.jd.blockchain.ledger.*; +import com.jd.blockchain.sdk.BlockchainService; +import com.jd.blockchain.sdk.BlockchainServiceFactory; +import com.jd.blockchain.sdk.client.GatewayServiceFactory; +import com.jd.blockchain.sdk.samples.SDKDemo_Contract; +import com.jd.blockchain.utils.Bytes; +import com.jd.blockchain.utils.codec.Base58Utils; +import com.jd.blockchain.utils.io.ByteArray; +import com.jd.blockchain.utils.net.NetworkAddress; +import com.jd.blockchain.utils.serialize.json.JSONSerializeUtils; +import org.junit.Before; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.io.ClassPathResource; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +import static org.junit.Assert.assertTrue; + +/** + * 演示合约执行的过程; + * + * @author zhaogw + * 2019-05-21 11:03 + */ +public class SDK_Contract_Test { + public static Logger log = LoggerFactory.getLogger(SDKDemo_Contract.class); + + public static BlockchainKeypair CLIENT_CERT = BlockchainKeyGenerator.getInstance().generate("ED25519"); + // 账本地址; + public static String ledgerAddress; + private PrivKey privKey; + private PubKey pubKey; + BlockchainService bcsrv; + AsymmetricKeypair signKeyPair; + HashDigest ledgerHash; + + @Before + public void init(){ + ledgerAddress = "j5rpuGWVxSuUbU3gK7MDREfui797AjfdHzvAMiSaSzydu7"; + ledgerHash = getLedgerHash(); + pubKey = SDK_GateWay_KeyPair_Para.pubKey0; + privKey = SDK_GateWay_KeyPair_Para.privkey0; + // 使用私钥进行签名; + signKeyPair = new BlockchainKeypair(pubKey, privKey); + + // 创建服务代理; + final String GATEWAY_IP = "localhost"; + final int GATEWAY_PORT = 11000; + NetworkAddress addr = new NetworkAddress(GATEWAY_IP,GATEWAY_PORT); + GatewayServiceFactory serviceFactory = GatewayServiceFactory.connect(addr); + bcsrv = serviceFactory.getBlockchainService(); + } + + /** + * 演示合约执行的过程; + */ + @Test + public void demoContract1() { + // 发起交易; + TransactionTemplate txTemp = bcsrv.newTransaction(ledgerHash); + String contractAddress = "LdeNfBcbQWqVge1sVyLq3EHBJhMMjwQY3uJJE"; + AssetContract2 assetContract = txTemp.contract(contractAddress, AssetContract2.class); + TransactionContentBody transactionContentBody = new TransactionContentBody() { + @Override + public HashDigest getLedgerHash() { + return new HashDigest(ClassicAlgorithm.SHA256, "zhaogw".getBytes()); + } + + @Override + public Operation[] getOperations() { + return new Operation[0]; + } + }; + assetContract.issue(transactionContentBody,contractAddress); + + // TX 准备就绪; + PreparedTransaction prepTx = txTemp.prepare(); + prepTx.sign(signKeyPair); + // 提交交易; + prepTx.commit(); + } + + @Test + public void registerData(){ + // 在本地定义 TX 模板 + TransactionTemplate txTemp = bcsrv.newTransaction(ledgerHash); + BlockchainKeypair dataAccount = BlockchainKeyGenerator.getInstance().generate(); + txTemp.dataAccounts().register(dataAccount.getIdentity()); + + String key1 = "jd_key1"; + String val1 = "www.jd1.com"; + String key2 = "jd_key2"; + String val2 = "www.jd2.com"; + // 定义交易,传输最简单的数字、字符串、提取合约中的地址; + txTemp.dataAccount(dataAccount.getAddress()).set(key1, val1, -1); + txTemp.dataAccount(dataAccount.getAddress()).set(key2, val2, -1); + + // TX 准备就绪; + PreparedTransaction prepTx = txTemp.prepare(); + prepTx.sign(signKeyPair); + // 提交交易; + TransactionResponse transactionResponse = prepTx.commit(); + + assertTrue(transactionResponse.isSuccess()); + + //repeat; + String[] keys = {key1,key2}; + String[] values = {"www.jd1.com.v1","www.jd2.com.v1"}; + this.setDataInDataAddress(dataAccount.getAddress(),keys,values,0); + String[] values2 = {"www.jd1.com.v2","www.jd2.com.v2"}; + this.setDataInDataAddress(dataAccount.getAddress(),keys,values2,1); + } + + private void setDataInDataAddress(Bytes dataAddress, String[] keys, String[] values, long version){ + // 在本地定义 TX 模板 + TransactionTemplate txTemp = bcsrv.newTransaction(ledgerHash); + BlockchainKeypair dataAccount = BlockchainKeyGenerator.getInstance().generate(); + + for(int i=0; i + * + * 注:私钥由调用方在本地保管和使用; + * + * @return + */ + private static AsymmetricKeypair getSponsorKey() { + SignatureFunction signatureFunction = Crypto.getSignatureFunction("ED25519"); + return signatureFunction.generateKeypair(); + } + + /** + * 商品信息; + * + * @author huanghaiquan + * + */ + public static class Remark { + + private String code; + + private String name; + + private String venderAddress; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getVenderAddress() { + return venderAddress; + } + + public void setVenderAddress(String venderAddress) { + this.venderAddress = venderAddress; + } + + } + +} diff --git a/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_KeyPair_Para.java b/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_KeyPair_Para.java index 916a3460..450e5ff4 100644 --- a/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_KeyPair_Para.java +++ b/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_KeyPair_Para.java @@ -10,16 +10,16 @@ import com.jd.blockchain.tools.keygen.KeyGenCommand; public class SDK_GateWay_KeyPair_Para { public static final String PASSWORD = "abc"; - public static final String[] PUB_KEYS = { "endPsK36imXrY66pru6ttZ8dZ3TynWekmdqoM1K7ZRRoRBBiYVzM", - "endPsK36jQE1uYpdVRSnwQXVYhgAMWTaMJiAqii7URiULoBDLUUN", - "endPsK36fc7FSecKAJCJdFhTejbPHMLaGcihJVQCv95czCq4tW5n", - "endPsK36m1grx8mkTMgh8XQHiiaNzajdC5hkuqP6pAuLmMbYkzd4" }; + public static final String[] PUB_KEYS = { "3snPdw7i7PjVKiTH2VnXZu5H8QmNaSXpnk4ei533jFpuifyjS5zzH9", + "3snPdw7i7PajLB35tEau1kmixc6ZrjLXgxwKbkv5bHhP7nT5dhD9eX", + "3snPdw7i7PZi6TStiyc6mzjprnNhgs2atSGNS8wPYzhbKaUWGFJt7x", + "3snPdw7i7PifPuRX7fu3jBjsb3rJRfDe9GtbDfvFJaJ4V4hHXQfhwk" }; public static final String[] PRIV_KEYS = { - "177gjsuHdbf3PU68Sm1ZU2aMcyB7sLWj94xwBUoUKvTgHq7qGUfg6ynDB62hocYYXSRXD4X", - "177gjwQwTdXthkutDKVgKwiq6wWfLWYuxhji1U2N1C5MzqLRWCLZXo3i2g4vpfcEAQUPG8H", - "177gjvLHUjxvAWsqVcGgV8eHgVNBvJZYDfpP9FLjTouR1gEJNiamYu1qjTNDh18XWyLg8or", - "177gk2VtYeGbK5TS2xWhbSZA4BsT9Xj5Fb8hqCzxzgbojVVcqaDSFFrFPsLbZBx7rszyCNy" }; + "177gjzHTznYdPgWqZrH43W3yp37onm74wYXT4v9FukpCHBrhRysBBZh7Pzdo5AMRyQGJD7x", + "177gju9p5zrNdHJVEQnEEKF4ZjDDYmAXyfG84V5RPGVc5xFfmtwnHA7j51nyNLUFffzz5UT", + "177gjtwLgmSx5v1hFb46ijh7L9kdbKUpJYqdKVf9afiEmAuLgo8Rck9yu5UuUcHknWJuWaF", + "177gk1pudweTq5zgJTh8y3ENCTwtSFsKyX7YnpuKPo7rKgCkCBXVXh5z2syaTCPEMbuWRns" }; public static PrivKey privkey0 = KeyGenCommand.decodePrivKeyWithRawPassword(PRIV_KEYS[0], PASSWORD); public static PrivKey privkey1 = KeyGenCommand.decodePrivKeyWithRawPassword(PRIV_KEYS[1], PASSWORD); diff --git a/source/sdk/sdk-samples/src/test/resources/contract.jar b/source/sdk/sdk-samples/src/test/resources/contract.jar new file mode 100644 index 0000000000000000000000000000000000000000..c96e32148a9e10caa00ba044c759389e29140337 GIT binary patch literal 5372 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 Ob^Z8VC-(5q3;92z6GNE* literal 0 HcmV?d00001 diff --git a/source/sdk/sdk-samples/src/test/resources/sys-contract.properties b/source/sdk/sdk-samples/src/test/resources/sys-contract.properties new file mode 100644 index 00000000..a1457b06 --- /dev/null +++ b/source/sdk/sdk-samples/src/test/resources/sys-contract.properties @@ -0,0 +1,13 @@ +#ledger info; +ownerPubPath=F:\\jdsk\\jdsk-files\\github\\jdchain-starter\\conf\\jd-com.pub +ownerPrvPath=F:\\jdsk\\jdsk-files\\github\\jdchain-starter\\conf\\jd-com.priv +ownerPassword=F:\\jdsk\\jdsk-files\\github\\jdchain-starter\\conf\\jd-com.pwd +ledgerHash=j5rpuGWVxSuUbU3gK7MDREfui797AjfdHzvAMiSaSzydu7 +host=localhost +port=11000 +#execute contract; +event = issue-asset +chainCodePath=F:\\jdsk\\jdsk-files\\github\\jdchain-starter\\contract-compile\\target\\contract.jar +contractArgs=1000##fromAddr##LdeNvLeq6MB6y8CoyawYxgCCYCJkrp5xoVGUw +#contractArgs=fromAddr##toAddr##30##LdeNvLeq6MB6y8CoyawYxgCCYCJkrp5xoVGUw + diff --git a/source/utils/utils-serialize/src/main/java/com/jd/blockchain/utils/serialize/binary/ContractSerializeUtils.java b/source/utils/utils-serialize/src/main/java/com/jd/blockchain/utils/serialize/binary/ContractSerializeUtils.java deleted file mode 100644 index d239c883..00000000 --- a/source/utils/utils-serialize/src/main/java/com/jd/blockchain/utils/serialize/binary/ContractSerializeUtils.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.jd.blockchain.utils.serialize.binary; - -import com.jd.blockchain.utils.ArrayUtils; -import com.jd.blockchain.utils.io.BytesUtils; -import org.springframework.util.SerializationUtils; - -import java.lang.reflect.Method; -import java.math.BigDecimal; - -/** - * @author zhaogw - * date 2019/5/16 18:05 - */ -public class ContractSerializeUtils { - public static final Class[] confirmedType = {Integer.class, Long.class, Double.class, - int.class,long.class,double.class,String.class, BigDecimal.class}; - - /** - * valid then parse the Object by Method params; - * @param object - * @param method - * @return - */ - public static byte[] serializeMethodParam(Object object,Method method) { - if (object == null) { - return BytesUtils.EMPTY_BYTES; - } - - Class[] classType = method.getParameterTypes(); - for(Class curClass : classType){ - if(!ArrayUtils.asList(confirmedType).contains(curClass)){ - throw new IllegalArgumentException("not support this type="+curClass.toString()); - } - } - return SerializationUtils.serialize(object); - } - - public static Object deserializeMethodParam(byte[] bytes,Method method) { - if (bytes == null) { - return null; - } - - Class[] classType = method.getParameterTypes(); - for(Class curClass : classType){ - if(!ArrayUtils.asList(confirmedType).contains(curClass)){ - throw new IllegalArgumentException("not support this type="+curClass.toString()); - } - } - return SerializationUtils.deserialize(bytes); - } -}