美文网首页
三分钟搭建一个简易的区块链原型

三分钟搭建一个简易的区块链原型

作者: 空白少侠 | 来源:发表于2017-10-29 16:58 被阅读107次

    区块链是一种去中心化、不可篡改的分布式账本。

    了解区块链的构成以及基本的原理对于初学者非常重要。本文将使用Java语言搭建最简单的区块链原型。

    区块

    建立Block类�,具有以下属性:

        private String mTimestamp;
        private String mPrevBlockHash;
        private String mHash;
        private String mData;
    
    
    • mTimestamp 时间戳,表示当前区块创建时的时间
    • mPrevBlockHash前一块�区块的hash
    • mData 当前区块所保存的信息
    • mHash 当前区块的�hash(当前区块��所有信息拼接后产生的hash)

    在初始化区块时需要前一块区块�preHash和当前区块的data

     public Block(String data, String prehash) {
            this.mData = data;
            this.mPrevBlockHash = prehash;
            this.setHash();
        }
    
       private void setHash() {
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
            mTimestamp = df.format(new Date());
            String headers = mTimestamp + mPrevBlockHash + mData;
            mHash = block.SHA(headers, "SHA-256");
    
        }
    
    

    Hash

    在Java中如何�计算SHA-256值呢?

    public static String SHA(final String strText, final String strType) {
            // 返回值
            String strResult = null;
            // 是否是有效字符串
            if (strText != null && strText.length() > 0) {
                try {
                    // SHA 加密开始
                    // 创建加密对象 并傳入加密類型
                    MessageDigest messageDigest = MessageDigest.getInstance(strType);
                    // 传入要加密的字符串
                    messageDigest.update(strText.getBytes());
                    // 得到 byte 類型结果
                    byte byteBuffer[] = messageDigest.digest();
    
                    // 將 byte 轉換爲 string
                    StringBuffer strHexString = new StringBuffer();
                    // 遍歷 byte buffer
                    for (int i = 0; i < byteBuffer.length; i++) {
                        String hex = Integer.toHexString(0xff & byteBuffer[i]);
                        if (hex.length() == 1) {
                            strHexString.append('0');
                        }
                        strHexString.append(hex);
                    }
                    // 得到返回結果
                    strResult = strHexString.toString();
                } catch (NoSuchAlgorithmException e) {
                    e.printStackTrace();
                }
            }
            return strResult;
        }
    
    

    我们使用以及写好的方法具体的原理就请大家自行搜索学习了。

    区块链

    区块链是由区块与区块‘连接’而成的,如何将区块连接起来呢?

    建立一个Blockchain类
    我们需要一个专门存放若干区块的载体List

        public  static List<Block> blockChain;
    
    

    添加一个新的区块

      public static void addBlock(String data) {
            Block preBlock = blockChain.get(blockChain.size() - 1);
            Block newBlock = new Block(data, preBlock.getmHash());
            blockChain.add(newBlock);
        }
    

    将前一区块的hash取出,创建新的区块并加入到List中

    创建创世块

    private block newGenesisBlock() {
            return new block("Genesis", "0");
        }
    

    创建区块链

     public void newBlockchain() {
            blockChain = new ArrayList<block>();
            blockChain.add(this.newGenesisBlock());
        }
    
    

    编写测试类

    public class Main {
        public static void main(String[] args) {
            BlockChain.newBlockchain();
            BlockChain.addBlock("tom");
            BlockChain.addBlock("jack");
            BlockChain.addBlock("jerry");
    
    
            for (int i = 0; i < BlockChain.blockChain.size(); i++) {
                Block b = BlockChain.blockChain.get(i);
                System.out.println("|-----------------------------------|");
                System.out.println("区块编号:" + i);
                System.out.println("时间:" + b.getmTimestamp());
                System.out.println("数据:" + b.getmData());
                System.out.println("父Hash:" + b.getmPrevBlockHash());
                System.out.println("Hash:" + b.getmHash());
    
            }
            System.out.print("|-----------------------------------|");
    
    
        }
    }
    
    
    
    

    运行结果:

    |-----------------------------------|
    区块编号:0
    时间:2017-10-25 23:26:55
    数据:Genesis
    父Hash:0
    Hash:7a708fe6c9c1038b313a83cc2deeea40f270ea7e6fb2ff0dfd981ef6f2e8ff2a
    |-----------------------------------|
    区块编号:1
    时间:2017-10-25 23:26:55
    数据:tom
    父Hash:7a708fe6c9c1038b313a83cc2deeea40f270ea7e6fb2ff0dfd981ef6f2e8ff2a
    Hash:481abd2e8797fbe4ef0eaf02aaf4952d4d68366cab9204a60c6f635c61b88ce6
    |-----------------------------------|
    区块编号:2
    时间:2017-10-25 23:26:55
    数据:jack
    父Hash:481abd2e8797fbe4ef0eaf02aaf4952d4d68366cab9204a60c6f635c61b88ce6
    Hash:bab85541ab30bec07c765b23d55c69522b09b9d3ab1aed0a7ebbee258f123a61
    |-----------------------------------|
    区块编号:3
    时间:2017-10-25 23:26:55
    数据:jerry
    父Hash:bab85541ab30bec07c765b23d55c69522b09b9d3ab1aed0a7ebbee258f123a61
    Hash:4dc6075449d753c3101e8d08aaee731cf9bea48d7c2fa24195ebb58ad4a988d7
    |-----------------------------------|
    
    

    不到三分钟一个最简单的区块链原型就搭建好了。

    相关文章

      网友评论

          本文标题: 三分钟搭建一个简易的区块链原型

          本文链接:https://www.haomeiwen.com/subject/gtbypxtx.html