简单的用java代码实现智能合约

简单理解智能合约:

所谓智能合约,从另一个角度望过去,就是写入了不可篡改的电子账簿中的,可执行但不可篡改的程序代码而已。

一、

编写生成jar包

二、

通过文件流的方式读取jar,获取到每个class对象对应的字节数组

1.首先获取到jar对应的字节输入流
String jarPath = "/nghb/jar/MyFirstDemo.jar";
File file = new File(jarPath);
System.out.println("文件的长度:"+file.length());
byte [] buffer = new byte[Integer.parseInt(String.valueOf(file.length()))];
FileInputStream fis = new FileInputStream(file);
int size = Integer.parseInt(String.valueOf(file.length()));
int offset;
int read =0;
//int result = fis.read(buffer,0,Integer.parseInt(String.valueOf(file.length())));
// 虽然知道了file文件的长度,但是还是要用for循环把流读到数组中,因为可能存在fis不一定会一次read完所有数据到字节数组中
for(offset = 0;(read = fis.read(buffer,offset,size-offset)) != -1 && offset < size; offset += read){
;
}
2.根据获取到的字节流输入数组,拆分字节流,拆分为jar包中每个类class对象对应的字节流
// JarInputStream专门用来处理jar包流的
JarInputStream jis = new JarInputStream(new ByteArrayInputStream(buffer));
Map byteMap = new HashMap();
JarEntry nextEntry = null;
while((nextEntry=jis.getNextJarEntry()) != null){
if(!nextEntry.isDirectory() && nextEntry.getName().endsWith(".class")){
// 层层获取到jar包的jarEntry,替换为class对象中的className形式
String name = nextEntry.getName().replaceAll("/",".").replaceAll(".class","");
byte [] classByte = generateByteOfClass(jis);
byteMap.put(name,classByte);
}
}
/*
* @Author ZDLS
* @Description 根据流的方式,读入jar中的class对象对应的字节流
* @Date 下午 16:44 2021/1/26 0026
* @Param
* @return
*/
private byte [] generateByteOfClass(JarInputStream jarInputStream) throws Exception{
List bufs = null;
byte [] result = null;
int total = 0;
// 整数的最大取值
int remaining = 2147483647;
int n=0;
do{
byte [] buf = new byte[Math.min(remaining,8192)];
int nread = 0;
// 跳出for循环的情况有:buf不够用,这个时间n为0;流读取完了n的返回值为-1
for(nread=0; (n = jarInputStream.read(buf,nread,Math.min(buf.length - nread,remaining)))>0;remaining -= n){
nread += n;
}
if(nread > 0){
if(2147483639 - total < nread){
System.out.println("抛出异常");
}
total += nread;
if(result == null){
result = buf;
}else {
if(bufs == null){
bufs = new ArrayList();
bufs.add(result);
}
bufs.add(buf);
}
}
}while (remaining>0 && n>= 0);
// while中的调用for循环次数小于2
if(bufs == null){
if(result == null){
return new byte[0];
}else {
return result.length == total result : Arrays.copyOfRange(result,0,total);
}
// 把bufs中的数组合并成一个数组,保证每个class对象对应的字节流只是自己
}else {
result = new byte[total];
int count = 0;
int offset = 0;
remaining = total;
for(Iterator var12 = bufs.iterator(); var12.hasNext() ; remaining-=count){
byte[] b = (byte[]) var12.next();
count = Math.min(b.length,remaining);
System.arraycopy(b,0,result,offset,count);
offset += count;
}
}
return result;
}
3.解析下特殊方法意义
n = jarInputStream.read(buf,nread,end)
返回值
入参:buf:本次流要写入的缓存字节数组,nread:本次流开始写入字节数组的起始位置,end:本次流最大写入字节的长度
返回值:本次流写入的字节数组的长度,-1:表示流读完了,如果返回的值为0,表示的就是本次读入的字节长度为0;一定要保证end -nread的值 >缓存数据数组剩余的长度。

