Browse Source

add ContractSerialUtils.java;

tags/1.0.0
zhaoguangwei 5 years ago
parent
commit
642946eece
3 changed files with 61 additions and 12 deletions
  1. +4
    -6
      source/contract/contract-jvm/src/main/java/com/jd/blockchain/contract/jvm/JavaContractCode.java
  2. +6
    -6
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ContractInvocationProxy.java
  3. +51
    -0
      source/utils/utils-serialize/src/main/java/com/jd/blockchain/utils/serialize/binary/ContractSerializeUtils.java

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

@@ -5,14 +5,12 @@ 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 org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.ReflectionUtils;
import org.springframework.util.SerializationUtils;

import java.lang.reflect.Array;
import java.lang.reflect.Method;
import java.lang.reflect.Type;

/**
* contract code based jvm
@@ -50,8 +48,8 @@ public class JavaContractCode implements ContractCode {
codeModule.execute(new ContractExecution());
}

private Object resolveArgs(byte[] args) {
return SerializationUtils.deserialize(args);
private Object resolveArgs(byte[] args, Method method) {
return ContractSerializeUtils.deserializeMethodParam(args,method);
}

class ContractExecution implements Runnable {
@@ -75,7 +73,7 @@ public class JavaContractCode implements ContractCode {

// 反序列化参数;
Method handleMethod = ContractType.resolve(myClass).getHandleMethod(contractEventContext.getEvent());
Object args = resolveArgs(contractEventContext.getArgs());
Object args = resolveArgs(contractEventContext.getArgs(), handleMethod);

Object[] params = null;
if(args.getClass().isArray()){


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

@@ -1,11 +1,11 @@
package com.jd.blockchain.transaction;

import com.jd.blockchain.utils.Bytes;
import com.jd.blockchain.utils.serialize.binary.ContractSerializeUtils;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

import com.jd.blockchain.utils.Bytes;
import com.jd.blockchain.utils.serialize.binary.BinarySerializeUtils;

public class ContractInvocationProxy implements InvocationHandler {

// private String contractMessage;
@@ -39,15 +39,15 @@ public class ContractInvocationProxy implements InvocationHandler {
// hashCode 方法;
}
// 合约方法;
byte[] argBytes = serializeArgs(args);
byte[] argBytes = serializeArgs(args,method);
sendOpBuilder.send(contractAddress, event, argBytes);

// TODO: 暂时未考虑有返回值的情况;
return null;
}

private byte[] serializeArgs(Object[] args) {
private byte[] serializeArgs(Object[] args, Method method) throws Exception {
// TODO 根据方法参数的定义序列化参数;
return BinarySerializeUtils.serialize(args);
return ContractSerializeUtils.serializeMethodParam(args,method);
}
}

+ 51
- 0
source/utils/utils-serialize/src/main/java/com/jd/blockchain/utils/serialize/binary/ContractSerializeUtils.java View File

@@ -0,0 +1,51 @@
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);
}
}

Loading…
Cancel
Save