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