Browse Source

test pass for contract param serialize and deserialize

tags/1.0.0
zhaoguangwei 5 years ago
parent
commit
5851902fc4
13 changed files with 113 additions and 104 deletions
  1. +8
    -0
      source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java
  2. +51
    -11
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/contract/ContractSerializeUtils.java
  3. +1
    -1
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_BIG_INT.java
  4. +2
    -1
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_BINARY.java
  5. +1
    -1
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_INT16.java
  6. +1
    -1
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_INT8.java
  7. +2
    -3
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ContractInvocationProxy.java
  8. +8
    -0
      source/sdk/sdk-client/src/main/java/com/jd/blockchain/sdk/client/GatewayServiceFactory.java
  9. +2
    -2
      source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_Contract_Test.java
  10. BIN
      source/sdk/sdk-samples/src/test/resources/contract.jar
  11. +10
    -27
      source/test/test-integration/src/main/java/test/com/jd/blockchain/intgr/IntegrationTest.java
  12. +15
    -26
      source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest2.java
  13. +12
    -31
      source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTestAll4Redis.java

+ 8
- 0
source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java View File

@@ -79,7 +79,15 @@ public interface DataCodes {

public static final int DATA = 0x900;

//contract related;
public static final int CONTRACT = 0xA00;
public static final int CONTRACT_INT8 = 0xA01;
public static final int CONTRACT_INT16 = 0xA02;
public static final int CONTRACT_INT32 = 0xA03;
public static final int CONTRACT_INT64 = 0xA04;
public static final int CONTRACT_TEXT = 0xA05;
public static final int CONTRACT_BINARY = 0xA06;
public static final int CONTRACT_BIG_INT = 0xA07;

public static final int HASH = 0xB00;



+ 51
- 11
source/ledger/ledger-model/src/main/java/com/jd/blockchain/contract/ContractSerializeUtils.java View File

@@ -6,8 +6,10 @@ 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.Bytes;
import com.jd.blockchain.utils.io.ByteArray;
import com.jd.blockchain.utils.io.BytesUtils;
import org.springframework.util.ReflectionUtils;
import org.springframework.util.SerializationUtils;

import java.lang.annotation.Annotation;
@@ -92,7 +94,7 @@ public class ContractSerializeUtils {
byteBuffer.putInt(curResult.length);
}
for(int k=0; k<result.length; k++){
byteBuffer.put(result[k],0, result[k].length);
byteBuffer.put(result[k]);
}
return byteBuffer.array();
}
@@ -113,21 +115,50 @@ public class ContractSerializeUtils {
Object result[] = new Object[classTypes.length];

ByteBuffer byteBuffer = ByteBuffer.allocate(params.length);
byteBuffer.put(params);
int paramNums = byteBuffer.getInt(0);

if(paramNums != classTypes.length){
throw new IllegalArgumentException("deserializeMethodparm. params'length in byte[] != method's param length");
}

Annotation [][] annotations = method.getParameterAnnotations();
int offsetPosition = (1 + classTypes.length)*4; //start position of real data;
for(int i=0; i<classTypes.length; i++){
Class<?> classType = classTypes[i];
int curParamLength = byteBuffer.get(i+1);
int curParamLength = byteBuffer.getInt((i+1)*4);
DataContract dataContract = classType.getDeclaredAnnotation(DataContract.class);
if(dataContract == null){
throw new IllegalArgumentException("must set annotation in each param of contract.");
boolean canPass = false;
//check by annotation;
Annotation[] annotationArr = annotations[i];
for(Annotation annotation : annotationArr){
if(annotation.annotationType().equals(DataContract.class)){
dataContract = (DataContract) annotation;
canPass = true;
}
}
if(!canPass){
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(),
ByteBuffer byteBuffer1 = ByteBuffer.allocate(curParamLength);
byteBuffer1.put(params,offsetPosition,curParamLength);
offsetPosition += curParamLength;
//if dataContract=primitive type(byte/short/int/long/String),only use its getValues();
Object object = BinaryProtocol.decodeAs(byteBuffer1.array(),
getDataIntf().get(dataContract.code()));
if(isPrimitiveType(dataContract.code())){
Class<?> classObj = getDataIntf().get(dataContract.code());
try {
result[i] = ReflectionUtils.invokeMethod(classObj.getMethod("getValue"),object);
} catch (NoSuchMethodException e) {
throw new IllegalStateException("no getValue(). detail="+e.getMessage());
}
}else {
result[i] = object;
}
byteBuffer1.clear();
}

return result;
@@ -146,19 +177,28 @@ public class ContractSerializeUtils {
return dataContractMap;
}

public static boolean isPrimitiveType(int dataContractCode){
return (dataContractCode == DataCodes.CONTRACT_INT8 ||
dataContractCode == DataCodes.CONTRACT_INT16 ||
dataContractCode == DataCodes.CONTRACT_INT32 ||
dataContractCode == DataCodes.CONTRACT_INT64 ||
dataContractCode == DataCodes.CONTRACT_TEXT
);
}

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());
public Byte getValue() {
return Byte.parseByte(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());
public short getValue() {
return Short.parseShort(object.toString());
}
};
}else if(getDataIntf().get(dataContract.code()).equals(CONTRACT_INT32.class)){
@@ -185,8 +225,8 @@ public class ContractSerializeUtils {
}else if(getDataIntf().get(dataContract.code()).equals(CONTRACT_BINARY.class)){
return new CONTRACT_BINARY() {
@Override
public Byte getValue() {
return (Byte) object;
public Bytes getValue() {
return (Bytes) object;
}
};
}else if(getDataIntf().get(dataContract.code()).equals(CONTRACT_BIG_INT.class)){


+ 1
- 1
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_BIG_INT.java View File

@@ -12,7 +12,7 @@ import java.math.BigDecimal;
* @author zhaogw
* date 2019-05-17 15:32
*/
@DataContract(code = DataCodes.CONTRACT_BINARY)
@DataContract(code = DataCodes.CONTRACT_BIG_INT)
public interface CONTRACT_BIG_INT {

@DataField(order=2, primitiveType= PrimitiveType.BIG_INT)


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

@@ -4,6 +4,7 @@ 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 com.jd.blockchain.utils.Bytes;

/**
* contract args for Binary;
@@ -14,5 +15,5 @@ import com.jd.blockchain.consts.DataCodes;
public interface CONTRACT_BINARY {

@DataField(order=2, primitiveType= PrimitiveType.BYTES)
Byte getValue();
Bytes getValue();
}

+ 1
- 1
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_INT16.java View File

@@ -14,5 +14,5 @@ import com.jd.blockchain.consts.DataCodes;
public interface CONTRACT_INT16 {

@DataField(order=2, primitiveType= PrimitiveType.INT16)
int getValue();
short getValue();
}

+ 1
- 1
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_INT8.java View File

@@ -14,5 +14,5 @@ import com.jd.blockchain.consts.DataCodes;
public interface CONTRACT_INT8 {

@DataField(order=2, primitiveType= PrimitiveType.INT8)
int getValue();
Byte getValue();
}

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

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

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

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

@@ -46,7 +45,7 @@ public class ContractInvocationProxy implements InvocationHandler {
return null;
}

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


+ 8
- 0
source/sdk/sdk-client/src/main/java/com/jd/blockchain/sdk/client/GatewayServiceFactory.java View File

@@ -56,6 +56,14 @@ public class GatewayServiceFactory implements BlockchainServiceFactory, Closeabl
DataContractRegistry.register(ClientIdentifications.class);
DataContractRegistry.register(ClientIdentification.class);
DataContractRegistry.register(CONTRACT_INT8.class);
DataContractRegistry.register(CONTRACT_INT16.class);
DataContractRegistry.register(CONTRACT_INT32.class);
DataContractRegistry.register(CONTRACT_INT64.class);
DataContractRegistry.register(CONTRACT_TEXT.class);
DataContractRegistry.register(CONTRACT_BINARY.class);
// DataContractRegistry.register(CONTRACT_BIG_INT.class);
ByteArrayObjectUtil.init();
}


+ 2
- 2
source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_Contract_Test.java View File

@@ -46,7 +46,7 @@ public class SDK_Contract_Test {

@Before
public void init(){
ledgerAddress = "j5rpuGWVxSuUbU3gK7MDREfui797AjfdHzvAMiSaSzydu7";
ledgerAddress = "j5qHcS8jG6XwpE5wXv9HYMeGTb5Fs2gQao3TPQ3irqFpQL";
ledgerHash = getLedgerHash();
pubKey = SDK_GateWay_KeyPair_Para.pubKey0;
privKey = SDK_GateWay_KeyPair_Para.privkey0;
@@ -68,7 +68,7 @@ public class SDK_Contract_Test {
public void demoContract1() {
// 发起交易;
TransactionTemplate txTemp = bcsrv.newTransaction(ledgerHash);
String contractAddress = "LdeNfBcbQWqVge1sVyLq3EHBJhMMjwQY3uJJE";
String contractAddress = "LdeNm31KhQ4e76bVjCyhPc7QoTejU6Pig9mHW";
AssetContract2 assetContract = txTemp.contract(contractAddress, AssetContract2.class);
TransactionContentBody transactionContentBody = new TransactionContentBody() {
@Override


BIN
source/sdk/sdk-samples/src/test/resources/contract.jar View File


+ 10
- 27
source/test/test-integration/src/main/java/test/com/jd/blockchain/intgr/IntegrationTest.java View File

@@ -1,38 +1,13 @@
package test.com.jd.blockchain.intgr;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.Random;
import java.util.concurrent.CountDownLatch;

import org.springframework.core.io.ClassPathResource;

import com.jd.blockchain.consensus.ConsensusProvider;
import com.jd.blockchain.consensus.ConsensusProviders;
import com.jd.blockchain.consensus.ConsensusSettings;
import com.jd.blockchain.crypto.AddressEncoding;
import com.jd.blockchain.crypto.AsymmetricKeypair;
import com.jd.blockchain.crypto.Crypto;
import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.crypto.PrivKey;
import com.jd.blockchain.crypto.PubKey;
import com.jd.blockchain.gateway.GatewayConfigProperties.KeyPairConfig;
import com.jd.blockchain.ledger.AccountHeader;
import com.jd.blockchain.ledger.BlockchainKeyGenerator;
import com.jd.blockchain.ledger.BlockchainKeypair;
import com.jd.blockchain.ledger.DataAccountKVSetOperation;
import com.jd.blockchain.ledger.KVDataEntry;
import com.jd.blockchain.ledger.LedgerBlock;
import com.jd.blockchain.ledger.LedgerInfo;
import com.jd.blockchain.ledger.ParticipantNode;
import com.jd.blockchain.ledger.PreparedTransaction;
import com.jd.blockchain.ledger.TransactionResponse;
import com.jd.blockchain.ledger.TransactionTemplate;
import com.jd.blockchain.ledger.UserInfo;
import com.jd.blockchain.ledger.core.DataAccountSet;
import com.jd.blockchain.ledger.*;
import com.jd.blockchain.ledger.core.LedgerManage;
import com.jd.blockchain.ledger.core.LedgerRepository;
import com.jd.blockchain.ledger.core.impl.LedgerManager;
@@ -48,10 +23,18 @@ import com.jd.blockchain.utils.Bytes;
import com.jd.blockchain.utils.codec.HexUtils;
import com.jd.blockchain.utils.concurrent.ThreadInvoker.AsyncCallback;
import com.jd.blockchain.utils.net.NetworkAddress;
import org.springframework.core.io.ClassPathResource;
import test.com.jd.blockchain.intgr.IntegratedContext.Node;
import test.com.jd.blockchain.intgr.perf.LedgerInitializeWebTest;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.Random;
import java.util.concurrent.CountDownLatch;

public class IntegrationTest {
// 合约测试使用的初始化数据;
BlockchainKeypair contractDataKey = BlockchainKeyGenerator.getInstance().generate();


+ 15
- 26
source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest2.java View File

@@ -1,34 +1,12 @@
package test.com.jd.blockchain.intgr;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.concurrent.CountDownLatch;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.core.io.ClassPathResource;

import com.jd.blockchain.consensus.ConsensusProvider;
import com.jd.blockchain.consensus.ConsensusProviders;
import com.jd.blockchain.consensus.ConsensusSettings;
import com.jd.blockchain.crypto.AsymmetricKeypair;
import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.crypto.PrivKey;
import com.jd.blockchain.gateway.GatewayConfigProperties.KeyPairConfig;
import com.jd.blockchain.ledger.BlockchainKeyGenerator;
import com.jd.blockchain.ledger.BlockchainKeypair;
import com.jd.blockchain.ledger.LedgerBlock;
import com.jd.blockchain.ledger.LedgerInfo;
import com.jd.blockchain.ledger.PreparedTransaction;
import com.jd.blockchain.ledger.TransactionResponse;
import com.jd.blockchain.ledger.TransactionTemplate;
import com.jd.blockchain.ledger.*;
import com.jd.blockchain.ledger.core.LedgerRepository;
import com.jd.blockchain.sdk.BlockchainService;
import com.jd.blockchain.sdk.client.GatewayServiceFactory;
@@ -39,18 +17,29 @@ import com.jd.blockchain.tools.initializer.Prompter;
import com.jd.blockchain.tools.keygen.KeyGenCommand;
import com.jd.blockchain.utils.concurrent.ThreadInvoker.AsyncCallback;
import com.jd.blockchain.utils.net.NetworkAddress;

import org.junit.Test;
import org.springframework.core.io.ClassPathResource;
import test.com.jd.blockchain.intgr.IntegratedContext.Node;
import test.com.jd.blockchain.intgr.contract.AssetContract;
import test.com.jd.blockchain.intgr.initializer.LedgerInitializeWeb4SingleStepsTest;
import test.com.jd.blockchain.intgr.initializer.LedgerInitializeWeb4SingleStepsTest.NodeWebContext;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.concurrent.CountDownLatch;

import static org.junit.Assert.*;

/**
* 测试合约,提交后不立即进行验证,因为此时可能还没有完成正式结块;
*/
public class IntegrationTest2 {
// 合约测试使用的初始化数据;
BlockchainKeypair contractDeployKey = BlockchainKeyGenerator.getInstance().generate();
private String contractZipName = "AssetContract3.contract";
private String contractZipName = "contract.jar";
private String eventName = "issue-asset";

@Test
@@ -315,7 +304,7 @@ public class IntegrationTest2 {
// 定义交易;
TransactionTemplate txTpl = blockchainService.newTransaction(ledgerHash);

txTpl.contractEvents().send(contractDeployKey.getAddress(), eventName, ("888##999##abc").getBytes());
txTpl.contract(contractDeployKey.getAddress(), AssetContract.class).issue(10,"abc");

// 签名;
PreparedTransaction ptx = txTpl.prepare();


+ 12
- 31
source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTestAll4Redis.java View File

@@ -1,36 +1,8 @@
package test.com.jd.blockchain.intgr;

import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Random;

import org.junit.Test;
import org.springframework.core.io.ClassPathResource;

import com.jd.blockchain.crypto.AddressEncoding;
import com.jd.blockchain.crypto.AsymmetricKeypair;
import com.jd.blockchain.crypto.Crypto;
import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.crypto.PrivKey;
import com.jd.blockchain.crypto.PubKey;
import com.jd.blockchain.crypto.*;
import com.jd.blockchain.gateway.GatewayConfigProperties.KeyPairConfig;
import com.jd.blockchain.ledger.BlockchainKeyGenerator;
import com.jd.blockchain.ledger.BlockchainKeypair;
import com.jd.blockchain.ledger.DataAccountKVSetOperation;
import com.jd.blockchain.ledger.KVDataEntry;
import com.jd.blockchain.ledger.LedgerBlock;
import com.jd.blockchain.ledger.LedgerInfo;
import com.jd.blockchain.ledger.PreparedTransaction;
import com.jd.blockchain.ledger.TransactionResponse;
import com.jd.blockchain.ledger.TransactionState;
import com.jd.blockchain.ledger.TransactionTemplate;
import com.jd.blockchain.ledger.*;
import com.jd.blockchain.ledger.core.DataAccount;
import com.jd.blockchain.ledger.core.DataAccountSet;
import com.jd.blockchain.ledger.core.LedgerManage;
@@ -47,10 +19,19 @@ import com.jd.blockchain.utils.Bytes;
import com.jd.blockchain.utils.codec.HexUtils;
import com.jd.blockchain.utils.concurrent.ThreadInvoker.AsyncCallback;
import com.jd.blockchain.utils.net.NetworkAddress;

import org.junit.Test;
import org.springframework.core.io.ClassPathResource;
import test.com.jd.blockchain.intgr.contract.AssetContract;
import test.com.jd.blockchain.intgr.initializer.LedgerInitializeWeb4SingleStepsTest;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Random;

import static org.junit.Assert.*;

public class IntegrationTestAll4Redis {

public static final String PASSWORD = "abc";


Loading…
Cancel
Save