From e1b4240d5169332c4e7282c554f13e59c682a135 Mon Sep 17 00:00:00 2001 From: shaozhuguang Date: Tue, 10 Sep 2019 17:05:07 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E5=90=88=E7=BA=A6=E7=BC=96?= =?UTF-8?q?=E8=AF=91=E6=8F=92=E4=BB=B6BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contract/maven/ContractCompileMojo.java | 186 ++++++++++++++---- .../contract/maven/rule/BlackList.java | 3 +- .../maven/rule/DependencyExclude.java | 6 +- .../contract/maven/verify/ResolveEngine.java | 70 +++++-- .../contract/maven/verify/VerifyEngine.java | 16 +- .../src/main/resources/blacks.conf | 12 +- .../{provideds.conf => providers.conf} | 0 .../src/main/resources/whites.conf | 4 +- .../ledger/ContractInvokingTest.java | 13 +- .../resources/contract-JDChain-Contract.jar | Bin 0 -> 96020 bytes .../ledger/data/ContractJarUtilsTest.java | 69 ------- 11 files changed, 243 insertions(+), 136 deletions(-) rename source/contract/contract-maven-plugin/src/main/resources/{provideds.conf => providers.conf} (100%) create mode 100644 source/ledger/ledger-core/src/test/resources/contract-JDChain-Contract.jar delete mode 100644 source/ledger/ledger-model/src/test/java/test/com/jd/blockchain/ledger/data/ContractJarUtilsTest.java diff --git a/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractCompileMojo.java b/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractCompileMojo.java index 3ddf15a0..a98eeca3 100644 --- a/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractCompileMojo.java +++ b/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractCompileMojo.java @@ -1,12 +1,12 @@ package com.jd.blockchain.contract.maven; -import com.jd.blockchain.contract.ContractJarUtils; import com.jd.blockchain.contract.maven.rule.BlackList; import com.jd.blockchain.contract.maven.rule.WhiteList; import com.jd.blockchain.contract.maven.rule.DependencyExclude; import com.jd.blockchain.contract.maven.verify.ResolveEngine; import com.jd.blockchain.contract.maven.verify.VerifyEngine; import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; import org.apache.maven.artifact.Artifact; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; @@ -16,8 +16,14 @@ import org.apache.maven.project.MavenProject; import java.io.File; import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import java.util.Set; +import static com.jd.blockchain.contract.ContractJarUtils.BLACK_CONF; +import static com.jd.blockchain.contract.ContractJarUtils.WHITE_CONF; + @Mojo(name = "compile") public class ContractCompileMojo extends SingleAssemblyMojo { @@ -42,46 +48,122 @@ public class ContractCompileMojo extends SingleAssemblyMojo { // 首先对MainClass进行校验,要求必须有MainClass String mainClass = mainClassVerify(); - // 将JDChain本身代码之外的代码移除(不打包进整个Jar) + // 排除所有依赖,只打包当前代码 +// excludeAllArtifactExclude(super.getProject().getDependencyArtifacts()); +// handleArtifactCompile(super.getProject().getDependencyArtifacts()); handleArtifactExclude(super.getProject().getDependencyArtifacts()); // 此参数用于设置将所有第三方依赖的Jar包打散为.class,与主代码打包在一起,生成一个jar包 super.setDescriptorRefs(new String[]{JAR_DEPENDENCE}); // 执行打包命令 + // 该命令生成的是只含有当前项目的实际代码的Jar包,该Jar包仅用于校验MainClass super.execute(); - // 将本次打包好的文件重新命名,以便于后续重新打包需要 - // 把文件改名,然后重新再生成一个文件 - File dstFile; + // 生成解析引擎 + ResolveEngine resolveEngine = new ResolveEngine(getLog(), mainClass); + + // 获取本次生成的Jar文件 + File defaultJarFile; try { - dstFile = rename(getProject(), getFinalName()); - } catch (IOException e) { + defaultJarFile = rename(getProject(), getFinalName()); + // 校验当前MainClass是否满足需求 + resolveEngine.verifyCurrentProjectMainClass(defaultJarFile); + // 校验完成后将该Jar删除 +// FileUtils.forceDelete(mainClassFile); + } catch (Exception e) { getLog().error(e); throw new MojoFailureException(e.getMessage()); } - // 首先校验该类的Jar包中是否包含不符合规范的命名,以及该类的代码中的部分解析 - File finalJarFile = verify(dstFile, mainClass); - - // 将所有的依赖的jar包全部打包进一个包中,以便于进行ASM检查 - handleArtifactCompile(super.getProject().getDependencyArtifacts()); - - // 然后再打包一次,本次打包完成后,其中的代码包含所有的class(JDK自身的除外) - super.execute(); - - // 对代码中的一些规则进行校验,主要是校验其是否包含一些不允许使用的类、包、方法等 - verify(mainClass); - - // 删除中间的一些文件 +// // 将JDChain本身之外的代码打包进Jar包,然后编译 +// handleArtifactExclude(super.getProject().getDependencyArtifacts()); +// +// // 此参数用于设置将所有第三方依赖的Jar包打散为.class,与主代码打包在一起,生成一个jar包 +// super.setDescriptorRefs(new String[]{JAR_DEPENDENCE}); +// +// // 生成Jar包(该Jar包中不包含JDChain内部的代码) +// super.execute(); +// +// File defaultJarFile; +// try { +// defaultJarFile = rename(getProject(), getFinalName()); +// } catch (Exception e) { +// getLog().error(e); +// throw new MojoFailureException(e.getMessage()); +// } + + // 校验该Jar包 + verify(defaultJarFile, mainClass); + + File deployJarFile = resolveEngine.verify(defaultJarFile); + + // 删除中间产生的临时文件 try { - FileUtils.forceDelete(dstFile); - } catch (IOException e) { - throw new MojoFailureException(e.getMessage()); + FileUtils.forceDelete(defaultJarFile); + } catch (Exception e) { + getLog().error(e); } + getLog().info(String.format("JDChain's Contract compile success, path = %s !", deployJarFile.getPath())); + + + +// // 将JDChain本身代码之外的代码移除(不打包进整个Jar) +// handleArtifactExclude(super.getProject().getDependencyArtifacts()); +// +// // 此参数用于设置将所有第三方依赖的Jar包打散为.class,与主代码打包在一起,生成一个jar包 +// super.setDescriptorRefs(new String[]{JAR_DEPENDENCE}); +// +// // 执行打包命令 +// super.execute(); + +// // 将本次打包好的文件重新命名,以便于后续重新打包需要 +// // 把文件改名,然后重新再生成一个文件 +// File dstFile; +// try { +// dstFile = rename(getProject(), getFinalName()); +// } catch (IOException e) { +// getLog().error(e); +// throw new MojoFailureException(e.getMessage()); +// } +// +// // dstFile理论上应该含有 +// +// // 首先校验该类的Jar包中是否包含不符合规范的命名,以及该类的代码中的部分解析 +// +// ResolveEngine resolveEngine = new ResolveEngine(getLog(), mainClass); +// +// // 校验mainClass +// resolveEngine.verifyCurrentProjectMainClass(dstFile); +// +// +// +// File finalJarFile = resolveEngine.verify(); +// +// // 将所有的依赖的jar包全部打包进一个包中,以便于进行ASM检查 +// handleArtifactCompile(super.getProject().getDependencyArtifacts()); +// +// // 然后再打包一次,本次打包完成后,其中的代码包含所有的class(JDK自身的除外) +// super.execute(); +// +// File jarFile = new File(jarPath(getProject(), getFinalName())); +// +// // 校验mainClass +// resolveEngine.verifyCurrentProjectMainClass(jarFile); +// +// // 对代码中的一些规则进行校验,主要是校验其是否包含一些不允许使用的类、包、方法等 +// verify(jarFile, mainClass); +// +// // 删除中间的一些文件 +//// try { +//// FileUtils.forceDelete(dstFile); +//// } catch (IOException e) { +//// throw new MojoFailureException(e.getMessage()); +//// } +// // 若执行到此处没有异常则表明打包成功,打印打包成功消息 - getLog().info(String.format("JDChain's Contract compile success, path = %s !", finalJarFile.getPath())); +// getLog().info(String.format("JDChain's Contract compile success, path = %s !", finalJarFile.getPath())); } private String mainClassVerify() throws MojoFailureException { @@ -107,10 +189,20 @@ public class ContractCompileMojo extends SingleAssemblyMojo { getLog().info(String.format("GroupId[%s] ArtifactId[%s] belongs to DependencyExclude !!!", groupId, artifactId)); // 属于排除的名单之中 artifact.setScope(SCOPE_PROVIDED); + } else { + getLog().info(String.format("GroupId[%s] ArtifactId[%s] not belongs to DependencyExclude !!!", groupId, artifactId)); + // 属于排除的名单之中 + artifact.setScope(SCOPE_COMPILE); } } } + private void excludeAllArtifactExclude(Set artifacts) { + for (Artifact artifact : artifacts) { + artifact.setScope(SCOPE_PROVIDED); + } + } + private void handleArtifactCompile(Set artifacts) { for (Artifact artifact : artifacts) { if (artifact.getScope().equals(SCOPE_PROVIDED)) { @@ -135,17 +227,14 @@ public class ContractCompileMojo extends SingleAssemblyMojo { File.separator + finalName + "-" + JAR_DEPENDENCE + ".jar"; } - private void verify(String mainClass) throws MojoFailureException { + private void verify(File jarFile, String mainClass) throws MojoFailureException { try { - - File jarFile = new File(jarPath(getProject(), getFinalName())); - VerifyEngine verifyEngine = new VerifyEngine(getLog(), jarFile, mainClass, black, white); verifyEngine.verify(); // 校验完成后将该jar包删除 - FileUtils.forceDelete(jarFile); +// FileUtils.forceDelete(jarFile); } catch (Exception e) { getLog().error(e); @@ -153,20 +242,47 @@ public class ContractCompileMojo extends SingleAssemblyMojo { } } - private File verify(File jarFile, String mainClass) throws MojoFailureException { - ResolveEngine resolveEngine = new ResolveEngine(getLog(), jarFile, mainClass); - return resolveEngine.verify(); + private static void init() { + try { + black = AbstractContract.initBlack(loadBlackConf()); + white = AbstractContract.initWhite(loadWhiteConf()); + } catch (Exception e) { + throw new IllegalStateException(e); + } + } + private static List loadWhiteConf() { + + return resolveConfig(WHITE_CONF); } - private static void init() { + private static List loadBlackConf() { + return resolveConfig(BLACK_CONF); + } + + private static List resolveConfig(String fileName) { + List configs = new ArrayList<>(); + try { - black = AbstractContract.initBlack(ContractJarUtils.loadBlackConf()); - white = AbstractContract.initWhite(ContractJarUtils.loadWhiteConf()); + List readLines = loadConfig(fileName); + if (!readLines.isEmpty()) { + for (String readLine : readLines) { + String[] lines = readLine.split(","); + configs.addAll(Arrays.asList(lines)); + } + } } catch (Exception e) { throw new IllegalStateException(e); } + + return configs; + } + + public static List loadConfig(String fileName) throws Exception { + + return IOUtils.readLines( + ContractCompileMojo.class.getResourceAsStream("/" + fileName)); } } diff --git a/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/rule/BlackList.java b/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/rule/BlackList.java index 97044df6..593093aa 100644 --- a/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/rule/BlackList.java +++ b/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/rule/BlackList.java @@ -52,6 +52,7 @@ public class BlackList { } public boolean isBlack(Class clazz, String methodName) { + // 判断该Class是否属于黑名单 if (isCurrentClassBlack(clazz, methodName)) { return true; @@ -75,7 +76,7 @@ public class BlackList { String packageName = clazz.getPackage().getName(); for (String bp : blackPackages) { - if (packageName.equals(bp) || packageName.startsWith(bp)) { + if ((packageName + ".").equals(bp) || packageName.startsWith(bp)) { return true; } } diff --git a/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/rule/DependencyExclude.java b/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/rule/DependencyExclude.java index 6c3dca44..c20ce777 100644 --- a/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/rule/DependencyExclude.java +++ b/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/rule/DependencyExclude.java @@ -1,6 +1,6 @@ package com.jd.blockchain.contract.maven.rule; -import com.jd.blockchain.contract.ContractJarUtils; +import com.jd.blockchain.contract.maven.ContractCompileMojo; import java.util.ArrayList; import java.util.List; @@ -11,7 +11,7 @@ public class DependencyExclude { private static final String COMMON_ARTIFACTID = "*"; - private static final String CONFIG = "provided.conf"; + private static final String CONFIG = "providers.conf"; private static final Map> DEPENDENCYS = new ConcurrentHashMap<>(); @@ -24,7 +24,7 @@ public class DependencyExclude { } private static void init() throws Exception { - List readLines = ContractJarUtils.loadConfig(CONFIG); + List readLines = ContractCompileMojo.loadConfig(CONFIG); if (!readLines.isEmpty()) { for (String line : readLines) { // groupId/artifactId diff --git a/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/verify/ResolveEngine.java b/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/verify/ResolveEngine.java index 059f7337..97744689 100644 --- a/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/verify/ResolveEngine.java +++ b/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/verify/ResolveEngine.java @@ -1,7 +1,10 @@ package com.jd.blockchain.contract.maven.verify; +import com.alibaba.fastjson.JSON; +import com.jd.blockchain.contract.Contract; import com.jd.blockchain.contract.ContractJarUtils; import com.jd.blockchain.contract.ContractType; +import com.jd.blockchain.contract.EventProcessingAware; import org.apache.commons.io.FileUtils; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugin.logging.Log; @@ -21,23 +24,49 @@ public class ResolveEngine { private Log LOGGER; - private File jarFile; +// private File jarFile; private String mainClass; - public ResolveEngine(Log LOGGER, File jarFile, String mainClass) { +// public ResolveEngine(Log LOGGER, File jarFile, String mainClass) { + public ResolveEngine(Log LOGGER, String mainClass) { this.LOGGER = LOGGER; - this.jarFile = jarFile; +// this.jarFile = jarFile; this.mainClass = mainClass; } - public File verify() throws MojoFailureException { + /** + * 校验当前项目中MainClass其是否满足JDChain合约写法 + * + * @param mainClassJarFile + * @throws MojoFailureException + */ + public void verifyCurrentProjectMainClass(File mainClassJarFile) throws MojoFailureException { + // 校验MainClass try { - // 首先校验MainClass - ClassLoader classLoader = verifyMainClass(jarFile); + LOGGER.debug(String.format("Verify Jar [%s] 's MainClass start...", mainClassJarFile.getName())); + // 自定义ClassLoader,必须使用Thread.currentThread().getContextClassLoader() + // 保证其项目内部加载的Jar包无须再加载一次 + URLClassLoader classLoader = new URLClassLoader(new URL[]{mainClassJarFile.toURI().toURL()}, + Thread.currentThread().getContextClassLoader()); + // 从MainClass作为入口进行MainClass代码校验 + Class mClass = classLoader.loadClass(mainClass); + ContractType.resolve(mClass); + + // 校验完成后需要释放,否则无法删除该Jar文件 + classLoader.close(); + + LOGGER.debug(String.format("Verify Jar [%s] 's MainClass end...", mainClassJarFile.getName())); + } catch (Exception e) { + throw new MojoFailureException(e.getMessage()); + } + } + + public File verify(File defaultJarFile) throws MojoFailureException { + try { // 检查jar包中所有的class的命名,要求其包名不能为com.jd.blockchain.* - LinkedList totalClasses = loadAllClass(jarFile); + LinkedList totalClasses = loadAllClass(defaultJarFile); if (!totalClasses.isEmpty()) { @@ -47,9 +76,8 @@ public class ResolveEngine { LOGGER.debug(String.format("Verify Dependency Class[%s] start......", dotClassName)); // 获取其包名 - Class currentClass = classLoader.loadClass(dotClassName); - - String packageName = currentClass.getPackage().getName(); + // 将class转换为包名 + String packageName = class2Package(dotClassName); if (ContractJarUtils.isJDChainPackage(packageName)) { throw new IllegalStateException(String.format("Class[%s]'s package[%s] cannot start with %s !", @@ -61,18 +89,23 @@ public class ResolveEngine { } // 处理完成之后,生成finalName-JDChain-Contract.jar - return compileCustomJar(); + return compileCustomJar(defaultJarFile); } catch (Exception e) { LOGGER.error(e.getMessage()); throw new MojoFailureException(e.getMessage()); } } - private File compileCustomJar() throws IOException { + private String class2Package(String dotClassName) { + + return dotClassName.substring(0, dotClassName.lastIndexOf(".")); + } + + private File compileCustomJar(File defaultJarFile) throws IOException { - String fileParentPath = jarFile.getParentFile().getPath(); + String fileParentPath = defaultJarFile.getParentFile().getPath(); - String jarFileName = jarFile.getName(); + String jarFileName = defaultJarFile.getName(); String fileName = jarFileName.substring(0, jarFileName.lastIndexOf(".")); @@ -80,13 +113,13 @@ public class ResolveEngine { String dstJarPath = fileParentPath + File.separator + fileName + "-temp-" + System.currentTimeMillis() + ".jar"; - File srcJar = jarFile, dstJar = new File(dstJarPath); + File srcJar = defaultJarFile, dstJar = new File(dstJarPath); - LOGGER.debug(String.format("Jar from [%s] to [%s] Copying", jarFile.getPath(), dstJarPath)); + LOGGER.debug(String.format("Jar from [%s] to [%s] Copying", defaultJarFile.getPath(), dstJarPath)); // 首先进行Copy处理 copy(srcJar, dstJar); - LOGGER.debug(String.format("Jar from [%s] to [%s] Copied", jarFile.getPath(), dstJarPath)); + LOGGER.debug(String.format("Jar from [%s] to [%s] Copied", defaultJarFile.getPath(), dstJarPath)); byte[] txtBytes = contractMF(FileUtils.readFileToByteArray(dstJar)).getBytes(StandardCharsets.UTF_8); @@ -128,6 +161,9 @@ public class ResolveEngine { } } } + // Jar文件使用完成后需要关闭,否则可能会产生无法删除的问题 + jarFile.close(); + return allClass; } } diff --git a/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/verify/VerifyEngine.java b/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/verify/VerifyEngine.java index ea3d723c..7fd59c7e 100644 --- a/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/verify/VerifyEngine.java +++ b/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/verify/VerifyEngine.java @@ -52,7 +52,8 @@ public class VerifyEngine { // 加载所有的jar,然后ASM获取MAP URL jarURL = jarFile.toURI().toURL(); - URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{jarURL}); + URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{jarURL}, + Thread.currentThread().getContextClassLoader()); // 解析Jar包中所有的Class Map allContractClasses = resolveClasses(jarClasses()); @@ -60,6 +61,8 @@ public class VerifyEngine { // 开始处理MainClass verify(urlClassLoader, allContractClasses); + // 校验完成后需要释放ClassLoader,否则无法删除该Jar包 + urlClassLoader.close(); } public void verify(URLClassLoader urlClassLoader, Map allContractClasses) throws Exception { @@ -91,6 +94,8 @@ public class VerifyEngine { // 将该方法设置为已处理 haveManagedMethods.add(managedKey); String dotClassName = method.getDotClassName(); + + Class dotClass = urlClassLoader.loadClass(dotClassName); if (dotClass == null) { @@ -137,8 +142,13 @@ public class VerifyEngine { } } else { // 非URLClassLoader加载的类,只需要做判断即可 + // 对于系统加载的类,其白名单优先级高于黑名单 // 1、不再需要获取其方法; - // 2、只需要判断黑名单不需要判断白名单 + // 首先判断是否为白名单 + if (white.isWhite(dotClass)) { + return; + } + // 然后判断其是否为黑名单 if (black.isBlack(dotClass, method.getMethodName())) { throw new IllegalStateException(String.format("Class [%s] Method [%s] is Black !!!", dotClassName, method.getMethodName())); } @@ -187,8 +197,6 @@ public class VerifyEngine { continue; } - LOGGER.info(String.format("Resolve Class [%s] ...", className)); - ContractClass contractClass = new ContractClass(className); ClassReader cr = new ClassReader(classContent); cr.accept(new ASMClassVisitor(contractClass), ClassReader.SKIP_DEBUG); diff --git a/source/contract/contract-maven-plugin/src/main/resources/blacks.conf b/source/contract/contract-maven-plugin/src/main/resources/blacks.conf index 533c4850..caa20370 100644 --- a/source/contract/contract-maven-plugin/src/main/resources/blacks.conf +++ b/source/contract/contract-maven-plugin/src/main/resources/blacks.conf @@ -1,5 +1,13 @@ -java.io.* -java.nio.* +java.io.File +java.io.InputStream +java.io.OutputStream +java.io.DataInput +java.io.DataOutput +java.io.Reader +java.io.Writer +java.io.Flushable +java.nio.channels.* +java.nio.file.* java.net.* java.sql.* java.lang.reflect.* diff --git a/source/contract/contract-maven-plugin/src/main/resources/provideds.conf b/source/contract/contract-maven-plugin/src/main/resources/providers.conf similarity index 100% rename from source/contract/contract-maven-plugin/src/main/resources/provideds.conf rename to source/contract/contract-maven-plugin/src/main/resources/providers.conf diff --git a/source/contract/contract-maven-plugin/src/main/resources/whites.conf b/source/contract/contract-maven-plugin/src/main/resources/whites.conf index a495db60..08e7d754 100644 --- a/source/contract/contract-maven-plugin/src/main/resources/whites.conf +++ b/source/contract/contract-maven-plugin/src/main/resources/whites.conf @@ -1 +1,3 @@ -com.jd.blockchain.* \ No newline at end of file +com.jd.blockchain.* +java.nio.charset.Charset +com.alibaba.fastjson.* \ No newline at end of file diff --git a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/ContractInvokingTest.java b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/ContractInvokingTest.java index 41d28ab2..86ec8c2e 100644 --- a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/ContractInvokingTest.java +++ b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/ContractInvokingTest.java @@ -13,9 +13,13 @@ import com.jd.blockchain.service.TransactionBatchResultHandle; import com.jd.blockchain.storage.service.utils.MemoryKVStorage; import com.jd.blockchain.transaction.TxBuilder; import com.jd.blockchain.utils.Bytes; +import com.jd.blockchain.utils.io.BytesUtils; +import org.apache.commons.io.IOUtils; import org.junit.Test; import org.mockito.Mockito; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; import java.util.Random; import static org.junit.Assert.*; @@ -44,6 +48,9 @@ public class ContractInvokingTest { // 采用基于内存的 Storage; private MemoryKVStorage storage = new MemoryKVStorage(); + // 用于测试的发布合约文件 + private static final String CONTRACT_JAR = "contract-JDChain-Contract.jar"; + @Test public void test() { // 初始化账本到指定的存储库; @@ -82,7 +89,6 @@ public class ContractInvokingTest { // 构建基于接口调用合约的交易请求,用于测试合约调用; TxBuilder txBuilder = new TxBuilder(ledgerHash); TestContract contractProxy = txBuilder.contract(contractAddress, TestContract.class); - TestContract contractProxy1 = txBuilder.contract(contractAddress, TestContract.class); String asset = "AK"; long issueAmount = new Random().nextLong(); @@ -190,8 +196,7 @@ public class ContractInvokingTest { } private byte[] chainCode() { - byte[] chainCode = new byte[1024]; - new Random().nextBytes(chainCode); - return chainCode; + + return BytesUtils.copyToBytes(this.getClass().getResourceAsStream("/" + CONTRACT_JAR)); } } diff --git a/source/ledger/ledger-core/src/test/resources/contract-JDChain-Contract.jar b/source/ledger/ledger-core/src/test/resources/contract-JDChain-Contract.jar new file mode 100644 index 0000000000000000000000000000000000000000..fd926b150f9c82047415778431d230260b00cc98 GIT binary patch literal 96020 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 literal 0 HcmV?d00001 diff --git a/source/ledger/ledger-model/src/test/java/test/com/jd/blockchain/ledger/data/ContractJarUtilsTest.java b/source/ledger/ledger-model/src/test/java/test/com/jd/blockchain/ledger/data/ContractJarUtilsTest.java deleted file mode 100644 index 06e2bf44..00000000 --- a/source/ledger/ledger-model/src/test/java/test/com/jd/blockchain/ledger/data/ContractJarUtilsTest.java +++ /dev/null @@ -1,69 +0,0 @@ -package test.com.jd.blockchain.ledger.data; - -import org.apache.commons.io.FileUtils; -import org.junit.Test; -import org.springframework.core.io.ClassPathResource; - -import java.io.File; -import java.nio.charset.StandardCharsets; - -import static com.jd.blockchain.contract.ContractJarUtils.*; -import static org.junit.Assert.fail; - -public class ContractJarUtilsTest { - - private String jarName = "complex"; - - @Test - public void test() { - - byte[] chainCode = null; - try { - ClassPathResource classPathResource = new ClassPathResource(jarName + ".jar"); - String classPath = classPathResource.getFile().getParentFile().getPath(); - - // 首先将Jar包转换为指定的格式 - String srcJarPath = classPath + - File.separator + jarName + ".jar"; - - String dstJarPath = classPath + - File.separator + jarName + "-temp-" + System.currentTimeMillis() + ".jar"; - - File srcJar = new File(srcJarPath), dstJar = new File(dstJarPath); - - // 首先进行Copy处理 - copy(srcJar, dstJar); - - byte[] txtBytes = contractMF(FileUtils.readFileToByteArray(dstJar)).getBytes(StandardCharsets.UTF_8); - - String finalJarPath = classPath + - File.separator + jarName + "-jdchain.jar"; - - File finalJar = new File(finalJarPath); - - copy(dstJar, finalJar, contractMFJarEntry(), txtBytes, null); - - // 删除临时文件 - FileUtils.forceDelete(dstJar); - - // 读取finalJar中的内容 - chainCode = FileUtils.readFileToByteArray(finalJar); - - FileUtils.forceDelete(finalJar); - } catch (Exception e) { - e.printStackTrace(); - } - try { - verify(chainCode); - System.out.println("Verify Success !!!"); - } catch (Exception e) { - fail("Verify Fail !!"); - } - } - - @Test - public void testSign() { - byte[] test = "zhangsan".getBytes(StandardCharsets.UTF_8); - System.out.println(contractMF(test)); - } -}