中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

怎么用java實現簡單比特幣功能

發布時間:2021-08-12 13:59:12 來源:億速云 閱讀:303 作者:chen 欄目:互聯網科技

這篇文章主要講解了“怎么用java實現簡單比特幣功能”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“怎么用java實現簡單比特幣功能”吧!

一、塊定義

/**
 * 區塊結構
 * @author 
 */
public class Block {
    /**
     * 區塊索引號
     */
    private int index;
    /**
     * 當前區塊的hash值,區塊唯一標識
     */
    private String hash;
    /**
     * 生成區塊的時間戳
     */
    private long timestamp;
    /**
     * 當前區塊的交易集合
     */
    private List<Transaction> transactions;
    /**
     * 工作量證明,計算正確hash值的次數
     */
    private int nonce;
    /**
     * 前一個區塊的hash值
     */
    private String previousHash;
 
    public Block() {
        super();
    }
 
    public Block(int index, long timestamp, List<Transaction> transactions, int nonce, String previousHash, String hash) {
        super();
        this.index = index;
        this.timestamp = timestamp;
        this.transactions = transactions;
        this.nonce = nonce;
        this.previousHash = previousHash;
        this.hash = hash;
    }
}

二、交易定義

/**
 * 交易
 * @author 
 */
public class Transaction {
    /**
     * 交易唯一標識
     */
    private String id;
    /**
     * 交易發送方錢包地址
     */
    private String sender;
    /**
     * 交易接收方錢包地址
     */
    private String recipient;
    /**
     * 交易金額
     */
    private int amount;
 
    public Transaction() {
        super();
    }
 
    public Transaction(String id, String sender, String recipient, int amount) {
        super();
        this.id = id;
        this.sender = sender;
        this.recipient = recipient;
        this.amount = amount;
    }
}

三、挖礦方法

/**
 * 挖礦
 * @param blockchain 整個區塊鏈
 * @param txs 需記賬交易記錄
 * @param address 礦工錢包地址
 * @return
 */
private static void mineBlock(List<Block> blockchain, List<Transaction> txs, String address) {
    //加入系統獎勵的交易,默認挖礦獎勵10個比特幣
    Transaction sysTx = new Transaction(CryptoUtil.UUID(), "", address, 10);
    txs.add(sysTx);
    //獲取當前區塊鏈里的最后一個區塊
        Block latestBlock = blockchain.get(blockchain.size() - 1);
    //隨機數
    int nonce = 1;
    String hash = "";
    while(true){
        hash = CryptoUtil.SHA256(latestBlock.getHash() + JSON.toJSONString(txs) + nonce);
        if (hash.startsWith("0000000000")) {
            System.out.println("=====計算結果正確,計算次數為:" +nonce+ ",hash:" + hash);
            break;
        }
        nonce++;
        System.out.println("計算錯誤,hash:" + hash); 
    }
    
    //解出難題,可以構造新區塊并加入進區塊鏈里
    Block newBlock = new Block(latestBlock.getIndex() + 1, System.currentTimeMillis(), txs, nonce, latestBlock.getHash(), hash);
    blockchain.add(newBlock);
    System.out.println("挖礦后的區塊鏈:" + JSON.toJSONString(blockchain));
}

四、余額計算
/**
 * 查詢余額
 * @param blockchain
 * @param address
 * @return
 */
public static int getWalletBalance(List<Block> blockchain, String address) {
    int balance = 0;
    for (Block block : blockchain) {
            List<Transaction> transactions = block.getTransactions();
            for (Transaction transaction : transactions) {
                    if (address.equals(transaction.getRecipient())) {
                        balance += transaction.getAmount();
                    }
                    if (address.equals(transaction.getSender())) {
                        balance -= transaction.getAmount();
                    }
            }
        }
    return balance;
 

五、運行范例

public static void main(String[] args) {
    //創建一個空的區塊鏈
    List<Block> blockchain = new ArrayList<>();
    //生成創世區塊
    Block block = new Block(1, System.currentTimeMillis(), new ArrayList<Transaction>(), 1, "1", "1");
    //加入創世區塊到區塊鏈里
    blockchain.add(block);
    System.out.println(JSON.toJSONString(blockchain));
    
    // 發送方錢包地址
    String sender = "sender_wallet";
    //接收方錢包地址
    String recipient = "recipient_wallet";
    
    //創建一個空的交易集合
    List<Transaction> txs = new ArrayList<>();
    //挖礦
    mineBlock(blockchain, txs, sender);
    System.out.println(sender + "錢包的余額為:" + getWalletBalance(blockchain, sender));
    
    //創建一個空的交易集合
    List<Transaction> txs1 = new ArrayList<>();
    //已發生但未記賬的交易記錄,發送者給接收者轉賬3個比特幣
    Transaction tx1 = new Transaction(CryptoUtil.UUID(), sender, recipient, 3);
    //已發生但未記賬的交易記錄,發送者給接收者轉賬1個比特幣
    Transaction tx2 = new Transaction(CryptoUtil.UUID(), sender, recipient, 1);
    txs1.add(tx1);
    txs1.add(tx2);
    //挖礦
    mineBlock(blockchain, txs1, sender);
    System.out.println(sender + "錢包的余額為:" + getWalletBalance(blockchain, sender));
    System.out.println(recipient + "錢包的余額為:" + getWalletBalance(blockchain, recipient));
}

感謝各位的閱讀,以上就是“怎么用java實現簡單比特幣功能”的內容了,經過本文的學習后,相信大家對怎么用java實現簡單比特幣功能這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

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

AI

永修县| 军事| 金阳县| 漠河县| 灯塔市| 鲜城| 白玉县| 吉水县| 酉阳| 博白县| 武邑县| 谷城县| 南华县| 财经| 和顺县| 宜兴市| 孟州市| 日喀则市| 汾西县| 土默特右旗| 涟水县| 济南市| 保靖县| 亚东县| 衡阳县| 古田县| 丰城市| 榆社县| 永寿县| 曲阜市| 钟祥市| 丰台区| 南华县| 云霄县| 石景山区| 乐山市| 贵溪市| 亚东县| 福清市| 辽宁省| 南充市|