美文网首页区块链研习社
2020 走进区块链 (2)

2020 走进区块链 (2)

作者: zidea | 来源:发表于2020-04-19 20:09 被阅读0次
    封面

    定义 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!("");
        }
    
    }
    
    

    相关文章

      网友评论

        本文标题:2020 走进区块链 (2)

        本文链接:https://www.haomeiwen.com/subject/gnxibhtx.html