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

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

发布时间:2019-06-07 01:35:36 所属栏目:建站 来源:浮云-Mignet
导读:区块链是今朝最热点的话题,宽大读者都传闻过比特币,或者尚有智能合约,信托各人都很是想相识这统统是怎样事变的。这篇文章就是辅佐你行使 Java 说话来实现一个简朴的区块链,用不到 120 行代码来显现区块链的道理! 用不到120行 Java 代码就能实现一个自

搞定了块的天生,接下来我们必要有函数帮我们判定一个块是否有被改动。搜查 Index 来看这个块是否正确得递增,搜查 PrevHash 与前一个块的 Hash 是否同等,再来通过 calculateHash 搜查当前块的 Hash 值是否正确。通过这几步我们就能写出一个校验函数:

  1. public static boolean isBlockValid(Block newBlock, Block oldBlock) {  
  2.        if (oldBlock.getIndex() + 1 != newBlock.getIndex()) {  
  3.            return false;  
  4.        }  
  5.        if (!oldBlock.getHash().equals(newBlock.getPrevHash())) {  
  6.            return false;  
  7.        }  
  8.        if (!calculateHash(newBlock).equals(newBlock.getHash())) {  
  9.            return false;  
  10.        }  
  11.        return true;  
  12.     } 

除了校验块以外,我们还会碰着一个题目:两个节点都天生块并添加到各自的链上,那我们应该以谁为准?这里的细节我们留到下一篇文章,这里先让我们记着一个原则:始终选择最长的链。

[block 1] -> [block 2] -> [block 3] -> [block 4] -> [block 5] -> 承认

[block 1] -> [block 2] -> [block 3] -> [block 4] ->  扬弃

凡是来说,更长的链暗示它的数据(状态)是越发新的,以是我们必要一个函数能帮我们将当地的逾期的镣迫椿成最新的链:

  1. public void replaceChain(ArrayList<Block> newBlocks) {  
  2.        if (newBlocks.size() > blockChain.size()) {  
  3.            blockChain = newBlocks;  
  4.        }  
  5.     } 

到这一步,我们根基就把全部重要的函数完成了。接下来,我们必要一个利便直观的方法来查察我们的链,包罗数据及状态。通过赏识器查察 web 页面大噶?鲱吻合的方法。

Web 处事

我猜你必然对传统的 web 处事及开拓很是认识,以是这部门你必定一看就会。

借助 Spark Web Framework,来完成我们的 web 处事,代码如下:

  1. public static void main(String[] args) {  
  2.        // port(5678); //默认端口是4567,你可以配置此外端口   

OK,完成,对,你没看错,就是一个空的main要领,就可以了。

接下来我们界说差异 endpoint 以及对应的 handler。譬喻,对“/”的 GET 哀求我们可以查察整个链,对“/”的 POST 哀求可以建设一个新的块。

GET 哀求的 handler:

  1. get("/", (q, a) ->{return gson.toJson(blockChain)}); 

为了简化,我们直接以 JSON 名目返回整个链,你可以在赏识器中会见 localhost:4567 可能 127.0.0.1:4567 来查察

POST 哀求的 handler 轻微有些伟大,我们先来界说一下 POST 哀求的 payload:

  1. public class Message {  
  2.     private int vac;  
  3. //getters and setters  

再看看 handler 的实现:

  1. post("/", (q, a) -> {  
  2. String body = request.body();  
  3.               Message m = gson.fromJson(body, Message.class);  
  4.               if (m == null) {  
  5.                   return "vac is NULL";  
  6.               }  
  7.               int vac = m.getVac();  
  8.               Block lastBlock = blockChain.get(blockChain.size() - 1);  
  9.               Block newBlock = generateBlock(lastBlock, vac);  
  10.               if (isBlockValid(newBlock, lastBlock)) {  
  11.                   blockChain.add(newBlock);  
  12.                   LOGGER.debug(gson.toJson(blockChain));  
  13.               } else {  
  14.                   return "HTTP 500: Invalid Block Error";  
  15.               }  
  16.               return "success!";  
  17. }); 

我们的 POST 哀求体中可以行使上面界说的 payload,好比:

{"vac":7500}

(编辑:湖南网)

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

热点阅读