成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

基于Java語言構(gòu)建區(qū)塊鏈(一)—— 基本原型

PiscesYE / 796人閱讀

摘要:本文將基于語言構(gòu)建簡化版的,來實(shí)現(xiàn)數(shù)字貨幣。值用于確保的安全。計(jì)算是計(jì)算敏感的操作,即使在高性能電腦也需要花費(fèi)一段時(shí)間來完成計(jì)算這也就是為什么人們購買高性能進(jìn)行比特幣挖礦的原因。資料源代碼精通比特幣第二版

最終內(nèi)容請以原文為準(zhǔn):https://wangwei.one/posts/df1...
引言

區(qū)塊鏈技術(shù)是一項(xiàng)比人工智能更具革命性的技術(shù),人工智能只是提高了人類的生產(chǎn)力,而區(qū)塊鏈則將改變?nèi)祟惿鐣?huì)的生產(chǎn)關(guān)系,它將會(huì)顛覆我們?nèi)祟惿鐣?huì)現(xiàn)有的協(xié)作方式。了解和掌握區(qū)塊鏈相關(guān)知識(shí)和技術(shù),是我們每位開發(fā)人員必須要去做的事情,這樣我們才能把握住這波時(shí)代趨勢的紅利。

本文將基于Java語言構(gòu)建簡化版的blockchain,來實(shí)現(xiàn)數(shù)字貨幣。

創(chuàng)建區(qū)塊

區(qū)塊鏈?zhǔn)怯砂灰仔畔⒌膮^(qū)塊從后向前有序鏈接起來的數(shù)據(jù)結(jié)構(gòu)。區(qū)塊被從后向前有序地鏈接在這個(gè)鏈條里,每個(gè)區(qū)塊都指向前一個(gè)區(qū)塊。以比特幣為例,每個(gè)區(qū)塊主要包含如下信息字段:


區(qū)塊大?。河米止?jié)表示的區(qū)塊數(shù)據(jù)大小

區(qū)塊頭:組成區(qū)塊頭的幾個(gè)字段

區(qū)塊頭hash值

父區(qū)塊頭hash值

時(shí)間戳:區(qū)塊產(chǎn)生的近似時(shí)間

Merkle根:該區(qū)塊中交易的merkle樹根的哈希值

難度目標(biāo):該區(qū)塊工作量證明算法的難度目標(biāo)

Nonce:用于工作量證明算法的計(jì)數(shù)器

交易計(jì)數(shù)器:交易的數(shù)量

交易:記錄在區(qū)塊里的交易信息

詳見:《精通比特幣》(第二版)第9章——區(qū)塊鏈
區(qū)塊數(shù)據(jù)結(jié)構(gòu)

在這里,我們主要是為了實(shí)現(xiàn)最簡單的區(qū)塊鏈結(jié)構(gòu),僅僅包含以下幾個(gè)信息字段:

/**
 * 區(qū)塊
 *
 * @author wangwei
 * @date 2018/02/02
 */
@Data
public class Block {

    /**
     * 區(qū)塊hash值
     */
    private String hash;
    /**
     * 前一個(gè)區(qū)塊的hash值
     */
    private String previousHash;
    /**
     * 區(qū)塊數(shù)據(jù)
     */
    private String data;
    /**
     * 區(qū)塊創(chuàng)建時(shí)間(單位:秒)
     */
    private long timeStamp;

    public Block() {
    }

    public Block(String hash, String previousHash, String data, long timeStamp) {
        this();
        this.hash = hash;
        this.previousHash = previousHash;
        this.data = data;
        this.timeStamp = timeStamp;
    }
}
區(qū)塊Hash值計(jì)算

加密Hash值,一個(gè)通過SHA256算法對區(qū)塊頭進(jìn)行二次哈希計(jì)算而得到的數(shù)字指紋。Hash值用于確保blockchain的安全。Hash計(jì)算是計(jì)算敏感的操作,即使在高性能電腦也需要花費(fèi)一段時(shí)間來完成計(jì)算(這也就是為什么人們購買高性能GPU進(jìn)行比特幣挖礦的原因)。blockchain架構(gòu)設(shè)計(jì)有意使Hash計(jì)算變得困難,這樣做是為了加大新增一個(gè)block的難度,進(jìn)而防止block在增加后被隨意修改。

