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