# 使用Java创造你的第一个区块链
Original address (English ver): https://medium.com/programmers-blockchain/create-simple-blockchain-java-tutorial-from-scratch-6eeed3cb03fa
*该repo用于学习与记录,主要为区块链相关博文翻译以及相应实践。想获取更多信息请点击以上原文链接。*
本教程系列的目的是帮助你了解开发区块链相关的技术。<br/>
在本教程中,我们将获得以下的体验:
创建一个非常基本的区块链。
实现简单的工作量证明系统,也就是常说的挖矿。
为各种可能性感到惊叹!~
(本教程适用于已基本掌握面向对象编程知识的朋友)
需要注意的是,这将不会是一个功能完备适合生成的区块链产品。而是一种概念性的实现,从而帮助你理解未来教程中
的区块链。
这是《区块链开发巨型指南》的一部分。
## 配置
我们将使用Java,但是你可以使用任何面向对象的语言。我将使用Eclipse,但其实其他任何新潮的文本编辑器你都可以使用,尽管你会错过很多好的体验。
你将需要准备好以下几项:
+ JDK
+ Eclipse或者其他IDE/文本编辑器
![别担心,如果你的eclipse看起来和我的不太一样。那我会使用一个暗色的主题(逃](./img/1_3rE0ahnLzfQ7JHyxNJAH7Q.gif)
你可以考虑添加Google的gson依赖,通过它可以将一个对象转为Json。这是一个超级好用的库,所以我们之后也会用这个去做一些P2P的东西。不过你要用其他方式的话也请便。
在Eclipse里,创建一个(file > new >)Java项目。我将会给我的项目命名"noobchain"然后也用这个名字去创建一个类(NoobChain)。
![名字可以考虑不照抄嗷( ͠° ͟ ͜ʖ ͡°)](./img/1_VPKiJWgOiZszGvLgPNiqLA.png "名字可以考虑不照抄嗷( ͠° ͟ ͜ʖ ͡°)")
## 现在可以大展拳脚了
制作区块链
区块链只是一个包含块的链或者列表结构。 区块链中的每个区块将拥有自己的数字指纹,包含前一个区块的数字指纹,并具有一些数据(比如可以用于交易的数据)。
![非常希望中本聪不会看到这个_(:з」∠)_](./img/1_627BG-7qMtaXNsX0n41C6Q.png "非常希望中本聪不会看到这个_(:з」∠)_")
## 哈希=数字指纹 (Hash = Digital Fingerprint)
每个区块不仅包含之前的哈希,他自己的一部分哈希也是从之前的哈希计算出来的。这样一来如果前面的哈希产生变化,进而会影响之后所有区块的哈希值(因为他有一部分哈希是基于之前的哈希值)。通过计算和比较哈希值,我们可以查看区块链是否无效。
这是什么意思呢?简单说就是更改了列表中的任何数据都将更改前面然后**中断这个链**。
## 所以我们先来创建一个用于组成区块链的区块类
import java.util.Date;
public class Block {
public String hash;
public String previousHash;
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(String data,String previousHash ) {
this.data = data;
this.previousHash = previousHash;
this.timeStamp = new Date().getTime();
}
}
如你所见,我们这个基础的Block类中包含一个名为hash的String变量,它保存我们的数字签名。previousHash则保存之前区块的哈希,然后data这个String变量则保存该区块的数据。
## 接下来我们将需要一个生成数字签名的方式
其实有很多加密算法你可以使用,但是SHA256对这个例子来说再合适不过。我们直接引用MessageDigest(import java.security.MessageDigest;)从而可以调用SHA256这个算法。
我们接下来需要使用SHA256,因此我们需要在新的StringUtil类中创建一个helper方法(applySha256)。
import java.security.MessageDigest;
public class StringUtil {
//Applies Sha256 to a string and returns the result.
public static String applySha256(String input){
try {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
//Applies sha256 to our input,
byte[] hash = digest.digest(input.getBytes("UTF-8"));
StringBuffer hexString = new StringBuffer(); // This will contain hash as hexidecimal
for (int i = 0; i < hash.length; i++) {
String hex = Integer.toHexString(0xff & hash[i]);
if(hex.length() == 1) hexString.append('0');
hexString.append(hex);
}
return hexString.toString();
}
catch(Exception e) {
throw new RuntimeException(e);
}
}
}
如果你不是很理解这个helper方法中的内容,不用过于担心,所有你需要明白的只是这个会接收一个字符串变量然后对其应用SHA256算法。最后返回由这个字符串生成的字符串签名。
现在让我们在Block类的新方法中使用applySha256 helper方法来计算哈希值。我们必须从那些不希望被修改的块中计算哈希值。所以我们的块中需要包含previousHash、data和timeStamp这些变量。
public String calculateHash() {
String calculatedhash = StringUtil.applySha256(
previousHash +
Long.toString(timeStamp) +
data
);
return calculatedhash;
}
然后把这个方法加到Block的构造器里…
## 测试时间到…
在NoobChain主类中,让我们创建一些块并将哈希值打印到屏幕上,以查看一切是否都在正常工作。
![试一试嗷](./img/1_I6k_gZJ0KRZYR4KU22Okig.gif "试一试嗷")
第一个块称为创世块,由于没有先前的块,我们只需输入“ 0”作为先前的哈希即可。
public class NoobChain {
public static void main(String[] args) {
Block genesisBlock = new Block("Hi im the first block", "0");
System.out.println("Hash for block 1 : " + genesisBlock.hash);
Block secondBlock = new Block("Yo im the second block",genesisBlock.hash);
System.out.println("Hash for block 2 : " + secondBlock.hash);
Block thirdBlock = new Block("Hey im the third block",secondBlock.hash);
System.out.println("Hash for block 3 : " + thirdBlock.hash);
}
}
输出的结果应该很像下图:
![也不会完全一样,毕竟时间戳是不一样的](./img/0_uRnxW_CqB6FqWiUd.png)
现在所有的区块都有基于自身信息以及之前区块签名的数字签名了。
当前他还不是一个很大的区块链,所以让我们将这些区块都存到ArrayList里然后导入Gson依赖以Json形式来查看他。
import java.util.ArrayList;
import com.google.gson.GsonBuilder;
public class NoobChain {
public static ArrayList<Block> blockchain = new ArrayList<Block>();
public static void main(String[] args) {
//add our blocks to the blockchain ArrayList:
blockchain.add(new Block("Hi im the first block", "0"));
blockchain.add(new Block("Yo im the second block",blockchain.get(blockchain.size()-1).hash));
blockchain.add(new Block("Hey im the third block",blockchain.get(blockchain.size()-1).hash));
String blockchainJson = new GsonBuilder().setPrettyPrinting().create().toJson(blockchain);
System.out.println(blockchainJson);
}
}
现在我们的输出应该看起来和我们期望的区块链很接近了。
## 现在我们需要一种检查区块链完整性的方法
我们来创建一个isChainValid()返回值是Boolean类型的方法,它将遍历链中所有区块并比较他们的哈希值。这个方法将确认Hash变量实际上等于计算出的哈希,并且之前区块的哈希等于previousHash变量。
public static Boolean isChainValid() {
Block currentBlock;
Block previousBlock;
//loop through blockchain to check hashes:
for(int i=1; i < blockchain.size(
没有合适的资源?快使用搜索试试~ 我知道了~
基于Java实现具备基本功能的区块链系统源码+详细文档+全部资料(毕业设计).zip
共17个文件
gif:5个
java:4个
png:4个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 140 浏览量
2024-04-15
17:26:50
上传
评论
收藏 10.03MB ZIP 举报
温馨提示
【资源说明】 基于Java实现具备基本功能的区块链系统。源码+全部资料(毕业设计).zip基于Java实现具备基本功能的区块链系统。源码+全部资料(毕业设计).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如软件工程、计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也可作为毕设项目、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 3、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
资源推荐
资源详情
资源评论
收起资源包目录
基于Java实现具备基本功能的区块链系统。源码+全部资料(毕业设计).zip (17个子文件)
simple-blockchain-master
pom.xml 850B
src
test
java
top
lazyyy
tether
TestTether.java 4KB
main
java
top
lazyyy
tether
Block.java 1KB
Tether.java 1KB
StringUtil.java 841B
readme.md 14KB
用Java创建你的第一个区块链.md 14KB
img
1_qzjPDdgOESJSwDSP0peEEg.png 21KB
1_3rE0ahnLzfQ7JHyxNJAH7Q.gif 1.9MB
1_I6k_gZJ0KRZYR4KU22Okig.gif 307KB
1_627BG-7qMtaXNsX0n41C6Q.png 125KB
0_uRnxW_CqB6FqWiUd.png 14KB
1_ZbFDb_ml08yDSRXyzhFGxA.gif 4.3MB
1_VPKiJWgOiZszGvLgPNiqLA.png 16KB
1_9K4pVMSdI7A0YZH-g47I2w.gif 981KB
1_R_bfhtxuHqM6aJYCZiQA9g.gif 2.46MB
171265889347208773632.zip 416B
共 17 条
- 1
资源评论
不走小道
- 粉丝: 3237
- 资源: 5112
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 数据库管理工具:dbeaver-ce-23.3.1-stable.x86-64.rpm
- AndroidOCR源码.zip
- 数据库管理工具:dbeaver-ce-23.3.0-x86-64-setup.exe
- 数据库管理工具:dbeaver-ce-23.3.0-stable.x86-64.rpm
- 数据库管理工具:dbeaver-ce-23.3.0-macos-x86-64.dmg
- 数据库管理工具:dbeaver-ce-23.3.0-macos-aarch64.dmg
- 数据库管理工具:dbeaver-ce-23.2.5-stable.x86-64.rpm
- 数据库管理工具:dbeaver-ce-23.2.5-macos-x86-64.dmg
- C语言面试应用详解教程
- 数据库管理工具:dbeaver-ce-23.2.5-macos-aarch64.dmg
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功