用Rust实现区块链 - 1 区块和区块链

2022年7月10日 267点热度 0人点赞 0条评论



区块链从技术角度上看就是一个去中心化的,点对点的,保证最终一致性的分布式数据库。下面我们先来实现区块及区块链。


区块

区块存储了区块链中的有效信息,如交易等。这一部分我们先实现简单的区块及区块链,把框架搭建起来,后面随着新功能的加入,再逐渐去完善。


区块头

#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]pub struct BlockHeader {    timestamp: i64,    prev_hash: String,    nonce: usize,}
  • timestamp:时间戳

  • prev_hash:前一个区块的Hash值

  • nonce:随机数,用于计算工作量证明

区块

#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]pub struct Block {    header: BlockHeader,    data: String,    hash: String,}
  • header:区块头

  • data:区块存储的数据,后面在实现交易的功能时,这个字段会修改为交易集合。

  • hash:块的Hash值

每个区块都计算存储了一个hash值,区块头中存储了前一个区块的hash,这样就形成了一个区块链。如图:

图片

计算hash值

我们对区块头进行hash就可以了,因为区块头包含了区块的所有信息,后面会把交易的hash值也加入到区块头中。


先使用serde和bincode库把区块头序列化成字节,然后再使用SHA256计算hash值。

pub fn serialize<T>(data: &T) -> Result<Vec<u8>, BlockchainError> where    T: Serialize + ?Sized{    Ok(bincode::serialize(data)?)}
pub fn hash_to_str(data: &[u8]) -> String { let mut hasher = Sha3::sha3_256(); hasher.input(data); hasher.result_str()}

新建区块及实现创世块

创世块是区块链中的第一个区块,所以区块头中的prev_hash没有值。

pub fn new(data: &str, prev_hash: &str) -> Self {    let mut block = Block {        header: BlockHeader {             timestamp: Utc::now().timestamp(),             prev_hash: prev_hash.into(),             nonce: 0,         },        data: data.into(),        hash: String::new(),    };    block.set_hash();
block}
pub fn create_genesis_block() -> Self { Self::new("创世区块", "")}

区块链

我们现在先把区块存储在内存中,后面部分会把区块存储到KV数据库中。

pub struct Blockchain {    blocks: Vec<Block>,    height: usize,}
  • blocks:区块集合

  • height:区块链的高度,即区块个数。

挖矿

就是将区块加入到链中

pub fn mine_block(&mut self, data: &str) {    let prev_block = self.blocks.last().unwrap();    let block = Block::new(data, prev_block.get_hash().as_str());    self.blocks.push(block);    self.height += 1;}

创建区块链及加入区块

let mut bc = Blockchain::new();
bc.mine_block("Justin -> Bob 2 btc");bc.mine_block("Justin -> Bruce 2 btc");
bc.blocks_info();

执行结果:

$ RUST_LOG=info cargo run --example gen_bc --quiet
INFO blockchain_rust_part_1::blocks::blockchain: Block { header: BlockHeader { timestamp: 1650188197, prev_hash: "", nonce: 0, }, data: "创世区块", hash: "dc7e47a45b9b898269efbc4e05cff5d2c8c9dac17cd181451471e62cdcd646c6",}INFO blockchain_rust_part_1::blocks::blockchain: Block { header: BlockHeader { timestamp: 1650188197, prev_hash: "dc7e47a45b9b898269efbc4e05cff5d2c8c9dac17cd181451471e62cdcd646c6", nonce: 0, }, data: "Justin -> Bob 2 btc", hash: "8620a3e7965c71ccf391898bb53a374db8d133a2c7dcbfa05cea9b83a06c04dc",}INFO blockchain_rust_part_1::blocks::blockchain: Block { header: BlockHeader { timestamp: 1650188197, prev_hash: "8620a3e7965c71ccf391898bb53a374db8d133a2c7dcbfa05cea9b83a06c04dc", nonce: 0, }, data: "Justin -> Bruce 2 btc", hash: "3618c57b1aec52b56f820bc20a03f171174a059c5a982e486e0975c1eccbaa12",}

工程结构


图片

完整代码:

https://github.com/Justin02180218/blockchain_rust



14350用Rust实现区块链 - 1 区块和区块链

root

这个人很懒,什么都没留下

文章评论