diff --git a/source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java b/source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java index 6b47a505..9d069903 100644 --- a/source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java +++ b/source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java @@ -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; diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/contract/ContractSerializeUtils.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/contract/ContractSerializeUtils.java index 440c06d1..c68c84bc 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/contract/ContractSerializeUtils.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/contract/ContractSerializeUtils.java @@ -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 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)){ diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_BIG_INT.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_BIG_INT.java index e53f017f..fad0e208 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_BIG_INT.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_BIG_INT.java @@ -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) diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_BINARY.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_BINARY.java index b4193d85..7661b852 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_BINARY.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_BINARY.java @@ -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(); } diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_INT16.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_INT16.java index cb27e0c6..b6666cc0 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_INT16.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_INT16.java @@ -14,5 +14,5 @@ import com.jd.blockchain.consts.DataCodes; public interface CONTRACT_INT16 { @DataField(order=2, primitiveType= PrimitiveType.INT16) - int getValue(); + short getValue(); } diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_INT8.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_INT8.java index 754e23ed..f77d3de2 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_INT8.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CONTRACT_INT8.java @@ -14,5 +14,5 @@ import com.jd.blockchain.consts.DataCodes; public interface CONTRACT_INT8 { @DataField(order=2, primitiveType= PrimitiveType.INT8) - int getValue(); + Byte getValue(); } diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ContractInvocationProxy.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ContractInvocationProxy.java index 26857631..542e31f5 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ContractInvocationProxy.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ContractInvocationProxy.java @@ -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); } diff --git a/source/sdk/sdk-client/src/main/java/com/jd/blockchain/sdk/client/GatewayServiceFactory.java b/source/sdk/sdk-client/src/main/java/com/jd/blockchain/sdk/client/GatewayServiceFactory.java index 5396a430..f3e3b42c 100644 --- a/source/sdk/sdk-client/src/main/java/com/jd/blockchain/sdk/client/GatewayServiceFactory.java +++ b/source/sdk/sdk-client/src/main/java/com/jd/blockchain/sdk/client/GatewayServiceFactory.java @@ -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(); } diff --git a/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_Contract_Test.java b/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_Contract_Test.java index d74ea6bd..168065d7 100644 --- a/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_Contract_Test.java +++ b/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_Contract_Test.java @@ -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 diff --git a/source/sdk/sdk-samples/src/test/resources/contract.jar b/source/sdk/sdk-samples/src/test/resources/contract.jar index c96e3214..8fb96749 100644 Binary files a/source/sdk/sdk-samples/src/test/resources/contract.jar and b/source/sdk/sdk-samples/src/test/resources/contract.jar differ diff --git a/source/test/test-integration/src/main/java/test/com/jd/blockchain/intgr/IntegrationTest.java b/source/test/test-integration/src/main/java/test/com/jd/blockchain/intgr/IntegrationTest.java index e4b7843c..c3c80a9a 100644 --- a/source/test/test-integration/src/main/java/test/com/jd/blockchain/intgr/IntegrationTest.java +++ b/source/test/test-integration/src/main/java/test/com/jd/blockchain/intgr/IntegrationTest.java @@ -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(); diff --git a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest2.java b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest2.java index a6f2f30a..1da5341b 100644 --- a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest2.java +++ b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest2.java @@ -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(); diff --git a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTestAll4Redis.java b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTestAll4Redis.java index 3e37e9c8..d6daf44b 100644 --- a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTestAll4Redis.java +++ b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTestAll4Redis.java @@ -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";