@@ -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; | |||
@@ -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)){ | |||
@@ -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) | |||
@@ -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(); | |||
} |
@@ -14,5 +14,5 @@ import com.jd.blockchain.consts.DataCodes; | |||
public interface CONTRACT_INT16 { | |||
@DataField(order=2, primitiveType= PrimitiveType.INT16) | |||
int getValue(); | |||
short getValue(); | |||
} |
@@ -14,5 +14,5 @@ import com.jd.blockchain.consts.DataCodes; | |||
public interface CONTRACT_INT8 { | |||
@DataField(order=2, primitiveType= PrimitiveType.INT8) | |||
int getValue(); | |||
Byte getValue(); | |||
} |
@@ -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); | |||
} | |||
@@ -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(); | |||
} | |||
@@ -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 | |||
@@ -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(); | |||
@@ -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(); | |||
@@ -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"; | |||