2020 走進(jìn)區(qū)塊鏈 (2)

封面

定義 Block 結(jié)構(gòu)體方法

實(shí)現(xiàn)獲取 hash 方法

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

接下來我們?yōu)?Block 結(jié)構(gòu)體添加一些方法,

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

這里定義set_hash方法接受自己可變引用,因?yàn)槲覀円薷?Block 本身所以這里用了可變引用&mut self,然后 coder 中sc_serialize 將區(qū)塊頭結(jié)構(gòu)體序列化為字符串,那么要使用 coder 的方法我們還需要在 core 包引用一下 utils。

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

要是將結(jié)構(gòu)序列化還需要讓結(jié)構(gòu)體 BlockHeader 實(shí)現(xiàn) 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 如果反了,可能會(huì)有問題。

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

然后調(diào)用 coder 的求 hash 方法來得到序列化后的 BlockHeader 的序列化體

創(chuàng)建區(qū)塊方法

現(xiàn)在我們?yōu)閰^(qū)塊添加創(chuàng)建區(qū)塊的方法

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

}

  • data: 也就是創(chuàng)建區(qū)塊鏈的數(shù)據(jù)
  • pre_hash: 定義字符串

記錄交易數(shù)據(jù)

使用同樣方法將交易數(shù)據(jù) data 轉(zhuǎn)換為 hash 加密字符串

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

將輸入交易數(shù)據(jù)通過 hash 方法get_hash,將輸入數(shù)據(jù)進(jìn)行序列化,

獲取時(shí)間戳

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

要獲取時(shí)間戳,我們需要引入chrono依賴庫,調(diào)用 Utc::now().timestamp() 方法獲取當(dāng)前的時(shí)間戳。

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
};

在內(nèi)部 Block 內(nèi)部定義 Block 一個(gè)結(jié)構(gòu)體,然后通過調(diào)用 set_hash 將 BlockHeader 通過序列化,來將區(qū)塊鏈頭部信息設(shè)置

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
    }
}

模擬區(qū)塊鏈記錄交易數(shù)據(jù)

接下來的工作就是驗(yàn)證一下之前的代碼,我們創(chuàng)建一個(gè)區(qū)塊鏈,然后模擬為區(qū)塊鏈添加兩個(gè)記錄交易的塊,雖然今天只是一個(gè)簡(jiǎn)單的實(shí)例,不過我們使用。

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

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 介紹完Bitcoin P2P網(wǎng)絡(luò)的組網(wǎng)機(jī)制后,本文將介紹Peer之間交換的協(xié)議消息。Bitcoin節(jié)點(diǎn)將Trans...
    oceanken閱讀 2,785評(píng)論 4 6
  • 原文地址 https://mbinary.coding.me/introduction-to-bitcoin.ht...
    mbinary閱讀 5,727評(píng)論 0 4
  • Go-ethereum 源碼解析之 miner/worker.go (下) Appendix D. 詳細(xì)批注 1....
    furnace閱讀 2,179評(píng)論 0 0
  • 無論何時(shí)你都不該 不重視自己的感受 而去照顧別人 包括自己的孩子 無論何時(shí)你都不該 放棄自己的夢(mèng)想 而去成全別人 ...
    愛00閱讀 207評(píng)論 0 1
  • 日歷一張張的被撕去 今天在明天中老去 我行走在生活的邊緣上 忘卻了步伐的美麗 夜里 疲憊的腳趾在哭泣 說它丟了一個(gè)...
    云中飄舞閱讀 323評(píng)論 13 23

友情鏈接更多精彩內(nèi)容