From 535c6c2273971624a90537d835f830f38aa49c0c Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Tue, 14 May 2019 13:58:44 +0800 Subject: [PATCH] test then optimize the contract based interface; --- .../contract/jvm/JavaContractCode.java | 28 ++++++++----------- .../ContractInvocationProxyBuilder.java | 17 +++++------ .../blockchain/transaction/ContractType.java | 4 +-- .../sdk/samples/SDKDemo_Contract.java | 18 +++++++----- .../com/jd/blockchain/utils/BaseConstant.java | 2 +- 5 files changed, 34 insertions(+), 35 deletions(-) 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 b51184de..29a66e6f 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 @@ -1,21 +1,16 @@ package com.jd.blockchain.contract.jvm; -import java.lang.annotation.Annotation; -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.Map; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.util.ReflectionUtils; - -import com.jd.blockchain.contract.ContractEvent; import com.jd.blockchain.contract.ContractEventContext; import com.jd.blockchain.contract.engine.ContractCode; import com.jd.blockchain.runtime.Module; import com.jd.blockchain.transaction.ContractType; -import com.jd.blockchain.utils.BaseConstant; import com.jd.blockchain.utils.Bytes; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.util.ReflectionUtils; +import org.springframework.util.SerializationUtils; + +import java.lang.reflect.Method; /** * contract code based jvm @@ -29,7 +24,7 @@ public class JavaContractCode implements ContractCode { private long version; private ContractEventContext contractEventContext; - private ContractType contractType; + private ContractType contractType ; public JavaContractCode(Bytes address, long version, Module codeModule) { this.address = address; @@ -53,9 +48,8 @@ public class JavaContractCode implements ContractCode { codeModule.execute(new ContractExecution()); } - private Object[] resolveArgs(byte[] args) { - // TODO Auto-generated method stub - return null; + private Object resolveArgs(byte[] args) { + return SerializationUtils.deserialize(args); } class ContractExecution implements Runnable { @@ -78,8 +72,8 @@ public class JavaContractCode implements ContractCode { startTime = System.currentTimeMillis(); // 反序列化参数; - Method handleMethod = contractType.getHandleMethod(contractEventContext.getEvent()); - Object[] args = resolveArgs(contractEventContext.getArgs()); + Method handleMethod = ContractType.resolve(myClass).getHandleMethod(contractEventContext.getEvent()); + Object args = resolveArgs(contractEventContext.getArgs()); ReflectionUtils.invokeMethod(handleMethod, contractMainClassObj, args); diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ContractInvocationProxyBuilder.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ContractInvocationProxyBuilder.java index 3dd073d7..90032a9f 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ContractInvocationProxyBuilder.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ContractInvocationProxyBuilder.java @@ -1,20 +1,19 @@ package com.jd.blockchain.transaction; +import com.jd.blockchain.contract.Contract; +import com.jd.blockchain.contract.ContractEvent; +import com.jd.blockchain.utils.BaseConstant; +import com.jd.blockchain.utils.Bytes; + import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.HashMap; import java.util.Map; -import com.jd.blockchain.contract.ContractEvent; -import com.jd.blockchain.contract.ContractException; -import com.jd.blockchain.utils.BaseConstant; -import com.jd.blockchain.utils.Bytes; -import org.apache.http.annotation.Contract; - public class ContractInvocationProxyBuilder { - private Map, ContractType> contractTypes; + private Map, ContractType> contractTypes = new HashMap, ContractType>(); public T create(String address, Class contractIntf, ContractEventSendOperationBuilder contractEventBuilder) { return create(Bytes.fromBase58(address), contractIntf, contractEventBuilder); @@ -52,7 +51,9 @@ public class ContractInvocationProxyBuilder { // TODO 检查返回值类型; - return ContractType.resolve(contractIntf); + ContractType contractType1 = ContractType.resolve(contractIntf); + contractTypes.put(contractIntf,contractType1); + return contractType1; } diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ContractType.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ContractType.java index dddcb789..afaab56e 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ContractType.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ContractType.java @@ -12,9 +12,9 @@ public class ContractType { private String name; - private SortedMap events; + private SortedMap events = Collections.synchronizedSortedMap(new TreeMap<>()); - private SortedMap handleMethods; + private Map handleMethods = new HashMap<>();; /** * 返回声明的所有事件; diff --git a/source/sdk/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDKDemo_Contract.java b/source/sdk/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDKDemo_Contract.java index 3cff2d52..3059aaac 100644 --- a/source/sdk/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDKDemo_Contract.java +++ b/source/sdk/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDKDemo_Contract.java @@ -25,20 +25,24 @@ public class SDKDemo_Contract { public static BlockchainKeypair CLIENT_CERT = BlockchainKeyGenerator.getInstance().generate("ED25519"); + public static void main(String[] args) { + demoContract(); + } + /** * 演示合约执行的过程; */ public static void demoContract() { // 账本地址; - String ledgerAddress = "6GgNS3YgtxvZDBMvHEoqDiNZvWdiJ3MMpvRS9kL4DYwr4"; + String ledgerAddress = "j5rpuGWVxSuUbU3gK7MDREfui797AjfdHzvAMiSaSzydu7"; // 节点地址列表; // NetworkAddress[] peerAddrs = { new NetworkAddress("192.168.10.10", 8080), // new NetworkAddress("192.168.10.11", 8080), new NetworkAddress("192.168.10.12", 8080), // new NetworkAddress("192.168.10.13", 8080) }; // 创建服务代理; - final String GATEWAY_IP = "192.168.151.39"; - final int GATEWAY_PORT = 80; + final String GATEWAY_IP = "localhost"; + final int GATEWAY_PORT = 11000; final boolean SECURE = false; GatewayServiceFactory serviceFactory = GatewayServiceFactory.connect(GATEWAY_IP, GATEWAY_PORT, SECURE, CLIENT_CERT); @@ -52,13 +56,13 @@ public class SDKDemo_Contract { // 一个贸易账户,贸易结算后的利润将通过一个合约账户来执行利润分配; // 合约账户被设置为通用的账户,不具备对贸易结算账户的直接权限; // 只有当前交易发起人具备对贸易账户的直接权限,当交易发起人对交易进行签名之后,权限被间接传递给合约账户; - String commerceAccount = "GGhhreGeasdfasfUUfehf9932lkae99ds66jf=="; + String commerceAccount = "LdeP13gKE6319LvYPyWAT4UXr2brvpitPRBN1"; // 处理利润分成的通用业务逻辑的合约账户; - String profitDistributionContract = "AAdfe4346fHhefe34fwf343kaeER4678RT=="; + String profitDistributionContract = "LdeP13gKE6319LvYPyWAT4UXr2brvpitPRBN1"; // 收益人账户; - String receiptorAccount1 = "MMMEy902jkjjJJDkshreGeasdfassdfajjf=="; - String receiptorAccount2 = "Kjfe8832hfa9jjjJJDkshrFjksjdlkfj93F=="; + String receiptorAccount1 = "LdeP13gKE6319LvYPyWAT4UXr2brvpitPRBN1"; + String receiptorAccount2 = "LdeP13gKE6319LvYPyWAT4UXr2brvpitPRBN1"; // 资产编码; String assetKey = "RMB-ASSET"; // 此次待分配利润; diff --git a/source/utils/utils-common/src/main/java/com/jd/blockchain/utils/BaseConstant.java b/source/utils/utils-common/src/main/java/com/jd/blockchain/utils/BaseConstant.java index 303f82ee..6e3aeb8c 100644 --- a/source/utils/utils-common/src/main/java/com/jd/blockchain/utils/BaseConstant.java +++ b/source/utils/utils-common/src/main/java/com/jd/blockchain/utils/BaseConstant.java @@ -22,7 +22,7 @@ public class BaseConstant { public static final String SYS_CONTRACT_PROPS_NAME = "sys-contract.properties"; public static final String CONTRACT_MAIN_CLASS_KEY = "contract"; - public static final String CONTRACT_EVENT_PREFIX="@com.jd.blockchain.contract.model.ContractEvent(name="; + public static final String CONTRACT_EVENT_PREFIX="@com.jd.blockchain.contract.ContractEvent(name="; // 编译时引用包黑名单 public static final String PACKAGE_BLACKLIST = "BLACKLIST";