Browse Source

test then optimize the contract based interface;

tags/1.0.0
zhaoguangwei 5 years ago
parent
commit
535c6c2273
5 changed files with 34 additions and 35 deletions
  1. +11
    -17
      source/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/JavaContractCode.java
  2. +9
    -8
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ContractInvocationProxyBuilder.java
  3. +2
    -2
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ContractType.java
  4. +11
    -7
      source/sdk/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDKDemo_Contract.java
  5. +1
    -1
      source/utils/utils-common/src/main/java/com/jd/blockchain/utils/BaseConstant.java

+ 11
- 17
source/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/JavaContractCode.java View File

@@ -1,21 +1,16 @@
package com.jd.blockchain.contract.jvm; 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.ContractEventContext;
import com.jd.blockchain.contract.engine.ContractCode; import com.jd.blockchain.contract.engine.ContractCode;
import com.jd.blockchain.runtime.Module; import com.jd.blockchain.runtime.Module;
import com.jd.blockchain.transaction.ContractType; import com.jd.blockchain.transaction.ContractType;
import com.jd.blockchain.utils.BaseConstant;
import com.jd.blockchain.utils.Bytes; 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 * contract code based jvm
@@ -29,7 +24,7 @@ public class JavaContractCode implements ContractCode {
private long version; private long version;
private ContractEventContext contractEventContext; private ContractEventContext contractEventContext;


private ContractType contractType;
private ContractType contractType ;


public JavaContractCode(Bytes address, long version, Module codeModule) { public JavaContractCode(Bytes address, long version, Module codeModule) {
this.address = address; this.address = address;
@@ -53,9 +48,8 @@ public class JavaContractCode implements ContractCode {
codeModule.execute(new ContractExecution()); 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 { class ContractExecution implements Runnable {
@@ -78,8 +72,8 @@ public class JavaContractCode implements ContractCode {
startTime = System.currentTimeMillis(); 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); ReflectionUtils.invokeMethod(handleMethod, contractMainClassObj, args);




+ 9
- 8
source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ContractInvocationProxyBuilder.java View File

@@ -1,20 +1,19 @@
package com.jd.blockchain.transaction; 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.annotation.Annotation;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.lang.reflect.Proxy; import java.lang.reflect.Proxy;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; 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 { public class ContractInvocationProxyBuilder {
private Map<Class<?>, ContractType> contractTypes;
private Map<Class<?>, ContractType> contractTypes = new HashMap<Class<?>, ContractType>();
public <T> T create(String address, Class<T> contractIntf, ContractEventSendOperationBuilder contractEventBuilder) { public <T> T create(String address, Class<T> contractIntf, ContractEventSendOperationBuilder contractEventBuilder) {
return create(Bytes.fromBase58(address), contractIntf, contractEventBuilder); return create(Bytes.fromBase58(address), contractIntf, contractEventBuilder);
@@ -52,7 +51,9 @@ public class ContractInvocationProxyBuilder {
// TODO 检查返回值类型; // TODO 检查返回值类型;
return ContractType.resolve(contractIntf);
ContractType contractType1 = ContractType.resolve(contractIntf);
contractTypes.put(contractIntf,contractType1);
return contractType1;
} }


+ 2
- 2
source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ContractType.java View File

@@ -12,9 +12,9 @@ public class ContractType {


private String name; private String name;


private SortedMap<String, Method> events;
private SortedMap<String, Method> events = Collections.synchronizedSortedMap(new TreeMap<>());


private SortedMap<Method, String> handleMethods;
private Map<Method, String> handleMethods = new HashMap<>();;


/** /**
* 返回声明的所有事件; * 返回声明的所有事件;


+ 11
- 7
source/sdk/sdk-samples/src/main/java/com/jd/blockchain/sdk/samples/SDKDemo_Contract.java View File

@@ -25,20 +25,24 @@ public class SDKDemo_Contract {


public static BlockchainKeypair CLIENT_CERT = BlockchainKeyGenerator.getInstance().generate("ED25519"); public static BlockchainKeypair CLIENT_CERT = BlockchainKeyGenerator.getInstance().generate("ED25519");


public static void main(String[] args) {
demoContract();
}

/** /**
* 演示合约执行的过程; * 演示合约执行的过程;
*/ */
public static void demoContract() { public static void demoContract() {
// 账本地址; // 账本地址;
String ledgerAddress = "6GgNS3YgtxvZDBMvHEoqDiNZvWdiJ3MMpvRS9kL4DYwr4";
String ledgerAddress = "j5rpuGWVxSuUbU3gK7MDREfui797AjfdHzvAMiSaSzydu7";
// 节点地址列表; // 节点地址列表;
// NetworkAddress[] peerAddrs = { new NetworkAddress("192.168.10.10", 8080), // 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.11", 8080), new NetworkAddress("192.168.10.12", 8080),
// new NetworkAddress("192.168.10.13", 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; final boolean SECURE = false;
GatewayServiceFactory serviceFactory = GatewayServiceFactory.connect(GATEWAY_IP, GATEWAY_PORT, SECURE, GatewayServiceFactory serviceFactory = GatewayServiceFactory.connect(GATEWAY_IP, GATEWAY_PORT, SECURE,
CLIENT_CERT); 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"; String assetKey = "RMB-ASSET";
// 此次待分配利润; // 此次待分配利润;


+ 1
- 1
source/utils/utils-common/src/main/java/com/jd/blockchain/utils/BaseConstant.java View File

@@ -22,7 +22,7 @@ public class BaseConstant {
public static final String SYS_CONTRACT_PROPS_NAME = "sys-contract.properties"; 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_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"; public static final String PACKAGE_BLACKLIST = "BLACKLIST";


Loading…
Cancel
Save