[Blockchain] Utilisez JAV simple A pour simuler la création de blockchain et l'exploitation minière

Idées:
1. Créez une blockchain. La blockchain est une liste chaînée de blocs, chaque bloc contient le hachage du bloc précédent et le hachage de son propre bloc. Chaque bloc contient également des données, des événements de création, des nonce et d'autres informations.
2. Utilisez SHA256 pour générer une valeur de hachage.
3. Exploitation minière. Trouvez la valeur nonce dont la valeur de hachage est le premier chiffre difficile 0.
Code:

import java.util.Date;
import java.util.ArrayList;
import com.google.gson.GsonBuilder;
import java.security.MessageDigest;

class StringUtil {
    
    
    //Applies Sha256 to a string and returns the result.
    public static String applySha256(String input) {
    
    
        try {
    
    
            MessageDigest digest = MessageDigest.getInstance("SHA-256");
            //Applies sha256 to our input,
            byte[] hash = digest.digest(input.getBytes("UTF-8"));
            StringBuffer hexString = new StringBuffer(); // This will contain hash as hexidecimal
            for (int i = 0; i < hash.length; i++) {
    
    
                String hex = Integer.toHexString(0xff & hash[i]);
                if (hex.length() == 1) hexString.append('0');
                hexString.append(hex);
            }
            return hexString.toString();
        } catch (Exception e) {
    
    
            throw new RuntimeException(e);
        }
    }
}
class Block {
    
    
    public String hash;
    public String previousHash;
    private String data; //our data will be a simple message.
    private long timeStamp; //as number of milliseconds since 1/1/1970.
    private int nonce;

    //Block Constructor.
    public Block(String data, String previousHash) {
    
    
        this.data = data;
        this.previousHash = previousHash;
        this.timeStamp = new Date().getTime();

        this.hash = calculateHash(); //Making sure we do this after we set the other values.
    }

    //Calculate new hash based on blocks contents
    public String calculateHash() {
    
    
        String calculatedhash = StringUtil.applySha256(
                previousHash +
                        Long.toString(timeStamp) +
                        Integer.toString(nonce) +
                        data
        );
        return calculatedhash;
    }

    public void mineBlock(int difficulty) {
    
    
        String target = new String(new char[difficulty]).replace('\0', '0'); //Create a string with difficulty * "0"
        //System.out.println(target);
        while (!hash.substring(0, difficulty).equals(target)) {
    
    
            nonce++;
            hash = calculateHash();
        }
        System.out.println("Block Mined!!! : " + hash);
    }
}


public class main{
    
    
    public static int difficulty = 5;
    public static ArrayList<Block> blockchain = new ArrayList<Block>();
    public static void main(String[] args) {
    
    
        //add our blocks to the blockchain ArrayList:

        blockchain.add(new Block("Hi im the first block", "0"));
        System.out.println("Trying to Mine block 1... ");
        blockchain.get(0).mineBlock(difficulty);

        blockchain.add(new Block("Yo im the second block", blockchain.get(blockchain.size() - 1).hash));
        System.out.println("Trying to Mine block 2... ");
        blockchain.get(1).mineBlock(difficulty);

        blockchain.add(new Block("Hey im the third block", blockchain.get(blockchain.size() - 1).hash));
        System.out.println("Trying to Mine block 3... ");
        blockchain.get(2).mineBlock(difficulty);

        System.out.println("\nBlockchain is Valid: " + isChainValid());

        String blockchainJson = new GsonBuilder().setPrettyPrinting().create().toJson(blockchain);
        System.out.println("\nThe block chain: ");
        System.out.println(blockchainJson);
    }

    public static Boolean isChainValid() {
    
    
        Block currentBlock;
        Block previousBlock;
        String hashTarget = new String(new char[difficulty]).replace('\0', '0');

        //loop through blockchain to check hashes:
        for (int i = 1; i < blockchain.size(); i++) {
    
    
            currentBlock = blockchain.get(i);
            previousBlock = blockchain.get(i - 1);
            //compare registered hash and calculated hash:
            if (!currentBlock.hash.equals(currentBlock.calculateHash())) {
    
    
                System.out.println("Current Hashes not equal");
                return false;
            }
            //compare previous hash and registered previous hash
            if (!previousBlock.hash.equals(currentBlock.previousHash)) {
    
    
                System.out.println("Previous Hashes not equal");
                return false;
            }
            //check if hash is solved
            if (!currentBlock.hash.substring(0, difficulty).equals(hashTarget)) {
    
    
                System.out.println("This block hasn't been mined");
                return false;
            }
        }
        return true;
    }
}

Je suppose que tu aimes

Origine blog.csdn.net/weixin_44485744/article/details/115318603
conseillé
Classement