加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 湛江站长网 (https://www.0759zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

只用120行Java代码写一个自己的区块链

发布时间:2019-06-06 09:12:52 所属栏目:建站 来源:浮云-Mignet
导读:副标题#e# 区块链是目前最热门的话题,广大读者都听说过比特币,或许还有智能合约,相信大家都非常想了解这一切是如何工作的。这篇文章就是帮助你使用 Java 语言来实现一个简单的区块链,用不到 120 行代码来揭示区块链的原理! 用不到120行 Java 代码就能

还记得前面我们写的 generateBlock 这个函数吗?它接受一个“前一个块”参数,和一个 VAC 值。POST handler 接受请求后就能获得请求体中的 VAC 值,接着借助生成块的函数以及校验块的函数就能生成一个新的块了!

除此之外,你也可以:

1、使用new GsonBuilder().setPrettyPrinting().create()这个函数可以以非常美观和方便阅读的方式将数据json化打印在控制台里,方便调试。

2、测试 POST 请求时,可以使用 POSTMAN 这个 chrome 插件,相比 curl它更直观和方便。也可以使用RESTClient这个FireFox插件。

快要大功告成了

接下来,我们把这些关于区块链的函数,web 服务的函数“组装”起来:最重要的是,我们需要产生第一个块(创世块),来作为区块链的头。

  1. //创世块  
  2.        Block genesisBlock = new Block();  
  3.        genesisBlock.setIndex(0);  
  4.        genesisBlock.setTimestamp(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));  
  5.        genesisBlock.setVac(0);  
  6.        genesisBlock.setPrevHash("");  
  7.        genesisBlock.setHash(calculateHash(genesisBlock));  
  8.        blockChain.add(genesisBlock); 

这里的 genesisBlock (创世块)是 main 函数中最重要的部分,通过它来初始化区块链,毕竟要有一个开始,第一个块的 PrevHash 是空的。

哦耶!完成了

让我们来启动它:

在终端中,我们可以看到 web 服务器启动的日志信息,并且打印出了创世块的信息:

  1. [INFO ] 2018-02-08 10:58:26 SparkWeb@(SparkWeb.java:132):[  
  2. {  
  3. "index": 0,  
  4. "timestamp": "2018-02-08 10:58:25",  
  5. "vac": 0,  
  6. "hash": "7c2d2db62a82ac8aa3d843ff837c604d8bd17800f4c466d472c5df185b8967fa",  
  7. "prevHash": ""  
  8. }  
  9. ]  
  10. [INFO ] 2018-02-08 10:58:26 Log@(Log.java:192):Logging initialized @1267ms to org.eclipse.jetty.util.log.Slf4jLog  
  11. [INFO ] 2018-02-08 10:58:26 EmbeddedJettyServer@(EmbeddedJettyServer.java:127):== Spark has ignited ...  
  12. [INFO ] 2018-02-08 10:58:26 EmbeddedJettyServer@(EmbeddedJettyServer.java:128):>> Listening on 0.0.0.0:4567  
  13. [INFO ] 2018-02-08 10:58:26 Server@(Server.java:372):jetty-9.4.4.v20170414  
  14. [INFO ] 2018-02-08 10:58:26 DefaultSessionIdManager@(DefaultSessionIdManager.java:364):DefaultSessionIdManager workerName=node0  
  15. [INFO ] 2018-02-08 10:58:26 DefaultSessionIdManager@(DefaultSessionIdManager.java:369):No SessionScavenger set, using defaults  
  16. [INFO ] 2018-02-08 10:58:26 HouseKeeper@(HouseKeeper.java:149):Scavenging every 600000ms 
  17.  [INFO ] 2018-02-08 10:58:27 AbstractConnector@(AbstractConnector.java:280):Started ServerConnector@4c7573c5{HTTP/1.1,[http/1.1]}{0.0.0.0:4567}  
  18. [INFO ] 2018-02-08 10:58:27 Server@(Server.java:444):Started @1669ms 

(编辑:PHP编程网 - 湛江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!