2020 走进区块链 (2)

封面

定义 Block 结构体方法

实现获取 hash 方法

[dependencies]
chrono = "0.4"
utils = {path = "../utils"}

接下来我们为 Block 结构体添加一些方法,

impl Block {
    
    fn set_hash(&mut self){
        let header = coder::sc_serialize(&(self.header));
        self.hash = coder::get_hash(&header[..]);
    }
}

这里定义set_hash方法接受自己可变引用,因为我们要修改 Block 本身所以这里用了可变引用&mut self,然后 coder 中sc_serialize 将区块头结构体序列化为字符串,那么要使用 coder 的方法我们还需要在 core 包引用一下 utils。

utils = {path = "../utils"}

要是将结构序列化还需要让结构体 BlockHeader 实现 Serialize 和 Deserialize 的特征

#[derive(Serialize,Deserialize,Debug,PartialEq,Eq)]
pub struct BlockHeader{
    pub time: i64,
    pub tx_hash:String, //transactions data merkle root hash
    pub pre_hash:String
}

所以我们需要引用 serde 库,通过宏来为 BlockHeader 添加 Serialize 和 Deserialize 方法。

serde = {version = "1.0.106",features = ["derive"]}
utils = {path = "../utils"}

注意: 这里引用 serde 和 utils 顺序,需要先引入 serde 然后再引入 utils 如果反了,可能会有问题。

self.hash = coder::get_hash(&header[..]);

然后调用 coder 的求 hash 方法来得到序列化后的 BlockHeader 的序列化体

创建区块方法

现在我们为区块添加创建区块的方法

pub fn new_block(data:String,pre_hash:String) -> Block{

}

  • data: 也就是创建区块链的数据
  • pre_hash: 定义字符串

记录交易数据

使用同样方法将交易数据 data 转换为 hash 加密字符串

let transactions = coder::sc_serialize(&data);
let tx_hash = coder::get_hash(&transactions[..]);

将输入交易数据通过 hash 方法get_hash,将输入数据进行序列化,

获取时间戳

let time = Utc::now().timestamp();

要获取时间戳,我们需要引入chrono依赖库,调用 Utc::now().timestamp() 方法获取当前的时间戳。

chrono = "0.4"
let mut block = Block{
    header:BlockHeader{
        time: time,
        tx_hash:tx_hash, //transactions data merkle root hash
        pre_hash:pre_hash
    },
    hash:"".to_string(),
    data:data
};

在内部 Block 内部定义 Block 一个结构体,然后通过调用 set_hash 将 BlockHeader 通过序列化,来将区块链头部信息设置

block.set_hash();
block
impl Block {
    
    fn set_hash(&mut self){
        let header = coder::sc_serialize(&(self.header));
        self.hash = coder::get_hash(&header[..]);
    }

    pub fn new_block(data:String,pre_hash:String) -> Block{
        let transactions = coder::sc_serialize(&data);
        let tx_hash = coder::get_hash(&transactions[..]);

        let time = Utc::now().timestamp();

        let mut block = Block{
            header:BlockHeader{
                time: time,
                tx_hash:tx_hash, //transactions data merkle root hash
                pre_hash:pre_hash
            },
            hash:"".to_string(),
            data:data
        };

        block.set_hash();
        block
    }
}

模拟区块链记录交易数据

接下来的工作就是验证一下之前的代码,我们创建一个区块链,然后模拟为区块链添加两个记录交易的块,虽然今天只是一个简单的实例,不过我们使用。

use core::blockchain;
use std::thread;
use std::time::Duration;

fn main() {

    let mut bc = blockchain::BlockChain::new_blockchain();

    thread::sleep(Duration::from_secs(10));

    bc.add_block("alice -> john: 5 btc".to_string());
    thread::sleep(Duration::from_secs(10));
    bc.add_block("john -> mike: 1 btc".to_string());
    for b in bc.blocks{
        println!("----------------------");
        println!("{:#?}",b);
        println!("");
    }

}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容