三、

通过获取到class对象,通过反射获取到jar包中的执行逻辑

简单的用java代码实现智能合约 相关文章

reduce的基本使用

Java8 中reduce的基本使用1、初识 reduce 的基本 api @Test public void testReduce() { StreamInteger stream = Arrays.stream(new Integer[]{1, 2, 3, 4, 5, 6, 7, 8}); //求集合元素只和 Integer result = stream.reduce(0, Integer::sum); System.out.pr

java控制夜神访问浏览器

1、环境搭建java+eclipse+appium 参考文档:https://www.jianshu.com/p/1b959e0baae2 2、安装夜神,解决adb无法控制夜神问题 参考文档: 3、利用appium查找页面元素 --》打开浏览器 --》查看设备名称 adb d

ApplePay苹果支付内购项目配置及代码实现及沙箱测试

接上一篇博客:ApplePay苹果支付准备工作:apple苹果IOS内购申请教程协议、税务和银行业务配置 ,设置完成之后,我们需要配置苹果App内购项目 一、App 内购买项目配置流程 官方文档:https://help.apple.com/app-store-connect/lang=zh-cn#/devb57be10e7 1、

c语言学习教程1之预定义代码

c语言教程1之预定义代码 大家好,我是爱学编程的小圆子。 上一篇我觉得稀里扒拉的,根本没讲到重点,所以我又来详细讲一次啦。 前言 一些新手看到一些大佬的代码,里面可能第一句就是 #include.... ,很多新手看不懂是什么,可能还有一些 #define #ifdef #if #

Java 基础(方法参数的值传递机制)

方法参数的值传递机制 方法,必须由其所在类或对象调用才有意义。若方法含有参数: 形参:方法声明时的参数 实参:方法调用时实际传给形参的参数值 Java 里方法的参数传递方式只有一种:值传递。即将实际参数值的副本(复制品)传入方法内,而实参本身不受影响

java之 FilterListener

0x01、Filter 什么是filter ?Filter:一个实现了特殊接口(Filter)的Java类. 实现对请求资源(jsp,servlet,html,)的过滤的功能. ?过滤器是一个运行在服务器的程序, 优先于请求资源(Servlet或者jsp,html) 之前执行. 过滤器是javaweb技术中 最为实用 的技术之一.

Java并发包源码学习系列:阻塞队列BlockingQueue及实现原理分析

目录 本篇要点 什么是阻塞队列 阻塞队列提供的方法 阻塞队列的七种实现 TransferQueue和BlockingQueue的区别 1、ArrayBlockingQueue 2、LinkedBlockingQueue 3、PriorityBlockingQueue 4、DelayQueue 5、SynchronousQueue 6、LinkedTransferQueue 7、LinkedB

linux多路转接select---服务器代码

一、linux多路转接select---服务器代码 1 #includestdio.h 2 #includestdlib.h 3 #includeunistd.h 4 #includestring.h 5 #includesys/types.h 6 #includesys/socket.h 7 #includesys/time.h 8 #includearpa/inet.h 9 10 int main(int argc,const char* argv

JavaWeb三大框架基础架构——CRUD的基础功能搭建

@ 目录 介绍 注意 applicationContext.xml mybatis-config.xml web.xml 结束语 介绍 项目前端采用了bootstrap,后端是ssm三大框架 注意 这是项目的基础架构 要注意的几个配置:applicationContext.xml,mybatis.xml,web.xml,pom.xml 其中的pojo代码使用了l

Maven命令下载源码和javadocs

1:Maven命令下载源码和javadocs 当在IDE中使用Maven时如果想要看引用的jar包中类的源码和javadoc需要通过maven命令下载这些源码,然后再进行引入,通过mvn命令能够容易的达到这个目的: mvn dependency:sourcesmvn dependency:resolve -Dclassifier=javadoc