还记得前面我们写的 generateBlock 这个函数吗?它接受一个“前一个块”参数,和一个 VAC 值。POST handler 接受请求后就能获得请求体中的 VAC 值,接着借助生成块的函数以及校验块的函数就能生成一个新的块了!
除此之外,你也可以:
1、使用new GsonBuilder().setPrettyPrinting().create()这个函数可以以非常美观和方便阅读的方式将数据json化打印在控制台里,方便调试。
2、测试 POST 请求时,可以使用 POSTMAN 这个 chrome 插件,相比 curl它更直观和方便。也可以使用RESTClient这个FireFox插件。
快要大功告成了
接下来,我们把这些关于区块链的函数,web 服务的函数“组装”起来:最重要的是,我们需要产生第一个块(创世块),来作为区块链的头。
- //创世块
- Block genesisBlock = new Block();
- genesisBlock.setIndex(0);
- genesisBlock.setTimestamp(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
- genesisBlock.setVac(0);
- genesisBlock.setPrevHash("");
- genesisBlock.setHash(calculateHash(genesisBlock));
- blockChain.add(genesisBlock);
这里的 genesisBlock (创世块)是 main 函数中最重要的部分,通过它来初始化区块链,毕竟要有一个开始,第一个块的 PrevHash 是空的。
哦耶!完成了
让我们来启动它:
在终端中,我们可以看到 web 服务器启动的日志信息,并且打印出了创世块的信息:
- [INFO ] 2018-02-08 10:58:26 SparkWeb@(SparkWeb.java:132):[
- {
- "index": 0,
- "timestamp": "2018-02-08 10:58:25",
- "vac": 0,
- "hash": "7c2d2db62a82ac8aa3d843ff837c604d8bd17800f4c466d472c5df185b8967fa",
- "prevHash": ""
- }
- ]
- [INFO ] 2018-02-08 10:58:26 Log@(Log.java:192):Logging initialized @1267ms to org.eclipse.jetty.util.log.Slf4jLog
- [INFO ] 2018-02-08 10:58:26 EmbeddedJettyServer@(EmbeddedJettyServer.java:127):== Spark has ignited ...
- [INFO ] 2018-02-08 10:58:26 EmbeddedJettyServer@(EmbeddedJettyServer.java:128):>> Listening on 0.0.0.0:4567
- [INFO ] 2018-02-08 10:58:26 Server@(Server.java:372):jetty-9.4.4.v20170414
- [INFO ] 2018-02-08 10:58:26 DefaultSessionIdManager@(DefaultSessionIdManager.java:364):DefaultSessionIdManager workerName=node0
- [INFO ] 2018-02-08 10:58:26 DefaultSessionIdManager@(DefaultSessionIdManager.java:369):No SessionScavenger set, using defaults
- [INFO ] 2018-02-08 10:58:26 HouseKeeper@(HouseKeeper.java:149):Scavenging every 600000ms
- [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}
- [INFO ] 2018-02-08 10:58:27 Server@(Server.java:444):Started @1669ms
(编辑:ASP站长网)
|