亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java語言怎么實現數字貨幣

發布時間:2022-01-06 16:53:27 來源:億速云 閱讀:232 作者:iii 欄目:互聯網科技

本篇內容介紹了“Java語言怎么實現數字貨幣”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

引言

區塊鏈技術是一項比人工智能更具革命性的技術,人工智能只是提高了人類的生產力,而區塊鏈則將改變人類社會的生產關系,它將會顛覆我們人類社會現有的協作方式。了解和掌握區塊鏈相關知識和技術,是我們每位開發人員必須要去做的事情,這樣我們才能把握住這波時代趨勢的紅利。

本文將基于Java語言構建簡化版的blockchain,來實現數字貨幣。

創建區塊

區塊鏈是由包含交易信息的區塊從后向前有序鏈接起來的數據結構。區塊被從后向前有序地鏈接在這個鏈條里,每個區塊都指向前一個區塊。以比特幣為例,每個區塊主要包含如下信息字段:

  • 區塊大小:用字節表示的區塊數據大小

  • 區塊頭:組成區塊頭的幾個字段

    • 區塊頭hash值

    • 父區塊頭hash值

    • 時間戳:區塊產生的近似時間

    • Merkle根:該區塊中交易的merkle樹根的哈希值

    • 難度目標:該區塊工作量證明算法的難度目標

    • Nonce:用于工作量證明算法的計數器

  • 交易計數器:交易的數量

  • 交易:記錄在區塊里的交易信息

詳見:《精通比特幣》(第二版)第9章——區塊鏈

區塊數據結構

Java語言怎么實現數字貨幣

在這里,我們主要是為了實現最簡單的區塊鏈結構,僅僅包含以下幾個信息字段:

/**
 * 區塊
 *
 * @author wangwei
 * @date 2018/02/02
 */
@Data
public class Block {

    /**
     * 區塊hash值
     */
    private String hash;
    /**
     * 前一個區塊的hash值
     */
    private String previousHash;
    /**
     * 區塊數據
     */
    private String data;
    /**
     * 區塊創建時間(單位:秒)
     */
    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;
    }
}
區塊Hash值計算

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

/**
 * <p> 創建新區塊 </p>
 *
 * @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;
}

/**
 * 計算區塊Hash
 * <p>
 * 注意:在準備區塊數據時,一定要從原始數據類型轉化為byte[],不能直接從字符串進行轉換
 *
 * @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));
}

創建區塊鏈

區塊鏈本質上是一種有序反向鏈接鏈表的數據結構。這意味著,block按照插入的順序存放,同時每個block都保存指向上一個block的鏈接。這種結構保證可以快速獲取最新插入的block同時獲取它的hash值。這種結構保證可以快速獲取最新插入的block同時(高效地)獲取它的hash值。

區塊鏈數據結構
/**
 * <p> 區塊鏈 </p>
 *
 * @author wangwei
 * @date 2018/02/02
 */
public class Blockchain {
    
    @Getter
    private List<Block> blockList;

    public Blockchain(List<Block> blockList) {
        this.blockList = blockList;
    }
}
添加區塊

新增一個添加區塊鏈的方法

/**
 * <p> 添加區塊  </p>
 *
 * @param data 數據
 */
public void addBlock(String data) {
   Block previousBlock = blockList.get(blockList.size() - 1);
   this.addBlock(Block.newBlock(previousBlock.getHash(), data));
}

/**
 * <p> 添加區塊  </p>
 *
 * @param block 區塊
 */
public void addBlock(Block block) {
   this.blockList.add(block);
}
創世區塊

在添加區塊之前,區塊鏈必須有個創世區塊,在Block中新增創世區塊方法:

/**
  * <p> 創建創世區塊 </p>
  *
  * @return
  */
public static Block newGenesisBlock() {
   return Block.newBlock("", "Genesis Block");
}
創建區塊鏈

再在Blockchain中新增創建區塊鏈的方法:

/**
 * <p> 創建區塊鏈 </p>
 *
 * @return
 */
public static Blockchain newBlockchain() {
    List<Block> blocks = new LinkedList<>();
    blocks.add(Block.newGenesisBlock());
    return new Blockchain(blocks);
}

測試運行

/**
 * 測試
 *
 * @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

“Java語言怎么實現數字貨幣”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

葵青区| 宁德市| 琼结县| 五大连池市| 通化市| 青州市| 湾仔区| 剑河县| 江山市| 安陆市| 环江| 固阳县| 岑巩县| 乾安县| 株洲县| 酉阳| 九龙城区| 台东市| 六安市| 靖西县| 吉木萨尔县| 合肥市| 扎赉特旗| 吉安市| 阳原县| 香港| 县级市| 碌曲县| 鹤山市| 铁力市| 通州区| 桂平市| 通河县| 三穗县| 淳安县| 江华| 嘉兴市| 佛坪县| 逊克县| 昌宁县| 东城区|