區塊鏈的簡單實作
- 什么是區塊鏈
- 塊結構
- 創世區塊
- hash
- 驗證塊的有效性
- 記錄資料
- 從其他節點接收一個塊
- 撰寫測驗代碼
- 測驗結果
- 完整代碼
什么是區塊鏈
一個維護著一個持續增長的有序資料記錄串列的這么一個分布式資料庫
下面我將簡單用nodejs實作一個簡單的區塊鏈,它具有區塊鏈的基本特性,但沒有涉及PoS of PoW,
塊結構

一個塊Block一般有:
- index 塊號
- previousHash 上一個區塊的hash值
- timestamp 時間戳
- data 存放的資料
- hash 區塊的hash值
class Block {
constructor(index, previousHash, timestamp, data, hash) {
this.index = index;
this.previousHash = previousHash;
this.timestamp = timestamp;
this.data = data;
this.hash = hash.toString();
}
toString(){
return "\n{\nindex:"+this.index+",\npreviousHash:'"+this.previousHash+"',\ntimestamp:"+this.timestamp+",\ndata:'"+this.data+"',\nhash:'"+this.hash+"'\n}\n"
}
}
我們每生成一個區塊,我們都會給這個區塊按照特定的hash演算法,來得到一個hash值,一般來說,只要這個區塊的index,previoushash,timestamp,data有改動,那么它所算出的hash值也會改變,所以當你想要篡改某個區塊的資料時,你需要將后面所有的區塊的previoushash都進行篡改,
創世區塊
第一個區塊是沒有前置hash的,是特殊的一個區塊,我們用代碼將這個區塊寫死
const genesisBlock = new Block.Block(
0, null, 1619079309.946, "genesis block", '80dea37cccca5fb56b9b78dbe2733fb19e8ee2aa7bb03d4ac1e361fe3fad7b51'
);
hash
本文采用sha256來求得hash值
exports.caHash=function (index, previousHash, timestamp, data){
return sha256(index + previousHash + timestamp + data).toString();
}
驗證塊的有效性
下面是驗證單個塊是否有效,可以根據下面遍歷整個鏈是否有效,
vaildBlock(block,lastBlock) {
if (!Block.isValidBlockStructure(block))
return false;
if (
(block.index==lastBlock.index+1)
&&(block.previousHash==lastBlock.previousHash)
&&Block.caHash(block.index,block.previousHash,block.timestamp,block.data)
)
return true;
return false;
}
記錄資料
creatBlock(data){
var lastBlock=this.getLastBlock();
var newIndex=lastBlock.index+1;
var newTime=new Date().getTime()/1000;
var newPreHash=lastBlock.hash;
var newhash=Block.caHash(newIndex,newPreHash,newTime,data.toString());
return this.blocks[this.blocks.length]= new Block.Block(
newIndex, newPreHash, newTime, data, newhash
);
}
從其他節點接收一個塊
addBlock(block){
if (validBlock(block,this.getLastBlock())){
blocks.push(block);
return true;
}
return false;
}
撰寫測驗代碼
var Chain=require("./Chain");
var BlockChain=new Chain.BlockChain();
var http=require('http');
var fs=require('fs');
var querystring=require('querystring');
var server=http.createServer(function (req,res) {
var url=req.url;
if (url=="/get"){
res.writeHead(200,{'content-type':'text/plain'+'charset=UTF8'});
var str=BlockChain.blocks;
res.end(str.toString());
}else if (url=="/creat"){
var data=[];
req.on('data',function (chunk) {
data.push(chunk);
})
req.on('end',function (chunk){
var dataObj=querystring.parse(data.toString())
BlockChain.creatBlock(dataObj["data"]);
var lastblock=BlockChain.getLastBlock();
res.setHeader('content-type','text/plain;charset=UTF8');
res.write(lastblock.toString());
res.end("生成區塊"+lastblock.index+"號成功!");
})
}else {
res.setHeader('content-type','text/html;charset=UTF8');
fs.readFile('./client.html',function (err,data) {
res.write(data);
res.end();
})
}
});
server.listen(2345);
測驗結果

輸入一些資料,然后點擊生成區塊:

點擊獲取區塊鏈:

完整代碼
你可以從倉庫里獲取完整代碼:
github: https://github.com/Lixingwei0623/ablockchain.
gitee: https://gitee.com/li-xingwei/simple-block-chain.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/279868.html
標籤:區塊鏈