/**
 * 

創(chuàng)建新區(qū)塊

* * @param previousHash * @param data * @return */ public static Block newBlock(String previousHash, String data) { Block block = new Block("", previousHash, data.getBytes(), Instant.now().getEpochSecond()); block.setHash(); return block; } /** * 計(jì)算區(qū)塊Hash *

* 注意:在準(zhǔn)備區(qū)塊數(shù)據(jù)時(shí),一定要從原始數(shù)據(jù)類型轉(zhuǎn)化為byte[],不能直接從字符串進(jìn)行轉(zhuǎn)換 * * @return */ private void setHash() { byte[] prevBlockHashBytes = {}; if (StringUtils.isNoneBlank(this.getPrevBlockHash())) { prevBlockHashBytes = new BigInteger(this.getPrevBlockHash(), 16).toByteArray(); } byte[] headers = ByteUtils.merge( prevBlockHashBytes, this.getData().getBytes(), ByteUtils.toBytes(this.getTimeStamp())); this.setHash(DigestUtils.sha256Hex(headers)); }

創(chuàng)建區(qū)塊鏈

區(qū)塊鏈本質(zhì)上是一種有序、反向鏈接鏈表的數(shù)據(jù)結(jié)構(gòu)。這意味著,block按照插入的順序存放,同時(shí)每個(gè)block都保存指向上一個(gè)block的鏈接。這種結(jié)構(gòu)保證可以快速獲取最新插入的block同時(shí)獲取它的hash值。這種結(jié)構(gòu)保證可以快速獲取最新插入的block同時(shí)(高效地)獲取它的hash值。

區(qū)塊鏈數(shù)據(jù)結(jié)構(gòu)
/**
 * 

區(qū)塊鏈

* * @author wangwei * @date 2018/02/02 */ public class Blockchain { @Getter private List blockList; public Blockchain(List blockList) { this.blockList = blockList; } }
添加區(qū)塊
新增一個(gè)添加區(qū)塊鏈的方法
/**
 * 

添加區(qū)塊

* * @param data 數(shù)據(jù) */ public void addBlock(String data) { Block previousBlock = blockList.get(blockList.size() - 1); this.addBlock(Block.newBlock(previousBlock.getHash(), data)); } /** *

添加區(qū)塊

* * @param block 區(qū)塊 */ public void addBlock(Block block) { this.blockList.add(block); }
創(chuàng)世區(qū)塊
在添加區(qū)塊之前,區(qū)塊鏈必須有個(gè)創(chuàng)世區(qū)塊,在Block中新增創(chuàng)世區(qū)塊方法:
/**
  * 

創(chuàng)建創(chuàng)世區(qū)塊

* * @return */ public static Block newGenesisBlock() { return Block.newBlock("", "Genesis Block"); }
創(chuàng)建區(qū)塊鏈
再在Blockchain中新增創(chuàng)建區(qū)塊鏈的方法:
/**
 * 

創(chuàng)建區(qū)塊鏈

* * @return */ public static Blockchain newBlockchain() { List blocks = new LinkedList<>(); blocks.add(Block.newGenesisBlock()); return new Blockchain(blocks); }
測試運(yùn)行
/**
 * 測試
 *
 * @author wangwei
 * @date 2018/02/05
 */
public class BlockchainTest {

    public static void main(String[] args) {

        Blockchain blockchain = Blockchain.newBlockchain();
        blockchain.addBlock("Send 1 BTC to Ivan");
        blockchain.addBlock("Send 2 more BTC to Ivan");

        for (Block block : blockchain.getBlockList()) {
            System.out.println("Prev. hash: " + block.getPreviousHash());
            System.out.println("Data: " + block.getData());
            System.out.println("Hash: " + block.getHash());
            System.out.println();
        }
    }
}

/**
 * 輸出如下信息:
 */
Prev. hash: 
Data: Genesis Block
Hash: 4492cb9d396a9a52e7ff17ef3782f022ddcdc7b2c276bc6dd3d448b0655eb3d4

Prev. hash: 4492cb9d396a9a52e7ff17ef3782f022ddcdc7b2c276bc6dd3d448b0655eb3d4
Data: Send 1 BTC to Ivan
Hash: cd716d59d98ad673035ab7035ece751718ea9842944a4743c298bebc0fe24c04

Prev. hash: cd716d59d98ad673035ab7035ece751718ea9842944a4743c298bebc0fe24c04
Data: Send 2 more BTC to Ivan
Hash: 42f78d6a86f88aa9b5b10e468494dfd1b3f558a9fb74a01eb348c2cbfc5d000a
總結(jié)

我們構(gòu)建了一個(gè)非常簡單的區(qū)塊鏈原型:它只是一個(gè)塊的數(shù)組,每個(gè)塊都與前一個(gè)塊有連接。 實(shí)際的區(qū)塊鏈要復(fù)雜得多。

缺少交易信息:我們的區(qū)塊鏈還沒有任何交易信息。

缺少工作量證明:我們的生產(chǎn)區(qū)塊非常簡單快捷,實(shí)際的區(qū)塊鏈中,生產(chǎn)一個(gè)區(qū)塊需要進(jìn)行大量的計(jì)算。

