2019-06-20 14:35:56 3393浏览
区块链是目前最热门的话题,广大读者都听说过比特币,或许还有智能合约,相信大家都非常想了解这一切是如何工作的。这篇文章就是帮助你使用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免费公开课】