国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

僅僅用java就能簡單實現(xiàn)區(qū)塊鏈(BlockChain)

這篇具有很好參考價值的文章主要介紹了僅僅用java就能簡單實現(xiàn)區(qū)塊鏈(BlockChain)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

區(qū)塊鏈邏輯:根據(jù)所需信息創(chuàng)建一個區(qū)塊,再利用定義的計算hash值方法,不斷進行計算,直到達到想要的結(jié)果,再通過層層驗證,加入到我們的區(qū)塊鏈中。

1.設(shè)置好成員屬性

?
    //區(qū)塊鏈
    List<Block> blockchain = new ArrayList<>();
    //哈希值,判斷挖礦成功與否
    private String hash;
    //前塊哈希值,便于之后驗證成功與否
    private String previousHash;
    //所需存儲數(shù)據(jù)
    private String data;
    //時間戳
    private long timeStamp;
    //用于判斷”挖礦“成功的密碼學(xué)數(shù)字
    private int nonce;
    //構(gòu)析方法,得到所需信息
    public Block(String data,String previousHash,long timeStamp){
        this.data = data;
        this.previousHash = previousHash;
        this.timeStamp = timeStamp;
        this.hash = calculateBlockHash();
    }

2.計算hash值方法(“挖礦”方法)

所謂挖礦,就是進行不斷地計算,直到“挖到”,而這步算法我們是借助hash算法完成的。

    //得到對應(yīng)hash字符串
    //hash算法優(yōu)勢:輸出格式一致,而且對數(shù)的變化十分敏感,對于之后驗證挖礦成功與否作用巨大!
    public String calculateBlockHash(){
        //生成獨屬的字符串,方便之后轉(zhuǎn)換
        String dataToHash = previousHash + Long.toString(timeStamp)
        + Integer.toString(nonce) + data;
        MessageDigest digest = null;
        byte[] bytes = null;
        try {
            //創(chuàng)建一個提供信息摘要算法的對象,初始化為SHA-256算法對象
            digest = MessageDigest.getInstance("SHA-256");
            //用對象調(diào)用,信息摘要計算方法,計算后獲得字節(jié)數(shù)組
            //dataToHash.getBytes(UTF_8),將字符串轉(zhuǎn)換為字節(jié)數(shù)組
            bytes = digest.digest(dataToHash.getBytes(UTF_8));
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
        //用緩存字符串
        StringBuffer buffer = new StringBuffer();
        for (byte b : bytes) {
            //延伸字符串
            //String.format("%02x", b),以十六進制輸出,2為指定的輸出字段的寬度.如果位數(shù)小于2,則左端補0
            buffer.append(String.format("%02x", b));
        }
        //返回字符串
        return buffer.toString();
    }

3.設(shè)置好挖礦成功的條件

老實說,“挖礦”這件事本身已經(jīng)很抽象了,但是我們還需要沿著這條路,來考慮一個“挖到了”的情形。在我們“挖礦”實際是計算區(qū)塊hash值的情形下,而我們的思路是:找到以四個0開頭的hash值。

    //定義了一個前綴4,這實際上意味著我們希望哈希以4個零開始。
   
    int prefix = 4;
    String prefixString = new String(new char[prefix]).replace('\0', '0');

4.“挖到”方法

這里就體現(xiàn)了hash算法的價值,僅僅通過給nonce++,就可以顯著的改變hash值,讓其前綴可能達到“0000”。

而且由于只有nonce值并沒有提供任何信息,所以對其進行賦值操作,完全沒有問題。

    //開挖
    public String mineBlock(int prefix){
        //創(chuàng)建一個有perfix個的“0”的字符串
        String prefixString = new String(new char[prefix]).replace('\0','0');
        //找到開頭有perfix多個0的字符串
        //substring方法是,從字符串幾位讀到幾位
        while(!hash.substring(0,prefix).equals(prefixString)){
            //決定那個塊
            nonce++;
            //通過nonce變化,更新hash值
            hash = calculateBlockHash();
        }
        //找到了
        return hash;
    }

5.添加一個區(qū)塊

    //在區(qū)塊鏈里添加一個塊
    public void givenBlockchain_whenNewBlockAdded_thenSuccess() {
        //建立一個區(qū)塊
        Block newBlock = new Block(
                "The is a New Block.",
                blockchain.get(blockchain.size() - 1).getHash(),
                new Date().getTime());
        //找到四個0的區(qū)塊
        newBlock.mineBlock(prefix);
        //再次檢驗是否正確
        assertTrue(newBlock.getHash().substring(0, prefix).equals(prefixString));
        //添加一個區(qū)塊
        blockchain.add(newBlock);
    }

6.區(qū)塊鏈驗證

為了保證區(qū)塊的可靠性,我們就進行了多次驗證,保證絕對正確。

驗證:添加區(qū)塊的hash值是否等于hash算法所得——》

添加區(qū)塊的前區(qū)塊hash值是否等于前區(qū)塊的值——》

添加區(qū)塊的hash值是否以“0000”開頭

    //區(qū)塊鏈驗證
    public void givenBlockchain_whenValidated_thenSuccess() {
        boolean flag = true;
        for (int i = 0; i < blockchain.size(); i++) {
            //得到前區(qū)塊的hash值
            String previousHash = i==0 ? "0" : blockchain.get(i - 1).getHash();
            //進行真?zhèn)闻袛?            //原理:判斷hash是否等于計算的hash//判斷儲存的前區(qū)塊hash是否等于真正的hash//判斷是否滿足“挖礦”成功的條件
            flag = blockchain.get(i).getHash().equals(blockchain.get(i).calculateBlockHash())
                    && previousHash.equals(blockchain.get(i).getPreviousHash())
                    && blockchain.get(i).getHash().substring(0, prefix).equals(prefixString);
            //一次不行就直接跳出
            if (!flag) break;
        }
        //進行正確性檢驗
        assertTrue(flag);
    }

現(xiàn)在已經(jīng)完成了,開始制作自己的區(qū)塊鏈吧,添加一些隱私信息,讓別人無從知曉!文章來源地址http://www.zghlxwxcb.cn/news/detail-784559.html

到了這里,關(guān)于僅僅用java就能簡單實現(xiàn)區(qū)塊鏈(BlockChain)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Java實現(xiàn)Tron(波場)區(qū)塊鏈的開發(fā)實踐(一)環(huán)境搭建及簡單實現(xiàn)

    Java實現(xiàn)Tron(波場)區(qū)塊鏈的開發(fā)實踐(一)環(huán)境搭建及簡單實現(xiàn)

    最近在開發(fā)區(qū)塊鏈相關(guān)項目時,因本人一直使用JAVA做開發(fā)語言,但是區(qū)塊鏈開發(fā)對JAVA語言相對來說不是很友好。在開發(fā)過程中遇到很多的問題,甚至通過百度、Google都無法解決,官方文檔大部分篇幅在介紹接口相關(guān)信息,對Java實現(xiàn)不多。 可是為了賺點錢,也是硬著頭皮,經(jīng)

    2024年04月08日
    瀏覽(91)
  • blockchain layer區(qū)塊鏈分層

    blockchain layer區(qū)塊鏈分層

    目錄 1.layer0 2.layer1 3.layer2 ?4.layer3 ? 第0層的定義目前行業(yè)還沒有完全一致的理解。多數(shù)人認(rèn)為第0層是 加密數(shù)據(jù)連接層及其硬件 ,對應(yīng)上圖下半部分。 也有一些人把跨鏈或可以創(chuàng)建鏈的基礎(chǔ)設(shè)施為作為第0層,他們的代表有: LayerZero、Substrate / Polkadot 及 Cosmos layer1是我們常說

    2024年02月09日
    瀏覽(21)
  • Blockchain classification區(qū)塊鏈分類

    目錄 1.public blockchain 2.private blockchain 3.consortium blockchain 區(qū)塊鏈采用不同的共識機制,區(qū)塊鏈分為三類:公鏈、私鏈、聯(lián)盟鏈。 公鏈公開、透明的,信息對任何人都可見;任何人都可以在鏈上發(fā)起交易,任何人都可以按共識接入?yún)^(qū)塊鏈。沒有人可以修改鏈上數(shù)據(jù)、也沒有機構(gòu)或

    2024年02月09日
    瀏覽(54)
  • web3:區(qū)塊鏈Blockchain

    在此聲明,僅做分享,絕不存在倡導(dǎo)炒幣行為

    2024年02月09日
    瀏覽(24)
  • Go語言Blockchain與區(qū)塊鏈

    區(qū)塊鏈技術(shù)是一種分布式、去中心化的數(shù)字賬本技術(shù),它允許多個節(jié)點共同維護一個共享的、有序的、不可篡改的數(shù)據(jù)庫。區(qū)塊鏈技術(shù)的核心概念是通過加密技術(shù)和分布式共識算法來確保數(shù)據(jù)的安全性、完整性和可靠性。 Go語言是一種靜態(tài)類型、垃圾回收、并發(fā)簡單的編程語

    2024年02月20日
    瀏覽(31)
  • 【Blockchain】區(qū)塊鏈瀏覽器 | 以太坊Etherscan比特幣Blockchain門羅幣Monero

    【Blockchain】區(qū)塊鏈瀏覽器 | 以太坊Etherscan比特幣Blockchain門羅幣Monero

    區(qū)塊鏈瀏覽器是一種軟件,它使用API(應(yīng)用程序編程接口)和區(qū)塊鏈節(jié)點從區(qū)塊鏈中提取各種數(shù)據(jù),然后使用數(shù)據(jù)庫來排列搜索到的數(shù)據(jù),并以可搜索的格式將數(shù)據(jù)呈現(xiàn)給用戶。 用戶的輸入是資源管理器上的可搜索項,然后通過數(shù)據(jù)庫上的組織表進行搜索。瀏覽器已經(jīng)將區(qū)塊鏈中

    2024年04月08日
    瀏覽(24)
  • 【Blockchain】區(qū)塊鏈游戲GameFi | NFT

    【Blockchain】區(qū)塊鏈游戲GameFi | NFT

    GameFi是游戲和金融的組合,它涉及區(qū)塊鏈游戲,對玩家提供經(jīng)濟激勵,也被稱為“玩賺錢游戲”。 通常,玩家可以通過完成任務(wù)、與其他玩家戰(zhàn)斗或通過名種游戲關(guān)卡來獲得游戲內(nèi)的獎勵?,F(xiàn)在很多賺錢游戲都嚴(yán)重依賴于游戲設(shè)計師所說的研磨機制,在這種機制中,玩家必須

    2024年04月13日
    瀏覽(28)
  • Go語言的Blockchain與區(qū)塊鏈

    區(qū)塊鏈技術(shù)是一種分布式、去中心化的數(shù)字賬本技術(shù),它允許多個節(jié)點在網(wǎng)絡(luò)中共享和同步數(shù)據(jù)。區(qū)塊鏈技術(shù)的核心概念是將數(shù)據(jù)以鏈?zhǔn)浇Y(jié)構(gòu)存儲,每個數(shù)據(jù)塊(block)包含前一個數(shù)據(jù)塊的哈希值,形成一條鏈。這種結(jié)構(gòu)使得數(shù)據(jù)的完整性和不可篡改性得到保障。 Go語言是一種靜

    2024年04月10日
    瀏覽(40)
  • Overview of Blockchain區(qū)塊鏈概述

    Overview of Blockchain區(qū)塊鏈概述

    目錄 1.def 2.smart contract 3.Consensus mechanism 4.blockchain fork 比特幣誕生的幾年后,人們開始意識到區(qū)塊鏈技術(shù)本身的潛力,慢慢走出了自己的發(fā)展路線。 通常區(qū)塊鏈被定義為一種去中心化的分布式賬本技術(shù),最初用來記錄信息,使記錄具備不可篡改性,隨著以太坊的出現(xiàn),還可以

    2024年02月07日
    瀏覽(30)
  • 僅僅是調(diào)用第三方接口那么簡單嗎?

    僅僅是調(diào)用第三方接口那么簡單嗎?

    最近有個項目需要本地處理之后,然后調(diào)用第三方接口,本來開始覺得很簡單得事情,不就是調(diào)用第三方接口嗎?但是卻一波三折。 首先有了下面的第一版的設(shè)計。 這個設(shè)計很簡單,也是最容易想到的。主要有下面幾步 1、本地處理; 2、調(diào)用第三方接口; 3、本地日志打印

    2024年02月06日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包