区块链的原理与应用? -2
接着上一篇.
上一篇还没有输出,其实加入了index在实体类中.
package com.sha256.sha256.bean;
import com.sha256.sha256.utils.SHA256Util;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Block {
private long index;
private String hash; // our signature
private String previousHash; // the hash of previous block
private String data; //our data will be a simple message.
private long timeStamp; //as number of milliseconds since 1/1/1970.
//Block Constructor
public Block(long index,String data,String previousHash){
this.index = index;
this.data = data;
this.previousHash = previousHash;
this.timeStamp = new Date().getTime();
this.hash = SHA256Util.calculateHash(this); //Making sure we do this after we set the other values.
}
}
测试类:
package com.sha256.sha256.test;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.GsonBuilder;
import com.sha256.sha256.bean.Block;
import com.sha256.sha256.utils.SHA256Util;
import java.util.ArrayList;
import java.util.Random;
public class TestSHA256 {
//声明一个区块链,用于添加Block实体
public static ArrayList<Block> blockChain = new ArrayList<>();
public static void main(String[] args) {
//test1 测试三个被加密字符串 加密后的hash值的差别
/**
* 虽然第三条信息仅仅多一个".",但加密后的数据hash相差极大
*/
// String message0 = "我是要被加密的信息";
// String message1 = "我是要被加密的信息";
// String message2 = "我是要被加密的信息.";
// String encryptionMessage0 = SHA256Util.applySha256(message0);
// String encryptionMessage1 = SHA256Util.applySha256(message1);
// String encryptionMessage2 = SHA256Util.applySha256(message2);
// System.out.println(encryptionMessage0);
// System.out.println(encryptionMessage1);
// System.out.println(encryptionMessage2);
//
// //test2 创建区块链逻辑, 因为第一个块没有上一个块的hash头部值,所以输入0 作为前一个块的previous hash
// /**
// * 由于在{@link SHA256Util#calculateHash(Block)}
// * 中对同时产生的new Date().getTime() (timestamp)
// * 也加入进行了hash加密,所以固有的message (data)及
// * previoushash之和进行了加密.
// */
// Block genesisBlock = new Block(0,"这是第一个区块中的要被加密的信息和交易信息","0");
// String hash1 = genesisBlock.getHash();
// System.out.println("Hash for block 1 : "+hash1);
//
// Block secondBlock = new Block(1,"这是第二个区块,以及其中信息!!!它的前区块头部hash我们拿上一个的来使用",hash1);
// String hash2 = secondBlock.getHash(); //
// System.out.println("Hash for block 2 : "+hash2);
//
// Block thirdBlock = new Block(2,"这是第三个区块,它的hash应该已经被前两个的信息纳入进来了,它的hash如果对不上,那么说明前面的信息被改动过了",hash2);
// String hash3 = thirdBlock.getHash();
// System.out.println("Hash for block 3 : "+hash3);
//
//// test3 add our blocks to the blockchain ArrayList :
// blockChain.add(new Block(0,"区块链上第一小节","0"));
// blockChain.add(new Block(1,"区块链第二小节",blockChain.get(blockChain.size()-1).getHash()));
// blockChain.add(new Block(2,"区块链第三小节",blockChain.get(blockChain.size()-1).getHash()));
int chainNumber = 24;
int index = 0;
while (chainNumber > 0) {
System.out.println("blockChain.size():" + blockChain.size());
if (blockChain.size() == 0) {
blockChain.add(new Block(0, "创世块", "0"));
}
index++;
blockChain.add(new Block(index, "区块内容" + blockChainMessage(index), blockChain.get(blockChain.size() - 1).getHash()));
chainNumber--;
}
// JSONArray blockChainJson1 = (JSONArray)JSONArray.toJSON(blockChain); //JSONArray是不排版的
// System.out.println(blockChainJson1);
String blockChainJson = new GsonBuilder().setPrettyPrinting().create().toJson(blockChain);
System.out.println(blockChainJson);
}
//模拟一些交易信息
private static String blockChainMessage(int getNumber) {
Random random = new Random(getNumber);
long l = random.nextLong();
System.out.println("blockChainMessage:" + l);
return String.valueOf(l);
}
}
关注公众号
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
区块链的原理与应用? -1
读完了 <区块链 领导干部读本> , 以及看了一部分<区块链原理,设计与应用>, 通过对区块链的一些了解跟随网络博客完成demo 创建区块链 区块链就是一串或者是一系列区块的集合,类似于链表的概念,每个区块都指向于后面一个区块,然后顺序的连接在一起. 那么每个区块中内容是? 区块链中的每一个区块都存放了很多有价值的信息, 只要包括3个部分 : 自己的数字签名, 上一个区块的数字签名, 还有一切需要加密的数据 ( 这些数据在比特币中就相当于是交易的信息,它是加密货币的本质). 每个数字签名不但证明了自己是特有的一个区块, 而且指向了前一个区块的来源,让所有的区块在链条中可以串起来,而数据就是一些特定的信息, 你可以按照业务逻辑来保存业务数据. block 这里的hash指的就是数字签名 所以每一个区块不仅包含前一个区块的hash值, 同时包含自身的一个hash值, 自身的hash值是通过之前的hash值和数据data通过hash计算出来的. 如果前一个区块的数据一旦被篡改了, 那么前一个区块的hash值也会同样发生变化 (因为数据也被计算在内) ,这样也就导致了所...
-
下一篇
求你了,再问你Java内存模型的时候别再给我讲堆栈方法区了…
GitHub 4.1k Star 的Java工程师成神之路 ,不来了解一下吗? GitHub 4.1k Star 的Java工程师成神之路 ,真的不来了解一下吗? GitHub 4.1k Star 的Java工程师成神之路 ,真的确定不来了解一下吗? 最近,面试过很多Java中高级开发,问过很多次关于Java内存模型的知识,问完之后,很多人上来就开始回答: Java内存模型由几部分组成,堆、本地方法栈、虚拟机栈、方法区... 每一次我不想打断他们的话,虽然我知道这又是一个误会了我的问题的朋友。 其实,我想问的Java内存模型,是和并发编程有关的。而候选人给我回答的那叫JVM内存结构,完全是两回事。 很多时候,在我没有打断他们的情况下,一部分人慢慢的讲到了GC相关的知识。这种情况下,我只能硬着头皮继续问一些和JVM有关的知识。 但是,我的本意其实是
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2全家桶,快速入门学习开发网站教程
- MySQL数据库在高并发下的优化方案
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Hadoop3单机部署,实现最简伪集群
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8编译安装MySQL8.0.19
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16

微信收款码
支付宝收款码