Rust 实现简单区块链

85 行 Rust 实现一个简单的区块链

概述

这篇文章只是把之前写的 C 语言区块链用 Rust 实现了下,并且使用了 md5 作为哈希函数。本文只是为了 Rust 练手,不得不说这语言学起来难但是用起来真爽哈哈哈

区块链 = 由区块顺次连接形成的链

Cargo.toml

[dependencies]
chrono = "*"
rust-crypto = "^0.2"

组成

  • 区块

    #[derive(Debug)]
    struct Block {
        prevHash: String,
        timeStamp: i64,
        hash: String,
        body: String,
    }
    
  • 区块链

    struct BlockChain {
        block: Vec<Block>,
        height: i64,
    }
    

完整代码

use std::os::unix::raw::time_t;
use chrono::prelude::*;
use crypto::digest::Digest;
use crypto::md5::Md5;

#[derive(Debug)]
struct Block {
    prevHash: String,
    timeStamp: i64,
    hash: String,
    body: String,
}

struct BlockChain {
    block: Vec<Block>,
    height: i64,
}

impl Block {
    fn new(prevHash: String, body: String) -> Block {
        let timeStamp = Block::timeStamp();
        let hash = Block::md5(format!("{}-{}-{}", prevHash, timeStamp, body).as_str());
        Block {
            prevHash,
            timeStamp: timeStamp,
            hash: hash,
            body,
        }
    }

    fn timeStamp() -> i64 {
        (Local::now()).timestamp_millis()
    }

    fn md5(input: &str) -> String {
        let mut md5 = Md5::new();
        md5.input_str(input);
        md5.result_str()
    }
}

impl BlockChain {
    // 创建区块链对象时自动创建创世区块
    fn new() -> BlockChain {
        let mut blockChain = BlockChain {
            block: vec![],
            height: 0
        };

        blockChain.block.push(Block::new(
            "c87ffbd5d8dabb535b673c5d1b8197d5".to_string(),
            "广州吴彦祖  -   创世区块".to_string()
        ));

        blockChain.height += 1;
        blockChain
    }

    fn addBlock(&mut self, prevHash: String, body: String) {
        self.block.push(Block::new(
            prevHash,
            body
        ));

        self.height += 1;
    }
}

fn main() {
    let mut blockChain = BlockChain::new();

    blockChain.addBlock(
        "this is block A".to_string(),
        "this is Block A data".to_string(),
    );

    blockChain.addBlock(
        "this is block B".to_string(),
        "this is Block B data".to_string(),
    );

    for x in blockChain.block {
        println!("{:#?}", x);
    }
}

允许结果

Block {
    prevHash: "c87ffbd5d8dabb535b673c5d1b8197d5",
    timeStamp: 1639814280102,
    hash: "33ece6ba97133882800a8dd22ac49a19",
    body: "广州吴彦祖  -   创世区块",
}
Block {
    prevHash: "this is block A",
    timeStamp: 1639814280102,
    hash: "0565ce1ca7a0adc5a8ec3cad9e7102b4",
    body: "this is Block A data",
}
Block {
    prevHash: "this is block B",
    timeStamp: 1639814280102,
    hash: "5774ea1a98ecdd884dd4e58c0168ffa6",
    body: "this is Block B data",
}

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>