2019-06-20 14:35:56 3357浏览
区块链是目前最热门的话题,广大读者都听说过比特币,或许还有智能合约,相信大家都非常想了解这一切是如何工作的。这篇文章就是帮助你使用Java语言来实现一个简单的区块链,下面千锋扣丁学堂区块链培训用不到120行代码来揭示区块链的原理!
<!-- 超小型web框架 --> <dependency> <groupId>com.sparkjava</groupId> <artifactId>spark-core</artifactId> <version>${spark.version}</version> </dependency>
<dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>${commons.codec.version}</version> </dependency>
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.2</version> </dependency>
<!-- log start --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4j.version}</version> </dependency> <!-- log end -->
<properties> <commons.codec.version>1.9</commons.codec.version> <spark.version>2.6.0</spark.version> <slf4j.version>1.6.6</slf4j.version> <log4j.version>1.2.17</log4j.version> <gson.version>2.8.2</gson.version> </properties>
public class Block { /**是这个块在整个链中的位置*/ private int index; /**显而易见就是块生成时的时间戳*/ private String timestamp; /**虚拟资产。我们要记录的数据*/ private int vac; /**是这个块通过 SHA256 算法生成的散列值*/ private String hash; /**指向前一个块的 SHA256 散列值*/ private String prevHash; /** getters and setters**/ }
ArrayList<Block> blockChain
public static String calculateHash(Block block) { String record = (block.getIndex()) + block.getTimestamp() + (block.getVac()) + block.getPrevHash(); return SHA256.crypt(record); }
public static Block generateBlock(Block oldBlock, int vac) { Block newnewBlock = new Block(); newBlock.setIndex(oldBlock.getIndex() + 1); newBlock.setTimestamp(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); newBlock.setVac(vac); newBlock.setPrevHash(oldBlock.getHash()); newBlock.setHash(calculateHash(newBlock)); return newBlock; }
public static boolean isBlockValid(Block newBlock, Block oldBlock) { if (oldBlock.getIndex() + 1 != newBlock.getIndex()) { return false; } if (!oldBlock.getHash().equals(newBlock.getPrevHash())) { return false; } if (!calculateHash(newBlock).equals(newBlock.getHash())) { return false; } return true; }
public void replaceChain(ArrayList<Block> newBlocks) { if (newBlocks.size() > blockChain.size()) { blockChain = newBlocks; } }
public static void main(String[] args) { // port(5678); //默认端口是4567,你可以设置别的端口 }
get("/", (q, a) ->{return gson.toJson(blockChain)});
public class Message { private int vac; //getters and setters }
post("/", (q, a) -> { String body = request.body(); Message m = gson.fromJson(body, Message.class); if (m == null) { return "vac is NULL"; } int vac = m.getVac(); Block lastBlock = blockChain.get(blockChain.size() - 1); Block newBlock = generateBlock(lastBlock, vac); if (isBlockValid(newBlock, lastBlock)) { blockChain.add(newBlock); LOGGER.debug(gson.toJson(blockChain)); } else { return "HTTP 500: Invalid Block Error"; } return "success!"; });
//创世块 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);
[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
{ "index": 0, "timestamp": "2018-02-08 10:58:25", "vac": 0, "hash": "7c2d2db62a82ac8aa3d843ff837c604d8bd17800f4c466d472c5df185b8967fa", "prevHash": "" }
【关注微信公众号获取更多学习资料】 【扫码进入HTML5前端开发VIP免费公开课】