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;

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);



+ 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;
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<Class<?>, ContractType> contractTypes;
private Map<Class<?>, ContractType> contractTypes = new HashMap<Class<?>, ContractType>();
public <T> T create(String address, Class<T> 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;
}


+ 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 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 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";
// 此次待分配利润;


+ 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 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";


Loading…
Cancel
Save