缺少共識(shí)機(jī)制:區(qū)塊鏈?zhǔn)且粋€(gè)非單一決策者的分布式數(shù)據(jù)庫。 因此,一個(gè)新的區(qū)塊必須得到網(wǎng)絡(luò)的其他參與者的確認(rèn)和批

在以后的文章中,我們將介紹這些功能。

資料

源代碼:https://github.com/wangweiX/b...

https://jeiwan.cc/posts/build...

《精通比特幣(第二版)》

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/23990.html

相關(guān)文章

  • 基于Java語言構(gòu)建區(qū)塊)—— 基本原型

    摘要:本文將基于語言構(gòu)建簡化版的,來實(shí)現(xiàn)數(shù)字貨幣。值用于確保的安全。計(jì)算是計(jì)算敏感的操作,即使在高性能電腦也需要花費(fèi)一段時(shí)間來完成計(jì)算這也就是為什么人們購買高性能進(jìn)行比特幣挖礦的原因。資料源代碼精通比特幣第二版 showImg(https://segmentfault.com/img/remote/1460000013923206?w=1600&h=900); 最終內(nèi)容請以原文為準(zhǔn):http...

    Flink_China 評(píng)論0 收藏0
  • 區(qū)塊開發(fā)中使用的最流行的編程語言

    摘要:我們目前正處于一個(gè)新興的區(qū)塊鏈開發(fā)行業(yè)中。,一種在以太坊開發(fā)人員中流行的新的簡單編程語言,因?yàn)樗怯糜陂_發(fā)以太坊智能合約的語言。它是全球至少萬開發(fā)人員使用的世界上最流行的編程語言之一。以太坊,主要是針對工程師使用進(jìn)行區(qū)塊鏈以太坊開發(fā)的詳解。 我們目前正處于一個(gè)新興的區(qū)塊鏈開發(fā)行業(yè)中。區(qū)塊鏈技術(shù)處于初期階段,然而這種顛覆性技術(shù)已經(jīng)成功地風(fēng)靡全球,并且最近經(jīng)歷了一場與眾不同的繁榮。由于許多...

    2shou 評(píng)論0 收藏0
  • 基于Java語言構(gòu)建區(qū)塊(六)—— 交易(Merkle Tree)

    摘要:截止年月號(hào),比特幣中有個(gè)區(qū)塊,并且這些數(shù)據(jù)占據(jù)了的磁盤空間。每個(gè)比特幣節(jié)點(diǎn)都是路由區(qū)塊鏈數(shù)據(jù)庫挖礦錢包服務(wù)的功能集合。是比特幣的輕量級(jí)節(jié)點(diǎn),它不需要下載所有的區(qū)塊鏈數(shù)據(jù),也不需要驗(yàn)證區(qū)塊和交易數(shù)據(jù)。 showImg(https://img.i7years.com/blog/pexels-photo-38136.jpeg); 最終內(nèi)容請以原文為準(zhǔn):https://wangwei.one/...

    liuhh 評(píng)論0 收藏0
  • 基于Java語言構(gòu)建區(qū)塊(六)—— 交易(Merkle Tree)

    摘要:截止年月號(hào),比特幣中有個(gè)區(qū)塊,并且這些數(shù)據(jù)占據(jù)了的磁盤空間。每個(gè)比特幣節(jié)點(diǎn)都是路由區(qū)塊鏈數(shù)據(jù)庫挖礦錢包服務(wù)的功能集合。是比特幣的輕量級(jí)節(jié)點(diǎn),它不需要下載所有的區(qū)塊鏈數(shù)據(jù),也不需要驗(yàn)證區(qū)塊和交易數(shù)據(jù)。 showImg(https://img.i7years.com/blog/pexels-photo-38136.jpeg); 最終內(nèi)容請以原文為準(zhǔn):https://wangwei.one/...

    KevinYan 評(píng)論0 收藏0
  • 以太坊DApp開發(fā)入門教程——Node.js和truffle框架打造區(qū)塊投票系統(tǒng)

    摘要:第一節(jié)課程概述本課程面向初學(xué)者,內(nèi)容涵蓋以太坊開發(fā)相關(guān)的基本概念,并將手把手地教大家如何構(gòu)建一個(gè)基于以太坊的完整去中心化應(yīng)用區(qū)塊鏈投票系統(tǒng)。第七節(jié)以太坊世界計(jì)算機(jī)以太坊是一種區(qū)塊鏈的實(shí)現(xiàn)。交易數(shù)據(jù)以太坊中每筆交易都存儲(chǔ)在區(qū)塊鏈上。 第一節(jié) 課程概述 本課程面向初學(xué)者,內(nèi)容涵蓋以太坊開發(fā)相關(guān)的基本概念,并將手把手地教大家如何構(gòu)建一個(gè) 基于以太坊的完整去中心化應(yīng)用 —— 區(qū)塊鏈投票系統(tǒng)。 ...

    zebrayoung 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

PiscesYE

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<